diff --git a/404.html b/404.html new file mode 100644 index 0000000..0b8449f --- /dev/null +++ b/404.html @@ -0,0 +1,25 @@ + + + + + + 404 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/assets/FiraCode-Bold.DeMYoWdo.woff b/assets/FiraCode-Bold.DeMYoWdo.woff new file mode 100644 index 0000000..74e57c4 Binary files /dev/null and b/assets/FiraCode-Bold.DeMYoWdo.woff differ diff --git a/assets/FiraCode-Bold.DzhvDiv4.woff2 b/assets/FiraCode-Bold.DzhvDiv4.woff2 new file mode 100644 index 0000000..349dc36 Binary files /dev/null and b/assets/FiraCode-Bold.DzhvDiv4.woff2 differ diff --git a/assets/FiraCode-Light.B1hbeU4w.woff b/assets/FiraCode-Light.B1hbeU4w.woff new file mode 100644 index 0000000..1c1ebc6 Binary files /dev/null and b/assets/FiraCode-Light.B1hbeU4w.woff differ diff --git a/assets/FiraCode-Light.fY4l71KA.woff2 b/assets/FiraCode-Light.fY4l71KA.woff2 new file mode 100644 index 0000000..eeaa303 Binary files /dev/null and b/assets/FiraCode-Light.fY4l71KA.woff2 differ diff --git a/assets/FiraCode-Medium.-YTCSZkP.woff2 b/assets/FiraCode-Medium.-YTCSZkP.woff2 new file mode 100644 index 0000000..7f1d770 Binary files /dev/null and b/assets/FiraCode-Medium.-YTCSZkP.woff2 differ diff --git a/assets/FiraCode-Medium.B7pixCnj.woff b/assets/FiraCode-Medium.B7pixCnj.woff new file mode 100644 index 0000000..19251b0 Binary files /dev/null and b/assets/FiraCode-Medium.B7pixCnj.woff differ diff --git a/assets/FiraCode-Regular.B8-kG0vS.woff b/assets/FiraCode-Regular.B8-kG0vS.woff new file mode 100644 index 0000000..8816b69 Binary files /dev/null and b/assets/FiraCode-Regular.B8-kG0vS.woff differ diff --git a/assets/FiraCode-Regular.jAL9VymT.woff2 b/assets/FiraCode-Regular.jAL9VymT.woff2 new file mode 100644 index 0000000..f8b63fb Binary files /dev/null and b/assets/FiraCode-Regular.jAL9VymT.woff2 differ diff --git a/assets/FiraCode-SemiBold.BiAOBdH0.woff2 b/assets/FiraCode-SemiBold.BiAOBdH0.woff2 new file mode 100644 index 0000000..ccbefc8 Binary files /dev/null and b/assets/FiraCode-SemiBold.BiAOBdH0.woff2 differ diff --git a/assets/FiraCode-SemiBold.C_qsBl7p.woff b/assets/FiraCode-SemiBold.C_qsBl7p.woff new file mode 100644 index 0000000..97857db Binary files /dev/null and b/assets/FiraCode-SemiBold.C_qsBl7p.woff differ diff --git a/assets/FiraCode-VF.B-gPkBGS.woff b/assets/FiraCode-VF.B-gPkBGS.woff new file mode 100644 index 0000000..c3407ed Binary files /dev/null and b/assets/FiraCode-VF.B-gPkBGS.woff differ diff --git a/assets/FiraCode-VF.Bc8wnsZt.woff2 b/assets/FiraCode-VF.Bc8wnsZt.woff2 new file mode 100644 index 0000000..e755a9d Binary files /dev/null and b/assets/FiraCode-VF.Bc8wnsZt.woff2 differ diff --git a/assets/app.Ce5ZZ-Bh.js b/assets/app.Ce5ZZ-Bh.js new file mode 100644 index 0000000..6849c80 --- /dev/null +++ b/assets/app.Ce5ZZ-Bh.js @@ -0,0 +1 @@ +import{U as o,ak as p,al as u,am as l,an as c,ao as f,ap as d,aq as m,ar as h,as as g,at as A,d as v,u as P,y as w,x as y,au as C,av as R,aw as b,a4 as E}from"./chunks/framework.D-J1Cv1C.js";import{R as S}from"./chunks/theme.LZ60Kooo.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(S),T=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=P();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),R(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function _(){globalThis.__VITEPRESS__=!0;const e=D(),a=x();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function x(){return h(T)}function D(){let e=o,a;return g(t=>{let n=A(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&_().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{_ as createApp}; diff --git a/assets/buy.md.CS2ibG6n.js b/assets/buy.md.CS2ibG6n.js new file mode 100644 index 0000000..f4e6b9b --- /dev/null +++ b/assets/buy.md.CS2ibG6n.js @@ -0,0 +1 @@ +import{c as l,j as t,k as a,a5 as r,a as e,o as i,g as n}from"./chunks/framework.D-J1Cv1C.js";const d=r('

购买专业版

专业版超值优惠合集①:Fantastic-mobile + Fantastic-admin

原价:¥599.00 Fantastic-mobile + ¥1199.00 Fantastic-admin = ¥1798.00

合集优惠价:1099.00 (本价格不参与任何限时优惠活动)

请加作者微信进行购买

专业版超值优惠合集②:Fantastic-mobile + One-step-admin

原价:¥599.00 Fantastic-mobile + ¥999.00 One-step-admin = ¥1598.00

合集优惠价:899.00 (本价格不参与任何限时优惠活动)

请加作者微信进行购买

专业版超值优惠合集③:Fantastic-mobile + Fantastic-admin + One-step-admin

原价:¥599.00 Fantastic-mobile + ¥1199.00 Fantastic-admin + ¥999.00 One-step-admin = ¥2797.00

合集优惠价:1499.00 (本价格不参与任何限时优惠活动)

请加作者微信进行购买

购买流程

  1. 请先加作者微信进行在线咨询。
',6),s={align:"center"},c=["src"],o=r('
  1. 通过微信支付宝扫码支付,并在备注里留下手机/微信/QQ/邮箱等任意一种联系方式。
  2. 支付成功后需提供:
  3. 同意邀请后,进入专业版开发者私有组织,获取源码。

支付方式

',2),g={class:"tip custom-block"},h=t("p",{class:"custom-block-title"},"领红包",-1),p=t("p",null,"若你打算使用支付宝进行付款,可以先扫下面这个二维码领取红包。",-1),_=["src"],u={style:{width:"100%",display:"table",margin:"1rem auto"}},m=t("tr",null,[t("th",{colspan:"2",style:{"text-align":"center"}},"Fantastic-mobile 专业版")],-1),b=t("tr",null,[t("td",{colspan:"2",align:"center"},[t("div",null,[e("限时优惠:"),t("b",{style:{color:"#ff4400"}},[e("¥"),t("span",{style:{"font-size":"24px"}},"369"),e(".00")])]),t("b",{style:{color:"#ccc"}},"原价:¥599.00")])],-1),f={align:"center"},y=["src"],k={align:"center"},T=["src"],x=t("tr",null,[t("td",{colspan:"2"},[e("专业版用户可加入专业版微信群(群内提供框架技术支持),除此之外,每一位专业版用户可"),t("b",null,"免费绑定"),e("一位开发者(不支持换绑),绑定的开发者同样可加入专业版微信群,额外绑定更多开发者为 100 元/人。")])],-1),q=r('

使用说明

专业版与基础版区别

⭐功能与服务⭐基础版专业版
长期维护更新,提供新特性
开发与构建工具Vue 3 / Vite
UI 组件库默认使用 Vant ,可替换成任意 UI 组件库
主题风格明亮 1 款 / 暗黑 1 款明亮 6 款 / 暗黑 6 款
布局组件部分功能完整功能
导航栏预设按钮(布局组件)
导航栏模式(布局组件)
导航栏标题非居中(布局组件)
导航栏自定义标题(布局组件)
多套标签栏(布局组件)
标签栏角标(布局组件)
全方位权限验证
扩展组件5 个6 个
国际化
Mock 数据
错误日志上报
业务应用静态页面
团队代码规范
框架版权信息需保留可删除
技术支持查看
演示地址访问访问
',4),A=JSON.parse('{"title":"购买专业版","description":"","frontmatter":{},"headers":[],"relativePath":"buy.md","filePath":"buy.md"}'),P={name:"buy.md"},I=Object.assign(P,{setup(F){return(V,S)=>(i(),l("div",null,[d,t("p",s,[t("img",{src:a(n)("/friend-wechat.png"),width:"300"},null,8,c)]),o,t("div",g,[h,p,t("img",{src:a(n)("/qrcode-alipay-hongbao.jpg"),width:"200"},null,8,_)]),t("table",u,[m,b,t("tr",null,[t("td",f,[t("img",{src:a(n)("/qrcode-wechat.png")},null,8,y)]),t("td",k,[t("img",{src:a(n)("/qrcode-alipay.png")},null,8,T)])]),x]),q]))}});export{A as __pageData,I as default}; diff --git a/assets/buy.md.CS2ibG6n.lean.js b/assets/buy.md.CS2ibG6n.lean.js new file mode 100644 index 0000000..d669008 --- /dev/null +++ b/assets/buy.md.CS2ibG6n.lean.js @@ -0,0 +1 @@ +import{c as l,j as t,k as a,a5 as r,a as e,o as i,g as n}from"./chunks/framework.D-J1Cv1C.js";const d=r("",6),s={align:"center"},c=["src"],o=r("",2),g={class:"tip custom-block"},h=t("p",{class:"custom-block-title"},"领红包",-1),p=t("p",null,"若你打算使用支付宝进行付款,可以先扫下面这个二维码领取红包。",-1),_=["src"],u={style:{width:"100%",display:"table",margin:"1rem auto"}},m=t("tr",null,[t("th",{colspan:"2",style:{"text-align":"center"}},"Fantastic-mobile 专业版")],-1),b=t("tr",null,[t("td",{colspan:"2",align:"center"},[t("div",null,[e("限时优惠:"),t("b",{style:{color:"#ff4400"}},[e("¥"),t("span",{style:{"font-size":"24px"}},"369"),e(".00")])]),t("b",{style:{color:"#ccc"}},"原价:¥599.00")])],-1),f={align:"center"},y=["src"],k={align:"center"},T=["src"],x=t("tr",null,[t("td",{colspan:"2"},[e("专业版用户可加入专业版微信群(群内提供框架技术支持),除此之外,每一位专业版用户可"),t("b",null,"免费绑定"),e("一位开发者(不支持换绑),绑定的开发者同样可加入专业版微信群,额外绑定更多开发者为 100 元/人。")])],-1),q=r("",4),A=JSON.parse('{"title":"购买专业版","description":"","frontmatter":{},"headers":[],"relativePath":"buy.md","filePath":"buy.md"}'),P={name:"buy.md"},I=Object.assign(P,{setup(F){return(V,S)=>(i(),l("div",null,[d,t("p",s,[t("img",{src:a(n)("/friend-wechat.png"),width:"300"},null,8,c)]),o,t("div",g,[h,p,t("img",{src:a(n)("/qrcode-alipay-hongbao.jpg"),width:"200"},null,8,_)]),t("table",u,[m,b,t("tr",null,[t("td",f,[t("img",{src:a(n)("/qrcode-wechat.png")},null,8,y)]),t("td",k,[t("img",{src:a(n)("/qrcode-alipay.png")},null,8,T)])]),x]),q]))}});export{A as __pageData,I as default}; diff --git a/assets/chunks/@localSearchIndexroot.DdZsg3ni.js b/assets/chunks/@localSearchIndexroot.DdZsg3ni.js new file mode 100644 index 0000000..1635f98 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.DdZsg3ni.js @@ -0,0 +1 @@ +const t='{"documentCount":178,"nextId":178,"documentIds":{"0":"/buy.html#购买专业版","1":"/buy.html#购买流程","2":"/buy.html#支付方式","3":"/buy.html#使用说明","4":"/buy.html#专业版与基础版区别","5":"/components/auth-all.html#authall-鉴权","6":"/components/auth-all.html#props","7":"/components/auth-all.html#slots","8":"/components/auth.html#auth-鉴权","9":"/components/auth.html#props","10":"/components/auth.html#slots","11":"/components/#介绍","12":"/components/#基础组件","13":"/components/#内建组件","14":"/components/#扩展组件","15":"/components/page-main.html#pagemain-内容块","16":"/components/page-main.html#props","17":"/components/page-main.html#slots","18":"/components/sparkline.html#sparkline-迷你图","19":"/components/sparkline.html#props","20":"/components/svg-icon.html#svgicon-svg图标","21":"/components/svg-icon.html#props","22":"/components/trend.html#trend-趋势标记","23":"/components/trend.html#props","24":"/guide/api.html#常用-api","25":"/guide/api.html#接口请求","26":"/guide/api.html#鉴权","27":"/guide/api.html#页面","28":"/guide/api.html#刷新","29":"/guide/api.html#设置自定义标题","30":"/guide/api.html#重置自定义标题","31":"/guide/api.html#事件总线","32":"/guide/api.html#日期","33":"/guide/axios.html#与服务端交互","34":"/guide/axios.html#接口请求","35":"/guide/axios.html#设置-baseurl","36":"/guide/axios.html#请求调用","37":"/guide/axios.html#拦截器","38":"/guide/axios.html#模块管理","39":"/guide/axios.html#跨域处理","40":"/guide/axios.html#多数据源","41":"/guide/axios.html#mock","42":"/guide/axios.html#开发环境-mock","43":"/guide/axios.html#生产环境-mock","44":"/guide/build.html#构建与预览","45":"/guide/build.html#构建","46":"/guide/build.html#预览","47":"/guide/build.html#压缩","48":"/guide/build.html#生成存档","49":"/guide/build.html#其它设置","50":"/guide/changelog.html#更新日志","51":"/guide/changelog.html#_0-1-0","52":"/guide/coding-standard.html#代码规范","53":"/guide/coding-standard.html#ide-配置","54":"/guide/coding-standard.html#eslint-配置","55":"/guide/coding-standard.html#stylelint-配置","56":"/guide/coding-standard.html#simple-git-hooks-和-lint-staged","57":"/guide/coding-standard.html#移除","58":"/guide/configure.html#配置","59":"/guide/configure.html#环境配置","60":"/guide/configure.html#应用配置-框架配置","61":"/guide/devtools.html#开发者工具","62":"/guide/devtools.html#使用介绍","63":"/guide/error-log.html#错误日志","64":"/guide/font.html#自定义字体","65":"/guide/font.html#找字体","66":"/guide/font.html#生成字体","67":"/guide/font.html#使用","68":"/guide/global-resources.html#全局资源","69":"/guide/global-resources.html#图片","70":"/guide/global-resources.html#样式","71":"/guide/global-resources.html#组件","72":"/guide/global-resources.html#公共组件","73":"/guide/global-resources.html#局部组件","74":"/guide/i18n.html#国际化","75":"/guide/i18n.html#vscode-扩展","76":"/guide/i18n.html#语言包","77":"/guide/i18n.html#路由设置","78":"/guide/i18n.html#单页组件","79":"/guide/i18n.html#与服务端交互","80":"/guide/intro.html#文档说明","81":"/guide/keep-alive.html#页面缓存","82":"/guide/login.html#登录","83":"/guide/mobile-support.html#移动端支持","84":"/guide/page-layout.html#pagelayout-组件","85":"/guide/page-layout.html#基本用法","86":"/guide/page-layout.html#props","87":"/guide/page-layout.html#slots","88":"/guide/page-layout.html#events","89":"/guide/page-layout.html#导航栏","90":"/guide/page-layout.html#enable","91":"/guide/page-layout.html#mode","92":"/guide/page-layout.html#标签栏","93":"/guide/page-layout.html#enable-1","94":"/guide/page-layout.html#list","95":"/guide/page-layout.html#path","96":"/guide/page-layout.html#icon","97":"/guide/page-layout.html#activeicon","98":"/guide/page-layout.html#text","99":"/guide/page-layout.html#badge","100":"/guide/permission.html#权限","101":"/guide/permission.html#路由权限","102":"/guide/permission.html#鉴权组件","103":"/guide/permission.html#鉴权指令","104":"/guide/permission.html#鉴权函数","105":"/guide/permission.html#小技巧","106":"/guide/plop.html#代码文件自动生成","107":"/guide/plop.html#page","108":"/guide/plop.html#component","109":"/guide/plop.html#store","110":"/guide/q-a.html#常见问题","111":"/guide/q-a.html#安装依赖时有警告","112":"/guide/q-a.html#为什么本地开发环境首次载入很慢","113":"/guide/q-a.html#项目-url-里的-号能不能去掉","114":"/guide/q-a.html#页面切换后显示空白","115":"/guide/q-a.html#开发环境修改代码后-路由跳转导致页面空白","116":"/guide/q-a.html#构建报错-提示内存溢出","117":"/guide/q-a.html#不会-typescript-怎么办","118":"/guide/ready.html#准备工作","119":"/guide/ready.html#源码","120":"/guide/ready.html#基础版","121":"/guide/ready.html#专业版","122":"/guide/ready.html#开发环境","123":"/guide/ready.html#技术栈","124":"/guide/replace-to-nut.html#替换为-nutui","125":"/guide/replace-to-nut.html#安装","126":"/guide/replace-to-nut.html#代码调整","127":"/guide/replace-to-nut.html#修改登录页","128":"/guide/replace-to-nut.html#卸载","129":"/guide/replace-to-nut.html#完成","130":"/guide/replace-to-nut.html#示例","131":"/guide/replace-to-varlet.html#替换为-varlet","132":"/guide/replace-to-varlet.html#安装","133":"/guide/replace-to-varlet.html#代码调整","134":"/guide/replace-to-varlet.html#修改登录页","135":"/guide/replace-to-varlet.html#卸载","136":"/guide/replace-to-varlet.html#完成","137":"/guide/replace-to-varlet.html#示例","138":"/guide/router.html#路由","139":"/guide/router.html#配置规范","140":"/guide/router.html#definepage","141":"/guide/router.html#路由元信息","142":"/guide/router.html#title","143":"/guide/router.html#cache","144":"/guide/router.html#nocache","145":"/guide/router.html#auth","146":"/guide/start.html#开始","147":"/guide/storage.html#私有-storage-数据","148":"/guide/store.html#全局状态管理","149":"/guide/svg-icon.html#图标","150":"/guide/svg-icon.html#自定义图标","151":"/guide/svg-icon.html#iconify-图标","152":"/guide/svg-icon.html#unocss-方案","153":"/guide/svg-icon.html#iconify-原生方案","154":"/guide/theme.html#主题","155":"/guide/theme.html#框架主题","156":"/guide/theme.html#基础版","157":"/guide/theme.html#专业版","158":"/guide/theme.html#颜色方案","159":"/guide/theme.html#哀悼模式","160":"/guide/theme.html#色弱模式","161":"/guide/theme.html#开发注意","162":"/guide/title.html#动态标题","163":"/guide/title.html#使用","164":"/guide/upgrade.html#框架更新","165":"/guide/viewport.html#浏览器适配","166":"/guide/vue3-composition-api.html#使用-composition-api-开发","167":"/guide/vue3-composition-api.html#使用","168":"/guide/vue3-composition-api.html#组件-name","169":"/guide/watermark.html#页面水印","170":"/guide/watermark.html#使用","171":"/guide/watermark.html#设置水印内容","172":"/guide/why.html#为什么选择我们","173":"/guide/why.html#是模板-更是框架","174":"/guide/why.html#为什么不是它们","175":"/support.html#技术支持","176":"/support.html#基础版","177":"/support.html#专业版"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,25],"1":[1,1,23],"2":[1,1,22],"3":[1,1,31],"4":[1,1,48],"5":[2,1,1],"6":[1,2,16],"7":[1,2,6],"8":[2,1,1],"9":[1,2,16],"10":[1,2,6],"11":[1,1,2],"12":[1,1,21],"13":[1,1,21],"14":[1,1,8],"15":[2,1,1],"16":[1,2,19],"17":[1,2,8],"18":[2,1,1],"19":[1,2,40],"20":[2,1,1],"21":[1,2,30],"22":[2,1,1],"23":[1,2,20],"24":[2,1,1],"25":[1,2,9],"26":[1,2,9],"27":[1,2,1],"28":[1,3,5],"29":[1,3,6],"30":[1,3,5],"31":[1,2,12],"32":[1,2,8],"33":[1,1,5],"34":[1,1,1],"35":[2,2,24],"36":[1,2,28],"37":[1,2,33],"38":[1,1,7],"39":[1,1,59],"40":[1,1,100],"41":[1,1,18],"42":[2,2,79],"43":[2,2,28],"44":[1,1,1],"45":[1,1,33],"46":[1,1,13],"47":[1,1,21],"48":[1,1,13],"49":[1,1,8],"50":[1,1,5],"51":[2,1,4],"52":[1,1,17],"53":[2,1,4],"54":[2,1,29],"55":[2,1,26],"56":[6,1,71],"57":[1,7,22],"58":[1,1,1],"59":[1,1,79],"60":[3,1,70],"61":[1,1,7],"62":[1,1,16],"63":[1,1,34],"64":[1,1,11],"65":[1,1,7],"66":[1,1,13],"67":[1,1,28],"68":[1,1,1],"69":[1,1,7],"70":[1,1,34],"71":[1,1,1],"72":[1,2,27],"73":[1,2,7],"74":[1,1,6],"75":[2,1,10],"76":[1,1,67],"77":[1,1,35],"78":[1,1,17],"79":[1,1,5],"80":[1,1,21],"81":[1,1,98],"82":[1,1,39],"83":[1,1,66],"84":[2,1,12],"85":[1,2,17],"86":[1,2,55],"87":[1,2,12],"88":[1,2,9],"89":[1,2,1],"90":[1,3,19],"91":[1,3,26],"92":[1,2,1],"93":[1,3,11],"94":[1,3,39],"95":[1,4,6],"96":[1,4,17],"97":[1,4,17],"98":[1,4,6],"99":[1,4,23],"100":[1,1,37],"101":[1,1,37],"102":[1,1,34],"103":[1,1,27],"104":[1,1,25],"105":[1,1,30],"106":[1,1,41],"107":[1,1,20],"108":[1,1,9],"109":[1,1,6],"110":[1,1,1],"111":[1,1,18],"112":[1,1,21],"113":[4,1,17],"114":[1,1,29],"115":[2,1,7],"116":[2,1,39],"117":[3,1,28],"118":[1,1,1],"119":[1,1,16],"120":[1,2,30],"121":[1,2,11],"122":[1,1,57],"123":[1,1,15],"124":[2,1,14],"125":[1,2,11],"126":[1,2,79],"127":[1,2,7],"128":[1,2,9],"129":[1,2,9],"130":[1,2,4],"131":[2,1,14],"132":[1,2,12],"133":[1,2,87],"134":[1,2,7],"135":[1,2,9],"136":[1,2,9],"137":[1,2,4],"138":[1,1,13],"139":[1,1,77],"140":[2,1,25],"141":[1,1,1],"142":[1,2,13],"143":[1,2,28],"144":[1,2,23],"145":[1,2,24],"146":[1,1,67],"147":[3,1,59],"148":[1,1,57],"149":[1,1,3],"150":[1,1,25],"151":[2,1,20],"152":[2,2,58],"153":[2,2,32],"154":[1,1,1],"155":[1,1,7],"156":[1,2,45],"157":[1,2,66],"158":[1,1,14],"159":[1,1,10],"160":[1,1,10],"161":[1,1,41],"162":[1,1,5],"163":[1,1,10],"164":[1,1,43],"165":[1,1,34],"166":[4,1,17],"167":[1,4,55],"168":[2,4,26],"169":[1,1,1],"170":[1,1,11],"171":[1,1,34],"172":[2,1,1],"173":[2,2,22],"174":[2,2,33],"175":[1,1,1],"176":[1,1,10],"177":[1,1,3]},"averageFieldLength":[1.252808988764045,1.5168539325842703,21.949438202247194],"storedFields":{"0":{"title":"购买专业版","titles":[]},"1":{"title":"购买流程","titles":["购买专业版"]},"2":{"title":"支付方式","titles":["购买专业版"]},"3":{"title":"使用说明","titles":["购买专业版"]},"4":{"title":"专业版与基础版区别","titles":["购买专业版"]},"5":{"title":"AuthAll 鉴权","titles":[]},"6":{"title":"Props","titles":["AuthAll 鉴权"]},"7":{"title":"Slots","titles":["AuthAll 鉴权"]},"8":{"title":"Auth 鉴权","titles":[]},"9":{"title":"Props","titles":["Auth 鉴权"]},"10":{"title":"Slots","titles":["Auth 鉴权"]},"11":{"title":"介绍","titles":[]},"12":{"title":"基础组件","titles":["介绍"]},"13":{"title":"内建组件","titles":["介绍"]},"14":{"title":"扩展组件","titles":["介绍"]},"15":{"title":"PageMain 内容块","titles":[]},"16":{"title":"Props","titles":["PageMain 内容块"]},"17":{"title":"Slots","titles":["PageMain 内容块"]},"18":{"title":"Sparkline 迷你图","titles":[]},"19":{"title":"Props","titles":["Sparkline 迷你图"]},"20":{"title":"SvgIcon SVG图标","titles":[]},"21":{"title":"Props","titles":["SvgIcon SVG图标"]},"22":{"title":"Trend 趋势标记","titles":[]},"23":{"title":"Props","titles":["Trend 趋势标记"]},"24":{"title":"常用 API","titles":[]},"25":{"title":"接口请求","titles":["常用 API"]},"26":{"title":"鉴权","titles":["常用 API"]},"27":{"title":"页面","titles":["常用 API"]},"28":{"title":"刷新","titles":["常用 API","页面"]},"29":{"title":"设置自定义标题","titles":["常用 API","页面"]},"30":{"title":"重置自定义标题","titles":["常用 API","页面"]},"31":{"title":"事件总线","titles":["常用 API"]},"32":{"title":"日期","titles":["常用 API"]},"33":{"title":"与服务端交互","titles":[]},"34":{"title":"接口请求","titles":["与服务端交互"]},"35":{"title":"设置 baseURL","titles":["与服务端交互","接口请求"]},"36":{"title":"请求调用","titles":["与服务端交互","接口请求"]},"37":{"title":"拦截器","titles":["与服务端交互","接口请求"]},"38":{"title":"模块管理","titles":["与服务端交互"]},"39":{"title":"跨域处理","titles":["与服务端交互"]},"40":{"title":"多数据源","titles":["与服务端交互"]},"41":{"title":"Mock","titles":["与服务端交互"]},"42":{"title":"开发环境 mock","titles":["与服务端交互","Mock"]},"43":{"title":"生产环境 mock","titles":["与服务端交互","Mock"]},"44":{"title":"构建与预览","titles":[]},"45":{"title":"构建","titles":["构建与预览"]},"46":{"title":"预览","titles":["构建与预览"]},"47":{"title":"压缩","titles":["构建与预览"]},"48":{"title":"生成存档","titles":["构建与预览"]},"49":{"title":"其它设置","titles":["构建与预览"]},"50":{"title":"更新日志","titles":[]},"51":{"title":"0.1.0","titles":["更新日志"]},"52":{"title":"代码规范","titles":[]},"53":{"title":"IDE 配置","titles":["代码规范"]},"54":{"title":"ESLint 配置","titles":["代码规范"]},"55":{"title":"StyleLint 配置","titles":["代码规范"]},"56":{"title":"simple-git-hooks 和 lint-staged","titles":["代码规范"]},"57":{"title":"移除","titles":["代码规范","simple-git-hooks 和 lint-staged"]},"58":{"title":"配置","titles":[]},"59":{"title":"环境配置","titles":["配置"]},"60":{"title":"应用配置(框架配置)","titles":["配置"]},"61":{"title":"开发者工具","titles":[]},"62":{"title":"使用介绍","titles":["开发者工具"]},"63":{"title":"错误日志","titles":[]},"64":{"title":"自定义字体","titles":[]},"65":{"title":"找字体","titles":["自定义字体"]},"66":{"title":"生成字体","titles":["自定义字体"]},"67":{"title":"使用","titles":["自定义字体"]},"68":{"title":"全局资源","titles":[]},"69":{"title":"图片","titles":["全局资源"]},"70":{"title":"样式","titles":["全局资源"]},"71":{"title":"组件","titles":["全局资源"]},"72":{"title":"公共组件","titles":["全局资源","组件"]},"73":{"title":"局部组件","titles":["全局资源","组件"]},"74":{"title":"国际化","titles":[]},"75":{"title":"vscode 扩展","titles":["国际化"]},"76":{"title":"语言包","titles":["国际化"]},"77":{"title":"路由设置","titles":["国际化"]},"78":{"title":"单页组件","titles":["国际化"]},"79":{"title":"与服务端交互","titles":["国际化"]},"80":{"title":"文档说明","titles":[]},"81":{"title":"页面缓存","titles":[]},"82":{"title":"登录","titles":[]},"83":{"title":"移动端支持","titles":[]},"84":{"title":"PageLayout 组件","titles":[]},"85":{"title":"基本用法","titles":["PageLayout 组件"]},"86":{"title":"Props","titles":["PageLayout 组件"]},"87":{"title":"Slots","titles":["PageLayout 组件"]},"88":{"title":"Events","titles":["PageLayout 组件"]},"89":{"title":"导航栏","titles":["PageLayout 组件"]},"90":{"title":"enable","titles":["PageLayout 组件","导航栏"]},"91":{"title":"mode","titles":["PageLayout 组件","导航栏"]},"92":{"title":"标签栏","titles":["PageLayout 组件"]},"93":{"title":"enable","titles":["PageLayout 组件","标签栏"]},"94":{"title":"list","titles":["PageLayout 组件","标签栏"]},"95":{"title":"path","titles":["PageLayout 组件","标签栏","list"]},"96":{"title":"icon","titles":["PageLayout 组件","标签栏","list"]},"97":{"title":"activeIcon","titles":["PageLayout 组件","标签栏","list"]},"98":{"title":"text","titles":["PageLayout 组件","标签栏","list"]},"99":{"title":"badge","titles":["PageLayout 组件","标签栏","list"]},"100":{"title":"权限","titles":[]},"101":{"title":"路由权限","titles":["权限"]},"102":{"title":"鉴权组件","titles":["权限"]},"103":{"title":"鉴权指令","titles":["权限"]},"104":{"title":"鉴权函数","titles":["权限"]},"105":{"title":"小技巧","titles":["权限"]},"106":{"title":"代码文件自动生成","titles":[]},"107":{"title":"page","titles":["代码文件自动生成"]},"108":{"title":"component","titles":["代码文件自动生成"]},"109":{"title":"store","titles":["代码文件自动生成"]},"110":{"title":"常见问题","titles":[]},"111":{"title":"安装依赖时有警告","titles":["常见问题"]},"112":{"title":"为什么本地开发环境首次载入很慢","titles":["常见问题"]},"113":{"title":"项目 URL 里的 # 号能不能去掉","titles":["常见问题"]},"114":{"title":"页面切换后显示空白","titles":["常见问题"]},"115":{"title":"开发环境修改代码后,路由跳转导致页面空白","titles":["常见问题"]},"116":{"title":"构建报错,提示内存溢出","titles":["常见问题"]},"117":{"title":"不会 TypeScript 怎么办","titles":["常见问题"]},"118":{"title":"准备工作","titles":[]},"119":{"title":"源码","titles":["准备工作"]},"120":{"title":"基础版","titles":["准备工作","源码"]},"121":{"title":"专业版","titles":["准备工作","源码"]},"122":{"title":"开发环境","titles":["准备工作"]},"123":{"title":"技术栈","titles":["准备工作"]},"124":{"title":"替换为 NutUI","titles":[]},"125":{"title":"安装","titles":["替换为 NutUI"]},"126":{"title":"代码调整","titles":["替换为 NutUI"]},"127":{"title":"修改登录页","titles":["替换为 NutUI"]},"128":{"title":"卸载","titles":["替换为 NutUI"]},"129":{"title":"完成","titles":["替换为 NutUI"]},"130":{"title":"示例","titles":["替换为 NutUI"]},"131":{"title":"替换为 Varlet","titles":[]},"132":{"title":"安装","titles":["替换为 Varlet"]},"133":{"title":"代码调整","titles":["替换为 Varlet"]},"134":{"title":"修改登录页","titles":["替换为 Varlet"]},"135":{"title":"卸载","titles":["替换为 Varlet"]},"136":{"title":"完成","titles":["替换为 Varlet"]},"137":{"title":"示例","titles":["替换为 Varlet"]},"138":{"title":"路由","titles":[]},"139":{"title":"配置规范","titles":["路由"]},"140":{"title":"definePage()","titles":["路由"]},"141":{"title":"路由元信息","titles":["路由"]},"142":{"title":"title","titles":["路由","路由元信息"]},"143":{"title":"cache","titles":["路由","路由元信息"]},"144":{"title":"noCache","titles":["路由","路由元信息"]},"145":{"title":"auth","titles":["路由","路由元信息"]},"146":{"title":"开始","titles":[]},"147":{"title":"私有 Storage 数据","titles":[]},"148":{"title":"全局状态管理","titles":[]},"149":{"title":"图标","titles":[]},"150":{"title":"自定义图标","titles":["图标"]},"151":{"title":"Iconify 图标","titles":["图标"]},"152":{"title":"Unocss 方案","titles":["图标","Iconify 图标"]},"153":{"title":"Iconify 原生方案","titles":["图标","Iconify 图标"]},"154":{"title":"主题","titles":[]},"155":{"title":"框架主题","titles":["主题"]},"156":{"title":"基础版","titles":["主题","框架主题"]},"157":{"title":"专业版","titles":["主题","框架主题"]},"158":{"title":"颜色方案","titles":["主题"]},"159":{"title":"哀悼模式","titles":["主题"]},"160":{"title":"色弱模式","titles":["主题"]},"161":{"title":"开发注意","titles":["主题"]},"162":{"title":"动态标题","titles":[]},"163":{"title":"使用","titles":["动态标题"]},"164":{"title":"框架更新","titles":[]},"165":{"title":"浏览器适配","titles":[]},"166":{"title":"使用 Composition API 开发","titles":[]},"167":{"title":"使用","titles":["使用 Composition API 开发"]},"168":{"title":"组件 name","titles":["使用 Composition API 开发"]},"169":{"title":"页面水印","titles":[]},"170":{"title":"使用","titles":["页面水印"]},"171":{"title":"设置水印内容","titles":["页面水印"]},"172":{"title":"为什么选择我们 ?","titles":[]},"173":{"title":"是模板,更是框架","titles":["为什么选择我们 ?"]},"174":{"title":"为什么不是它们 ?","titles":["为什么选择我们 ?"]},"175":{"title":"技术支持","titles":[]},"176":{"title":"基础版","titles":["技术支持"]},"177":{"title":"专业版","titles":["技术支持"]}},"dirtCount":0,"index":[["优先推荐在仓库提交",{"2":{"176":1}}],["几乎是一样的",{"2":{"174":1}}],["几乎形成了一套社区默认的技术栈",{"2":{"174":1}}],["整体的生态已经非常成熟",{"2":{"174":1}}],["整体修改",{"2":{"126":4,"133":4}}],["再决定是否要继续使用其他",{"2":{"174":1}}],["再删除",{"2":{"146":1}}],["认为它还达不到你心中框架的标准",{"2":{"173":1}}],["让你的开发工作高效且愉快",{"2":{"173":1}}],["让开发者可以更加专注于业务逻辑的开发",{"2":{"173":1}}],["让网页标题显示路由配置的",{"2":{"162":1}}],["恢复到默认设置",{"2":{"171":1}}],["重置水印",{"2":{"171":1}}],["重置自定义标题",{"0":{"30":1}}],["水印同时支持动态更新",{"2":{"171":1}}],["效果如下",{"2":{"170":1}}],["语法糖进行开发",{"2":{"167":1}}],["语言包存放在",{"2":{"76":1}}],["语言包",{"0":{"76":1}}],["宽度",{"2":{"165":1}}],["宽度设计稿",{"2":{"165":1}}],["作为开发者",{"2":{"165":1}}],["作者的",{"2":{"152":1}}],["编写的样式也能通过一套方案转换成",{"2":{"165":1}}],["编写代码",{"2":{"117":1}}],["使得基于",{"2":{"165":1}}],["使用到的技术栈",{"2":{"174":1}}],["使用文件比较工具",{"2":{"164":1}}],["使用它",{"2":{"152":1}}],["使用方式也极为简单",{"2":{"152":1}}],["使用方法",{"2":{"148":1}}],["使用方法请查阅官方文档",{"2":{"31":1,"32":1}}],["使用本框架前",{"2":{"122":1}}],["使用上对比鉴权组件更方便",{"2":{"103":1}}],["使用页面里的不同功能",{"2":{"101":1}}],["使用原有的",{"2":{"83":1}}],["使用也很简单",{"2":{"83":1}}],["使用基础版的开发者可直接跳过阅读",{"2":{"80":1}}],["使用介绍",{"0":{"62":1}}],["使用",{"0":{"67":1,"163":1,"166":1,"167":1,"170":1},"1":{"167":1,"168":1},"2":{"42":1,"144":1,"167":1}}],["使用说明",{"0":{"3":1}}],["转",{"2":{"165":1}}],["浏览器适配",{"0":{"165":1}}],["浏览器及页面中展示的标题",{"2":{"142":1}}],["修复同步到原有项目中即可",{"2":{"164":1}}],["修改登录页",{"0":{"127":1,"134":1}}],["修改为",{"2":{"113":1}}],["修改后重新执行一下",{"2":{"56":1}}],["做开发",{"2":{"166":1}}],["做项目开发时尽量避免框架自带模块或组件的改动",{"2":{"164":1}}],["做为移动端的布局单位",{"2":{"83":1}}],["做为基础规范",{"2":{"54":1}}],["做为开发",{"2":{"52":1}}],["做为异步请求工具",{"2":{"33":1}}],["字段",{"2":{"162":1}}],["字体使用的视口单位",{"2":{"83":1}}],["字体的",{"2":{"67":1}}],["字体为例",{"2":{"67":1}}],["字体文件有大有小",{"2":{"64":1}}],["动态标题",{"0":{"162":1},"1":{"163":1}}],["动画",{"2":{"114":1}}],["教你巧用ui设计中的暗黑模式",{"2":{"161":1}}],["等有涉及到颜色的属性",{"2":{"161":1}}],["等单位",{"2":{"83":1}}],["色弱模式",{"0":{"160":1}}],["哀悼模式",{"0":{"159":1}}],["留空跟随系统",{"2":{"158":1}}],["与市面上大部分移动端",{"2":{"173":1}}],["与基础版不同",{"2":{"157":1}}],["与服务端交互",{"0":{"33":1,"79":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1},"2":{"25":1}}],["假设",{"2":{"152":1}}],["假设你已经在",{"2":{"76":1}}],["+",{"2":{"152":1}}],["集合名",{"2":{"152":1,"153":1}}],["格式为",{"2":{"152":1,"153":1}}],["格式的字体文件不是浏览器支持的字体格式",{"2":{"66":1}}],["格式的字体文件",{"2":{"65":1}}],["复制图标名称",{"2":{"152":1}}],["聊聊纯",{"2":{"152":1}}],["去处理图标的展示",{"2":{"152":1}}],["网站",{"2":{"151":1}}],["套图标集",{"2":{"151":1}}],["又或者是设计师绘制的",{"2":{"150":1}}],["面向未来的",{"2":{"148":1}}],["探索学习",{"2":{"148":1}}],["状态管理工具",{"2":{"148":1}}],["欧耶",{"2":{"148":1}}],["视频的介绍",{"2":{"148":1}}],["已正式成为",{"2":{"148":1}}],["已经使用",{"2":{"56":1}}],["避免出现",{"2":{"147":1}}],["避免不了手动去频繁创建页面",{"2":{"106":1}}],["容量",{"2":{"147":1}}],["方案采用了",{"2":{"152":1}}],["方案",{"0":{"152":1}}],["方法用来判断对象是否存在",{"2":{"147":1}}],["方法",{"2":{"147":1}}],["方便统一管理",{"2":{"70":1}}],["方便业务开发",{"2":{"37":1}}],["解决同源",{"2":{"147":1}}],["类来解决这个问题",{"2":{"147":1}}],["类型定义",{"2":{"171":1}}],["类型",{"2":{"6":1,"9":1,"16":1,"19":1,"21":1,"23":2,"86":1,"95":1,"96":1,"97":1,"98":1,"142":1,"143":1,"144":1,"145":1}}],["系统",{"2":{"147":1}}],["及以上",{"2":{"147":1}}],["及部分源码片段",{"2":{"3":1}}],["私有",{"0":{"147":1}}],["非必要情况下",{"2":{"146":1}}],["非必须",{"2":{"122":1}}],["镜像源",{"2":{"146":1}}],["切换为国内",{"2":{"146":1}}],["切换到",{"2":{"56":1}}],["报错",{"2":{"146":1}}],["运行成功后",{"2":{"146":1}}],["运行",{"2":{"146":1}}],["必须使用",{"2":{"146":1}}],["警告",{"2":{"140":1}}],["有",{"2":{"151":1}}],["有容量上限",{"2":{"147":1}}],["有区别",{"2":{"139":1}}],["有人却说",{"2":{"112":1}}],["统一处理页面缓存",{"2":{"139":1}}],["│",{"2":{"139":13}}],["意味着两套系统共享",{"2":{"147":1}}],["意味着如果同时创建",{"2":{"139":1}}],["意味着开发者只需在",{"2":{"138":1}}],["意味着你可以使用自定义图标",{"2":{"96":1,"97":1}}],["示例",{"0":{"130":1,"137":1},"2":{"140":1,"171":1}}],["至此",{"2":{"129":1,"136":1}}],["完成",{"0":{"129":1,"136":1}}],["完整功能",{"2":{"4":1}}],["卸载",{"0":{"128":1,"135":1},"2":{"128":1,"135":1}}],["迁移指南",{"2":{"123":1}}],["技术栈",{"0":{"123":1}}],["技术支持",{"0":{"175":1},"1":{"176":1,"177":1},"2":{"4":1}}],["彩虹缩进提示",{"2":{"122":1}}],["高亮显示匹配的标签",{"2":{"122":1}}],["额外推荐",{"2":{"122":1}}],["额外绑定更多开发者为",{"2":{"2":1}}],["右下角会自动提示需要安装的依赖",{"2":{"122":1}}],["要求版本",{"2":{"122":1}}],["加入组织后可访问专业版私有仓库",{"2":{"121":1}}],["拉取演示源码",{"2":{"120":2}}],["拉取框架源码",{"2":{"120":2}}],["拉取",{"2":{"120":1}}],["拉取从",{"2":{"120":1}}],["到",{"2":{"120":1}}],["演示源码",{"2":{"119":1}}],["演示地址",{"2":{"4":1}}],["都是需要在本地项目中编写或修改代码并运行才能呈现的",{"2":{"119":1}}],["都是路由的",{"2":{"81":1}}],["阅读开发文档前",{"2":{"119":1}}],["源码获取方式和基础版无差异",{"2":{"121":1}}],["源码分为两种",{"2":{"119":1}}],["源码",{"0":{"119":1},"1":{"120":1,"121":1},"2":{"119":1}}],["足以证明它是构建一款成熟稳健产品的基石",{"2":{"117":1}}],["库",{"2":{"117":1}}],["从一开始就不打算仅仅只是做一个",{"2":{"174":1}}],["从",{"2":{"120":1}}],["从长远考虑我们都建议你学习",{"2":{"117":1}}],["从预设中选择展示在导航栏右侧的图标按钮",{"2":{"86":1}}],["从预设中设置展示在导航栏左侧的图标按钮",{"2":{"86":1}}],["产品或者项目",{"2":{"117":1}}],["怎么办",{"0":{"117":1}}],["怎么理解呢",{"2":{"81":1}}],["8192",{"2":{"116":1}}],["依旧还是需要手动导入一个",{"2":{"153":1}}],["依旧请求真实接口",{"2":{"42":1}}],["依赖",{"2":{"116":1}}],["未来",{"2":{"115":1}}],["正式成为",{"2":{"148":1}}],["正式发布",{"2":{"51":2}}],["正确示例",{"2":{"114":1}}],["没有节点也是不行的",{"2":{"114":1}}],["注释也会被视为一个节点",{"2":{"114":1}}],["注意按文件夹区分",{"2":{"67":1}}],["注意",{"2":{"43":1,"56":1,"59":1,"60":1,"81":1,"122":1,"139":1,"146":1,"147":1}}],["错误示例",{"2":{"114":1}}],["错误日志",{"0":{"63":1}}],["错误日志上报",{"2":{"4":1}}],["服务器也需要做相应的配置调整",{"2":{"113":1}}],["号能不能去掉",{"0":{"113":1}}],["项目就固定在什么版本了",{"2":{"164":1}}],["项目",{"0":{"113":1}}],["项目开发完成之后",{"2":{"45":1}}],["版本",{"2":{"112":1,"122":1}}],["版本开始",{"2":{"112":1}}],["403",{"2":{"145":1}}],["4",{"2":{"112":3}}],["慢",{"2":{"112":1}}],["快",{"2":{"112":1}}],["具体可以阅读这篇文章了解",{"2":{"112":2}}],["具体使用如下",{"2":{"102":1}}],["常见问题",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1}}],["常用的",{"2":{"36":1}}],["常用",{"0":{"24":1},"1":{"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1}}],["常用邮箱",{"2":{"1":1}}],["确保唯一",{"2":{"107":1}}],["确保接口可以请求成功",{"2":{"82":1}}],["预设",{"2":{"165":1}}],["预设了一些规范",{"2":{"139":1}}],["预设模板文件存放在",{"2":{"106":1}}],["预览",{"0":{"46":1}}],["按照之前记录的文档可以有个大致的迁移方案",{"2":{"164":1}}],["按照特定规则创建文件或者文件夹",{"2":{"106":1}}],["按照实际情况进行调整",{"2":{"82":1}}],["指令进行创建",{"2":{"148":1}}],["指令进行组件生成",{"2":{"72":1}}],["指令可以自行选择",{"2":{"106":1}}],["种模式的目录结构进行创建新的模板",{"2":{"106":1}}],["种模式",{"2":{"106":2}}],["种类型",{"2":{"81":2}}],["实现",{"2":{"106":1}}],["现在你可以用更简洁的方式来处理这一切",{"2":{"106":1}}],["业务页面里使用到的颜色将不能写成固定值",{"2":{"161":1}}],["业务有大有小",{"2":{"105":1}}],["业务应用静态页面",{"2":{"4":1}}],["根据不同角色动态设置该角色所拥有的权限",{"2":{"105":1}}],["小技巧",{"0":{"105":1}}],["才会生效",{"2":{"144":1}}],["才验证通过",{"2":{"102":1,"103":1,"104":1}}],["才允许提交到",{"2":{"56":1}}],["遇到更多的情况通常是",{"2":{"101":1}}],["表示当前路由允许具备其中一个权限的用户可访问",{"2":{"145":1}}],["表示当前路由仅允许具备该权限的用户可访问",{"2":{"145":1}}],["表示当前路由页面跳转到设置的",{"2":{"143":1,"144":1}}],["表示内存空间大小",{"2":{"116":1}}],["表示操作类型",{"2":{"101":1}}],["表示模块名",{"2":{"101":1}}],["表示该功能仅提供于专业版使用",{"2":{"80":1}}],["yarn",{"2":{"146":2}}],["yaml",{"2":{"59":3,"62":1,"146":1}}],["yyy",{"2":{"101":2}}],["导航入口",{"2":{"100":1}}],["导航里切换帐号查看不同权限下的效果",{"2":{"100":1}}],["导航栏右侧图标区域",{"2":{"87":1}}],["导航栏左侧图标区域",{"2":{"87":1}}],["导航栏标题区域",{"2":{"87":1}}],["导航栏标题是否居中",{"2":{"86":1}}],["导航栏标题非居中",{"2":{"4":1}}],["导航栏",{"0":{"89":1},"1":{"90":1,"91":1},"2":{"77":1,"156":2,"157":3}}],["导航栏自定义标题",{"2":{"4":1}}],["导航栏模式",{"2":{"4":1,"86":1}}],["导航栏预设按钮",{"2":{"4":1}}],["激活时显示图标",{"2":{"97":1}}],["显著提升了开发服务器的性能",{"2":{"112":1}}],["显示文字",{"2":{"98":1}}],["显示图标",{"2":{"96":1}}],["显隐固定",{"2":{"91":1}}],["跳转路由地址",{"2":{"95":2}}],["列表",{"2":{"94":1}}],["属性指定当前页面使用哪套标签栏",{"2":{"94":1}}],["往上滚动时显示",{"2":{"91":1}}],["粘性",{"2":{"91":1}}],["始终固定在顶部",{"2":{"91":1}}],["固定",{"2":{"91":1}}],["跟随页面滚动",{"2":{"91":1}}],["静止",{"2":{"91":1}}],["事件名",{"2":{"88":1}}],["事件总线",{"0":{"31":1}}],["插槽名",{"2":{"87":1}}],["插件都是用",{"2":{"117":1}}],["插件",{"2":{"83":1,"165":2}}],["前提条件",{"2":{"86":1}}],["前缀",{"2":{"23":1,"42":1}}],["它针对通用场景提供了一套标准且易于扩展设计",{"2":{"173":1}}],["它将提高很多开发上的效率",{"2":{"167":1}}],["它比",{"2":{"151":1,"166":1}}],["它必须应用在根节点",{"2":{"85":1}}],["它提供了页面整体布局的基础",{"2":{"84":1}}],["记录滚动位置等特性",{"2":{"84":1}}],["记录用户账号",{"2":{"63":1}}],["返回",{"2":{"104":3}}],["返回顶部",{"2":{"84":1}}],["返回到新闻列表页时",{"2":{"81":1}}],["顶部标签栏",{"2":{"84":1}}],["了解并熟悉框架使用到的技术栈",{"2":{"123":1}}],["了",{"2":{"83":1}}],["最后分享一篇关于暗黑模式的文章",{"2":{"161":1}}],["最后在应用配置中使用该主题",{"2":{"157":1}}],["最后在开发中就可以直接使用",{"2":{"83":1}}],["最后使用",{"2":{"146":1}}],["最终发布时可能会有变动",{"2":{"120":1}}],["最终输出就是",{"2":{"83":1}}],["最终解释权归",{"2":{"3":1}}],["忽略某些文件夹下的文件或特定文件",{"2":{"83":1}}],["媒体查询里的单位是否需要转换单位",{"2":{"83":1}}],["选择其中一种模式进行业务开发",{"2":{"161":1}}],["选择器",{"2":{"83":1}}],["选项",{"2":{"76":1}}],["选项为",{"2":{"45":1}}],["希望帮助你更好地在暗黑模式下开发出优秀的页面",{"2":{"161":1}}],["希望使用的视口单位",{"2":{"83":1}}],["希望你可以去",{"2":{"80":1}}],["设计稿的视口宽度",{"2":{"83":1}}],["设置水印",{"2":{"171":1}}],["设置水印内容",{"0":{"171":1}}],["设置多个权限的名称数组",{"2":{"145":1}}],["设置某个权限的名称",{"2":{"145":1}}],["设置某个目标路由的",{"2":{"143":1,"144":1}}],["设置可以添加多个参数",{"2":{"139":1}}],["设置为",{"2":{"117":1,"143":1,"145":1}}],["设置不同的类型值",{"2":{"99":1}}],["设置横向滚动条位置",{"2":{"86":1}}],["设置竖向滚动条位置",{"2":{"86":1}}],["设置最小的转换数值",{"2":{"83":1}}],["设置成",{"2":{"81":1}}],["设置了拦截器",{"2":{"37":1}}],["设置",{"0":{"35":1},"2":{"43":1,"94":1}}],["设置自定义标题",{"0":{"29":1}}],["移动端支持",{"0":{"83":1}}],["移除",{"0":{"57":1}}],["计算属性",{"2":{"82":1}}],["函数",{"2":{"82":1}}],["什么状态下是请求异常",{"2":{"82":1}}],["针对一些简单场景",{"2":{"105":1}}],["针对这样的需求",{"2":{"102":1}}],["针对这些问题你需要依次检查以下几点",{"2":{"82":1}}],["针对上述场景",{"2":{"81":1}}],["经常会遇到一些问题",{"2":{"82":1}}],["登录接口请求成功",{"2":{"82":1}}],["登录",{"0":{"82":1}}],["新增新闻页",{"2":{"81":1}}],["新增新闻页就不再需要缓存了",{"2":{"81":1}}],["新闻模块的编辑权限",{"2":{"101":1}}],["新闻模块的浏览权限",{"2":{"101":1}}],["新闻列表页才会被缓存",{"2":{"81":2}}],["新闻列表页",{"2":{"81":2}}],["新闻列表页上的数据是不会重新加载",{"2":{"81":1}}],["新闻内容",{"2":{"36":1,"42":1}}],["新闻标题",{"2":{"36":1,"42":1}}],["一般为",{"2":{"147":1}}],["一键切换源",{"2":{"146":1}}],["一起使用",{"2":{"99":1,"168":1}}],["一旦新闻新增成功",{"2":{"81":1}}],["一个路由可以配置多个权限",{"2":{"101":1}}],["一个用户管理",{"2":{"81":1}}],["一个新闻管理",{"2":{"81":1}}],["仅在某些特定条件下才关闭缓存",{"2":{"81":1}}],["还不熟悉",{"2":{"148":1}}],["还有一种场景",{"2":{"81":1}}],["还是用上面的例子",{"2":{"81":1}}],["还是",{"2":{"81":1}}],["还是生产环境都需要使用到",{"2":{"59":1}}],["数组",{"2":{"81":1,"143":1,"144":1}}],["数据冲突的方式就是增加前缀区分",{"2":{"147":1}}],["数据冲突",{"2":{"147":1}}],["数据会共享",{"2":{"147":1}}],["数据编写规则请阅读",{"2":{"41":1}}],["数据是前端开发过程中必不可少的一环",{"2":{"41":1}}],["数据",{"0":{"147":1},"2":{"4":1}}],[">新增部门",{"2":{"103":3}}],[">",{"2":{"81":6,"85":1,"94":2,"102":6,"103":3,"105":2,"114":1,"126":6,"133":6,"140":2,"150":2,"152":8,"153":2,"167":1,"168":3,"171":1}}],["├──",{"2":{"81":4,"139":11}}],["└──",{"2":{"81":6,"139":7}}],["比如",{"2":{"82":1}}],["比如上一级页面",{"2":{"81":1}}],["比较大的区别是生产环境里调用",{"2":{"43":1}}],["除了可以在",{"2":{"151":1}}],["除了通过",{"2":{"148":1}}],["除了默认提供的",{"2":{"106":1}}],["除非手动进行浏览器刷新",{"2":{"81":1}}],["除此之外",{"2":{"2":1,"64":1}}],["就在使用的开发者",{"2":{"166":1}}],["就会根据文件目录自动生成对应的路由",{"2":{"138":1}}],["就会被缓存",{"2":{"81":1}}],["就不会出现该警告了",{"2":{"111":1}}],["就是",{"2":{"150":1}}],["就是在",{"2":{"111":1}}],["就是某个页面始终开启缓存",{"2":{"81":1}}],["就是该页面一旦访问就永久被缓存住了",{"2":{"81":1}}],["就分别是请求和响应的拦截代码了",{"2":{"37":1}}],["很好理解",{"2":{"81":1}}],["唯一id",{"2":{"148":1}}],["唯一",{"2":{"81":1}}],["那有没有解决办法么",{"2":{"164":1}}],["那也可以使用下面这种方法",{"2":{"161":1}}],["那没有什么需要注意的",{"2":{"161":1}}],["那么我们建议你在开发的时候",{"2":{"167":1}}],["那么我们建议你阅读",{"2":{"167":1}}],["那么你可以使用",{"2":{"153":1}}],["那么上面那个例子就表示",{"2":{"101":1}}],["那我们就开始吧~",{"2":{"80":1}}],["那语言包文件就会变得无比庞大且难以维护",{"2":{"78":1}}],["帮我点个",{"2":{"80":1}}],["码云",{"2":{"80":1}}],["相对于其他同类",{"2":{"165":1}}],["相关",{"2":{"114":1,"167":1}}],["相关的错误都不会在控制台里显示",{"2":{"63":1}}],["相信你已经准备或正在使用",{"2":{"80":1}}],["⭐",{"2":{"80":1}}],["⭐⭐⭐⭐⭐",{"2":{"80":1}}],["⭐功能与服务⭐",{"2":{"4":1}}],["更是框架",{"0":{"173":1}}],["更灵活且易读",{"2":{"166":1}}],["更多设置项请查看",{"2":{"171":1}}],["更多",{"2":{"78":1}}],["更新日志",{"0":{"50":1},"1":{"51":1}}],["自定义图标",{"0":{"150":1}}],["自定义块进行语言维护",{"2":{"78":1}}],["自定义字体",{"0":{"64":1},"1":{"65":1,"66":1,"67":1}}],["单位",{"2":{"165":1}}],["单位的",{"2":{"165":1}}],["单位从而实现移动端适配",{"2":{"165":1}}],["单位转换成",{"2":{"165":1}}],["单位转换后保留的精度",{"2":{"83":1}}],["单权限验证",{"2":{"102":1,"103":1,"104":1}}],["单页组件",{"0":{"78":1}}],["单独开启",{"2":{"47":2}}],["值",{"2":{"77":1,"142":1}}],["光设置好中文",{"2":{"77":1}}],["打开",{"2":{"77":1}}],["路由元信息",{"0":{"141":1},"1":{"142":1,"143":1,"144":1,"145":1}}],["路由参数通过",{"2":{"139":1}}],["路由地址",{"2":{"139":1}}],["路由",{"0":{"138":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1},"2":{"139":4}}],["路由跳转导致页面空白",{"0":{"115":1}}],["路由权限是比较暴力的",{"2":{"101":1}}],["路由权限",{"0":{"101":1},"2":{"145":1}}],["路由设置",{"0":{"77":1}}],["路径",{"2":{"40":1}}],["日本語",{"2":{"76":1}}],["日期",{"0":{"32":1}}],["繁體",{"2":{"76":1}}],["简体",{"2":{"76":1,"77":2}}],["简单封装",{"2":{"31":1,"32":1}}],["key",{"2":{"76":8,"77":1,"142":1,"147":8}}],["kit",{"2":{"13":1}}],["引入",{"2":{"76":1}}],["zhcn",{"2":{"126":4,"133":3}}],["zh",{"2":{"76":4,"77":1,"126":4,"133":3}}],["zip",{"2":{"48":3,"59":2}}],["join",{"2":{"156":4,"157":6}}],["javascript",{"2":{"116":1,"117":2}}],["ja",{"2":{"76":3}}],["jsmodule",{"2":{"83":1}}],["js",{"2":{"54":3,"55":3,"83":1,"106":1,"122":1,"148":1}}],["json",{"2":{"40":1,"56":3,"57":2,"76":1,"77":2,"111":2,"116":2,"117":1,"122":1,"146":1}}],["扩展",{"0":{"75":1}}],["扩展组件为框架封装的组件",{"2":{"14":1}}],["扩展组件",{"0":{"14":1},"2":{"4":1}}],["建立一个",{"2":{"73":1}}],["建议使用",{"2":{"148":1}}],["建议使用最新",{"2":{"122":1}}],["建议先阅读官方文档",{"2":{"139":1}}],["建议",{"2":{"52":1}}],["建议按照不同模块区分文件夹",{"2":{"42":1}}],["局部组件则在",{"2":{"108":1}}],["局部组件没有提供专门的存放目录",{"2":{"73":1}}],["局部组件",{"0":{"73":1}}],["详细可查看",{"2":{"72":1}}],["详细可阅读",{"2":{"21":1,"25":1,"26":1,"96":1,"97":1,"113":1,"142":1,"143":1,"144":1,"145":1}}],["推荐在每个页面组件里使用",{"2":{"78":1}}],["推荐安装",{"2":{"75":1}}],["推荐使用",{"2":{"72":1}}],["推荐根据模块来统一管理接口",{"2":{"38":1}}],["每个组件的文件夹内至少保留一个文件名为",{"2":{"72":1}}],["每个组件按文件夹进行区分",{"2":{"72":1}}],["每一位专业版用户可免费绑定一位开发者",{"2":{"2":1}}],["公共组件存放在",{"2":{"72":1}}],["公共组件在使用时",{"2":{"72":1}}],["公共组件",{"0":{"72":1}}],["资源并不是全局样式",{"2":{"70":1}}],["资源也是全局可调用的",{"2":{"70":1}}],["资源目录",{"2":{"70":1}}],["精灵图目录下生成的",{"2":{"70":1}}],["无法像",{"2":{"164":1}}],["无法正常登录",{"2":{"82":1}}],["无导航栏",{"2":{"77":1}}],["无需手动",{"2":{"167":1}}],["无需手动引入",{"2":{"72":1}}],["无需在页面上引用即可生效并使用",{"2":{"70":1}}],["无论有意或无意",{"2":{"3":1}}],["样式存放目录为",{"2":{"70":1}}],["样式",{"0":{"70":1}}],["图片预览",{"2":{"122":1}}],["图片",{"0":{"69":1}}],["图标字符串不支持异步返回",{"2":{"152":1}}],["图标字符串不支持拼接",{"2":{"152":1}}],["图标时",{"2":{"152":1}}],["图标文件放到",{"2":{"150":1}}],["图标文件的网站",{"2":{"150":1}}],["图标",{"0":{"149":1,"151":1},"1":{"150":1,"151":1,"152":2,"153":2},"2":{"21":1,"96":1,"97":1,"152":1}}],["图标名",{"2":{"21":1,"152":1,"153":1}}],["另外你也可以将",{"2":{"67":1}}],["名称在",{"2":{"67":1}}],["随后引入文件夹中的",{"2":{"67":1}}],["将设计稿转换为",{"2":{"165":1}}],["将",{"2":{"165":1}}],["将准备好的",{"2":{"150":1}}],["将无法与官方环境锁定的依赖包版本保持一致",{"2":{"146":1}}],["将参数名包裹",{"2":{"139":1}}],["将上一步下载的压缩包解压并放入",{"2":{"67":1}}],["将错误日志记录在",{"2":{"63":1}}],["点击下载",{"2":{"66":1}}],["点击即可打开开发者工具",{"2":{"62":1}}],["找字体",{"0":{"65":1}}],["7regular",{"2":{"67":2}}],["7",{"2":{"64":1,"67":4}}],["文档",{"2":{"106":1}}],["文档中标记",{"2":{"80":1}}],["文档中提供的配置介绍",{"2":{"60":1}}],["文档说明",{"0":{"80":1}}],["文件后",{"2":{"146":1}}],["文件内设置并覆盖",{"2":{"139":1}}],["文件会生成一个空路由",{"2":{"139":1}}],["文件删除或修改为",{"2":{"82":1}}],["文件可以看到路由相关的配置",{"2":{"77":1}}],["文件中",{"2":{"155":1}}],["文件中有限制",{"2":{"122":1}}],["文件中查阅",{"2":{"60":1}}],["文件中进行配置",{"2":{"60":1}}],["文件中进行修改",{"2":{"55":1}}],["文件中进行覆盖",{"2":{"54":1}}],["文件即可",{"2":{"57":1}}],["文件",{"2":{"47":1,"48":1,"66":1,"70":1,"126":4,"133":4,"150":1}}],["文件夹与",{"2":{"146":1}}],["文件夹并重新安装依赖",{"2":{"146":1}}],["文件夹下的文件均不会生成路由",{"2":{"139":1}}],["文件夹或文件名开头为",{"2":{"139":1}}],["文件夹专门用于存放局部组件",{"2":{"73":1}}],["文件夹名称即为组件名",{"2":{"72":1}}],["文件夹一般需要部署至服务器才算部署发布成功",{"2":{"46":1}}],["文件夹",{"2":{"45":2}}],["文件新增或修改后会自动更新",{"2":{"42":1}}],["文件存放在",{"2":{"42":1}}],["文件复制一份",{"2":{"40":1}}],["文件里进行引用",{"2":{"106":1}}],["文件里找到",{"2":{"100":1}}],["文件里做以下调整",{"2":{"76":1}}],["文件里编写业务代码",{"2":{"63":1}}],["文件里配置第二个数据源的",{"2":{"40":1}}],["文件里",{"2":{"39":1,"70":1}}],["文件里实例化了",{"2":{"37":1}}],["文件里的注释代码开启即可",{"2":{"83":1}}],["文件里的",{"2":{"35":1}}],["文件名",{"2":{"21":1}}],["我还收集了一些文字",{"2":{"148":1}}],["我的",{"2":{"60":1,"94":2}}],["我们尽量在提交代码时标明每次提交改动的变更记录说明",{"2":{"164":1}}],["我们希望新增新闻页始终开启缓存",{"2":{"81":1}}],["我们就可以对新增新闻页的路由设置成",{"2":{"81":1}}],["我们就可以对新闻列表页的路由设置成",{"2":{"81":1}}],["我们就可以将其进行忽略",{"2":{"54":1,"55":1}}],["我们把新闻列表页设置为",{"2":{"81":1}}],["我们只要在需要进行缓存的路由",{"2":{"81":2}}],["我们建议采用就近原则",{"2":{"73":1}}],["我们已经将大部分工作做好了",{"2":{"12":1}}],["我们不承担任何责任",{"2":{"3":1}}],["我们有权利收回产品授权及更新权限",{"2":{"3":1}}],["我们会邀请你加入组织",{"2":{"1":1}}],["主体",{"2":{"156":2,"157":3}}],["主题名称",{"2":{"157":1}}],["主题配色存放在",{"2":{"155":1}}],["主题",{"0":{"154":1},"1":{"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1}}],["主题风格",{"2":{"4":1}}],["主要是",{"2":{"112":1}}],["主页",{"2":{"60":1,"94":2}}],["特色",{"2":{"60":1}}],["关于配置的类型定义",{"2":{"60":1}}],["应用配置",{"0":{"60":1}}],["应用配置面板",{"2":{"59":3}}],["目前只能手动刷新浏览器",{"2":{"115":1}}],["目的是方便开发者在开发阶段调试",{"2":{"59":1}}],["目录结构",{"2":{"139":1}}],["目录是",{"2":{"56":1}}],["目录为",{"2":{"38":1}}],["目录下创建文件",{"2":{"138":1}}],["目录下生成一个对应的文件",{"2":{"109":1}}],["目录下选择指定的文件夹进行生成",{"2":{"107":1,"108":1}}],["目录下新增并配置好了一个日文语言包",{"2":{"76":1}}],["目录下找到对应组件自行修改",{"2":{"14":1}}],["目录下",{"2":{"13":1,"67":1,"69":1,"72":1,"76":1,"106":1,"148":1,"150":1}}],["该依赖会自动导入",{"2":{"167":1}}],["该路由仅登录用户可访问",{"2":{"145":1}}],["该路由访问权限",{"2":{"145":1}}],["该路由页面会被一直缓存",{"2":{"143":1}}],["该属性通常搭配",{"2":{"144":1}}],["该能力由",{"2":{"138":1}}],["该功能基于",{"2":{"106":1}}],["该方法用于登录成功后获取用户权限",{"2":{"100":1}}],["该项配置最终会通过",{"2":{"96":1,"97":1}}],["该页面只要一被访问",{"2":{"81":1}}],["该特性由",{"2":{"61":1,"72":1,"74":1}}],["该变量是开启应用配置面板",{"2":{"59":1}}],["该配置即用于代理",{"2":{"39":1,"40":1}}],["章节",{"2":{"59":1}}],["测试",{"2":{"59":1}}],["测试环境和生产环境用于构建使用",{"2":{"59":1}}],["测试环境",{"2":{"59":1}}],["调试工具",{"2":{"59":3}}],["分别为",{"2":{"59":1}}],["提示内存溢出",{"0":{"116":1}}],["提交时强制进行代码规范校验",{"2":{"57":1}}],["提供了更加细致的适配策略",{"2":{"165":1}}],["提供了大量示例代码",{"2":{"119":1}}],["提供的所有图标",{"2":{"152":1}}],["提供的图标",{"2":{"96":1,"97":1}}],["提供支持",{"2":{"72":1}}],["提供技术支持",{"2":{"61":1,"74":1}}],["提供开发和生产模拟服务",{"2":{"41":1}}],["提供",{"2":{"12":1,"138":1,"151":1}}],["提供新特性",{"2":{"4":1}}],["脚本",{"2":{"56":1}}],["此处的对象属性和",{"2":{"126":1,"133":1}}],["此处填写接口地址",{"2":{"40":1}}],["此目录下还有一个特殊目录",{"2":{"70":1}}],["此外",{"2":{"56":1}}],["安装依赖",{"2":{"125":1,"132":1,"146":3}}],["安装依赖时有警告",{"0":{"111":1}}],["安装它们将在一定程度上提升开发效率",{"2":{"122":1}}],["安装",{"0":{"125":1,"132":1},"2":{"116":1,"125":1,"132":1}}],["安装该扩展后",{"2":{"75":1}}],["安装命令",{"2":{"56":1}}],["安装指定模块并开启后才会生效",{"2":{"47":1}}],["环境变量和模式",{"2":{"59":1}}],["环境配置",{"0":{"59":1}}],["环境",{"2":{"56":1}}],["环境初始化之后再执行一遍",{"2":{"56":1}}],["环境初始化",{"2":{"56":1}}],["直接点击安装即可",{"2":{"122":1}}],["直接拉取源码可能会包含未发布的内容",{"2":{"120":1}}],["直接使用了",{"2":{"67":1}}],["直接覆盖",{"2":{"40":1}}],["直到开发者修改完所有错误代码后",{"2":{"56":1}}],["检测",{"2":{"56":1}}],["仓库目录和框架目录并非同一个",{"2":{"56":1}}],["仓库里的代码不会有不规范的代码",{"2":{"56":1}}],["仓库",{"2":{"56":2}}],["只需要在开发前",{"2":{"165":1}}],["只需将必要的一些新特性或",{"2":{"164":1}}],["只需将根目录下",{"2":{"83":1}}],["只有路由",{"2":{"139":1}}],["只有大于",{"2":{"83":1}}],["只是源码仓库不同",{"2":{"121":1}}],["只能在",{"2":{"107":1}}],["只能对代码的书写规范进行格式化",{"2":{"56":1}}],["只要满足其中任何一个",{"2":{"101":1}}],["只记录",{"2":{"50":1}}],["能够成为你的得力助手",{"2":{"173":1}}],["能够让前端开发独立自主",{"2":{"41":1}}],["能让你使用本框架更得心应手",{"2":{"123":1}}],["能转化为",{"2":{"83":1}}],["能做的事比较有限",{"2":{"56":1}}],["由于登录页使用了",{"2":{"127":1,"134":1}}],["由于框架默认使用的是",{"2":{"124":1,"131":1}}],["由于权限配置不涉及角色",{"2":{"105":1}}],["由于开启错误日志监控后",{"2":{"63":1}}],["由于",{"2":{"56":1,"147":2}}],["官网",{"2":{"152":1}}],["官网的操作更直观",{"2":{"151":1}}],["官网上查找搜需要的图标",{"2":{"151":1}}],["官网学习外",{"2":{"148":1}}],["官网规则并在",{"2":{"54":1,"55":1}}],["官方提供的使用方式",{"2":{"153":1}}],["官方状态库",{"2":{"148":1}}],["官方组织",{"2":{"121":1}}],["官方可能会修复这个问题",{"2":{"115":1}}],["官方文档了解",{"2":{"167":1}}],["官方文档",{"2":{"41":1}}],["通常情况下无需做任何修改",{"2":{"53":1}}],["通过简单的配置即可轻松完成页面的设计和布局",{"2":{"173":1}}],["通过上面的示例",{"2":{"139":1}}],["通过",{"2":{"106":1,"140":1}}],["通过修改",{"2":{"54":1,"55":1}}],["通过预先跟服务器端约定好的接口",{"2":{"41":1}}],["通过微信或支付宝扫码支付",{"2":{"1":1}}],["准备工作完成后",{"2":{"146":1}}],["准备工作",{"0":{"118":1},"1":{"119":1,"120":1,"121":1,"122":1,"123":1},"2":{"52":1}}],["代码调整",{"0":{"126":1,"133":1}}],["代码不会受到影响",{"2":{"117":1}}],["代码里可以实时查看对应语言的内容",{"2":{"75":1}}],["代码文件自动生成",{"0":{"106":1},"1":{"107":1,"108":1,"109":1},"2":{"72":1}}],["代码规范",{"0":{"52":1},"1":{"53":1,"54":1,"55":1,"56":1,"57":1}}],["代码很简单",{"2":{"37":1}}],["其实也有",{"2":{"164":1}}],["其实大部分",{"2":{"164":1}}],["其原理就是通过预设模板",{"2":{"106":1}}],["其它语言包文件里也要同步添加",{"2":{"77":1}}],["其它设置",{"0":{"49":1}}],["其次在这个目录里的文件",{"2":{"70":1}}],["其中有一个",{"2":{"101":1}}],["其中",{"2":{"42":1,"59":1,"76":1,"101":1,"116":1}}],["两个类型的参数值",{"2":{"81":1}}],["两个数据源的",{"2":{"40":1}}],["两者均需要",{"2":{"47":1}}],["两者可以共存",{"2":{"47":1}}],["压缩率更高的算法",{"2":{"47":1}}],["压缩",{"0":{"47":1}}],["生成的路由和行为都是一样的",{"2":{"139":1}}],["生成的文件中",{"2":{"107":1}}],["生成其它格式的字体文件",{"2":{"66":1}}],["生成字体",{"0":{"66":1}}],["生成",{"2":{"48":2}}],["生成存档",{"0":{"48":1}}],["生成好的",{"2":{"46":1}}],["生产环境下默认关闭",{"2":{"59":1}}],["生产环境一般都是调用真实接口",{"2":{"43":1}}],["生产环境",{"0":{"43":1},"2":{"59":1}}],["生产环境的跨域需要服务端去解决",{"2":{"39":1}}],["否则不清除缓存",{"2":{"144":1}}],["否则不缓存",{"2":{"143":1}}],["否则会出现资源引用错误",{"2":{"45":1}}],["否则我们有权利收回产品授权及更新权限",{"2":{"3":1}}],["watermarkstore",{"2":{"171":3}}],["watermark",{"2":{"171":3}}],["watch",{"2":{"126":1,"133":2}}],["white",{"2":{"161":1}}],["window",{"2":{"90":1}}],["width",{"2":{"19":2}}],["website",{"2":{"60":1}}],["www",{"2":{"45":1}}],["对应的路由页面时",{"2":{"143":1,"144":1}}],["对应的",{"2":{"142":1}}],["对应会在根目录生成",{"2":{"45":1}}],["对权限没有这么多复杂的要求",{"2":{"105":1}}],["对于从",{"2":{"166":1}}],["对于单个元素",{"2":{"103":1}}],["对于一些无法自动修复的错误代码",{"2":{"56":1}}],["对项目进行过",{"2":{"56":1}}],["对本次提交变更的文件进行分别进行",{"2":{"56":1}}],["对象属性一一对应",{"2":{"126":1,"133":1}}],["对象里配置",{"2":{"81":2}}],["对象里可以扩展需要开启国际化支持的路由",{"2":{"77":1}}],["对象",{"2":{"37":2,"40":1}}],["对象内参数为",{"2":{"19":1}}],["则",{"2":{"157":1}}],["则将当前路由页面清除缓存",{"2":{"144":1}}],["则将当前路由页面进行缓存",{"2":{"143":1}}],["则无需将列表页进行缓存",{"2":{"143":1}}],["则需要将列表页进行缓存",{"2":{"143":1}}],["则需要在",{"2":{"45":1,"56":1}}],["则可以访问该路由",{"2":{"105":1}}],["则可设置为",{"2":{"35":1}}],["则验证通过",{"2":{"102":1,"103":1,"104":1}}],["则视为用户有访问该路由的权限",{"2":{"101":1}}],["则不需要对新闻列表页进行缓存",{"2":{"81":1}}],["则在导航栏里看不到",{"2":{"100":1}}],["则在",{"2":{"56":1}}],["则会阻止本次代码提交",{"2":{"56":1}}],["则会将不符合规则的代码自动进行格式化",{"2":{"54":1,"55":1}}],["则执行",{"2":{"45":1}}],["会各种客观原因存在",{"2":{"117":1}}],["会根据当前文件目录和文件名自动生成",{"2":{"107":1}}],["会按照你输入的中文名称替换",{"2":{"107":1}}],["会在语言选择器里显示",{"2":{"76":1}}],["会在根目录生成",{"2":{"45":1}}],["会自动访问页面",{"2":{"146":1}}],["会自动下载字体文件",{"2":{"64":1}}],["会自动对当前文件进行代码格式化操作",{"2":{"52":1}}],["会有属性的介绍",{"2":{"60":1}}],["会设置到",{"2":{"59":3}}],["会通过",{"2":{"56":1}}],["会请求本地的",{"2":{"42":1}}],["命令预览不同环境构建出的文件夹",{"2":{"46":1}}],["命令",{"2":{"45":1}}],["命令进行构建",{"2":{"45":1}}],["命名可随意",{"2":{"40":1}}],["构建时失败并在错误信息里提示",{"2":{"116":1}}],["构建报错",{"0":{"116":1}}],["构建打包成功之后",{"2":{"45":1}}],["构建",{"0":{"45":1}}],["构建与预览",{"0":{"44":1},"1":{"45":1,"46":1,"47":1,"48":1,"49":1}}],["差异不大",{"2":{"43":1}}],["也方便后人查阅",{"2":{"176":1}}],["也就是说",{"2":{"174":1}}],["也就是局部更新",{"2":{"164":1}}],["也是社区内人气较高的项目",{"2":{"174":1}}],["也请告诉我们有哪些可改进的地方",{"2":{"173":1}}],["也兼顾了桌面端的使用场景",{"2":{"165":1}}],["也升级到了",{"2":{"112":1}}],["也可以使用",{"2":{"146":1}}],["也可以将角色直接配置到",{"2":{"105":1}}],["也可通过",{"2":{"139":1}}],["也可使用",{"2":{"96":1,"97":1}}],["也提供了",{"2":{"103":1}}],["也建议关闭",{"2":{"59":1}}],["也只适用于一些简单的示例网站及预览网站",{"2":{"43":1}}],["也替换为",{"2":{"40":1}}],["即没有权限则该路由页面无法访问",{"2":{"101":1}}],["即",{"2":{"70":1}}],["即不管是在开发",{"2":{"59":1}}],["即可使用",{"2":{"67":1}}],["即可",{"2":{"56":1,"117":1}}],["即可在构建完后成生成",{"2":{"48":1}}],["即可在构建时生成",{"2":{"47":1}}],["即使开启跨域代理也不影响",{"2":{"42":1}}],["即项目开发中",{"2":{"42":1}}],["而不仅仅是",{"2":{"173":1}}],["而不添加备用属性",{"2":{"83":1}}],["而业务代码则可以直接拷贝过去",{"2":{"164":1}}],["而从列表页进入其它页面",{"2":{"143":1}}],["而从新闻列表页进入用户列表页",{"2":{"81":1}}],["而且大部分框架",{"2":{"117":1}}],["而鉴权函数则更多是使用在业务流程代码里的权限判断",{"2":{"104":1}}],["而是基于文件系统自动生成路由",{"2":{"138":1}}],["而是其它模块的页面",{"2":{"81":1}}],["而是保留了当时离开时的状态",{"2":{"81":1}}],["而其余配置则在不同环境下有不同用途",{"2":{"59":1}}],["而框架目录是",{"2":{"56":1}}],["而",{"2":{"42":1,"60":1,"114":1}}],["如上所示",{"2":{"105":1}}],["如下图所示",{"2":{"120":1}}],["如下",{"2":{"101":1}}],["如下所示",{"2":{"42":1}}],["如",{"2":{"45":1}}],["如果一时半会没办法立马上手",{"2":{"166":1}}],["如果一同域名下部署两套系统",{"2":{"147":1}}],["如果只在明亮或暗黑模式中",{"2":{"161":1}}],["如果只是几个接口需求从其它数据源请求",{"2":{"40":1}}],["如果主题是暗黑模式下使用的",{"2":{"157":1}}],["如果框架提供的主题风格满足不了你的需求",{"2":{"157":1}}],["如果确实有以上需求",{"2":{"152":1}}],["如果依旧无法运行",{"2":{"146":1}}],["如果无法正常安装依赖",{"2":{"146":1}}],["如果对",{"2":{"139":1}}],["如果对上述的步骤还有不清楚的地方",{"2":{"130":1,"137":1}}],["如果对这个问题感兴趣",{"2":{"111":1}}],["如果对这块不熟悉",{"2":{"59":1}}],["如果必须要用传统",{"2":{"117":1}}],["如果用户是",{"2":{"105":1}}],["如果用户从新闻列表页进入的不是新闻详情页",{"2":{"81":1}}],["如果标记需要动态更新",{"2":{"99":1}}],["如果应用配置里配置了多套标签栏",{"2":{"86":1}}],["如果为",{"2":{"83":1}}],["如果业务不需要用户体系",{"2":{"82":1}}],["如果有两个模块",{"2":{"81":1}}],["如果有报错",{"2":{"56":1}}],["如果每个页面都要做国际化支持",{"2":{"78":1}}],["如果使用的不是",{"2":{"100":1}}],["如果使用",{"2":{"75":1}}],["如果需要新增某个路由的国际化支持",{"2":{"77":1}}],["如果需要在开发环境下测试",{"2":{"63":1}}],["如果需要使用",{"2":{"43":1}}],["如果在本地的开发环境使用中报错或者无法生效",{"2":{"60":1}}],["如果不需要开启则留空",{"2":{"59":3}}],["如果不想在",{"2":{"57":1}}],["如果不想让生产环境里的请求走",{"2":{"43":1}}],["如果",{"2":{"56":1}}],["如果没有改正到就被推送到",{"2":{"56":1}}],["如果规则支持自动修复",{"2":{"54":1,"55":1}}],["如果最终访问地址为域名非根节点",{"2":{"45":1}}],["如果是需要构建测试环境",{"2":{"45":1}}],["如果项目中有涉及到上传功能",{"2":{"43":1}}],["如果项目里需要从多个不同地址的数据源请求数据",{"2":{"40":1}}],["如果项目里的接口很多",{"2":{"38":1}}],["如果第二个数据源也需要开启跨域处理的话",{"2":{"40":1}}],["如果本地开发环境请求接口提示跨域",{"2":{"39":1}}],["如果觉得用着不顺手",{"2":{"14":1}}],["如果你正在做技术选型",{"2":{"174":1}}],["如果你在使用过",{"2":{"173":1}}],["如果你在安装依赖后再初始化了",{"2":{"56":1}}],["如果你已经熟悉",{"2":{"167":1}}],["如果你还不熟悉",{"2":{"167":1}}],["如果你不习惯使用",{"2":{"161":1}}],["如果你不喜欢",{"2":{"12":1}}],["如果你也觉得麻烦的话",{"2":{"153":1}}],["如果你对其中的技术细节感兴趣",{"2":{"152":1}}],["如果你对",{"2":{"148":1}}],["如果你对默认的规则有异议",{"2":{"54":1,"55":1}}],["如果你恰好需要在同一域名下部署两套",{"2":{"147":1}}],["如果你需要使用",{"2":{"124":1,"131":1}}],["如果你想获取专业版源码",{"2":{"121":1}}],["如果你想使用的组件库不在上述方案中",{"2":{"12":1}}],["如果你准备好了",{"2":{"80":1}}],["如果传入为",{"2":{"6":1,"9":1}}],["强制修改此次请求的地址",{"2":{"42":1}}],["给",{"2":{"42":1}}],["部分关键位置会被替换掉",{"2":{"107":1}}],["部分请求真实接口",{"2":{"42":1}}],["部分请求",{"2":{"42":1}}],["部分功能",{"2":{"4":1}}],["接口文件",{"2":{"43":1}}],["接口的时候",{"2":{"42":1}}],["接口",{"2":{"42":2,"43":1}}],["接口与真实接口共存",{"2":{"42":1}}],["接口请求地址",{"2":{"59":3}}],["接口请求",{"0":{"25":1,"34":1},"1":{"35":1,"36":1,"37":1},"2":{"25":1}}],["quot",{"2":{"146":4}}],["query",{"2":{"42":1}}],["qq",{"2":{"1":1}}],["下的文件",{"2":{"83":1}}],["下载",{"2":{"65":1}}],["下",{"2":{"42":1}}],["模版",{"2":{"174":1}}],["模板",{"2":{"173":1,"174":1}}],["模板不同之处在于",{"2":{"173":1}}],["模式",{"2":{"113":3}}],["模式则会在",{"2":{"109":1}}],["模式可以选择生成的是全局组件还是局部组件",{"2":{"108":1}}],["模式下",{"2":{"107":1}}],["模拟获取用户权限",{"2":{"100":1}}],["模拟请求数据甚至逻辑",{"2":{"41":1}}],["模块管理",{"0":{"38":1}}],["是模板",{"0":{"173":1}}],["是",{"2":{"166":1}}],["是异步请求返回的数据",{"2":{"152":1}}],["是不是觉得很麻烦",{"2":{"106":1}}],["是变量",{"2":{"70":1}}],["是否对该页面清除缓存",{"2":{"144":1}}],["是否对该页面进行缓存",{"2":{"143":1}}],["是否在设置滚动条位置时使用动画过渡",{"2":{"86":1}}],["是否在打包后生成存档",{"2":{"59":2}}],["是否在打包时启用",{"2":{"59":2}}],["是否在打包时生成",{"2":{"49":1}}],["是否记忆滚动位置",{"2":{"86":1}}],["是否展示底部版权信息",{"2":{"86":1}}],["是否启用返回顶部按钮",{"2":{"86":1}}],["是否启用标签栏",{"2":{"86":1}}],["是否启用导航栏",{"2":{"86":1}}],["是否直接更换属性值",{"2":{"83":1}}],["是否开启开发者工具",{"2":{"59":1,"62":1}}],["是否开启代理",{"2":{"59":1}}],["是否折叠",{"2":{"16":1}}],["是比",{"2":{"47":1}}],["是分离前后端开发的关键链路",{"2":{"41":1}}],["同一域名下的",{"2":{"147":1}}],["同演示站",{"2":{"119":1}}],["同时也提供了一些常用的组件和工具函数",{"2":{"173":1}}],["同时得益于",{"2":{"167":1}}],["同时请保证文件名和文件内唯一id保持一致",{"2":{"148":1}}],["同时还增加了一个",{"2":{"147":1}}],["同时框架还使用到了",{"2":{"165":1}}],["同时框架",{"2":{"112":1}}],["同时在",{"2":{"40":1}}],["同样",{"2":{"70":1}}],["同意邀请后",{"2":{"1":1}}],["里定义组件的",{"2":{"168":1}}],["里定一个新的",{"2":{"40":1}}],["里无需导入相关",{"2":{"167":1}}],["里处理缓存逻辑",{"2":{"139":1}}],["里打开源码文件夹",{"2":{"122":1}}],["里安装好以下扩展",{"2":{"122":1}}],["里将",{"2":{"117":1}}],["里的",{"0":{"113":1}}],["里面有给出一个忽略警告的方案",{"2":{"111":1}}],["里面就是构建打包好的文件",{"2":{"45":1}}],["里修改构建脚本指令",{"2":{"116":1}}],["里修改",{"2":{"82":2}}],["里修改响应拦截器里的代码",{"2":{"82":1}}],["里修改开启的条件判断",{"2":{"63":1}}],["里检查接口请求地址是否正确",{"2":{"82":1}}],["里查看",{"2":{"67":1}}],["里",{"2":{"63":1,"105":1}}],["里找到",{"2":{"56":1}}],["里增加一段新的",{"2":{"40":1}}],["里代理部分的设置",{"2":{"39":1}}],["242b33",{"2":{"156":1,"157":1}}],["2024",{"2":{"60":1}}],["2",{"2":{"40":5,"81":1,"167":1}}],["以上",{"2":{"174":2}}],["以上为开发时必备扩展",{"2":{"122":1}}],["以及其他水印相关配置",{"2":{"171":1}}],["以及此链接查看示例网站",{"2":{"130":1,"137":1}}],["以及破坏性变更",{"2":{"50":1}}],["以下面的目录结构为例",{"2":{"139":1}}],["以下则是作者推荐安装的扩展",{"2":{"122":1}}],["以下为示例代码",{"2":{"42":1}}],["以中文",{"2":{"77":1}}],["以",{"2":{"40":1,"67":1}}],["首先明确一点",{"2":{"164":1}}],["首先需要在应用配置中设置一个唯一且不重名的前缀",{"2":{"147":1}}],["首先不管设置",{"2":{"81":1}}],["首先这个目录里只支持",{"2":{"70":1}}],["首先在",{"2":{"40":1}}],["首先初始化",{"2":{"37":1}}],["规则要保持一致",{"2":{"40":1}}],["你依旧可以在项目中使用",{"2":{"166":1}}],["你在哪个时间点开始使用",{"2":{"164":1}}],["你只需进入",{"2":{"152":1}}],["你还可以自定义新的主题",{"2":{"157":1}}],["你还可以自定义新的模式",{"2":{"106":1}}],["你还可以在",{"2":{"151":1}}],["你已经将框架中的",{"2":{"129":1,"136":1}}],["你需要设置的值",{"2":{"81":1}}],["你需要给第二个数据源单独实例化一个",{"2":{"40":1}}],["你也可以通过以下方法引入你需要的自定义字体",{"2":{"64":1}}],["你也可以点击",{"2":{"13":1}}],["你可以更详细描述问题产生的操作步骤",{"2":{"176":1}}],["你可以按照以往的开发习惯进行开发",{"2":{"161":1}}],["你可以使用",{"2":{"152":1,"168":1}}],["你可以使用覆盖",{"2":{"40":1}}],["你可以去阿里巴巴矢量图标库",{"2":{"150":1}}],["你可以根据自己的使用需求自行选择",{"2":{"149":1}}],["你可以执行",{"2":{"116":1}}],["你可以参考现有",{"2":{"106":1}}],["你可以在",{"2":{"100":1,"113":1,"117":1}}],["你可以在每个模块的文件夹下",{"2":{"73":1}}],["你可以打开",{"2":{"60":1}}],["你可以通过运行",{"2":{"54":1,"55":1}}],["你有两种方式可以实现",{"2":{"40":1}}],["多权限验证",{"2":{"102":2,"103":2,"104":2}}],["多数据源",{"0":{"40":1}}],["多套标签栏",{"2":{"4":1}}],["x3c",{"2":{"81":9,"85":5,"94":5,"102":27,"103":9,"105":5,"114":21,"126":15,"133":15,"140":5,"150":2,"152":8,"153":6,"167":2,"168":6,"171":2}}],["x26",{"2":{"39":2,"40":6,"56":2,"116":2,"161":1}}],["xxx",{"2":{"19":1,"101":2}}],["配置规范",{"0":{"139":1}}],["配置项中",{"2":{"101":1}}],["配置并修改",{"2":{"56":1}}],["配置可忽略无需做代码规范校验的文件",{"2":{"55":1}}],["配置可忽略无需做代码规范校验的目录或文件",{"2":{"54":1}}],["配置文件为",{"2":{"53":1,"54":1,"55":1}}],["配置",{"0":{"53":1,"54":1,"55":1,"58":1},"1":{"59":1,"60":1},"2":{"39":1,"40":2,"57":1}}],["中可修改水印展示内容",{"2":{"171":1}}],["中删除",{"2":{"140":1}}],["中使用变量",{"2":{"140":1}}],["中呈现",{"2":{"139":1}}],["中添加",{"2":{"111":1}}],["中的",{"2":{"107":1,"126":1,"133":1}}],["中文语言包",{"2":{"122":1}}],["中文",{"2":{"76":2}}],["中移除",{"2":{"57":1}}],["中修改",{"2":{"56":1}}],["中设置",{"2":{"45":1}}],["中",{"2":{"39":1,"40":1,"54":1,"55":1,"146":1,"171":1}}],["匹配到了",{"2":{"39":1}}],["匹配到其中一项则鉴权通过",{"2":{"9":1}}],["因为我们最终的目标是希望",{"2":{"173":1}}],["因为大部分项目是无需全局更新到新版的",{"2":{"164":1}}],["因为本质上这类框架其实是一个初始框架",{"2":{"164":1}}],["因为同一个色值是无法顾及到明亮和暗黑两种模式的",{"2":{"161":1}}],["因为其传递的参数会在构建时提取并从",{"2":{"140":1}}],["因为文档中提及的内容",{"2":{"119":1}}],["因为它是未来的趋势",{"2":{"117":1}}],["因为路由切换有使用到",{"2":{"114":1}}],["因为依赖已经安装成功了",{"2":{"111":1}}],["因为在进行新增操作时",{"2":{"81":1}}],["因为只是覆盖",{"2":{"40":1}}],["因为",{"2":{"39":1,"66":1,"70":1,"76":1,"174":1}}],["因使用本产品所产生的损害及风险",{"2":{"3":1}}],["原生方案",{"0":{"153":1}}],["原生提供的方案",{"2":{"152":1}}],["原有的代码可能会因为规则的变动导致编辑器大量提示错误",{"2":{"54":1,"55":1}}],["原有请求都会被指向到本地",{"2":{"39":1}}],["原价",{"2":{"0":3,"2":1}}],["9000",{"2":{"39":3,"146":1}}],["lts",{"2":{"122":1}}],["lt",{"2":{"78":1,"84":1,"85":1,"96":1,"97":1,"102":2,"107":1,"114":2,"139":1,"140":1,"167":2,"168":3}}],["labelname",{"2":{"76":5}}],["lang=",{"2":{"81":3,"105":1,"126":2,"133":2,"140":1,"167":1,"168":3,"171":1}}],["language",{"2":{"79":1,"122":1}}],["lang",{"2":{"76":2,"77":1,"126":6,"133":4}}],["lighttheme",{"2":{"156":1,"157":1}}],["light",{"2":{"133":2,"156":1,"157":3,"158":1}}],["limit",{"2":{"116":1}}],["lint",{"0":{"56":1},"1":{"57":1},"2":{"54":1,"55":1,"56":3,"57":1}}],["list|5",{"2":{"42":1}}],["list",{"0":{"94":1},"1":{"95":1,"96":1,"97":1,"98":1,"99":1},"2":{"35":1,"36":1,"39":2,"40":3,"42":3,"60":1,"94":6}}],["lock",{"2":{"146":1}}],["local",{"2":{"147":5}}],["localstorage",{"2":{"147":4}}],["locale=",{"2":{"133":2}}],["locale",{"2":{"76":4,"126":7,"133":7}}],["locales",{"2":{"76":10,"77":1,"126":5,"133":5}}],["localhost",{"2":{"39":3,"146":1}}],["login",{"2":{"82":3,"139":3}}],["log",{"2":{"63":2,"167":1}}],["loadenv",{"2":{"39":2,"40":4}}],["开始",{"0":{"146":1},"2":{"168":1}}],["开启",{"2":{"113":1}}],["开启缓存必须保证每个页面组件必须设置",{"2":{"81":1}}],["开启后",{"2":{"62":1}}],["开启代理后",{"2":{"39":1}}],["开启代理",{"2":{"39":1}}],["开头即可",{"2":{"40":1}}],["开发",{"0":{"166":1},"1":{"167":1,"168":1}}],["开发框架都是如此",{"2":{"164":1}}],["开发注意",{"0":{"161":1}}],["开发的",{"2":{"117":1}}],["开发过程中",{"2":{"106":1}}],["开发者会根据自身需求去修改",{"2":{"164":1}}],["开发者可自行扩展出角色层",{"2":{"105":1}}],["开发者可根据实际业务需求进行扩展",{"2":{"59":1}}],["开发者在接入登录功能的时候",{"2":{"82":1}}],["开发者需要根据实际业务情况修改代码",{"2":{"63":1}}],["开发者工具",{"0":{"61":1},"1":{"62":1}}],["开发者通常希望能在本地先预览一下",{"2":{"46":1}}],["开发环境修改代码后",{"0":{"115":1}}],["开发环境配置文件中开启",{"2":{"62":1}}],["开发环境与生产环境使用",{"2":{"43":1}}],["开发环境",{"0":{"42":1,"122":1},"2":{"52":1,"59":1}}],["开发环境的跨域问题可在本地设置代理解决",{"2":{"39":1}}],["开发与构建工具",{"2":{"4":1}}],["跨域处理",{"0":{"39":1}}],["响应的时候会根据错误信息判断是登录失效还是接口报错",{"2":{"37":1}}],["参考如下",{"2":{"164":1}}],["参考这个",{"2":{"115":1}}],["参考代码里只做了简单的拦截处理",{"2":{"37":1}}],["参数即可",{"2":{"81":2}}],["参数上直接设置对应",{"2":{"77":1}}],["参数上",{"2":{"59":3}}],["参数统一设置",{"2":{"42":1}}],["参数获取",{"2":{"42":1}}],["参数",{"2":{"6":1,"9":1,"16":1,"19":1,"21":1,"23":1,"86":1,"101":1}}],["然后即可开始开发",{"2":{"165":1}}],["然后基于业务开展业务代码编写",{"2":{"164":1}}],["然后点击需要使用的图标",{"2":{"152":1}}],["然后删除根目录下",{"2":{"146":1}}],["然后用户与角色挂钩",{"2":{"105":1}}],["然后在页面中就可以通过",{"2":{"150":1}}],["然后在需要使用到",{"2":{"147":1}}],["然后在",{"2":{"100":1,"122":1}}],["然后通过",{"2":{"94":1}}],["然后从新闻列表页点击某条记录进入新闻详情页",{"2":{"81":1}}],["然后你需要到",{"2":{"76":1}}],["然后需要到",{"2":{"63":1}}],["然后手动删除",{"2":{"57":1}}],["然后把",{"2":{"40":1}}],["然后",{"2":{"37":1}}],["然后做一些全局的处理",{"2":{"37":1}}],["例如新建一个",{"2":{"148":1}}],["例如从列表页进入详情页",{"2":{"143":1}}],["例如为",{"2":{"101":1}}],["例如搭配",{"2":{"99":1}}],["例如下面这段配置表示页面在微信环境下默认不显示导航栏",{"2":{"90":1}}],["例如什么状态下是请求成功",{"2":{"82":1}}],["例如有一个新闻管理的模块",{"2":{"81":2}}],["例如将增加上报信息",{"2":{"63":1}}],["例如开发环境用于本地开发使用",{"2":{"59":1}}],["例如在项目中导入了一些第三方的插件代码或组件代码",{"2":{"54":1,"55":1}}],["例如",{"2":{"40":1,"56":1,"77":1,"83":1,"107":1,"139":2,"152":1,"161":2,"164":1}}],["例如就叫",{"2":{"40":1}}],["例如请求的时候会自动带上",{"2":{"37":1}}],["例如接口响应报错",{"2":{"37":1}}],["例如项目的真实接口请求地址为",{"2":{"35":1}}],["拦截器还是用的同一套规则",{"2":{"40":1}}],["拦截器的用处就是拦截每一次的请求和响应",{"2":{"37":1}}],["拦截器",{"0":{"37":1}}],["后",{"2":{"173":1}}],["后并访问",{"2":{"81":1}}],["后端可根据这一状态信息做动态数据国际化处理",{"2":{"79":1}}],["后续业务代码",{"2":{"36":2,"42":2}}],["后缀",{"2":{"23":1}}],["和",{"0":{"56":1},"1":{"57":1},"2":{"36":1,"37":2,"40":1,"56":2,"59":4,"81":1,"102":1,"103":1,"122":1,"139":2,"147":1,"167":1}}],["if",{"2":{"133":2}}],["is",{"2":{"112":1}}],["issue",{"2":{"111":1,"114":1,"115":1,"176":3}}],["islogin",{"2":{"82":1}}],["id",{"2":{"81":4,"139":10}}],["ide",{"0":{"53":1},"2":{"52":1,"56":1}}],["i18n",{"2":{"74":1,"75":1,"78":3,"86":2,"142":1}}],["image",{"2":{"122":1}}],["images",{"2":{"69":1}}],["import",{"2":{"40":4,"42":1,"67":2,"76":3,"126":14,"133":12,"153":1,"167":4,"171":1}}],["io",{"2":{"60":1}}],["icônes",{"2":{"151":1}}],["ic",{"2":{"60":6,"94":6}}],["icon=",{"2":{"153":1}}],["icons",{"2":{"150":2}}],["icon",{"0":{"96":1},"2":{"60":3,"94":6,"153":3}}],["iconify",{"0":{"151":1,"153":1},"1":{"152":1,"153":1},"2":{"21":1,"96":1,"97":1,"151":4,"152":3,"153":2}}],["i",{"2":{"60":6,"90":1,"94":6,"152":7}}],["ignoremissing",{"2":{"111":1}}],["ignorefiles",{"2":{"55":1}}],["ignores",{"2":{"54":1}}],["indent",{"2":{"122":1}}],["index2",{"2":{"40":3}}],["index",{"2":{"37":1,"40":1,"72":1,"76":1,"81":5,"82":1,"113":1,"126":6,"133":6,"139":9,"155":1}}],["in",{"2":{"76":1}}],["install",{"2":{"56":2,"125":1,"126":4,"132":1,"133":4,"146":1}}],["init",{"2":{"56":1}}],["interceptors",{"2":{"37":2}}],["info",{"2":{"35":1,"61":1,"74":1}}],["的特性",{"2":{"167":1}}],["的插件一样更新",{"2":{"164":1}}],["的在线图标搜索网站",{"2":{"151":1}}],["的文件名",{"2":{"150":1}}],["的文件",{"2":{"148":1}}],["的文件特性",{"2":{"70":1}}],["的一员",{"2":{"148":1}}],["的同源策略",{"2":{"147":1}}],["的不会生成路由",{"2":{"139":1}}],["的规范还不了解",{"2":{"139":1}}],["的原因",{"2":{"112":1,"173":1}}],["的方法",{"2":{"100":1}}],["的方式",{"2":{"40":1}}],["的值会被转换",{"2":{"83":1}}],["的话",{"2":{"83":1}}],["的属性列表",{"2":{"83":1}}],["的地方引入",{"2":{"147":1}}],["的地方",{"2":{"80":1}}],["的使用技巧请参考官方文档",{"2":{"78":1}}],["的还不行",{"2":{"77":1}}],["的日文语言包",{"2":{"76":1}}],["的语言包文件",{"2":{"76":1}}],["的语言包需要进行数据合并",{"2":{"76":1}}],["的组件入口",{"2":{"72":1}}],["的两套字体",{"2":{"64":1}}],["的",{"2":{"35":1,"59":3,"139":1}}],["的应用平台",{"2":{"3":1}}],["在基于",{"2":{"164":1}}],["在页面中去自定义一些颜色",{"2":{"161":1}}],["在使用框架的过程中难免会遇到问题",{"2":{"176":1}}],["在使用",{"2":{"152":1}}],["在任意原生",{"2":{"152":1}}],["在源码文件夹根目录下依次执行以下命令",{"2":{"146":1}}],["在代码中高亮颜色",{"2":{"122":1}}],["在框架源码基础上",{"2":{"119":1}}],["在扩展新的模式前",{"2":{"106":1}}],["在路由的",{"2":{"101":1}}],["在演示源码中",{"2":{"100":1}}],["在实际开发中",{"2":{"100":1}}],["在此之前",{"2":{"80":1}}],["在这里增加一个",{"2":{"76":1}}],["在应用配置中设置",{"2":{"63":1,"100":1,"158":1,"159":1,"160":1,"163":1,"170":1}}],["在本地运行时",{"2":{"62":1}}],["在构建时开启压缩",{"2":{"59":2}}],["在构建时生成",{"2":{"59":2}}],["在提交代码时",{"2":{"56":1}}],["在多人协作开发时",{"2":{"56":1}}],["在保存代码时",{"2":{"52":1}}],["在环境配置文件里设置",{"2":{"47":1,"48":1}}],["在环境配置里设置",{"2":{"43":1}}],["在控制台内看不到接口请求日志",{"2":{"43":1}}],["在",{"2":{"37":1,"62":1,"77":1,"82":4,"122":2,"139":1,"167":1,"168":1,"171":1}}],["在根目录",{"2":{"35":1}}],["在未经我们许可下",{"2":{"3":1}}],["beyond",{"2":{"164":1}}],["bg",{"2":{"156":8,"157":12,"161":2}}],["b",{"2":{"120":2}}],["bug",{"2":{"164":1}}],["button>",{"2":{"103":3}}],["button",{"2":{"103":3}}],["build",{"2":{"43":1,"45":2,"47":4,"48":3,"49":1,"59":8,"116":2}}],["browse",{"2":{"101":2}}],["brotli",{"2":{"47":4,"59":3}}],["break",{"2":{"76":4}}],["br",{"2":{"47":1}}],["basic",{"2":{"120":4}}],["baseline",{"2":{"60":1,"94":2}}],["base",{"2":{"45":1}}],["baseurl",{"0":{"35":1},"2":{"35":3,"39":2,"40":12,"42":2,"43":1,"59":7}}],["badge",{"0":{"99":1}}],["background",{"2":{"161":1}}],["backtop",{"2":{"86":1}}],["back",{"2":{"86":2}}],["baidu",{"2":{"40":1}}],["box",{"2":{"161":1}}],["border",{"2":{"156":2,"157":3,"161":1}}],["body",{"2":{"42":1}}],["both",{"2":{"21":1}}],["boolean",{"2":{"16":1,"19":1,"23":1,"81":2,"86":7,"99":1,"143":2,"145":2}}],["old",{"2":{"116":1}}],["options",{"2":{"166":2}}],["options=",{"2":{"116":1}}],["open",{"2":{"39":2,"40":3,"59":2,"62":1}}],["of",{"2":{"116":1}}],["official",{"2":{"122":1}}],["off",{"2":{"31":1}}],["out",{"2":{"112":1,"116":1}}],["object",{"2":{"76":4}}],["only",{"2":{"146":1}}],["on",{"2":{"31":1}}],["one",{"2":{"0":4}}],["e5e5e5",{"2":{"156":3,"157":3}}],["ep",{"2":{"152":5,"153":2}}],["else",{"2":{"133":2}}],["elementlocaleja",{"2":{"76":2}}],["elementlocaleen",{"2":{"76":2}}],["elementlocalezhtw",{"2":{"76":2}}],["elementlocalezhcn",{"2":{"76":2}}],["element",{"2":{"76":8}}],["es",{"2":{"133":4}}],["eslint",{"0":{"54":1},"2":{"54":6,"56":1,"122":1}}],["emulator",{"2":{"125":1,"126":2,"128":1,"132":1,"133":2,"135":1}}],["emit",{"2":{"31":1}}],["edit",{"2":{"101":2,"102":2,"103":2,"104":2}}],["editorconfig",{"2":{"53":1,"122":1}}],["events",{"0":{"88":1}}],["eventbus",{"2":{"31":5}}],["enus",{"2":{"126":2,"133":2}}],["end",{"2":{"87":1}}],["english",{"2":{"76":1}}],["en",{"2":{"76":2,"126":2,"133":2}}],["enablewatermark",{"2":{"170":1}}],["enablecoloramblyopiamode",{"2":{"160":1}}],["enablemournmode",{"2":{"159":1}}],["enablebacktop",{"2":{"86":1}}],["enable",{"0":{"90":1,"93":1},"2":{"86":3,"90":2,"93":1}}],["enableerrorlog",{"2":{"63":1}}],["enabledynamictitle",{"2":{"60":1,"163":1}}],["enablepermission",{"2":{"60":1,"100":1}}],["env",{"2":{"35":1,"39":1,"40":4,"59":3,"62":1,"82":1,"116":3}}],["eruda",{"2":{"59":3}}],["error",{"2":{"42":1,"63":2}}],["exclude",{"2":{"83":1}}],["examplestore",{"2":{"148":2}}],["example",{"2":{"45":1,"120":2,"139":5,"140":1,"148":3,"150":2}}],["exports",{"2":{"83":1}}],["export",{"2":{"42":1,"126":3,"133":3,"148":1,"156":2,"157":2,"168":1}}],["matching",{"2":{"122":1}}],["max",{"2":{"116":1}}],["memory",{"2":{"116":1}}],["mediaquery",{"2":{"83":1}}],["messages=",{"2":{"133":2}}],["messages",{"2":{"76":1,"126":1,"133":1}}],["method",{"2":{"42":1}}],["meta",{"2":{"40":3,"81":5,"101":1,"105":1,"140":1,"162":1}}],["mjs",{"2":{"76":4}}],["mini",{"2":{"156":1,"157":2}}],["min",{"2":{"126":6,"133":6}}],["minpixelvalue",{"2":{"83":1}}],["micromessenger",{"2":{"90":1}}],["mixin",{"2":{"70":1}}],["mitt",{"2":{"31":1}}],["mode",{"0":{"91":1},"2":{"39":2,"40":4,"86":1,"91":1,"161":1}}],["modules",{"2":{"38":1,"82":2,"83":1,"100":1,"109":1,"126":2,"133":2,"146":2,"148":2,"171":2}}],["mockjs",{"2":{"41":1,"42":1}}],["mock",{"0":{"41":1,"42":1,"43":1},"1":{"42":1,"43":1},"2":{"4":1,"41":2,"42":12,"43":8,"59":4,"100":1}}],["mobile",{"2":{"0":6,"2":1,"3":1,"12":1,"56":2,"59":3,"60":2,"80":1,"119":1,"120":4,"121":1,"164":2,"165":2,"173":3,"174":4}}],["基本是无法更新的",{"2":{"164":1}}],["基本不太可能",{"2":{"146":1}}],["基本用法",{"0":{"85":1}}],["基于文件的类型化路由",{"2":{"123":1}}],["基于",{"2":{"31":1,"32":1}}],["基础组件由",{"2":{"12":1}}],["基础组件",{"0":{"12":1}}],["基础版和专业版内容略有不同",{"2":{"155":1}}],["基础版",{"0":{"120":1,"156":1,"176":1},"2":{"4":1,"13":1,"51":1,"126":1,"133":1}}],["刷新",{"0":{"28":1}}],["页面水印",{"0":{"169":1},"1":{"170":1,"171":1}}],["页面下载框架源码压缩包",{"2":{"124":1,"131":1}}],["页面下载最新版本的压缩包",{"2":{"120":1}}],["页面切换后显示空白",{"0":{"114":1}}],["页面的",{"2":{"107":1}}],["页面文件",{"2":{"106":1}}],["页面中某个模块",{"2":{"102":1}}],["页面往下滚动时隐藏",{"2":{"91":1}}],["页面滚动时显示",{"2":{"91":1}}],["页面滚动时触发",{"2":{"88":1}}],["页面滚动到底部时触发",{"2":{"88":1}}],["页面滚动到顶部时触发",{"2":{"88":1}}],["页面区域",{"2":{"87":1}}],["页面缓存",{"0":{"81":1},"2":{"143":1,"144":1}}],["页面样式建议写在",{"2":{"70":1}}],["页面标题",{"2":{"59":3}}],["页面",{"0":{"27":1},"1":{"28":1,"29":1,"30":1},"2":{"145":1}}],["==",{"2":{"39":1,"40":2}}],["===",{"2":{"39":1,"40":3,"133":2}}],["=>",{"2":{"36":2,"39":1,"40":2,"42":3,"99":1,"126":2,"133":4,"148":1,"167":1}}],["=",{"2":{"26":1,"28":1,"29":1,"30":1,"35":1,"39":1,"40":2,"42":2,"43":1,"47":3,"48":2,"49":1,"59":22,"60":1,"62":1,"63":1,"76":2,"83":1,"90":2,"91":1,"93":1,"94":2,"100":1,"104":1,"126":3,"133":3,"147":1,"148":3,"156":2,"157":1,"158":1,"159":1,"160":1,"163":1,"167":4,"170":1,"171":1}}],["权限验证",{"2":{"100":2}}],["权限",{"0":{"100":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1},"2":{"26":1,"105":1,"145":1}}],["权限数据",{"2":{"6":1,"9":1}}],["green",{"2":{"161":1}}],["g",{"2":{"156":16,"157":24}}],["globalstore",{"2":{"99":1}}],["globalsettings",{"2":{"60":1,"63":1,"90":2,"91":1,"93":1,"94":2,"100":1,"147":1,"157":1,"158":1,"159":1,"160":1,"163":1,"170":1}}],["globals",{"2":{"60":1}}],["gitee",{"2":{"80":1,"120":4,"176":1}}],["git",{"0":{"56":1},"1":{"57":1},"2":{"56":14,"57":5,"120":8,"122":1}}],["github",{"2":{"1":3,"60":1,"80":1,"120":5,"121":1,"124":1,"131":1,"176":1}}],["gzip",{"2":{"47":4,"59":3}}],["gz",{"2":{"47":1,"48":2}}],["gt",{"2":{"42":2,"78":1,"84":1,"85":1,"96":1,"97":1,"102":2,"107":1,"114":2,"139":3,"140":1,"167":2,"168":3}}],["getitem",{"2":{"147":1}}],["getpermissions",{"2":{"100":1}}],["getelementlocales",{"2":{"76":1}}],["get",{"2":{"25":1,"36":3,"39":1,"40":3,"42":3,"147":2}}],["right",{"2":{"152":2,"153":2}}],["rainbow",{"2":{"122":1}}],["rollup",{"2":{"111":1}}],["root",{"2":{"77":1}}],["routerview",{"2":{"139":1}}],["router",{"2":{"113":2,"123":2,"138":1,"139":2,"167":4}}],["route",{"2":{"77":1,"167":2}}],["rotate",{"2":{"21":1}}],["run",{"2":{"45":2,"46":2,"54":1,"55":1,"106":1,"146":1}}],["rem",{"2":{"165":1}}],["removeitem",{"2":{"147":1}}],["remove",{"2":{"128":1,"135":1,"147":2}}],["red",{"2":{"161":1}}],["ref",{"2":{"148":1,"167":2}}],["registry",{"2":{"146":2}}],["record",{"2":{"126":1,"133":1}}],["releases",{"2":{"120":1,"124":1,"131":1}}],["reload",{"2":{"28":2}}],["reached",{"2":{"116":1}}],["reachbottom",{"2":{"88":1}}],["reachtop",{"2":{"88":1}}],["return",{"2":{"42":1,"76":1,"148":1}}],["replace",{"2":{"39":1,"40":2,"83":1}}],["rewrite",{"2":{"39":1,"40":2}}],["request",{"2":{"37":2,"40":1}}],["resources",{"2":{"70":1}}],["responsetype",{"2":{"40":1}}],["response",{"2":{"37":2,"40":1,"42":1}}],["res",{"2":{"36":2,"42":2}}],["resetcustomtitle",{"2":{"30":2}}],["reverse",{"2":{"23":1}}],["dcdfe6",{"2":{"156":1,"157":2}}],["dc2b33",{"2":{"19":3}}],["dvh",{"2":{"126":2,"133":2}}],["doubled",{"2":{"167":1}}],["dotenv",{"2":{"122":1}}],["down",{"2":{"23":1}}],["div",{"2":{"152":1}}],["div>",{"2":{"114":4}}],["dialog",{"2":{"139":1}}],["digital",{"2":{"64":1,"67":6}}],["dist",{"2":{"45":2,"46":1,"76":4,"126":5}}],["d",{"2":{"60":1,"116":1}}],["dashboard",{"2":{"167":1}}],["darktheme",{"2":{"156":1,"157":1}}],["dark",{"2":{"133":2,"156":1,"157":2,"158":1,"161":5}}],["dafont",{"2":{"65":1}}],["dates",{"2":{"60":1}}],["data",{"2":{"42":1,"161":1}}],["dayjs",{"2":{"32":4}}],["department",{"2":{"102":5,"103":5,"104":5}}],["detail",{"2":{"81":2,"139":8}}],["debug",{"2":{"59":4}}],["defineoptions",{"2":{"168":2}}],["definestore",{"2":{"148":1}}],["definepage",{"0":{"140":1},"2":{"81":3,"105":1,"139":1,"140":3}}],["definefakeroute",{"2":{"42":2}}],["default",{"2":{"42":1,"60":2,"77":2,"126":2,"133":2,"148":1,"157":2,"168":1}}],["devtools",{"2":{"59":1,"61":1,"62":1}}],["dev",{"2":{"40":1,"146":1}}],["development",{"2":{"39":1,"59":1,"62":1,"82":1}}],["us",{"2":{"126":2,"133":2}}],["usewatermarkstore",{"2":{"171":2}}],["useexamplestore",{"2":{"148":4}}],["usesettingsstore",{"2":{"126":4,"133":4}}],["userouter",{"2":{"167":2}}],["useroute",{"2":{"167":2}}],["users",{"2":{"139":6}}],["useragent",{"2":{"90":1}}],["user",{"2":{"60":1,"82":2,"94":2,"100":1,"139":2}}],["use",{"2":{"37":2,"126":4,"133":2}}],["usemainpage",{"2":{"28":1,"29":1,"30":1}}],["useauth",{"2":{"26":1,"104":3}}],["unocss",{"0":{"152":1},"2":{"122":1,"123":1,"152":3,"156":1,"157":2,"161":2,"165":3}}],["unitprecision",{"2":{"83":1}}],["unittoconvert",{"2":{"83":1}}],["unplugin",{"2":{"72":1,"123":1,"138":1,"139":2,"167":1}}],["util",{"2":{"63":1}}],["utils",{"2":{"31":1,"32":1,"63":1,"104":1,"147":1,"156":1,"157":2,"171":1}}],["url",{"0":{"113":1},"2":{"42":2}}],["update",{"2":{"171":2}}],["up",{"2":{"23":2}}],["ui",{"2":{"4":2,"13":2,"126":4,"132":1,"133":9,"156":6,"157":9}}],["趋势标记",{"0":{"22":1},"1":{"23":1}}],["尺寸",{"2":{"21":1}}],["颜色方案",{"0":{"158":1}}],["颜色主题",{"2":{"156":2,"157":3}}],["颜色反转",{"2":{"23":1}}],["颜色",{"2":{"21":1}}],["0a0a0a",{"2":{"156":1,"157":1}}],["0f0f0f",{"2":{"156":3,"157":6}}],["0",{"0":{"51":2},"2":{"21":2,"99":1,"112":2,"148":1,"167":1}}],["000",{"2":{"161":1}}],["000+",{"2":{"151":1}}],["00",{"2":{"0":13,"2":2}}],["旋转角度",{"2":{"21":1}}],["垂直以及同时翻转",{"2":{"21":1}}],["翻转方式",{"2":{"21":1}}],["鼠标悬浮到属性上时",{"2":{"60":1}}],["鼠标",{"2":{"19":3}}],["currentcolorscheme",{"2":{"126":2,"133":2}}],["cursor",{"2":{"19":1}}],["chinese",{"2":{"122":1}}],["changeorigin",{"2":{"39":1,"40":2}}],["class",{"2":{"152":1}}],["class=",{"2":{"126":2,"133":2,"152":2}}],["clear",{"2":{"147":3}}],["clone",{"2":{"120":4}}],["client",{"2":{"42":1}}],["cross",{"2":{"116":3}}],["create",{"2":{"35":1,"36":1,"40":1,"42":2,"81":4,"102":3,"103":3,"104":3}}],["cart",{"2":{"139":5}}],["cache",{"0":{"143":1},"2":{"81":6,"144":2}}],["case",{"2":{"76":5}}],["cn",{"2":{"76":2,"77":1,"126":4,"133":3}}],["css",{"2":{"67":4,"83":1,"126":2,"152":2}}],["cd",{"2":{"56":1}}],["ctitle",{"2":{"42":1}}],["cwd",{"2":{"39":2,"40":4}}],["count",{"2":{"167":2}}],["copyright>",{"2":{"85":1}}],["copyright",{"2":{"60":1,"86":2}}],["code",{"2":{"52":1,"60":1,"122":5}}],["console",{"2":{"167":1}}],["const",{"2":{"60":1,"76":2,"104":1,"126":3,"133":3,"148":2,"156":2,"167":4,"171":1}}],["container",{"2":{"156":2,"157":3}}],["content",{"2":{"36":1,"42":1}}],["config",{"2":{"39":2,"40":2,"45":1,"54":4,"55":3,"83":1,"146":1}}],["commit",{"2":{"56":1,"57":2}}],["command",{"2":{"39":1,"40":2}}],["computed",{"2":{"167":2}}],["compare",{"2":{"164":1}}],["company",{"2":{"60":1}}],["composition",{"0":{"166":1},"1":{"167":1,"168":1},"2":{"166":3,"167":2}}],["composables",{"2":{"104":1}}],["componentname",{"2":{"168":2}}],["component",{"0":{"108":1},"2":{"106":1,"108":1}}],["components",{"2":{"14":1,"72":2,"73":1,"108":1,"139":2}}],["compress",{"2":{"47":4,"59":2}}],["com",{"2":{"35":4,"40":1,"45":1,"120":4,"146":1}}],["colorscheme",{"2":{"158":1}}],["color",{"2":{"19":4,"21":1,"122":1,"156":10,"157":15,"161":5}}],["collaspe",{"2":{"16":2}}],["填充颜色",{"2":{"19":1}}],["fff",{"2":{"156":3,"157":6,"161":1}}],["f2f2f2",{"2":{"156":1,"157":2}}],["fcfcfc",{"2":{"156":1,"157":2}}],["fm",{"2":{"147":1}}],["forever",{"2":{"165":2}}],["forward",{"2":{"86":2}}],["for",{"2":{"76":1,"122":2}}],["fontviewportunit",{"2":{"83":1}}],["fonts",{"2":{"67":3}}],["font",{"2":{"66":1,"67":3}}],["function",{"2":{"70":1,"76":1,"78":1,"126":2,"133":2}}],["fixed",{"2":{"86":2,"91":3}}],["fix",{"2":{"50":1}}],["fill",{"2":{"19":1}}],["feature",{"2":{"60":1,"78":1}}],["feat",{"2":{"50":1}}],["from",{"2":{"25":1,"31":1,"32":1,"36":1,"39":1,"40":3,"42":3,"76":4,"104":1,"126":12,"133":10,"147":1,"148":1,"153":1,"156":1,"157":2,"167":2,"171":1}}],["flip",{"2":{"21":1}}],["failed",{"2":{"116":1}}],["family",{"2":{"67":3}}],["fake",{"2":{"41":1,"42":1}}],["false",{"2":{"16":1,"19":1,"23":1,"43":1,"59":6,"83":1,"85":1,"99":1,"104":3}}],["fantastic",{"2":{"0":10,"2":1,"3":1,"12":1,"56":2,"59":3,"60":2,"80":1,"119":1,"120":4,"121":1,"164":2,"173":3,"174":2}}],["折线颜色",{"2":{"19":1}}],["折线宽度",{"2":{"19":1}}],["展示形式为文本",{"2":{"99":2}}],["展示形式为点",{"2":{"99":1}}],["展示效果也会不同",{"2":{"99":1}}],["展示宽度",{"2":{"19":1}}],["展示高度",{"2":{"16":1,"19":1}}],["支持设置",{"2":{"142":1}}],["支持",{"2":{"59":4}}],["支持水平",{"2":{"21":1}}],["支持一维数组和对象数组",{"2":{"19":1}}],["支付方式",{"0":{"2":1}}],["支付成功后需提供",{"2":{"1":1}}],["迷你图数据",{"2":{"19":1}}],["迷你图",{"0":{"18":1},"1":{"19":1}}],["themes",{"2":{"133":3,"155":1}}],["theme=",{"2":{"126":2,"161":1}}],["then",{"2":{"36":2,"42":2}}],["tw",{"2":{"76":2}}],["twotone",{"2":{"60":3}}],["ttf",{"2":{"65":1,"66":3}}],["templates",{"2":{"106":1}}],["template",{"2":{"102":4,"103":1,"174":1}}],["template>",{"2":{"85":2,"94":2,"102":3,"105":2,"114":8,"126":4,"133":4,"140":2,"153":2}}],["text",{"0":{"98":1},"2":{"60":3,"94":6,"156":2,"157":3,"161":2,"171":1}}],["test",{"2":{"35":4,"45":2,"46":1,"59":1,"90":1,"100":1,"139":1}}],["tag",{"2":{"122":1}}],["tabbar2",{"2":{"94":2}}],["tabbar1",{"2":{"94":1}}],["tabbarname",{"2":{"86":1,"94":1}}],["tabbar",{"2":{"60":1,"85":1,"86":2,"87":1,"93":1,"94":3,"156":6,"157":9}}],["tar",{"2":{"48":3,"59":2}}],["target",{"2":{"39":1,"40":2}}],["tip",{"2":{"41":1,"45":1,"54":1,"55":1,"148":1}}],["timeout",{"2":{"40":1}}],["titlecenter",{"2":{"86":1}}],["title",{"0":{"142":1},"2":{"16":1,"17":1,"29":1,"36":1,"42":2,"59":4,"77":2,"81":3,"107":1,"140":1,"162":1}}],["to",{"2":{"165":1}}],["touch",{"2":{"125":1,"126":2,"128":1,"132":1,"133":2,"135":1}}],["tool",{"2":{"59":4}}],["tooltip",{"2":{"19":2}}],["token等数据",{"2":{"63":1}}],["token",{"2":{"37":1}}],["tsconfig",{"2":{"117":1}}],["tsconst",{"2":{"26":1,"28":1,"29":1,"30":1,"40":1,"63":1,"90":2,"91":1,"93":1,"94":2,"100":1,"147":1,"148":1,"157":1,"158":1,"159":1,"160":1,"163":1,"170":1}}],["tsc",{"2":{"116":1}}],["tsbadge",{"2":{"99":1}}],["tsmeta",{"2":{"77":1,"101":1}}],["tsserver",{"2":{"39":1,"40":1}}],["ts",{"2":{"37":1,"39":2,"40":5,"45":1,"60":5,"63":2,"76":1,"81":3,"82":3,"100":1,"105":1,"113":1,"126":5,"133":5,"140":1,"147":1,"148":1,"155":1,"167":1,"168":3,"171":3}}],["tsimport",{"2":{"25":1,"31":1,"32":1,"36":1,"39":1,"40":2,"42":2,"76":1,"104":1,"126":2,"133":2,"147":1,"148":1,"156":1,"157":2}}],["typescript",{"0":{"117":1},"2":{"117":3}}],["types",{"2":{"60":1}}],["type",{"2":{"23":1,"126":2,"133":2}}],["transition",{"2":{"114":2}}],["trend",{"0":{"22":1},"1":{"23":1}}],["true",{"2":{"16":1,"39":2,"40":3,"49":1,"56":1,"57":1,"59":3,"60":2,"62":1,"63":1,"81":3,"83":1,"86":1,"90":1,"93":1,"100":1,"104":3,"117":1,"143":1,"144":1,"145":1,"159":1,"160":1,"163":1,"170":1}}],["为什么不是它们",{"0":{"174":1}}],["为什么选择我们",{"0":{"172":1},"1":{"173":1,"174":1}}],["为什么有人说",{"2":{"112":1}}],["为什么本地开发环境首次载入很慢",{"0":{"112":1}}],["为例",{"2":{"77":1}}],["为框架的默认配置",{"2":{"60":1}}],["为必要配置",{"2":{"59":1}}],["为保证代码风格统一",{"2":{"52":1}}],["为了让",{"2":{"42":1}}],["为了实现",{"2":{"13":1}}],["为",{"2":{"16":1,"152":1}}],["当类型为",{"2":{"143":1,"145":1}}],["当然我们更建议你使用",{"2":{"166":1}}],["当然这么使用并没有很方便",{"2":{"153":1}}],["当然你同样也可以通过",{"2":{"152":1}}],["当然了",{"2":{"105":1}}],["当然它能做的事情也更简单",{"2":{"103":1}}],["当然也可将",{"2":{"81":1}}],["当前用户具备该权限是如何显示",{"2":{"102":1}}],["当配置多个权限时",{"2":{"101":1}}],["当值小于等于",{"2":{"99":1}}],["当值为空时隐藏",{"2":{"99":1}}],["当值为",{"2":{"99":1}}],["当返回新增新闻页时",{"2":{"81":1}}],["当从新闻列表页进入新闻详情页的时候",{"2":{"81":1}}],["当设置为",{"2":{"81":1}}],["当都设置好后",{"2":{"77":1}}],["当你对规则进行修改后",{"2":{"54":1,"55":1}}],["当为对象数组时",{"2":{"19":1}}],["当",{"2":{"16":1}}],["has",{"2":{"147":3}}],["hash",{"2":{"113":1}}],["h",{"2":{"126":4,"133":4}}],["highlight",{"2":{"122":2}}],["hide",{"2":{"86":1,"91":1}}],["h2>",{"2":{"114":2}}],["h2>text",{"2":{"114":2}}],["h2",{"2":{"114":2}}],["h1>",{"2":{"114":2}}],["h1>text",{"2":{"114":2}}],["h1",{"2":{"114":2}}],["hex2rgba",{"2":{"156":5,"157":8}}],["heap",{"2":{"116":2}}],["header",{"2":{"107":1}}],["height",{"2":{"16":1,"19":1,"126":2,"133":2}}],["h5",{"2":{"84":1,"164":1,"173":1,"174":3}}],["https",{"2":{"45":1,"60":1,"120":4,"146":1}}],["http",{"2":{"35":4,"39":3,"40":1,"146":1}}],["html5",{"2":{"113":2}}],["html",{"2":{"7":1,"10":1,"17":2,"152":1}}],["home",{"2":{"60":2,"86":2,"94":2}}],["hooks",{"0":{"56":1},"1":{"57":1},"2":{"56":4,"57":4}}],["horizontal",{"2":{"21":1}}],["hover",{"2":{"19":3}}],["标签上通过设置",{"2":{"152":1}}],["标签栏展示数据",{"2":{"94":1}}],["标签栏",{"0":{"92":1},"1":{"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1},"2":{"156":2,"157":3}}],["标签栏区域",{"2":{"87":1}}],["标签栏名称",{"2":{"86":1}}],["标签栏角标",{"2":{"4":1}}],["标题区的",{"2":{"17":1}}],["标题",{"2":{"16":1}}],["push",{"2":{"167":1}}],["peerdependencyrules",{"2":{"111":1}}],["person",{"2":{"60":2,"94":2}}],["plopfile",{"2":{"106":1}}],["plop",{"2":{"106":3}}],["plus",{"2":{"76":8}}],["plugins",{"2":{"83":1}}],["plugin",{"2":{"41":1,"42":1}}],["p>你没有该权限",{"2":{"102":3}}],["p>你有该权限",{"2":{"102":3}}],["p>",{"2":{"102":6}}],["pinia",{"2":{"99":1,"123":1,"148":6,"167":1}}],["px",{"2":{"83":4,"165":3}}],["px2vp",{"2":{"83":2}}],["pnpm",{"2":{"45":2,"46":2,"54":1,"55":1,"56":3,"57":1,"72":1,"106":1,"111":1,"116":1,"122":1,"125":2,"128":1,"132":2,"135":1,"146":6,"148":1}}],["pack",{"2":{"122":1}}],["packages",{"2":{"126":3}}],["package",{"2":{"56":2,"57":1,"111":1,"116":1,"122":1,"146":1}}],["path",{"0":{"95":1},"2":{"39":2,"40":4,"60":3,"94":6,"167":1}}],["pagelayout>",{"2":{"85":1,"94":1}}],["pagelayout",{"0":{"84":1},"1":{"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1},"2":{"84":1,"85":2,"94":1}}],["pages",{"2":{"77":2}}],["page",{"0":{"107":1},"2":{"36":1,"42":1,"106":1,"107":2}}],["pagemain",{"0":{"15":1},"1":{"16":1,"17":1}}],["params",{"2":{"36":1,"42":1}}],["postcss",{"2":{"83":3,"111":1,"165":4}}],["postinstall",{"2":{"56":1,"57":1}}],["post",{"2":{"25":1,"36":3,"39":1,"42":2}}],["primary",{"2":{"156":2,"157":3}}],["preinstall",{"2":{"146":1}}],["preview",{"2":{"122":1}}],["preset",{"2":{"156":1,"157":2,"165":1}}],["present",{"2":{"60":1}}],["preserveunused",{"2":{"56":1,"57":1}}],["pre",{"2":{"56":1,"57":2}}],["prefix",{"2":{"23":1}}],["product",{"2":{"139":1}}],["production",{"2":{"59":1}}],["provider",{"2":{"126":4,"133":4}}],["proplist",{"2":{"83":1}}],["props",{"0":{"6":1,"9":1,"16":1,"19":1,"21":1,"23":1,"86":1}}],["project",{"2":{"56":2}}],["process",{"2":{"39":2,"40":4}}],["proxy2",{"2":{"40":4}}],["proxy",{"2":{"39":10,"40":9,"59":1}}],["组件来展示",{"2":{"153":1}}],["组件使用了",{"2":{"150":1}}],["组件无法处理多个根节点的组件",{"2":{"114":1}}],["组件文件",{"2":{"106":1}}],["组件等文件",{"2":{"106":1}}],["组件进行展示",{"2":{"96":1,"97":1}}],["组件是本框架区别于其他",{"2":{"84":1}}],["组件",{"0":{"71":1,"84":1,"168":1},"1":{"72":1,"73":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1},"2":{"72":1,"85":1,"102":1,"127":1,"134":1,"139":1,"153":1}}],["组件源码完全开放",{"2":{"14":1}}],["组件库替换为",{"2":{"129":1,"136":1}}],["组件库可替换",{"2":{"13":1}}],["组件库",{"2":{"4":2,"124":1,"129":1,"131":1,"136":1}}],["这款工具可以直接对比文件夹",{"2":{"164":1}}],["这也是为什么我们自称为",{"2":{"173":1}}],["这也是框架推荐的方式",{"2":{"161":1}}],["这也意味着",{"2":{"139":1}}],["这篇文章",{"2":{"152":1}}],["这句脚本",{"2":{"146":1}}],["这句代码放到全局引入",{"2":{"67":1}}],["这与",{"2":{"139":1}}],["这部分需要根据实际存储的用户信息去判断是否登录",{"2":{"82":1}}],["这表示从新闻列表页进入新闻详情页时",{"2":{"81":1}}],["这种方案也是作者在公司内部项目经常使用的",{"2":{"164":1}}],["这种方式的前提是",{"2":{"40":1}}],["这种情况下",{"2":{"81":1}}],["这时候我们建议使用",{"2":{"161":1}}],["这时候开发则需要注意",{"2":{"161":1}}],["这时候就需要用到下面三种鉴权方式",{"2":{"101":1}}],["这时候其实是不希望新闻列表页被缓存的",{"2":{"81":1}}],["这时候再从新闻详情页返回新闻列表页时",{"2":{"81":1}}],["这时候你就会需要用到它们",{"2":{"13":1}}],["这将是对我极大的鼓励",{"2":{"80":1}}],["这个类封装了",{"2":{"147":1}}],["这个就是用来配置路由的权限",{"2":{"101":1}}],["这个参数可接受以下",{"2":{"81":2}}],["这个参数就是配置",{"2":{"35":1}}],["这个扩展",{"2":{"75":1}}],["这些东西",{"2":{"70":1}}],["这些组件仅服务于框架自身",{"2":{"13":1}}],["这是一个基于",{"2":{"151":1}}],["这是一个可以无视的警告",{"2":{"111":1}}],["这是因为路由默认使用的是",{"2":{"113":1}}],["这是全局",{"2":{"70":1}}],["这是基础版演示源码里的自定义配置示例",{"2":{"60":1}}],["这样做可以让更多的人参与讨论",{"2":{"176":1}}],["这样当你需要进行新版本更新时",{"2":{"164":1}}],["这样不会生效",{"2":{"152":2}}],["这样操作后",{"2":{"146":1}}],["这样你可以选择性的更新部分新代码到项目中",{"2":{"164":1}}],["这样你下次再安装依赖的时候",{"2":{"111":1}}],["这样你就可以在页面中通过引入不同的文件分别请求两个数据源了",{"2":{"40":1}}],["这样所有页面默认都会显示标签栏",{"2":{"93":1}}],["这样所有页面默认都会显示导航栏",{"2":{"90":1}}],["这样所有页面就都可以通过设置",{"2":{"67":1}}],["这样就没问题啦",{"2":{"114":1}}],["这样就无需繁琐的给每个用户重复分配权限",{"2":{"105":1}}],["这样就不会生成登录路由",{"2":{"82":1}}],["这样就表示从新闻列表页进入新闻详情页或新增新闻页时",{"2":{"81":1}}],["这样可以确保",{"2":{"56":1}}],["这两个依赖来解决这一问题",{"2":{"56":1}}],["所在目录",{"2":{"56":1}}],["所设置的地址",{"2":{"39":1}}],["所以",{"2":{"174":1}}],["所以可以这样定义组件",{"2":{"168":1}}],["所以一旦下载开始使用",{"2":{"164":1}}],["所以此处需要开发者自行修改或者重新制作登录页",{"2":{"127":1,"134":1}}],["所以请检查路由对应所有的页面文件的根节点是否均为单个",{"2":{"114":1}}],["所以建议对权限有个统一的格式",{"2":{"101":1}}],["所以在实现上会更灵活",{"2":{"105":1}}],["所以在做国际化支持的时候",{"2":{"76":1}}],["所以在开发环境下即使开启错误日志也不会被启用",{"2":{"63":1}}],["所以该目录只存放全局样式",{"2":{"70":1}}],["所以该文件拦截器部分的代码",{"2":{"37":1}}],["所以需要通过",{"2":{"66":1}}],["所以不建议在同一域名部署太多套系统",{"2":{"147":1}}],["所以不建议在非英文环境中使用",{"2":{"64":1}}],["所以不建议在业务页面内使用",{"2":{"13":1}}],["所以框架集成了",{"2":{"56":1}}],["所以如果两个数据源的请求和响应是完全不同的标准",{"2":{"40":1}}],["所以实际是请求依旧是",{"2":{"39":1}}],["所有的请求均会在请求头里带上",{"2":{"79":1}}],["所有",{"2":{"3":1,"139":1}}],["内置",{"2":{"156":2,"157":3}}],["内建组件存放在",{"2":{"13":1}}],["内建组件",{"0":{"13":1}}],["内容区的",{"2":{"17":1}}],["内容块",{"0":{"15":1},"1":{"16":1,"17":1}}],["内容",{"2":{"6":1,"7":1,"9":1,"10":1,"17":2,"23":1}}],["别担心会很复杂",{"2":{"12":1}}],["理解替换的整理思路",{"2":{"12":1}}],["npx",{"2":{"146":1}}],["npmmirror",{"2":{"146":2}}],["npm",{"2":{"146":3,"164":1}}],["nrm",{"2":{"146":1}}],["noemit",{"2":{"116":1}}],["no",{"2":{"102":3}}],["node",{"2":{"83":1,"116":1,"122":2,"146":2}}],["nocache",{"0":{"144":1},"2":{"81":2}}],["none",{"2":{"77":1}}],["navigator",{"2":{"90":1}}],["navbarendside",{"2":{"86":1}}],["navbarstartside",{"2":{"86":1}}],["navbarmode",{"2":{"86":1}}],["navbar=",{"2":{"85":1}}],["navbar",{"2":{"77":2,"86":3,"87":3,"90":2,"91":1,"156":4,"157":6}}],["name=",{"2":{"94":1,"150":1,"152":3,"153":1}}],["name",{"0":{"168":1},"2":{"7":1,"10":1,"17":1,"21":1,"81":4,"94":2,"107":1,"139":3,"140":1,"143":3,"144":3,"150":1,"152":3,"168":4}}],["next",{"2":{"61":1}}],["newthemename",{"2":{"157":3}}],["new",{"2":{"40":3,"72":1,"106":1,"148":1}}],["news",{"2":{"35":2,"36":2,"39":4,"42":5,"81":10,"101":4,"139":7}}],["nginx",{"2":{"47":1}}],["null",{"2":{"133":2}}],["nutconfigprovider>",{"2":{"126":2}}],["nutconfigprovider",{"2":{"126":2}}],["nutui",{"0":{"124":1},"1":{"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"12":1,"124":1,"125":4,"126":22,"129":2,"132":1}}],["number",{"2":{"19":3,"21":2,"86":2,"99":2}}],["替换真实接口后",{"2":{"82":1}}],["替换为",{"0":{"124":1,"131":1},"1":{"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1},"2":{"12":2}}],["替换组件库",{"2":{"12":1}}],["但正如上面所说",{"2":{"174":1}}],["但如果需要让用户可以自己选择明亮或暗黑模式",{"2":{"161":1}}],["但如果你需要对框架进行二次开发",{"2":{"13":1}}],["但需要清楚一点",{"2":{"146":1}}],["但需要注意",{"2":{"113":1,"120":1}}],["但为了用一套",{"2":{"139":1}}],["但为了保证构建出来的文件能正常运行",{"2":{"46":1}}],["但考虑到实际情况",{"2":{"117":1}}],["但会根据不同权限",{"2":{"101":1}}],["但在实际业务中",{"2":{"101":1}}],["但依旧提示登录",{"2":{"82":1}}],["但这个方案也有一个弊端",{"2":{"81":1}}],["但因为每个公司提供的接口标准不同",{"2":{"37":1}}],["但老项目里使用的组件库并不是",{"2":{"12":1}}],["但通常情况下我们不会随意打扰你",{"2":{"1":1}}],["上查找",{"2":{"151":1,"152":1}}],["上拉取源码",{"2":{"120":1}}],["上传",{"2":{"66":1}}],["上",{"2":{"12":1}}],["或其他包管理工具进行安装依赖",{"2":{"146":1}}],["或其它字体下载网站",{"2":{"65":1}}],["或者提供完整的最小复现",{"2":{"176":1}}],["或者改动地方做一个文档记录",{"2":{"164":1}}],["或者是根据浏览器主题来判断是使用明亮还是暗黑模式",{"2":{"161":1}}],["或者是其他页面进行一些操作",{"2":{"81":1}}],["或者其它支持下载",{"2":{"150":1}}],["或者到",{"2":{"124":1,"131":1}}],["或者也可以参考下方示例中已经修改好的登录页",{"2":{"127":1,"134":1}}],["或者也可以从",{"2":{"120":1}}],["或者也可以提供一段正则表达式",{"2":{"90":1}}],["或者也可以都开启",{"2":{"47":1}}],["或者",{"2":{"80":1}}],["或者你想要将老项目迁移到",{"2":{"12":1}}],["或直接删除",{"2":{"43":1}}],["或",{"2":{"13":1,"46":1,"47":1,"48":1,"59":3,"100":1,"104":3,"143":1,"145":1,"146":1}}],["或简单包装成同类产品",{"2":{"3":1}}],["框架",{"2":{"173":1}}],["框架设计基于",{"2":{"165":1}}],["框架更新",{"0":{"164":1}}],["框架主题",{"0":{"155":1},"1":{"156":1,"157":1}}],["框架已经帮你做好的所有处理",{"2":{"153":1}}],["框架已经做好了所有配置",{"2":{"152":1}}],["框架保留了",{"2":{"153":1}}],["框架大部分核心模块里采用的是这种方式",{"2":{"152":1}}],["框架会将所有路由均处理成一级路由",{"2":{"139":1}}],["框架会在你使用时自动引入",{"2":{"72":1}}],["框架在此基础上",{"2":{"139":1}}],["框架无需手动配置路由",{"2":{"138":1}}],["框架源码",{"2":{"119":1}}],["框架源码里已提供相关配置文件",{"2":{"52":1}}],["框架原有的",{"2":{"117":1}}],["框架提供了三种使用图标的方式",{"2":{"149":1}}],["框架提供了一个",{"2":{"147":1}}],["框架提供了",{"2":{"102":1}}],["框架提供一系列的组件方便快速开发",{"2":{"11":1}}],["框架内部鉴权的逻辑是字符串比对",{"2":{"101":1}}],["框架内建了一些组件",{"2":{"13":1}}],["框架默认通过",{"2":{"100":1}}],["框架默认已经配置好生产环境",{"2":{"43":1}}],["框架的最重要的特性",{"2":{"84":1}}],["框架的语言包和",{"2":{"76":1}}],["框架支持设置",{"2":{"81":1}}],["框架用到的图片资源都放在",{"2":{"69":1}}],["框架预设了",{"2":{"64":1}}],["框架为方便演示",{"2":{"63":1}}],["框架配置",{"0":{"60":1}}],["框架使用",{"2":{"33":1,"41":1,"54":1}}],["框架也提供了组件库替换移方案",{"2":{"12":1}}],["框架版权信息",{"2":{"4":1}}],["介绍",{"0":{"11":1},"1":{"12":1,"13":1,"14":1},"2":{"151":1}}],["something",{"2":{"148":3}}],["sourcemap",{"2":{"49":2,"59":4}}],["skuid",{"2":{"139":1}}],["supports",{"2":{"126":2,"133":2}}],["suffix",{"2":{"23":1}}],["savedposition",{"2":{"86":1}}],["switch",{"2":{"76":1}}],["scheme",{"2":{"156":2,"157":3}}],["scroll",{"2":{"88":1}}],["scrollwithanimation",{"2":{"86":1}}],["scrollleft",{"2":{"86":1}}],["scrolltop",{"2":{"86":1}}],["script>",{"2":{"81":3,"105":1,"126":2,"133":2,"140":1,"153":1,"167":1,"168":3,"171":1}}],["script",{"2":{"81":3,"105":1,"126":2,"133":2,"140":2,"153":1,"167":3,"168":6,"171":1}}],["scripts",{"2":{"57":1,"116":1}}],["scssdiv",{"2":{"161":1}}],["scss",{"2":{"67":1,"70":4}}],["squirrel",{"2":{"66":1}}],["shadow",{"2":{"161":1}}],["sharp",{"2":{"60":2,"94":4}}],["sh",{"2":{"120":2,"125":1,"128":1,"132":1,"135":1,"146":1}}],["show",{"2":{"86":1,"91":1}}],["shop",{"2":{"35":1}}],["simplified",{"2":{"122":1}}],["simple",{"0":{"56":1},"1":{"57":1},"2":{"56":4,"57":3}}],["size=8192",{"2":{"116":1}}],["size",{"2":{"21":1,"36":1,"42":1}}],["search",{"2":{"152":3}}],["session",{"2":{"147":5}}],["sessionstorage",{"2":{"63":1,"147":2}}],["seodescription",{"2":{"139":1}}],["selectorblacklist",{"2":{"83":1}}],["setitem",{"2":{"147":1}}],["set",{"2":{"146":1,"147":2}}],["setup>",{"2":{"153":1}}],["setup",{"2":{"81":3,"105":1,"126":2,"133":2,"140":2,"167":3,"168":4,"171":1}}],["settingstype",{"2":{"171":1}}],["settingsstore",{"2":{"126":7,"133":6}}],["settings",{"2":{"60":4,"63":1,"90":2,"91":1,"93":1,"94":3,"100":1,"126":2,"133":2,"147":1,"157":1,"158":1,"159":1,"160":1,"163":1,"170":1}}],["setting",{"2":{"59":5,"94":1}}],["setcustomtitle",{"2":{"29":2}}],["server",{"2":{"41":1,"42":1}}],["serve",{"2":{"39":1,"40":2,"46":2}}],["svg",{"2":{"21":1,"150":5}}],["svg图标",{"0":{"20":1},"1":{"21":1}}],["svgicon",{"0":{"20":1},"1":{"21":1},"2":{"72":1,"96":1,"97":1,"139":3,"150":2,"152":4,"153":2}}],["space",{"2":{"116":1}}],["sparkline",{"0":{"18":1},"1":{"19":1}}],["spot",{"2":{"19":1}}],["src",{"2":{"13":1,"14":1,"37":1,"38":1,"40":3,"42":1,"60":4,"63":2,"67":1,"69":1,"70":2,"72":1,"76":3,"77":1,"78":1,"81":6,"82":4,"100":1,"107":1,"108":2,"109":1,"113":1,"126":5,"133":5,"138":1,"139":10,"148":1,"150":2,"171":2}}],["storageprefix",{"2":{"147":1}}],["storage",{"0":{"147":1},"2":{"147":17}}],["store",{"0":{"109":1},"2":{"82":1,"106":1,"109":2,"126":2,"133":2,"148":2,"171":2}}],["sticky",{"2":{"86":1,"91":1}}],["styleprovider",{"2":{"133":5}}],["style",{"2":{"126":2,"133":2}}],["styles",{"2":{"70":2}}],["stylesheet",{"2":{"67":4}}],["stylelint",{"0":{"55":1},"2":{"55":5,"56":1,"122":1}}],["start",{"2":{"87":1}}],["static",{"2":{"86":1,"91":2}}],["status",{"2":{"42":1}}],["staged",{"0":{"56":1},"1":{"57":1},"2":{"56":3,"57":1}}],["studio",{"2":{"52":1,"60":1,"122":4}}],["stroke",{"2":{"19":2}}],["string",{"2":{"6":1,"9":1,"16":2,"19":4,"21":4,"23":4,"76":1,"81":8,"86":6,"95":1,"96":1,"97":1,"98":1,"99":1,"126":1,"133":1,"142":1,"143":6,"144":4,"145":6}}],["step",{"2":{"0":4}}],["slots",{"0":{"7":1,"10":1,"17":1,"87":1}}],["slot",{"2":{"6":1,"9":1,"126":2,"133":2}}],["并使用",{"2":{"165":1}}],["并返回外部变量",{"2":{"99":1}}],["并默认集成了",{"2":{"83":1}}],["并进行错误提示",{"2":{"82":1}}],["并进行了简单的封装",{"2":{"33":1}}],["并按照下面设置后",{"2":{"66":1}}],["并且你不需要担心技术栈上的差异",{"2":{"174":1}}],["并且你也可以在项目中使用",{"2":{"117":1}}],["并且主题在运行时共存",{"2":{"157":1}}],["并且可以开始使用",{"2":{"129":1,"136":1}}],["并且删除会导致框架无法正常使用",{"2":{"127":1,"134":1}}],["并且演示源码中大量示例也使用了",{"2":{"124":1,"131":1}}],["并且还要在文件里写一些必要的代码",{"2":{"106":1}}],["并且也不会在导航栏中显示",{"2":{"101":1}}],["并且一个页面里只能有一个",{"2":{"85":1}}],["并且确保",{"2":{"81":1}}],["并且将错误日志进行上报",{"2":{"63":1}}],["并且将代码中使用到",{"2":{"40":1}}],["并且如果你使用的是",{"2":{"60":1}}],["并且按照文档说明安装好相关软件及扩展",{"2":{"52":1}}],["并在群内提供技术支持",{"2":{"177":1}}],["并在",{"2":{"106":1,"116":1,"139":1}}],["并在调用接口的时候",{"2":{"42":1}}],["并在备注里留下手机",{"2":{"1":1}}],["并做相应动作",{"2":{"37":1}}],["并对",{"2":{"37":1}}],["并配置了使用时自动引入",{"2":{"13":1}}],["并保证视觉上的一致性",{"2":{"13":1}}],["并自行替换",{"2":{"12":1}}],["并显示",{"2":{"6":1,"9":1}}],["全新提供的一种语法",{"2":{"166":1}}],["全新的",{"2":{"148":1}}],["全局状态管理",{"0":{"148":1}}],["全局状态文件存放在",{"2":{"148":1}}],["全局状态文件",{"2":{"106":1}}],["全局组件生成目录为",{"2":{"108":1}}],["全局设置导航栏模式",{"2":{"91":1}}],["全局",{"2":{"70":1}}],["全局资源",{"0":{"68":1},"1":{"69":1,"70":1,"71":1,"72":1,"73":1}}],["全部匹配则鉴权通过",{"2":{"6":1}}],["全方位权限验证",{"2":{"4":1}}],["时隐藏",{"2":{"99":2}}],["时是否显示文字提示",{"2":{"19":1}}],["时辅助点颜色",{"2":{"19":1}}],["时辅助线颜色",{"2":{"19":1}}],["时生效",{"2":{"16":1}}],["时",{"2":{"6":1,"9":1,"81":1,"143":2,"145":2}}],["默认支持",{"2":{"167":1}}],["默认源无法访问",{"2":{"146":1}}],["默认地址为",{"2":{"146":1}}],["默认行为略有不同",{"2":{"139":1}}],["默认生成的路由可能为嵌套路由",{"2":{"139":1}}],["默认提供了两组权限",{"2":{"100":1}}],["默认提供三套环境配置",{"2":{"59":1}}],["默认隐藏",{"2":{"91":1}}],["默认为文件路径",{"2":{"139":1}}],["默认为",{"2":{"83":1,"91":1}}],["默认导航栏",{"2":{"77":1}}],["默认会在页面底部中间显示一个开发者工具按钮",{"2":{"62":1}}],["默认值",{"2":{"6":1,"9":1,"16":1,"19":1,"21":1,"23":1,"86":1,"95":1,"96":1,"97":1,"98":1,"142":1,"143":1,"144":1,"145":1}}],["默认使用第一套",{"2":{"86":1}}],["默认使用应用配置",{"2":{"86":5}}],["默认使用",{"2":{"4":1}}],["说明你使用的版本不支持或者配置参数有变动",{"2":{"60":1}}],["说明",{"2":{"6":1,"7":1,"9":1,"10":1,"16":1,"17":1,"19":1,"21":1,"23":1,"70":1,"72":1,"82":1,"86":1,"87":1,"88":1,"95":1,"96":1,"97":1,"98":1,"106":1,"114":1,"142":1,"143":1,"144":1,"145":1,"152":1,"153":1}}],["鉴权指令",{"0":{"103":1},"2":{"103":1}}],["鉴权组件和鉴权指令控制的是页面上的元素",{"2":{"104":1}}],["鉴权组件",{"0":{"102":1}}],["鉴权函数",{"0":{"104":1},"2":{"26":1}}],["鉴权",{"0":{"5":1,"8":1,"26":1},"1":{"6":1,"7":1,"9":1,"10":1}}],["about",{"2":{"139":1}}],["active",{"2":{"156":2,"157":3}}],["activeicon",{"0":{"97":1},"2":{"60":3}}],["accept",{"2":{"79":1}}],["assign",{"2":{"76":4}}],["assets",{"2":{"67":3,"69":1,"70":2,"150":2}}],["any>",{"2":{"126":1,"133":1}}],["any",{"2":{"76":1}}],["antfu",{"2":{"54":1}}],["awesome",{"2":{"60":2}}],["autoprefixer",{"2":{"83":1}}],["auto",{"2":{"60":2,"167":1}}],["auth=",{"2":{"103":2}}],["auth>",{"2":{"102":5}}],["auth",{"0":{"8":1,"145":1},"1":{"9":1,"10":1},"2":{"26":2,"101":2,"102":3,"103":3,"104":3,"105":2}}],["authall>",{"2":{"102":1}}],["authall",{"0":{"5":1},"1":{"6":1,"7":1},"2":{"26":2,"102":2,"104":2}}],["allow",{"2":{"146":1}}],["allowjs",{"2":{"117":1}}],["allocation",{"2":{"116":1}}],["all=",{"2":{"103":1}}],["ally",{"2":{"75":1}}],["all",{"2":{"60":1,"63":1,"90":2,"91":1,"93":1,"94":2,"100":1,"103":1,"139":3,"147":1,"157":1,"158":1,"159":1,"160":1,"163":1,"170":1}}],["arrow",{"2":{"152":2,"153":2}}],["array",{"2":{"6":2,"9":2,"19":1}}],["archive",{"2":{"48":3,"59":2}}],["add",{"2":{"39":2,"116":1,"125":1,"132":1}}],["admin",{"2":{"0":8,"100":1,"105":2}}],["app",{"2":{"35":2,"39":2,"40":7,"45":2,"59":17,"60":1,"63":1,"86":1,"100":1,"126":8,"133":8,"139":1,"147":1,"157":1,"158":1,"159":1,"160":1,"163":1,"170":1}}],["api2",{"2":{"40":2}}],["api",{"0":{"24":1,"166":1},"1":{"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"167":1,"168":1},"2":{"25":4,"35":6,"36":4,"37":1,"38":1,"39":7,"40":18,"42":4,"59":4,"82":2,"100":1,"139":1,"166":5,"167":4}}],["axios",{"2":{"33":1,"35":1,"37":4,"40":2,"59":3}}],["访问",{"2":{"4":2,"65":1,"66":1}}],["查看示例",{"2":{"78":1}}],["查看当前版本的完整配置作为参考",{"2":{"60":1}}],["查看内建组件示例页面",{"2":{"13":1}}],["查看",{"2":{"4":1}}],["团队代码规范",{"2":{"4":1}}],["国际化",{"0":{"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1},"2":{"4":1,"142":1}}],["个图标可以免费使用",{"2":{"151":1}}],["个数据源",{"2":{"40":1}}],["个",{"2":{"4":2}}],["5m",{"2":{"147":2}}],["5",{"2":{"4":1,"83":1}}],["布局组件",{"2":{"4":7}}],["6f6f6f",{"2":{"156":2,"157":3}}],["6",{"2":{"4":3,"157":1}}],["暗黑模式",{"2":{"158":1}}],["暗黑",{"2":{"4":2}}],["款模板和",{"2":{"174":1}}],["款模板都很成熟",{"2":{"174":1}}],["款主题",{"2":{"157":1}}],["款",{"2":{"4":4,"157":1}}],["12",{"2":{"157":1}}],["15191e",{"2":{"156":1,"157":1}}],["141414",{"2":{"156":3,"157":3}}],["10",{"2":{"36":1,"42":2}}],["100+",{"2":{"151":1}}],["100dvh",{"2":{"126":2,"133":2}}],["10000",{"2":{"40":1}}],["100",{"2":{"2":1,"19":1,"151":1}}],["1",{"0":{"51":1},"2":{"4":2,"19":1,"36":1,"42":2,"83":3}}],["明亮模式",{"2":{"158":1}}],["明亮和暗黑模式各",{"2":{"157":1}}],["明亮",{"2":{"4":2}}],["可实现动态切换",{"2":{"157":1}}],["可尝试删除根目录下",{"2":{"146":1}}],["可直接用于实际开发",{"2":{"119":1}}],["可直接测试效果",{"2":{"52":1}}],["可能会出现无法预知的问题",{"2":{"146":1}}],["可能会影响到别人的开发体验",{"2":{"56":1}}],["可能是因为",{"2":{"146":1}}],["可能需要跳转到新闻分类管理的页面进行新增分类的操作",{"2":{"81":1}}],["可访问",{"2":{"78":1}}],["可点击这里查看",{"2":{"76":1}}],["可参考",{"2":{"72":1}}],["可自行新建文件夹分类管理",{"2":{"69":1}}],["可在该路由的",{"2":{"77":1}}],["可在",{"2":{"63":1}}],["可在接口调用处删除",{"2":{"43":1}}],["可设置一个目标路由的",{"2":{"143":1,"144":1}}],["可设置",{"2":{"59":3}}],["可执行",{"2":{"46":1}}],["可以和普通的",{"2":{"168":1}}],["可以协助升级工作开展",{"2":{"164":1}}],["可以清晰的列出文件夹内所有文件的差异",{"2":{"164":1}}],["可以清楚知道改动了哪些",{"2":{"164":1}}],["可以阅读这篇",{"2":{"152":1}}],["可以帮助你快速上手",{"2":{"148":1}}],["可以尝试执行",{"2":{"146":1}}],["可以更精细的去控制页面权限",{"2":{"145":1}}],["可以更精细的去控制页面取消缓存的逻辑",{"2":{"144":1}}],["可以更精细的去控制页面缓存的逻辑",{"2":{"143":1}}],["可以修改路由对象或添加路由元信息",{"2":{"140":1}}],["可以看出几个规范",{"2":{"139":1}}],["可以访问此仓库查看示例源码",{"2":{"130":1,"137":1}}],["可以访问路由页面",{"2":{"101":1}}],["可以点这里去购买",{"2":{"121":1}}],["可以浏览下这个",{"2":{"111":1}}],["可以将标签栏全局开启",{"2":{"93":1}}],["可以将导航栏全局开启",{"2":{"90":1}}],["可以直接将",{"2":{"82":1}}],["可以查阅",{"2":{"54":1,"55":1}}],["可以执行",{"2":{"45":1}}],["可以在",{"2":{"57":1,"60":1}}],["可以在代码控制台查看日志信息",{"2":{"42":1}}],["可以在拦截器里用统一的报错提示来展示",{"2":{"37":1}}],["可以设置",{"2":{"39":1}}],["可以到",{"2":{"14":1}}],["可以通过参考任何一份方案",{"2":{"12":1}}],["可以先扫下面这个二维码领取红包",{"2":{"2":1}}],["可选值",{"2":{"6":1,"9":1,"16":1,"19":1,"21":1,"23":1,"86":1}}],["可删除",{"2":{"4":1}}],["可替换成任意",{"2":{"4":1}}],["vs",{"2":{"122":1}}],["vscode",{"0":{"75":1},"2":{"75":1}}],["v3",{"2":{"112":1,"123":1}}],["v",{"2":{"103":5}}],["vh",{"2":{"83":1,"126":2,"133":2}}],["vw",{"2":{"83":5,"165":3}}],["vconsole",{"2":{"59":3}}],["viewportunit",{"2":{"83":1}}],["viewportwidth",{"2":{"83":1}}],["views",{"2":{"78":1,"81":6,"82":1,"107":1,"108":1,"138":1,"139":10}}],["visual",{"2":{"52":1,"60":1,"122":4}}],["vite",{"2":{"4":1,"35":2,"39":6,"40":12,"41":1,"42":1,"43":1,"45":1,"47":4,"48":3,"49":1,"59":28,"62":1,"112":6,"116":1,"123":1}}],["vertical",{"2":{"21":1}}],["varlocaleprovider>",{"2":{"133":2}}],["varlocaleprovider",{"2":{"133":2}}],["varlet",{"0":{"131":1},"1":{"132":1,"133":1,"134":1,"135":1,"136":1,"137":1},"2":{"12":1,"131":1,"132":2,"133":11,"136":2}}],["val",{"2":{"133":4}}],["value=",{"2":{"102":3}}],["value",{"2":{"6":1,"9":1,"19":2,"23":1,"147":2,"167":1}}],["vant4",{"2":{"174":1}}],["vant",{"2":{"4":1,"12":3,"124":2,"126":1,"127":1,"128":3,"129":1,"131":2,"133":2,"134":1,"135":3,"136":1,"174":1}}],["vue2",{"2":{"166":1}}],["vuex",{"2":{"148":1}}],["vue3",{"2":{"148":1,"166":1,"167":1,"174":4}}],["vuejs",{"2":{"148":1}}],["vue",{"2":{"4":1,"61":1,"63":1,"70":2,"72":2,"74":1,"78":2,"81":13,"82":2,"85":1,"94":1,"105":1,"113":1,"114":2,"115":1,"116":1,"122":1,"123":3,"126":6,"133":6,"138":1,"139":26,"140":1,"148":1,"150":1,"152":4,"153":3,"167":5,"168":3,"171":1}}],["375px",{"2":{"165":2}}],["320",{"2":{"83":1}}],["360",{"2":{"21":1}}],["30",{"2":{"19":1}}],["3",{"2":{"4":1,"19":1,"81":1,"106":3,"112":3,"123":1,"168":2,"174":2}}],["✅",{"2":{"4":16}}],["长期维护更新",{"2":{"4":1}}],["虚拟物品不支持退货退款",{"2":{"3":1}}],["需设置",{"2":{"144":1}}],["需设置当前页面使用哪套标签栏",{"2":{"86":1}}],["需开启页面缓存",{"2":{"86":1}}],["需注意",{"2":{"40":1}}],["需要注意以下两点",{"2":{"152":1}}],["需要注意",{"2":{"114":1}}],["需要注意一点",{"2":{"43":1}}],["需要手动进行修改",{"2":{"100":1}}],["需要忽略的",{"2":{"83":1}}],["需要转换的单位",{"2":{"83":1}}],["需要将它缓存",{"2":{"81":1}}],["需要对新闻列表页进行缓存",{"2":{"81":1}}],["需要在本地依次安装好",{"2":{"122":1}}],["需要在配置",{"2":{"42":1}}],["需要在",{"2":{"40":1}}],["需要开发者根据实际情况去修改调整",{"2":{"37":1}}],["需要鉴权的",{"2":{"7":1,"10":1}}],["需保留",{"2":{"4":1}}],["需由购买者自行承担",{"2":{"3":1}}],["需提供你的",{"2":{"1":1}}],["商业信息丢失或任何其它经济损失",{"2":{"3":1}}],["商业赢利丧失",{"2":{"3":1}}],["贸易中断",{"2":{"3":1}}],["包括顶部导航栏",{"2":{"84":1}}],["包括但不限于个人损害",{"2":{"3":1}}],["包含全部源码",{"2":{"3":1}}],["进入其它任何页面都不会缓存",{"2":{"81":2}}],["进入专业版开发者私有组织",{"2":{"1":1}}],["进行样式编写",{"2":{"161":1}}],["进行业务开发了",{"2":{"129":1,"136":1}}],["进行开发工作了",{"2":{"80":1}}],["进行开发",{"2":{"75":1,"117":1,"166":1}}],["进行一次格式校验",{"2":{"54":1,"55":1}}],["进行二次转售或发布",{"2":{"3":1}}],["不如先了解一下我们这款框架",{"2":{"174":1}}],["不仅我们的框架如此",{"2":{"164":1}}],["不够用的情况",{"2":{"147":1}}],["不可避免会出现",{"2":{"147":1}}],["不可以用于任何形式的开源项目",{"2":{"3":1}}],["不具备访问权限则会显示",{"2":{"145":1}}],["不具备该权限又是如何显示",{"2":{"102":1}}],["不能在",{"2":{"140":1}}],["不含示例代码",{"2":{"119":1}}],["不管个人还是团队",{"2":{"117":1}}],["不同的历史模式",{"2":{"113":1}}],["不跟随页面滚动",{"2":{"91":1}}],["不会在",{"2":{"139":1}}],["不会",{"0":{"117":1}}],["不会转为视口单位",{"2":{"83":1}}],["不会被服务端的开发所阻塞",{"2":{"41":1}}],["不然线上环境将会报错",{"2":{"43":1}}],["不需要手动重启",{"2":{"42":1}}],["不得直接对本产品",{"2":{"3":1}}],["不限制域名和项目数量",{"2":{"3":1}}],["不支持换绑",{"2":{"2":1}}],["本套件默认提供了",{"2":{"106":1}}],["本套件支持使用",{"2":{"83":1}}],["本组件不是一个可以随处使用的组件",{"2":{"85":1}}],["本身也有自己的语言包",{"2":{"76":1}}],["本产品的源码",{"2":{"3":1}}],["本产品购买后可用于开发商业项目",{"2":{"3":1}}],["本价格不参与任何限时优惠活动",{"2":{"0":3}}],["禁止用于黄赌毒等危害国家安全与稳定的网站",{"2":{"3":1}}],["符合国家法律法规",{"2":{"3":1}}],["人有我优",{"2":{"174":1}}],["人无我有",{"2":{"174":1}}],["人",{"2":{"2":1}}],["元",{"2":{"2":1}}],["绑定的开发者同样可加入专业版微信群",{"2":{"2":1}}],["群内提供框架技术支持",{"2":{"2":1}}],["限时优惠",{"2":{"2":1}}],["若你打算使用支付宝进行付款",{"2":{"2":1}}],["领红包",{"2":{"2":1}}],["获取源码",{"2":{"1":1}}],["平台",{"2":{"1":1}}],["用一句简单的话概括就是",{"2":{"174":1}}],["用户必须具备全部权限",{"2":{"102":1,"103":1,"104":1}}],["用户只要具备其中任何一个权限",{"2":{"102":1,"103":1,"104":1}}],["用户访问使用了自定义字体的页面时",{"2":{"64":1}}],["用户名登录",{"2":{"100":1}}],["用户名",{"2":{"1":2}}],["用于接收框架相关通知公告的唯一方式",{"2":{"1":1}}],["专业版默认提供了",{"2":{"157":1}}],["专业版用户也同样",{"2":{"124":1,"131":1}}],["专业版用户会被邀请加入到",{"2":{"121":1}}],["专业版用户可加入专业版微信群",{"2":{"2":1}}],["专业版支持配置多套标签栏",{"2":{"94":1}}],["专业版与基础版区别",{"0":{"4":1}}],["专业版",{"0":{"121":1,"157":1,"177":1},"2":{"2":1,"4":1,"13":1,"51":1,"126":1,"133":1}}],["专业版源码托管在",{"2":{"1":1}}],["专业版客户的唯一凭证",{"2":{"1":1}}],["专业版超值优惠合集③",{"2":{"0":1}}],["专业版超值优惠合集②",{"2":{"0":1}}],["专业版超值优惠合集①",{"2":{"0":1}}],["授权邮箱号",{"2":{"1":1}}],["付款截图凭证",{"2":{"1":1}}],["邮箱等任意一种联系方式",{"2":{"1":1}}],["微信",{"2":{"1":1}}],["请按模块进行区分",{"2":{"148":1}}],["请勿使用该方案",{"2":{"146":1}}],["请勿使用",{"2":{"146":1}}],["请勿在该文件内修改",{"2":{"60":1}}],["请到专业版仓库下载框架源码",{"2":{"124":1,"131":1}}],["请拉取框架源码分支",{"2":{"124":1,"131":1}}],["请谨慎使用",{"2":{"120":1}}],["请先详细阅读",{"2":{"106":1}}],["请先加作者微信进行在线咨询",{"2":{"1":1}}],["请设置为箭头函数形式",{"2":{"99":1}}],["请阅读",{"2":{"59":1}}],["请在",{"2":{"56":1,"60":1}}],["请确保手上已经有",{"2":{"119":1}}],["请确保在安装依赖前",{"2":{"56":1}}],["请确保已阅读",{"2":{"52":1}}],["请使用",{"2":{"52":1}}],["请彻底关闭线上环境",{"2":{"43":1}}],["请求第",{"2":{"40":1}}],["请求默认数据源",{"2":{"40":1}}],["请求",{"2":{"36":2,"39":1,"40":1}}],["请求可使用以下的方法",{"2":{"36":1}}],["请求调用",{"0":{"36":1}}],["请加作者微信进行购买",{"2":{"0":3}}],["购买者需保证不传播产品源码",{"2":{"3":1}}],["购买者可将本产品用于任意",{"2":{"3":1}}],["购买流程",{"0":{"1":1}}],["购买专业版的用户会邀请到专业版的微信群",{"2":{"177":1}}],["购买专业版",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["合集优惠价",{"2":{"0":3}}],["=",{"2":{"0":3}}],["¥369",{"2":{"2":1}}],["¥2797",{"2":{"0":1}}],["¥899",{"2":{"0":1}}],["¥999",{"2":{"0":2}}],["¥1499",{"2":{"0":1}}],["¥1598",{"2":{"0":1}}],["¥1099",{"2":{"0":1}}],["¥1798",{"2":{"0":1}}],["¥1199",{"2":{"0":2}}],["¥599",{"2":{"0":3,"2":1}}],["+",{"2":{"0":8}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.C8j-OOtD.js b/assets/chunks/VPLocalSearchBox.C8j-OOtD.js new file mode 100644 index 0000000..5a1d3db --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.C8j-OOtD.js @@ -0,0 +1,7 @@ +var Nt=Object.defineProperty;var It=(o,e,t)=>e in o?Nt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>It(o,typeof e!="symbol"?e+"":e,t);import{X as Dt,s as oe,v as $e,ax as kt,ay as Ot,d as Rt,G as xe,az as tt,h as Fe,aA as _t,aB as Mt,x as Lt,aC as zt,y as Re,R as de,Q as Ee,aD as Pt,aE as Bt,Y as Vt,U as $t,aF as Wt,o as ee,b as Kt,j as k,a1 as Jt,k as j,aG as Ut,aH as jt,aI as Gt,c as re,n as rt,e as Se,E as at,F as nt,a as ve,t as pe,aJ as Ht,p as Qt,l as qt,aK as it,a3 as Yt,an as Zt,at as Xt,aL as er,_ as tr}from"./framework.D-J1Cv1C.js";import{u as rr,c as ar}from"./theme.LZ60Kooo.js";const nr={root:()=>Dt(()=>import("./@localSearchIndexroot.DdZsg3ni.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var yt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ce=yt.join(","),mt=typeof Element>"u",ue=mt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!mt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ie=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},ir=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Ie(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ce));return t&&ue.call(e,Ce)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ie(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=ue.call(i,Ce);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ie(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var y=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||ir(e))&&!wt(e)?0:e.tabIndex},or=function(e,t){var r=se(e);return r<0&&t&&!wt(e)?0:r},sr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},ur=function(e){return xt(e)&&e.type==="hidden"},lr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},cr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(ue.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Ne(e);if(u&&!u.shadowRoot&&n(u)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(vr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return ot(e);return!1},yr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},gr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=or(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(sr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:mr}):r=gt(e,t.includeContainer,We.bind(null,t)),gr(r)},wr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:De.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,De.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,Ce)===!1?!1:We(t,e)},xr=yt.concat("iframe").join(","),_e=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,xr)===!1?!1:De(t,e)};/*! +* focus-trap 7.5.4 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function st(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function ut(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},Ar=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Tr=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ge=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Cr=function(e){return ge(e)&&!e.shiftKey},Nr=function(e){return ge(e)&&e.shiftKey},ct=function(e){return setTimeout(e,0)},ft=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},ye=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?p-1:0),I=1;I=0)c=r.activeElement;else{var f=i.tabbableGroups[0],p=f&&f.firstTabbableNode;c=p||h("fallbackFocus")}if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var f=br(c,a.tabbableOptions),p=wr(c,a.tabbableOptions),N=f.length>0?f[0]:void 0,I=f.length>0?f[f.length-1]:void 0,M=p.find(function(m){return le(m)}),z=p.slice().reverse().find(function(m){return le(m)}),P=!!f.find(function(m){return se(m)>0});return{container:c,tabbableNodes:f,focusableNodes:p,posTabIndexesFound:P,firstTabbableNode:N,lastTabbableNode:I,firstDomTabbableNode:M,lastDomTabbableNode:z,nextTabbableNode:function(x){var $=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,K=f.indexOf(x);return K<0?$?p.slice(p.indexOf(x)+1).find(function(H){return le(H)}):p.slice(0,p.indexOf(x)).reverse().find(function(H){return le(H)}):f[K+($?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},y=function w(c){var f=c.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?w(f.shadowRoot):f},b=function w(c){if(c!==!1&&c!==y(document)){if(!c||!c.focus){w(d());return}c.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=c,Ar(c)&&c.select()}},E=function(c){var f=h("setReturnFocus",c);return f||(f===!1?!1:c)},g=function(c){var f=c.target,p=c.event,N=c.isBackward,I=N===void 0?!1:N;f=f||Ae(p),v();var M=null;if(i.tabbableGroups.length>0){var z=l(f,p),P=z>=0?i.containerGroups[z]:void 0;if(z<0)I?M=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:M=i.tabbableGroups[0].firstTabbableNode;else if(I){var m=ft(i.tabbableGroups,function(B){var U=B.firstTabbableNode;return f===U});if(m<0&&(P.container===f||_e(f,a.tabbableOptions)&&!le(f,a.tabbableOptions)&&!P.nextTabbableNode(f,!1))&&(m=z),m>=0){var x=m===0?i.tabbableGroups.length-1:m-1,$=i.tabbableGroups[x];M=se(f)>=0?$.lastTabbableNode:$.lastDomTabbableNode}else ge(p)||(M=P.nextTabbableNode(f,!1))}else{var K=ft(i.tabbableGroups,function(B){var U=B.lastTabbableNode;return f===U});if(K<0&&(P.container===f||_e(f,a.tabbableOptions)&&!le(f,a.tabbableOptions)&&!P.nextTabbableNode(f))&&(K=z),K>=0){var H=K===i.tabbableGroups.length-1?0:K+1,Q=i.tabbableGroups[H];M=se(f)>=0?Q.firstTabbableNode:Q.firstDomTabbableNode}else ge(p)||(M=P.nextTabbableNode(f))}}else M=h("fallbackFocus");return M},S=function(c){var f=Ae(c);if(!(l(f,c)>=0)){if(ye(a.clickOutsideDeactivates,c)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}ye(a.allowOutsideClick,c)||c.preventDefault()}},T=function(c){var f=Ae(c),p=l(f,c)>=0;if(p||f instanceof Document)p&&(i.mostRecentlyFocusedNode=f);else{c.stopImmediatePropagation();var N,I=!0;if(i.mostRecentlyFocusedNode)if(se(i.mostRecentlyFocusedNode)>0){var M=l(i.mostRecentlyFocusedNode),z=i.containerGroups[M].tabbableNodes;if(z.length>0){var P=z.findIndex(function(m){return m===i.mostRecentlyFocusedNode});P>=0&&(a.isKeyForward(i.recentNavEvent)?P+1=0&&(N=z[P-1],I=!1))}}else i.containerGroups.some(function(m){return m.tabbableNodes.some(function(x){return se(x)>0})})||(I=!1);else I=!1;I&&(N=g({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),b(N||i.mostRecentlyFocusedNode||d())}i.recentNavEvent=void 0},F=function(c){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var p=g({event:c,isBackward:f});p&&(ge(c)&&c.preventDefault(),b(p))},L=function(c){if(Tr(c)&&ye(a.escapeDeactivates,c)!==!1){c.preventDefault(),s.deactivate();return}(a.isKeyForward(c)||a.isKeyBackward(c))&&F(c,a.isKeyBackward(c))},_=function(c){var f=Ae(c);l(f,c)>=0||ye(a.clickOutsideDeactivates,c)||ye(a.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},V=function(){if(i.active)return lt.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?ct(function(){b(d())}):b(d()),r.addEventListener("focusin",T,!0),r.addEventListener("mousedown",S,{capture:!0,passive:!1}),r.addEventListener("touchstart",S,{capture:!0,passive:!1}),r.addEventListener("click",_,{capture:!0,passive:!1}),r.addEventListener("keydown",L,{capture:!0,passive:!1}),s},C=function(){if(i.active)return r.removeEventListener("focusin",T,!0),r.removeEventListener("mousedown",S,!0),r.removeEventListener("touchstart",S,!0),r.removeEventListener("click",_,!0),r.removeEventListener("keydown",L,!0),s},R=function(c){var f=c.some(function(p){var N=Array.from(p.removedNodes);return N.some(function(I){return I===i.mostRecentlyFocusedNode})});f&&b(d())},A=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(R):void 0,O=function(){A&&(A.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){A.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var f=u(c,"onActivate"),p=u(c,"onPostActivate"),N=u(c,"checkCanFocusTrap");N||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,f==null||f();var I=function(){N&&v(),V(),O(),p==null||p()};return N?(N(i.containers.concat()).then(I,I),this):(I(),this)},deactivate:function(c){if(!i.active)return this;var f=ut({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,C(),i.active=!1,i.paused=!1,O(),lt.deactivateTrap(n,s);var p=u(f,"onDeactivate"),N=u(f,"onPostDeactivate"),I=u(f,"checkCanReturnFocus"),M=u(f,"returnFocus","returnFocusOnDeactivate");p==null||p();var z=function(){ct(function(){M&&b(E(i.nodeFocusedBeforeActivation)),N==null||N()})};return M&&I?(I(E(i.nodeFocusedBeforeActivation)).then(z,z),this):(z(),this)},pause:function(c){if(i.paused||!i.active)return this;var f=u(c,"onPause"),p=u(c,"onPostPause");return i.paused=!0,f==null||f(),C(),O(),p==null||p(),this},unpause:function(c){if(!i.paused||!i.active)return this;var f=u(c,"onUnpause"),p=u(c,"onPostUnpause");return i.paused=!1,f==null||f(),v(),V(),O(),p==null||p(),this},updateContainerElements:function(c){var f=[].concat(c).filter(Boolean);return i.containers=f.map(function(p){return typeof p=="string"?r.querySelector(p):p}),i.active&&v(),O(),this}},s.updateContainerElements(e),s};function kr(o,e={}){let t;const{immediate:r,...n}=e,a=oe(!1),i=oe(!1),s=d=>t&&t.activate(d),u=d=>t&&t.deactivate(d),l=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)};return $e(()=>kt(o),d=>{d&&(t=Dr(d,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Ot(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:h}}class fe{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{fe.matches(l,this.exclude)?u():this.onIframeReady(l,h=>{t(l)&&(s++,r(h)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new fe(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,h,d=()=>({prevNode:h,node:l}=this.getIteratorNode(i),l);for(;d();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,h,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,y=>u.push(y),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let Or=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new fe(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return fe.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,h=(r>i.end?i.end:r)-i.start,d=e.value.substr(0,i.start),v=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,h),e.value=d+v,e.nodes.forEach((y,b)=>{b>=s&&(e.nodes[b].start>0&&b!==s&&(e.nodes[b].start-=h),e.nodes[b].end-=h)}),r-=h,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let h=l.index;if(i!==0)for(let d=1;d{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let d=1;dr(u[i],d),(d,v)=>{e.lastIndex=v,n(d)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:h,valid:d}=this.checkWhitespaceRanges(s,i,a.value);d&&this.wrapRangeInMappedTextNode(a,l,h,v=>t(v,s,a.value.substring(l,h),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let h=new RegExp(this.createRegExp(l),`gm${s}`),d=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(v,y)=>this.opt.filter(y,l,r,d),v=>{d++,r++,this.opt.each(v)},()=>{d===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=fe.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Rr(o){const e=new Or(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var W=function(){return W=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function J(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var Lr="ENTRIES",Ft="KEYS",Et="VALUES",G="",Me=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=ce(this._path),t=e.node,r=e.keys;if(ce(r)===G)return{done:!1,value:this.result()};var n=t.get(ce(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=ce(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return ce(t)}).filter(function(e){return e!==G}).join("")},o.prototype.value=function(){return ce(this._path).node.get(G)},o.prototype.result=function(){switch(this._type){case Et:return this.value();case Ft:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),ce=function(o){return o[o.length-1]},zr=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}St(o.get(y),e,t,r,n,E,i,s+y)}}}catch(f){u={error:f}}finally{try{v&&!v.done&&(l=d.return)&&l.call(d)}finally{if(u)throw u.error}}},Le=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=J(ke(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=J(je(i),2),u=s[0],l=s[1];try{for(var h=D(u.keys()),d=h.next();!d.done;d=h.next()){var v=d.value;if(v!==G&&v.startsWith(l)){var y=new Map;return y.set(v.slice(l.length),u.get(v)),new o(y,e)}}}catch(b){t={error:b}}finally{try{d&&!d.done&&(r=h.return)&&r.call(h)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Pr(this._tree,e)},o.prototype.entries=function(){return new Me(this,Lr)},o.prototype.forEach=function(e){var t,r;try{for(var n=D(this),a=n.next();!a.done;a=n.next()){var i=J(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return zr(this._tree,e,t)},o.prototype.get=function(e){var t=Ke(this._tree,e);return t!==void 0?t.get(G):void 0},o.prototype.has=function(e){var t=Ke(this._tree,e);return t!==void 0&&t.has(G)},o.prototype.keys=function(){return new Me(this,Ft)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=ze(this._tree,e);return r.set(G,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=ze(this._tree,e);return r.set(G,t(r.get(G))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=ze(this._tree,e),n=r.get(G);return n===void 0&&r.set(G,n=t()),n},o.prototype.values=function(){return new Me(this,Et)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=J(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(h){t={error:h}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),ke=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=D(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==G&&e.startsWith(s))return t.push([o,s]),ke(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),ke(void 0,"",t)},Ke=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=D(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==G&&e.startsWith(i))return Ke(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},ze=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Le,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Ue,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return _r(this,void 0,void 0,function(){var r,n,a,i,s,u,l,h,d,v,y,b,E,g,S,T,F,L,_,V,C,R,A,O,w;return Mr(this,function(c){switch(c.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||Je.batchSize,a=e.batchWait||Je.batchWait,i=1,c.label=1;case 1:c.trys.push([1,7,8,9]),s=D(this._index),u=s.next(),c.label=2;case 2:if(u.done)return[3,6];l=J(u.value,2),h=l[0],d=l[1];try{for(v=(R=void 0,D(d)),y=v.next();!y.done;y=v.next()){b=J(y.value,2),E=b[0],g=b[1];try{for(S=(O=void 0,D(g)),T=S.next();!T.done;T=S.next())F=J(T.value,1),L=F[0],!this._documentIds.has(L)&&(g.size<=1?d.delete(E):g.delete(L))}catch(f){O={error:f}}finally{try{T&&!T.done&&(w=S.return)&&w.call(S)}finally{if(O)throw O.error}}}}catch(f){R={error:f}}finally{try{y&&!y.done&&(A=v.return)&&A.call(v)}finally{if(R)throw R.error}}return this._index.get(h).size===0&&this._index.delete(h),i%n!==0?[3,4]:[4,new Promise(function(f){return setTimeout(f,a)})];case 3:c.sent(),c.label=4;case 4:i+=1,c.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return _=c.sent(),V={error:_},[3,9];case 8:try{u&&!u.done&&(C=s.return)&&C.call(s)}finally{if(V)throw V.error}return[7];case 9:this._dirtCount-=r,c.label=10;case 10:return[4,null];case 11:return c.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||Ve.minDirtCount,r=r||Ve.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=D(a),u=s.next();!u.done;u=s.next()){var l=J(u.value,2),h=l[0],d=l[1],v=d.score,y=d.terms,b=d.match,E=y.length||1,g={id:this._documentIds.get(h),score:v*E,terms:Object.keys(b),queryTerms:y,match:b};Object.assign(g,this._storedFields.get(h)),(t.filter==null||t.filter(g))&&i.push(g)}}catch(S){r={error:S}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return e===o.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||i.sort(vt),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=W(W({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=D(this.search(e,t)),l=u.next();!l.done;l=u.next()){var h=l.value,d=h.score,v=h.terms,y=v.join(" "),b=s.get(y);b!=null?(b.score+=d,b.count+=1):s.set(y,{score:d,terms:v,count:1})}}catch(_){r={error:_}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var E=[];try{for(var g=D(s),S=g.next();!S.done;S=g.next()){var T=J(S.value,2),b=T[0],F=T[1],d=F.score,v=F.terms,L=F.count;E.push({suggestion:b,terms:v,score:d/L})}}catch(_){a={error:_}}finally{try{S&&!S.done&&(i=g.return)&&i.call(g)}finally{if(a)throw a.error}}return E.sort(vt),E},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(Be.hasOwnProperty(e))return Pe(Be,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,h=e.documentCount,d=e.nextId,v=e.documentIds,y=e.fieldIds,b=e.fieldLength,E=e.averageFieldLength,g=e.storedFields,S=e.dirtCount,T=e.serializationVersion;if(T!==1&&T!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var F=new o(t);F._documentCount=h,F._nextId=d,F._documentIds=Te(v),F._idToShortId=new Map,F._fieldIds=y,F._fieldLength=Te(b),F._avgFieldLength=E,F._storedFields=Te(g),F._dirtCount=S||0,F._index=new Le;try{for(var L=D(F._documentIds),_=L.next();!_.done;_=L.next()){var V=J(_.value,2),C=V[0],R=V[1];F._idToShortId.set(R,C)}}catch(P){r={error:P}}finally{try{_&&!_.done&&(n=L.return)&&n.call(L)}finally{if(r)throw r.error}}try{for(var A=D(l),O=A.next();!O.done;O=A.next()){var w=J(O.value,2),c=w[0],f=w[1],p=new Map;try{for(var N=(s=void 0,D(Object.keys(f))),I=N.next();!I.done;I=N.next()){var M=I.value,z=f[M];T===1&&(z=z.ds),p.set(parseInt(M,10),Te(z))}}catch(P){s={error:P}}finally{try{I&&!I.done&&(u=N.return)&&u.call(N)}finally{if(s)throw s.error}}F._index.set(c,p)}}catch(P){a={error:P}}finally{try{O&&!O.done&&(i=A.return)&&i.call(A)}finally{if(a)throw a.error}}return F},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),e===o.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){var n=W(W(W({},t),e),{queries:void 0}),a=e.queries.map(function(g){return r.executeQuery(g,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,h=W(W({tokenize:s,processTerm:u},l),t),d=h.tokenize,v=h.processTerm,y=d(e).flatMap(function(g){return v(g)}).filter(function(g){return!!g}),b=y.map(Jr(h)),E=b.map(function(g){return r.executeQuerySpec(g,h)});return this.combineResults(E,h.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=W(W({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(M,z){var P;return W(W({},M),(P={},P[z]=Pe(s.boost,z)||1,P))},{}),l=s.boostDocument,h=s.weights,d=s.maxFuzzy,v=s.bm25,y=W(W({},ht.weights),h),b=y.fuzzy,E=y.prefix,g=this._index.get(e.term),S=this.termResults(e.term,e.term,1,g,u,l,v),T,F;if(e.prefix&&(T=this._index.atPrefix(e.term)),e.fuzzy){var L=e.fuzzy===!0?.2:e.fuzzy,_=L<1?Math.min(d,Math.round(e.term.length*L)):L;_&&(F=this._index.fuzzyGet(e.term,_))}if(T)try{for(var V=D(T),C=V.next();!C.done;C=V.next()){var R=J(C.value,2),A=R[0],O=R[1],w=A.length-e.term.length;if(w){F==null||F.delete(A);var c=E*A.length/(A.length+.3*w);this.termResults(e.term,A,c,O,u,l,v,S)}}}catch(M){r={error:M}}finally{try{C&&!C.done&&(n=V.return)&&n.call(V)}finally{if(r)throw r.error}}if(F)try{for(var f=D(F.keys()),p=f.next();!p.done;p=f.next()){var A=p.value,N=J(F.get(A),2),I=N[0],w=N[1];if(w){var c=b*A.length/(A.length+w);this.termResults(e.term,A,c,I,u,l,v,S)}}}catch(M){a={error:M}}finally{try{p&&!p.done&&(i=f.return)&&i.call(f)}finally{if(a)throw a.error}}return S},o.prototype.executeWildcardQuery=function(e){var t,r,n=new Map,a=W(W({},this._options.searchOptions),e);try{for(var i=D(this._documentIds),s=i.next();!s.done;s=i.next()){var u=J(s.value,2),l=u[0],h=u[1],d=a.boostDocument?a.boostDocument(h,"",this._storedFields.get(l)):1;n.set(l,{score:d,terms:[],match:{}})}}catch(v){t={error:v}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return n},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Ge),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce($r[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=D(this._index),s=i.next();!s.done;s=i.next()){var u=J(s.value,2),l=u[0],h=u[1],d={};try{for(var v=(r=void 0,D(h)),y=v.next();!y.done;y=v.next()){var b=J(y.value,2),E=b[0],g=b[1];d[E]=Object.fromEntries(g)}}catch(S){r={error:S}}finally{try{y&&!y.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,d])}}catch(S){e={error:S}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,h,d,v,y;if(u===void 0&&(u=new Map),n==null)return u;try{for(var b=D(Object.keys(a)),E=b.next();!E.done;E=b.next()){var g=E.value,S=a[g],T=this._fieldIds[g],F=n.get(T);if(F!=null){var L=F.size,_=this._avgFieldLength[T];try{for(var V=(d=void 0,D(F.keys())),C=V.next();!C.done;C=V.next()){var R=C.value;if(!this._documentIds.has(R)){this.removeTerm(T,R,t),L-=1;continue}var A=i?i(this._documentIds.get(R),t,this._storedFields.get(R)):1;if(A){var O=F.get(R),w=this._fieldLength.get(R)[T],c=Kr(O,L,this._documentCount,w,_,s),f=r*S*A*c,p=u.get(R);if(p){p.score+=f,jr(p.terms,e);var N=Pe(p.match,t);N?N.push(g):p.match[t]=[g]}else u.set(R,{score:f,terms:[e],match:(y={},y[t]=[g],y)})}}}catch(I){d={error:I}}finally{try{C&&!C.done&&(v=V.return)&&v.call(V)}finally{if(d)throw d.error}}}}}catch(I){l={error:I}}finally{try{E&&!E.done&&(h=b.return)&&h.call(b)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,pt),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,pt),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=D(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(Qt("data-v-50b67a39"),o=o(),qt(),o),Qr=["aria-owns"],qr={class:"shell"},Yr=["title"],Zr=Y(()=>k("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)),Xr=[Zr],ea={class:"search-actions before"},ta=["title"],ra=Y(()=>k("span",{class:"vpi-arrow-left local-search-icon"},null,-1)),aa=[ra],na=["placeholder"],ia={class:"search-actions"},oa=["title"],sa=Y(()=>k("span",{class:"vpi-layout-list local-search-icon"},null,-1)),ua=[sa],la=["disabled","title"],ca=Y(()=>k("span",{class:"vpi-delete local-search-icon"},null,-1)),fa=[ca],ha=["id","role","aria-labelledby"],da=["aria-selected"],va=["href","aria-label","onMouseenter","onFocusin"],pa={class:"titles"},ya=Y(()=>k("span",{class:"title-icon"},"#",-1)),ma=["innerHTML"],ga=Y(()=>k("span",{class:"vpi-chevron-right local-search-icon"},null,-1)),ba={class:"title main"},wa=["innerHTML"],xa={key:0,class:"excerpt-wrapper"},Fa={key:0,class:"excerpt",inert:""},Ea=["innerHTML"],Sa=Y(()=>k("div",{class:"excerpt-gradient-bottom"},null,-1)),Aa=Y(()=>k("div",{class:"excerpt-gradient-top"},null,-1)),Ta={key:0,class:"no-results"},Ca={class:"search-keyboard-shortcuts"},Na=["aria-label"],Ia=Y(()=>k("span",{class:"vpi-arrow-up navigate-icon"},null,-1)),Da=[Ia],ka=["aria-label"],Oa=Y(()=>k("span",{class:"vpi-arrow-down navigate-icon"},null,-1)),Ra=[Oa],_a=["aria-label"],Ma=Y(()=>k("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)),La=[Ma],za=["aria-label"],Pa=Rt({__name:"VPLocalSearchBox",emits:["close"],setup(o,{emit:e}){var z,P;const t=e,r=xe(),n=xe(),a=xe(nr),i=rr(),{activate:s}=kr(r,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:u,theme:l}=i,h=tt(async()=>{var m,x,$,K,H,Q,B,U,Z;return it(Vr.loadJSON(($=await((x=(m=a.value)[u.value])==null?void 0:x.call(m)))==null?void 0:$.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((K=l.value.search)==null?void 0:K.provider)==="local"&&((Q=(H=l.value.search.options)==null?void 0:H.miniSearch)==null?void 0:Q.searchOptions)},...((B=l.value.search)==null?void 0:B.provider)==="local"&&((Z=(U=l.value.search.options)==null?void 0:U.miniSearch)==null?void 0:Z.options)}))}),v=Fe(()=>{var m,x;return((m=l.value.search)==null?void 0:m.provider)==="local"&&((x=l.value.search.options)==null?void 0:x.disableQueryPersistence)===!0}).value?oe(""):_t("vitepress:local-search-filter",""),y=Mt("vitepress:local-search-detailed-list",((z=l.value.search)==null?void 0:z.provider)==="local"&&((P=l.value.search.options)==null?void 0:P.detailedView)===!0),b=Fe(()=>{var m,x,$;return((m=l.value.search)==null?void 0:m.provider)==="local"&&(((x=l.value.search.options)==null?void 0:x.disableDetailedView)===!0||(($=l.value.search.options)==null?void 0:$.detailedView)===!1)}),E=Fe(()=>{var x,$,K,H,Q,B,U;const m=((x=l.value.search)==null?void 0:x.options)??l.value.algolia;return((Q=(H=(K=($=m==null?void 0:m.locales)==null?void 0:$[u.value])==null?void 0:K.translations)==null?void 0:H.button)==null?void 0:Q.buttonText)||((U=(B=m==null?void 0:m.translations)==null?void 0:B.button)==null?void 0:U.buttonText)||"Search"});Lt(()=>{b.value&&(y.value=!1)});const g=xe([]),S=oe(!1);$e(v,()=>{S.value=!1});const T=tt(async()=>{if(n.value)return it(new Rr(n.value))},null),F=new Hr(16);zt(()=>[h.value,v.value,y.value],async([m,x,$],K,H)=>{var be,He,Qe,qe;(K==null?void 0:K[0])!==m&&F.clear();let Q=!1;if(H(()=>{Q=!0}),!m)return;g.value=m.search(x).slice(0,16),S.value=!0;const B=$?await Promise.all(g.value.map(q=>L(q.id))):[];if(Q)return;for(const{id:q,mod:ae}of B){const ne=q.slice(0,q.indexOf("#"));let te=F.get(ne);if(te)continue;te=new Map,F.set(ne,te);const X=ae.default??ae;if(X!=null&&X.render||X!=null&&X.setup){const ie=Yt(X);ie.config.warnHandler=()=>{},ie.provide(Zt,i),Object.defineProperties(ie.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ye=document.createElement("div");ie.mount(Ye),Ye.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(he=>{var et;const we=(et=he.querySelector("a"))==null?void 0:et.getAttribute("href"),Ze=(we==null?void 0:we.startsWith("#"))&&we.slice(1);if(!Ze)return;let Xe="";for(;(he=he.nextElementSibling)&&!/^h[1-6]$/i.test(he.tagName);)Xe+=he.outerHTML;te.set(Ze,Xe)}),ie.unmount()}if(Q)return}const U=new Set;if(g.value=g.value.map(q=>{const[ae,ne]=q.id.split("#"),te=F.get(ae),X=(te==null?void 0:te.get(ne))??"";for(const ie in q.match)U.add(ie);return{...q,text:X}}),await de(),Q)return;await new Promise(q=>{var ae;(ae=T.value)==null||ae.unmark({done:()=>{var ne;(ne=T.value)==null||ne.markRegExp(M(U),{done:q})}})});const Z=((be=r.value)==null?void 0:be.querySelectorAll(".result .excerpt"))??[];for(const q of Z)(He=q.querySelector('mark[data-markjs="true"]'))==null||He.scrollIntoView({block:"center"});(qe=(Qe=n.value)==null?void 0:Qe.firstElementChild)==null||qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function L(m){const x=Xt(m.slice(0,m.indexOf("#")));try{if(!x)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await import(x)}}catch($){return console.error($),{id:m,mod:{}}}}const _=oe(),V=Fe(()=>{var m;return((m=v.value)==null?void 0:m.length)<=0});function C(m=!0){var x,$;(x=_.value)==null||x.focus(),m&&(($=_.value)==null||$.select())}Re(()=>{C()});function R(m){m.pointerType==="mouse"&&C()}const A=oe(-1),O=oe(!1);$e(g,m=>{A.value=m.length?0:-1,w()});function w(){de(()=>{const m=document.querySelector(".result.selected");m==null||m.scrollIntoView({block:"nearest"})})}Ee("ArrowUp",m=>{m.preventDefault(),A.value--,A.value<0&&(A.value=g.value.length-1),O.value=!0,w()}),Ee("ArrowDown",m=>{m.preventDefault(),A.value++,A.value>=g.value.length&&(A.value=0),O.value=!0,w()});const c=Pt();Ee("Enter",m=>{if(m.isComposing||m.target instanceof HTMLButtonElement&&m.target.type!=="submit")return;const x=g.value[A.value];if(m.target instanceof HTMLInputElement&&!x){m.preventDefault();return}x&&(c.go(x.id),t("close"))}),Ee("Escape",()=>{t("close")});const p=ar({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Re(()=>{window.history.pushState(null,"",null)}),Bt("popstate",m=>{m.preventDefault(),t("close")});const N=Vt($t?document.body:null);Re(()=>{de(()=>{N.value=!0,de().then(()=>s())})}),Wt(()=>{N.value=!1});function I(){v.value="",de().then(()=>C(!1))}function M(m){return new RegExp([...m].sort((x,$)=>$.length-x.length).map(x=>`(${er(x)})`).join("|"),"gi")}return(m,x)=>{var $,K,H,Q;return ee(),Kt(Ht,{to:"body"},[k("div",{ref_key:"el",ref:r,role:"button","aria-owns":($=g.value)!=null&&$.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[k("div",{class:"backdrop",onClick:x[0]||(x[0]=B=>m.$emit("close"))}),k("div",qr,[k("form",{class:"search-bar",onPointerup:x[4]||(x[4]=B=>R(B)),onSubmit:x[5]||(x[5]=Jt(()=>{},["prevent"]))},[k("label",{title:E.value,id:"localsearch-label",for:"localsearch-input"},Xr,8,Yr),k("div",ea,[k("button",{class:"back-button",title:j(p)("modal.backButtonTitle"),onClick:x[1]||(x[1]=B=>m.$emit("close"))},aa,8,ta)]),Ut(k("input",{ref_key:"searchInput",ref:_,"onUpdate:modelValue":x[2]||(x[2]=B=>Gt(v)?v.value=B:null),placeholder:E.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,na),[[jt,j(v)]]),k("div",ia,[b.value?Se("",!0):(ee(),re("button",{key:0,class:rt(["toggle-layout-button",{"detailed-list":j(y)}]),type:"button",title:j(p)("modal.displayDetails"),onClick:x[3]||(x[3]=B=>A.value>-1&&(y.value=!j(y)))},ua,10,oa)),k("button",{class:"clear-button",type:"reset",disabled:V.value,title:j(p)("modal.resetButtonTitle"),onClick:I},fa,8,la)])],32),k("ul",{ref_key:"resultsEl",ref:n,id:(K=g.value)!=null&&K.length?"localsearch-list":void 0,role:(H=g.value)!=null&&H.length?"listbox":void 0,"aria-labelledby":(Q=g.value)!=null&&Q.length?"localsearch-label":void 0,class:"results",onMousemove:x[7]||(x[7]=B=>O.value=!1)},[(ee(!0),re(nt,null,at(g.value,(B,U)=>(ee(),re("li",{key:B.id,role:"option","aria-selected":A.value===U?"true":"false"},[k("a",{href:B.id,class:rt(["result",{selected:A.value===U}]),"aria-label":[...B.titles,B.title].join(" > "),onMouseenter:Z=>!O.value&&(A.value=U),onFocusin:Z=>A.value=U,onClick:x[6]||(x[6]=Z=>m.$emit("close"))},[k("div",null,[k("div",pa,[ya,(ee(!0),re(nt,null,at(B.titles,(Z,be)=>(ee(),re("span",{key:be,class:"title"},[k("span",{class:"text",innerHTML:Z},null,8,ma),ga]))),128)),k("span",ba,[k("span",{class:"text",innerHTML:B.title},null,8,wa)])]),j(y)?(ee(),re("div",xa,[B.text?(ee(),re("div",Fa,[k("div",{class:"vp-doc",innerHTML:B.text},null,8,Ea)])):Se("",!0),Sa,Aa])):Se("",!0)])],42,va)],8,da))),128)),j(v)&&!g.value.length&&S.value?(ee(),re("li",Ta,[ve(pe(j(p)("modal.noResultsText"))+' "',1),k("strong",null,pe(j(v)),1),ve('" ')])):Se("",!0)],40,ha),k("div",Ca,[k("span",null,[k("kbd",{"aria-label":j(p)("modal.footer.navigateUpKeyAriaLabel")},Da,8,Na),k("kbd",{"aria-label":j(p)("modal.footer.navigateDownKeyAriaLabel")},Ra,8,ka),ve(" "+pe(j(p)("modal.footer.navigateText")),1)]),k("span",null,[k("kbd",{"aria-label":j(p)("modal.footer.selectKeyAriaLabel")},La,8,_a),ve(" "+pe(j(p)("modal.footer.selectText")),1)]),k("span",null,[k("kbd",{"aria-label":j(p)("modal.footer.closeKeyAriaLabel")},"esc",8,za),ve(" "+pe(j(p)("modal.footer.closeText")),1)])])])],8,Qr)])}}}),Ja=tr(Pa,[["__scopeId","data-v-50b67a39"]]);export{Ja as default}; diff --git a/assets/chunks/framework.D-J1Cv1C.js b/assets/chunks/framework.D-J1Cv1C.js new file mode 100644 index 0000000..379dfdb --- /dev/null +++ b/assets/chunks/framework.D-J1Cv1C.js @@ -0,0 +1,17 @@ +/** +* @vue/shared v3.4.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function wr(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const te={},mt=[],xe=()=>{},Ii=()=>!1,kt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Er=e=>e.startsWith("onUpdate:"),le=Object.assign,Cr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Mi=Object.prototype.hasOwnProperty,Y=(e,t)=>Mi.call(e,t),k=Array.isArray,_t=e=>Sn(e)==="[object Map]",Js=e=>Sn(e)==="[object Set]",K=e=>typeof e=="function",oe=e=>typeof e=="string",et=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",Qs=e=>(Z(e)||K(e))&&K(e.then)&&K(e.catch),Zs=Object.prototype.toString,Sn=e=>Zs.call(e),Pi=e=>Sn(e).slice(8,-1),eo=e=>Sn(e)==="[object Object]",xr=e=>oe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,yt=wr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Tn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ni=/-(\w)/g,$e=Tn(e=>e.replace(Ni,(t,n)=>n?n.toUpperCase():"")),Fi=/\B([A-Z])/g,ft=Tn(e=>e.replace(Fi,"-$1").toLowerCase()),An=Tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),un=Tn(e=>e?`on${An(e)}`:""),Qe=(e,t)=>!Object.is(e,t),fn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},cr=e=>{const t=parseFloat(e);return isNaN(t)?e:t},$i=e=>{const t=oe(e)?Number(e):NaN;return isNaN(t)?e:t};let Qr;const no=()=>Qr||(Qr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Sr(e){if(k(e)){const t={};for(let n=0;n{if(n){const r=n.split(ji);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Tr(e){let t="";if(oe(e))t=e;else if(k(e))for(let n=0;noe(e)?e:e==null?"":k(e)||Z(e)&&(e.toString===Zs||!K(e.toString))?JSON.stringify(e,so,2):String(e),so=(e,t)=>t&&t.__v_isRef?so(e,t.value):_t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],o)=>(n[kn(r,o)+" =>"]=s,n),{})}:Js(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>kn(n))}:et(t)?kn(t):Z(t)&&!k(t)&&!eo(t)?String(t):t,kn=(e,t="")=>{var n;return et(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let we;class ki{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=we,!t&&we&&(this.index=(we.scopes||(we.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=we;try{return we=this,t()}finally{we=n}}}on(){we=this}off(){we=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=5)break}}this._dirtyLevel===1&&(this._dirtyLevel=0),Ue()}return this._dirtyLevel>=5}set dirty(t){this._dirtyLevel=t?5:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Ye,n=ct;try{return Ye=!0,ct=this,this._runnings++,Zr(this),this.fn()}finally{es(this),this._runnings--,ct=n,Ye=t}}stop(){this.active&&(Zr(this),es(this),this.onStop&&this.onStop(),this.active=!1)}}function qi(e){return e.value}function Zr(e){e._trackId++,e._depsLength=0}function es(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t0&&(s??(s=e.get(r)===r._trackId))){r._dirtyLevel=2;continue}r._dirtyLevel{const n=new Map;return n.cleanup=e,n.computed=t,n},mn=new WeakMap,at=Symbol(""),fr=Symbol("");function ve(e,t,n){if(Ye&&ct){let r=mn.get(e);r||mn.set(e,r=new Map);let s=r.get(n);s||r.set(n,s=uo(()=>r.delete(n))),co(ct,s)}}function De(e,t,n,r,s,o){const i=mn.get(e);if(!i)return;let l=[];if(t==="clear")l=[...i.values()];else if(n==="length"&&k(e)){const c=Number(r);i.forEach((a,f)=>{(f==="length"||!et(f)&&f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":k(e)?xr(n)&&l.push(i.get("length")):(l.push(i.get(at)),_t(e)&&l.push(i.get(fr)));break;case"delete":k(e)||(l.push(i.get(at)),_t(e)&&l.push(i.get(fr)));break;case"set":_t(e)&&l.push(i.get(at));break}Rr();for(const c of l)c&&ao(c,5);Lr()}function Gi(e,t){const n=mn.get(e);return n&&n.get(t)}const zi=wr("__proto__,__v_isRef,__isVue"),fo=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(et)),ts=Xi();function Xi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=J(this);for(let o=0,i=this.length;o{e[t]=function(...n){tt(),Rr();const r=J(this)[t].apply(this,n);return Lr(),Ue(),r}}),e}function Yi(e){et(e)||(e=String(e));const t=J(this);return ve(t,"has",e),t.hasOwnProperty(e)}class ho{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const s=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw")return r===(s?o?al:_o:o?mo:go).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=k(t);if(!s){if(i&&Y(ts,n))return Reflect.get(ts,n,r);if(n==="hasOwnProperty")return Yi}const l=Reflect.get(t,n,r);return(et(n)?fo.has(n):zi(n))||(s||ve(t,"get",n),o)?l:de(l)?i&&xr(n)?l:l.value:Z(l)?s?On(l):Ln(l):l}}class po extends ho{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(!this._isShallow){const c=$t(o);if(!_n(r)&&!$t(r)&&(o=J(o),r=J(r)),!k(t)&&de(o)&&!de(r))return c?!1:(o.value=r,!0)}const i=k(t)&&xr(n)?Number(n)e,Rn=e=>Reflect.getPrototypeOf(e);function Yt(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),o=J(t);n||(Qe(t,o)&&ve(s,"get",t),ve(s,"get",o));const{has:i}=Rn(s),l=r?Or:n?Pr:Ht;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Jt(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(Qe(e,s)&&ve(r,"has",e),ve(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Qt(e,t=!1){return e=e.__v_raw,!t&&ve(J(e),"iterate",at),Reflect.get(e,"size",e)}function ns(e){e=J(e);const t=J(this);return Rn(t).has.call(t,e)||(t.add(e),De(t,"add",e,e)),this}function rs(e,t){t=J(t);const n=J(this),{has:r,get:s}=Rn(n);let o=r.call(n,e);o||(e=J(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?Qe(t,i)&&De(n,"set",e,t):De(n,"add",e,t),this}function ss(e){const t=J(this),{has:n,get:r}=Rn(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&De(t,"delete",e,void 0),o}function os(){const e=J(this),t=e.size!==0,n=e.clear();return t&&De(e,"clear",void 0,void 0),n}function Zt(e,t){return function(r,s){const o=this,i=o.__v_raw,l=J(i),c=t?Or:e?Pr:Ht;return!e&&ve(l,"iterate",at),i.forEach((a,f)=>r.call(s,c(a),c(f),o))}}function en(e,t,n){return function(...r){const s=this.__v_raw,o=J(s),i=_t(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,a=s[e](...r),f=n?Or:t?Pr:Ht;return!t&&ve(o,"iterate",c?fr:at),{next(){const{value:h,done:m}=a.next();return m?{value:h,done:m}:{value:l?[f(h[0]),f(h[1])]:f(h),done:m}},[Symbol.iterator](){return this}}}}function ke(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function tl(){const e={get(o){return Yt(this,o)},get size(){return Qt(this)},has:Jt,add:ns,set:rs,delete:ss,clear:os,forEach:Zt(!1,!1)},t={get(o){return Yt(this,o,!1,!0)},get size(){return Qt(this)},has:Jt,add:ns,set:rs,delete:ss,clear:os,forEach:Zt(!1,!0)},n={get(o){return Yt(this,o,!0)},get size(){return Qt(this,!0)},has(o){return Jt.call(this,o,!0)},add:ke("add"),set:ke("set"),delete:ke("delete"),clear:ke("clear"),forEach:Zt(!0,!1)},r={get(o){return Yt(this,o,!0,!0)},get size(){return Qt(this,!0)},has(o){return Jt.call(this,o,!0)},add:ke("add"),set:ke("set"),delete:ke("delete"),clear:ke("clear"),forEach:Zt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=en(o,!1,!1),n[o]=en(o,!0,!1),t[o]=en(o,!1,!0),r[o]=en(o,!0,!0)}),[e,n,t,r]}const[nl,rl,sl,ol]=tl();function Ir(e,t){const n=t?e?ol:sl:e?rl:nl;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(Y(n,s)&&s in r?n:r,s,o)}const il={get:Ir(!1,!1)},ll={get:Ir(!1,!0)},cl={get:Ir(!0,!1)};const go=new WeakMap,mo=new WeakMap,_o=new WeakMap,al=new WeakMap;function ul(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function fl(e){return e.__v_skip||!Object.isExtensible(e)?0:ul(Pi(e))}function Ln(e){return $t(e)?e:Mr(e,!1,Qi,il,go)}function dl(e){return Mr(e,!1,el,ll,mo)}function On(e){return Mr(e,!0,Zi,cl,_o)}function Mr(e,t,n,r,s){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=fl(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function Rt(e){return $t(e)?Rt(e.__v_raw):!!(e&&e.__v_isReactive)}function $t(e){return!!(e&&e.__v_isReadonly)}function _n(e){return!!(e&&e.__v_isShallow)}function yo(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function dn(e){return Object.isExtensible(e)&&to(e,"__v_skip",!0),e}const Ht=e=>Z(e)?Ln(e):e,Pr=e=>Z(e)?On(e):e;class vo{constructor(t,n,r,s){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Ar(()=>t(this._value),()=>Lt(this,this.effect._dirtyLevel===3?3:4)),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=J(this),n=t.effect._dirtyLevel;return(!t._cacheable||t.effect.dirty)&&Qe(t._value,t._value=t.effect.run())&&n!==3&&Lt(t,5),Nr(t),t.effect._dirtyLevel>=2&&Lt(t,3),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function hl(e,t,n=!1){let r,s;const o=K(e);return o?(r=e,s=xe):(r=e.get,s=e.set),new vo(r,s,o||!s,n)}function Nr(e){var t;Ye&&ct&&(e=J(e),co(ct,(t=e.dep)!=null?t:e.dep=uo(()=>e.dep=void 0,e instanceof vo?e:void 0)))}function Lt(e,t=5,n,r){e=J(e);const s=e.dep;s&&ao(s,t)}function de(e){return!!(e&&e.__v_isRef===!0)}function se(e){return bo(e,!1)}function Fr(e){return bo(e,!0)}function bo(e,t){return de(e)?e:new pl(e,t)}class pl{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Ht(t)}get value(){return Nr(this),this._value}set value(t){const n=this.__v_isShallow||_n(t)||$t(t);t=n?t:J(t),Qe(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:Ht(t),Lt(this,5))}}function wo(e){return de(e)?e.value:e}const gl={get:(e,t,n)=>wo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return de(s)&&!de(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Eo(e){return Rt(e)?e:new Proxy(e,gl)}class ml{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Nr(this),()=>Lt(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function _l(e){return new ml(e)}function ru(e){const t=k(e)?new Array(e.length):{};for(const n in e)t[n]=Co(e,n);return t}class yl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Gi(J(this._object),this._key)}}class vl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function bl(e,t,n){return de(e)?e:K(e)?new vl(e):Z(e)&&arguments.length>1?Co(e,t,n):se(e)}function Co(e,t,n){const r=e[t];return de(r)?r:new yl(e,t,n)}/** +* @vue/runtime-core v3.4.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Je(e,t,n,r){try{return r?e(...r):e()}catch(s){Kt(s,t,n)}}function Se(e,t,n,r){if(K(e)){const s=Je(e,t,n,r);return s&&Qs(s)&&s.catch(o=>{Kt(o,t,n)}),s}if(k(e)){const s=[];for(let o=0;o>>1,s=pe[r],o=Vt(s);oPe&&pe.splice(t,1)}function xl(e){k(e)?vt.push(...e):(!qe||!qe.includes(e,e.allowRecurse?it+1:it))&&vt.push(e),So()}function is(e,t,n=jt?Pe+1:0){for(;nVt(n)-Vt(r));if(vt.length=0,qe){qe.push(...t);return}for(qe=t,it=0;ite.id==null?1/0:e.id,Sl=(e,t)=>{const n=Vt(e)-Vt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function To(e){dr=!1,jt=!0,pe.sort(Sl);try{for(Pe=0;Peoe(y)?y.trim():y)),h&&(s=n.map(cr))}let l,c=r[l=un(t)]||r[l=un($e(t))];!c&&o&&(c=r[l=un(ft(t))]),c&&Se(c,e,6,s);const a=r[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Se(a,e,6,s)}}function Ao(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!K(e)){const c=a=>{const f=Ao(a,t,!0);f&&(l=!0,le(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(Z(e)&&r.set(e,null),null):(k(o)?o.forEach(c=>i[c]=null):le(i,o),Z(e)&&r.set(e,i),i)}function Pn(e,t){return!e||!kt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,ft(t))||Y(e,t))}let fe=null,Nn=null;function vn(e){const t=fe;return fe=e,Nn=e&&e.type.__scopeId||null,t}function su(e){Nn=e}function ou(){Nn=null}function Al(e,t=fe,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&Es(-1);const o=vn(t);let i;try{i=e(...s)}finally{vn(o),r._d&&Es(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Kn(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[o],slots:i,attrs:l,emit:c,render:a,renderCache:f,props:h,data:m,setupState:y,ctx:C,inheritAttrs:I}=e,H=vn(e);let W,D;try{if(n.shapeFlag&4){const _=s||r,M=_;W=Ae(a.call(M,_,f,h,y,m,C)),D=l}else{const _=t;W=Ae(_.length>1?_(h,{attrs:l,slots:i,emit:c}):_(h,null)),D=t.props?l:Rl(l)}}catch(_){Nt.length=0,Kt(_,e,1),W=ie(me)}let p=W;if(D&&I!==!1){const _=Object.keys(D),{shapeFlag:M}=p;_.length&&M&7&&(o&&_.some(Er)&&(D=Ll(D,o)),p=Ze(p,D,!1,!0))}return n.dirs&&(p=Ze(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&(p.transition=n.transition),W=p,vn(H),W}const Rl=e=>{let t;for(const n in e)(n==="class"||n==="style"||kt(n))&&((t||(t={}))[n]=e[n]);return t},Ll=(e,t)=>{const n={};for(const r in e)(!Er(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ol(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,a=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?ls(r,i,a):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function Oo(e,t){t&&t.pendingBranch?k(e)?t.effects.push(...e):t.effects.push(e):xl(e)}function Fn(e,t,n=ue,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{tt();const l=qt(n),c=Se(t,n,e,i);return l(),Ue(),c});return r?s.unshift(o):s.push(o),o}}const Be=e=>(t,n=ue)=>{(!Gt||e==="sp")&&Fn(e,(...r)=>t(...r),n)},Pl=Be("bm"),xt=Be("m"),Nl=Be("bu"),Fl=Be("u"),Io=Be("bum"),$n=Be("um"),$l=Be("sp"),Hl=Be("rtg"),jl=Be("rtc");function Vl(e,t=ue){Fn("ec",e,t)}function cu(e,t){if(fe===null)return e;const n=Vn(fe),r=e.dirs||(e.dirs=[]);for(let s=0;st(i,l,void 0,o));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;l!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function uu(e){K(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,a,f=0;const h=()=>(f++,c=null,m()),m=()=>{let y;return c||(y=c=t().catch(C=>{if(C=C instanceof Error?C:new Error(String(C)),l)return new Promise((I,H)=>{l(C,()=>I(h()),()=>H(C),f+1)});throw C}).then(C=>y!==c&&c?c:(C&&(C.__esModule||C[Symbol.toStringTag]==="Module")&&(C=C.default),a=C,C)))};return jr({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return a},setup(){const y=ue;if(a)return()=>Wn(a,y);const C=D=>{c=null,Kt(D,y,13,!r)};if(i&&y.suspense||Gt)return m().then(D=>()=>Wn(D,y)).catch(D=>(C(D),()=>r?ie(r,{error:D}):null));const I=se(!1),H=se(),W=se(!!s);return s&&setTimeout(()=>{W.value=!1},s),o!=null&&setTimeout(()=>{if(!I.value&&!H.value){const D=new Error(`Async component timed out after ${o}ms.`);C(D),H.value=D}},o),m().then(()=>{I.value=!0,y.parent&&Wt(y.parent.vnode)&&(y.parent.effect.dirty=!0,Mn(y.parent.update))}).catch(D=>{C(D),H.value=D}),()=>{if(I.value&&a)return Wn(a,y);if(H.value&&r)return ie(r,{error:H.value});if(n&&!W.value)return ie(n)}}})}function Wn(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=ie(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}function fu(e,t,n={},r,s){if(fe.isCE||fe.parent&&bt(fe.parent)&&fe.parent.isCE)return t!=="default"&&(n.name=t),ie("slot",n,r&&r());let o=e[t];o&&o._c&&(o._d=!1),Zo();const i=o&&Mo(o(n)),l=ti(ye,{key:n.key||i&&i.key||`_${t}`},i||(r?r():[]),i&&e._===1?64:-2);return!s&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),o&&o._c&&(o._d=!0),l}function Mo(e){return e.some(t=>Cn(t)?!(t.type===me||t.type===ye&&!Mo(t.children)):!0)?e:null}function du(e,t){const n={};for(const r in e)n[/[A-Z]/.test(r)?`on:${r}`:un(r)]=e[r];return n}const hr=e=>e?oi(e)?Vn(e):hr(e.parent):null,Ot=le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>hr(e.parent),$root:e=>hr(e.root),$emit:e=>e.emit,$options:e=>Vr(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Mn(e.update)}),$nextTick:e=>e.n||(e.n=In.bind(e.proxy)),$watch:e=>ac.bind(e)}),qn=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),Dl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const y=i[t];if(y!==void 0)switch(y){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(qn(r,t))return i[t]=1,r[t];if(s!==te&&Y(s,t))return i[t]=2,s[t];if((a=e.propsOptions[0])&&Y(a,t))return i[t]=3,o[t];if(n!==te&&Y(n,t))return i[t]=4,n[t];pr&&(i[t]=0)}}const f=Ot[t];let h,m;if(f)return t==="$attrs"&&ve(e.attrs,"get",""),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&Y(n,t))return i[t]=4,n[t];if(m=c.config.globalProperties,Y(m,t))return m[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return qn(s,t)?(s[t]=n,!0):r!==te&&Y(r,t)?(r[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==te&&Y(e,i)||qn(t,i)||(l=o[0])&&Y(l,i)||Y(r,i)||Y(Ot,i)||Y(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function hu(){return Ul().slots}function Ul(){const e=jn();return e.setupContext||(e.setupContext=li(e))}function as(e){return k(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let pr=!0;function Bl(e){const t=Vr(e),n=e.proxy,r=e.ctx;pr=!1,t.beforeCreate&&us(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:m,beforeUpdate:y,updated:C,activated:I,deactivated:H,beforeDestroy:W,beforeUnmount:D,destroyed:p,unmounted:_,render:M,renderTracked:A,renderTriggered:F,errorCaptured:$,serverPrefetch:O,expose:w,inheritAttrs:N,components:T,directives:G,filters:ne}=t;if(a&&kl(a,r,null),i)for(const X in i){const V=i[X];K(V)&&(r[X]=V.bind(n))}if(s){const X=s.call(n,n);Z(X)&&(e.data=Ln(X))}if(pr=!0,o)for(const X in o){const V=o[X],He=K(V)?V.bind(n,n):K(V.get)?V.get.bind(n,n):xe,zt=!K(V)&&K(V.set)?V.set.bind(n):xe,nt=re({get:He,set:zt});Object.defineProperty(r,X,{enumerable:!0,configurable:!0,get:()=>nt.value,set:Oe=>nt.value=Oe})}if(l)for(const X in l)Po(l[X],r,n,X);if(c){const X=K(c)?c.call(n):c;Reflect.ownKeys(X).forEach(V=>{Xl(V,X[V])})}f&&us(f,e,"c");function U(X,V){k(V)?V.forEach(He=>X(He.bind(n))):V&&X(V.bind(n))}if(U(Pl,h),U(xt,m),U(Nl,y),U(Fl,C),U(uc,I),U(fc,H),U(Vl,$),U(jl,A),U(Hl,F),U(Io,D),U($n,_),U($l,O),k(w))if(w.length){const X=e.exposed||(e.exposed={});w.forEach(V=>{Object.defineProperty(X,V,{get:()=>n[V],set:He=>n[V]=He})})}else e.exposed||(e.exposed={});M&&e.render===xe&&(e.render=M),N!=null&&(e.inheritAttrs=N),T&&(e.components=T),G&&(e.directives=G)}function kl(e,t,n=xe){k(e)&&(e=gr(e));for(const r in e){const s=e[r];let o;Z(s)?"default"in s?o=wt(s.from||r,s.default,!0):o=wt(s.from||r):o=wt(s),de(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function us(e,t,n){Se(k(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Po(e,t,n,r){const s=r.includes(".")?qo(n,r):()=>n[r];if(oe(e)){const o=t[e];K(o)&&Ne(s,o)}else if(K(e))Ne(s,e.bind(n));else if(Z(e))if(k(e))e.forEach(o=>Po(o,t,n,r));else{const o=K(e.handler)?e.handler.bind(n):t[e.handler];K(o)&&Ne(s,o,e)}}function Vr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(a=>bn(c,a,i,!0)),bn(c,t,i)),Z(t)&&o.set(t,c),c}function bn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&bn(e,o,n,!0),s&&s.forEach(i=>bn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Kl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Kl={data:fs,props:ds,emits:ds,methods:At,computed:At,beforeCreate:ge,created:ge,beforeMount:ge,mounted:ge,beforeUpdate:ge,updated:ge,beforeDestroy:ge,beforeUnmount:ge,destroyed:ge,unmounted:ge,activated:ge,deactivated:ge,errorCaptured:ge,serverPrefetch:ge,components:At,directives:At,watch:ql,provide:fs,inject:Wl};function fs(e,t){return t?e?function(){return le(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function Wl(e,t){return At(gr(e),gr(t))}function gr(e){if(k(e)){const t={};for(let n=0;n1)return n&&K(t)?t.call(r&&r.proxy):t}}const Fo={},$o=()=>Object.create(Fo),Ho=e=>Object.getPrototypeOf(e)===Fo;function Yl(e,t,n,r=!1){const s={},o=$o();e.propsDefaults=Object.create(null),jo(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:dl(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function Jl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=J(s),[c]=e.propsOptions;let a=!1;if((r||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[m,y]=Vo(h,t,!0);le(i,m),y&&l.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return Z(e)&&r.set(e,mt),mt;if(k(o))for(let f=0;f-1,y[1]=I<0||C-1||Y(y,"default"))&&l.push(h)}}}const a=[i,l];return Z(e)&&r.set(e,a),a}function hs(e){return e[0]!=="$"&&!yt(e)}function ps(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function gs(e,t){return ps(e)===ps(t)}function ms(e,t){return k(t)?t.findIndex(n=>gs(n,e)):K(t)&&gs(t,e)?0:-1}const Do=e=>e[0]==="_"||e==="$stable",Dr=e=>k(e)?e.map(Ae):[Ae(e)],Ql=(e,t,n)=>{if(t._n)return t;const r=Al((...s)=>Dr(t(...s)),n);return r._c=!1,r},Uo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Do(s))continue;const o=e[s];if(K(o))t[s]=Ql(s,o,r);else if(o!=null){const i=Dr(o);t[s]=()=>i}}},Bo=(e,t)=>{const n=Dr(t);e.slots.default=()=>n},Zl=(e,t)=>{const n=e.slots=$o();if(e.vnode.shapeFlag&32){const r=t._;r?(le(n,t),to(n,"_",r,!0)):Uo(t,n)}else t&&Bo(e,t)},ec=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=te;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(le(s,t),!n&&l===1&&delete s._):(o=!t.$stable,Uo(t,s)),i=t}else t&&(Bo(e,t),i={default:1});if(o)for(const l in s)!Do(l)&&i[l]==null&&delete s[l]};function wn(e,t,n,r,s=!1){if(k(e)){e.forEach((m,y)=>wn(m,t&&(k(t)?t[y]:t),n,r,s));return}if(bt(r)&&!s)return;const o=r.shapeFlag&4?Vn(r.component):r.el,i=s?null:o,{i:l,r:c}=e,a=t&&t.r,f=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(oe(a)?(f[a]=null,Y(h,a)&&(h[a]=null)):de(a)&&(a.value=null)),K(c))Je(c,l,12,[i,f]);else{const m=oe(c),y=de(c);if(m||y){const C=()=>{if(e.f){const I=m?Y(h,c)?h[c]:f[c]:c.value;s?k(I)&&Cr(I,o):k(I)?I.includes(o)||I.push(o):m?(f[c]=[o],Y(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else m?(f[c]=i,Y(h,c)&&(h[c]=i)):y&&(c.value=i,e.k&&(f[e.k]=i))};i?(C.id=-1,_e(C,n)):C()}}}let _s=!1;const pt=()=>{_s||(console.error("Hydration completed but contains mismatches."),_s=!0)},tc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",nc=e=>e.namespaceURI.includes("MathML"),tn=e=>{if(tc(e))return"svg";if(nc(e))return"mathml"},nn=e=>e.nodeType===8;function rc(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:a}}=e,f=(p,_)=>{if(!_.hasChildNodes()){n(null,p,_),yn(),_._vnode=p;return}h(_.firstChild,p,null,null,null),yn(),_._vnode=p},h=(p,_,M,A,F,$=!1)=>{$=$||!!_.dynamicChildren;const O=nn(p)&&p.data==="[",w=()=>I(p,_,M,A,F,O),{type:N,ref:T,shapeFlag:G,patchFlag:ne}=_;let ce=p.nodeType;_.el=p,ne===-2&&($=!1,_.dynamicChildren=null);let U=null;switch(N){case Et:ce!==3?_.children===""?(c(_.el=s(""),i(p),p),U=p):U=w():(p.data!==_.children&&(pt(),p.data=_.children),U=o(p));break;case me:D(p)?(U=o(p),W(_.el=p.content.firstChild,p,M)):ce!==8||O?U=w():U=o(p);break;case Pt:if(O&&(p=o(p),ce=p.nodeType),ce===1||ce===3){U=p;const X=!_.children.length;for(let V=0;V<_.staticCount;V++)X&&(_.children+=U.nodeType===1?U.outerHTML:U.data),V===_.staticCount-1&&(_.anchor=U),U=o(U);return O?o(U):U}else w();break;case ye:O?U=C(p,_,M,A,F,$):U=w();break;default:if(G&1)(ce!==1||_.type.toLowerCase()!==p.tagName.toLowerCase())&&!D(p)?U=w():U=m(p,_,M,A,F,$);else if(G&6){_.slotScopeIds=F;const X=i(p);if(O?U=H(p):nn(p)&&p.data==="teleport start"?U=H(p,p.data,"teleport end"):U=o(p),t(_,X,null,M,A,tn(X),$),bt(_)){let V;O?(V=ie(ye),V.anchor=U?U.previousSibling:X.lastChild):V=p.nodeType===3?si(""):ie("div"),V.el=p,_.component.subTree=V}}else G&64?ce!==8?U=w():U=_.type.hydrate(p,_,M,A,F,$,e,y):G&128&&(U=_.type.hydrate(p,_,M,A,tn(i(p)),F,$,e,h))}return T!=null&&wn(T,null,A,_),U},m=(p,_,M,A,F,$)=>{$=$||!!_.dynamicChildren;const{type:O,props:w,patchFlag:N,shapeFlag:T,dirs:G,transition:ne}=_,ce=O==="input"||O==="option";if(ce||N!==-1){G&&Me(_,null,M,"created");let U=!1;if(D(p)){U=Ko(A,ne)&&M&&M.vnode.props&&M.vnode.props.appear;const V=p.content.firstChild;U&&ne.beforeEnter(V),W(V,p,M),_.el=p=V}if(T&16&&!(w&&(w.innerHTML||w.textContent))){let V=y(p.firstChild,_,p,M,A,F,$);for(;V;){pt();const He=V;V=V.nextSibling,l(He)}}else T&8&&p.textContent!==_.children&&(pt(),p.textContent=_.children);if(w)if(ce||!$||N&48)for(const V in w)(ce&&(V.endsWith("value")||V==="indeterminate")||kt(V)&&!yt(V)||V[0]===".")&&r(p,V,null,w[V],void 0,void 0,M);else w.onClick&&r(p,"onClick",null,w.onClick,void 0,void 0,M);let X;(X=w&&w.onVnodeBeforeMount)&&Ce(X,M,_),G&&Me(_,null,M,"beforeMount"),((X=w&&w.onVnodeMounted)||G||U)&&Oo(()=>{X&&Ce(X,M,_),U&&ne.enter(p),G&&Me(_,null,M,"mounted")},A)}return p.nextSibling},y=(p,_,M,A,F,$,O)=>{O=O||!!_.dynamicChildren;const w=_.children,N=w.length;for(let T=0;T{const{slotScopeIds:O}=_;O&&(F=F?F.concat(O):O);const w=i(p),N=y(o(p),_,w,M,A,F,$);return N&&nn(N)&&N.data==="]"?o(_.anchor=N):(pt(),c(_.anchor=a("]"),w,N),N)},I=(p,_,M,A,F,$)=>{if(pt(),_.el=null,$){const N=H(p);for(;;){const T=o(p);if(T&&T!==N)l(T);else break}}const O=o(p),w=i(p);return l(p),n(null,_,w,O,M,A,tn(w),F),O},H=(p,_="[",M="]")=>{let A=0;for(;p;)if(p=o(p),p&&nn(p)&&(p.data===_&&A++,p.data===M)){if(A===0)return o(p);A--}return p},W=(p,_,M)=>{const A=_.parentNode;A&&A.replaceChild(p,_);let F=M;for(;F;)F.vnode.el===_&&(F.vnode.el=F.subTree.el=p),F=F.parent},D=p=>p.nodeType===1&&p.tagName.toLowerCase()==="template";return[f,h]}const _e=Oo;function sc(e){return ko(e)}function oc(e){return ko(e,rc)}function ko(e,t){const n=no();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:m,setScopeId:y=xe,insertStaticContent:C}=e,I=(u,d,g,v=null,b=null,S=null,L=void 0,x=null,R=!!d.dynamicChildren)=>{if(u===d)return;u&&!lt(u,d)&&(v=Xt(u),Oe(u,b,S,!0),u=null),d.patchFlag===-2&&(R=!1,d.dynamicChildren=null);const{type:E,ref:P,shapeFlag:B}=d;switch(E){case Et:H(u,d,g,v);break;case me:W(u,d,g,v);break;case Pt:u==null&&D(d,g,v,L);break;case ye:T(u,d,g,v,b,S,L,x,R);break;default:B&1?M(u,d,g,v,b,S,L,x,R):B&6?G(u,d,g,v,b,S,L,x,R):(B&64||B&128)&&E.process(u,d,g,v,b,S,L,x,R,dt)}P!=null&&b&&wn(P,u&&u.ref,S,d||u,!d)},H=(u,d,g,v)=>{if(u==null)r(d.el=l(d.children),g,v);else{const b=d.el=u.el;d.children!==u.children&&a(b,d.children)}},W=(u,d,g,v)=>{u==null?r(d.el=c(d.children||""),g,v):d.el=u.el},D=(u,d,g,v)=>{[u.el,u.anchor]=C(u.children,d,g,v,u.el,u.anchor)},p=({el:u,anchor:d},g,v)=>{let b;for(;u&&u!==d;)b=m(u),r(u,g,v),u=b;r(d,g,v)},_=({el:u,anchor:d})=>{let g;for(;u&&u!==d;)g=m(u),s(u),u=g;s(d)},M=(u,d,g,v,b,S,L,x,R)=>{d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),u==null?A(d,g,v,b,S,L,x,R):O(u,d,b,S,L,x,R)},A=(u,d,g,v,b,S,L,x)=>{let R,E;const{props:P,shapeFlag:B,transition:j,dirs:q}=u;if(R=u.el=i(u.type,S,P&&P.is,P),B&8?f(R,u.children):B&16&&$(u.children,R,null,v,b,Gn(u,S),L,x),q&&Me(u,null,v,"created"),F(R,u,u.scopeId,L,v),P){for(const ee in P)ee!=="value"&&!yt(ee)&&o(R,ee,null,P[ee],S,u.children,v,b,je);"value"in P&&o(R,"value",null,P.value,S),(E=P.onVnodeBeforeMount)&&Ce(E,v,u)}q&&Me(u,null,v,"beforeMount");const z=Ko(b,j);z&&j.beforeEnter(R),r(R,d,g),((E=P&&P.onVnodeMounted)||z||q)&&_e(()=>{E&&Ce(E,v,u),z&&j.enter(R),q&&Me(u,null,v,"mounted")},b)},F=(u,d,g,v,b)=>{if(g&&y(u,g),v)for(let S=0;S{for(let E=R;E{const x=d.el=u.el;let{patchFlag:R,dynamicChildren:E,dirs:P}=d;R|=u.patchFlag&16;const B=u.props||te,j=d.props||te;let q;if(g&&rt(g,!1),(q=j.onVnodeBeforeUpdate)&&Ce(q,g,d,u),P&&Me(d,u,g,"beforeUpdate"),g&&rt(g,!0),E?w(u.dynamicChildren,E,x,g,v,Gn(d,b),S):L||V(u,d,x,null,g,v,Gn(d,b),S,!1),R>0){if(R&16)N(x,d,B,j,g,v,b);else if(R&2&&B.class!==j.class&&o(x,"class",null,j.class,b),R&4&&o(x,"style",B.style,j.style,b),R&8){const z=d.dynamicProps;for(let ee=0;ee{q&&Ce(q,g,d,u),P&&Me(d,u,g,"updated")},v)},w=(u,d,g,v,b,S,L)=>{for(let x=0;x{if(g!==v){if(g!==te)for(const x in g)!yt(x)&&!(x in v)&&o(u,x,g[x],null,L,d.children,b,S,je);for(const x in v){if(yt(x))continue;const R=v[x],E=g[x];R!==E&&x!=="value"&&o(u,x,E,R,L,d.children,b,S,je)}"value"in v&&o(u,"value",g.value,v.value,L)}},T=(u,d,g,v,b,S,L,x,R)=>{const E=d.el=u?u.el:l(""),P=d.anchor=u?u.anchor:l("");let{patchFlag:B,dynamicChildren:j,slotScopeIds:q}=d;q&&(x=x?x.concat(q):q),u==null?(r(E,g,v),r(P,g,v),$(d.children||[],g,P,b,S,L,x,R)):B>0&&B&64&&j&&u.dynamicChildren?(w(u.dynamicChildren,j,g,b,S,L,x),(d.key!=null||b&&d===b.subTree)&&Ur(u,d,!0)):V(u,d,g,P,b,S,L,x,R)},G=(u,d,g,v,b,S,L,x,R)=>{d.slotScopeIds=x,u==null?d.shapeFlag&512?b.ctx.activate(d,g,v,L,R):ne(d,g,v,b,S,L,R):ce(u,d,R)},ne=(u,d,g,v,b,S,L)=>{const x=u.component=Sc(u,v,b);if(Wt(u)&&(x.ctx.renderer=dt),Tc(x),x.asyncDep){if(b&&b.registerDep(x,U,L),!u.el){const R=x.subTree=ie(me);W(null,R,d,g)}}else U(x,u,d,g,b,S,L)},ce=(u,d,g)=>{const v=d.component=u.component;if(Ol(u,d,g))if(v.asyncDep&&!v.asyncResolved){X(v,d,g);return}else v.next=d,Cl(v.update),v.effect.dirty=!0,v.update();else d.el=u.el,v.vnode=d},U=(u,d,g,v,b,S,L)=>{const x=()=>{if(u.isMounted){let{next:P,bu:B,u:j,parent:q,vnode:z}=u;{const ht=Wo(u);if(ht){P&&(P.el=z.el,X(u,P,L)),ht.asyncDep.then(()=>{u.isUnmounted||x()});return}}let ee=P,Q;rt(u,!1),P?(P.el=z.el,X(u,P,L)):P=z,B&&fn(B),(Q=P.props&&P.props.onVnodeBeforeUpdate)&&Ce(Q,q,P,z),rt(u,!0);const ae=Kn(u),Te=u.subTree;u.subTree=ae,I(Te,ae,h(Te.el),Xt(Te),u,b,S),P.el=ae.el,ee===null&&Il(u,ae.el),j&&_e(j,b),(Q=P.props&&P.props.onVnodeUpdated)&&_e(()=>Ce(Q,q,P,z),b)}else{let P;const{el:B,props:j}=d,{bm:q,m:z,parent:ee}=u,Q=bt(d);if(rt(u,!1),q&&fn(q),!Q&&(P=j&&j.onVnodeBeforeMount)&&Ce(P,ee,d),rt(u,!0),B&&Bn){const ae=()=>{u.subTree=Kn(u),Bn(B,u.subTree,u,b,null)};Q?d.type.__asyncLoader().then(()=>!u.isUnmounted&&ae()):ae()}else{const ae=u.subTree=Kn(u);I(null,ae,g,v,u,b,S),d.el=ae.el}if(z&&_e(z,b),!Q&&(P=j&&j.onVnodeMounted)){const ae=d;_e(()=>Ce(P,ee,ae),b)}(d.shapeFlag&256||ee&&bt(ee.vnode)&&ee.vnode.shapeFlag&256)&&u.a&&_e(u.a,b),u.isMounted=!0,d=g=v=null}},R=u.effect=new Ar(x,xe,()=>Mn(E),u.scope),E=u.update=()=>{R.dirty&&R.run()};E.id=u.uid,rt(u,!0),E()},X=(u,d,g)=>{d.component=u;const v=u.vnode.props;u.vnode=d,u.next=null,Jl(u,d.props,v,g),ec(u,d.children,g),tt(),is(u),Ue()},V=(u,d,g,v,b,S,L,x,R=!1)=>{const E=u&&u.children,P=u?u.shapeFlag:0,B=d.children,{patchFlag:j,shapeFlag:q}=d;if(j>0){if(j&128){zt(E,B,g,v,b,S,L,x,R);return}else if(j&256){He(E,B,g,v,b,S,L,x,R);return}}q&8?(P&16&&je(E,b,S),B!==E&&f(g,B)):P&16?q&16?zt(E,B,g,v,b,S,L,x,R):je(E,b,S,!0):(P&8&&f(g,""),q&16&&$(B,g,v,b,S,L,x,R))},He=(u,d,g,v,b,S,L,x,R)=>{u=u||mt,d=d||mt;const E=u.length,P=d.length,B=Math.min(E,P);let j;for(j=0;jP?je(u,b,S,!0,!1,B):$(d,g,v,b,S,L,x,R,B)},zt=(u,d,g,v,b,S,L,x,R)=>{let E=0;const P=d.length;let B=u.length-1,j=P-1;for(;E<=B&&E<=j;){const q=u[E],z=d[E]=R?ze(d[E]):Ae(d[E]);if(lt(q,z))I(q,z,g,null,b,S,L,x,R);else break;E++}for(;E<=B&&E<=j;){const q=u[B],z=d[j]=R?ze(d[j]):Ae(d[j]);if(lt(q,z))I(q,z,g,null,b,S,L,x,R);else break;B--,j--}if(E>B){if(E<=j){const q=j+1,z=qj)for(;E<=B;)Oe(u[E],b,S,!0),E++;else{const q=E,z=E,ee=new Map;for(E=z;E<=j;E++){const be=d[E]=R?ze(d[E]):Ae(d[E]);be.key!=null&&ee.set(be.key,E)}let Q,ae=0;const Te=j-z+1;let ht=!1,Xr=0;const St=new Array(Te);for(E=0;E=Te){Oe(be,b,S,!0);continue}let Ie;if(be.key!=null)Ie=ee.get(be.key);else for(Q=z;Q<=j;Q++)if(St[Q-z]===0&<(be,d[Q])){Ie=Q;break}Ie===void 0?Oe(be,b,S,!0):(St[Ie-z]=E+1,Ie>=Xr?Xr=Ie:ht=!0,I(be,d[Ie],g,null,b,S,L,x,R),ae++)}const Yr=ht?ic(St):mt;for(Q=Yr.length-1,E=Te-1;E>=0;E--){const be=z+E,Ie=d[be],Jr=be+1{const{el:S,type:L,transition:x,children:R,shapeFlag:E}=u;if(E&6){nt(u.component.subTree,d,g,v);return}if(E&128){u.suspense.move(d,g,v);return}if(E&64){L.move(u,d,g,dt);return}if(L===ye){r(S,d,g);for(let B=0;Bx.enter(S),b);else{const{leave:B,delayLeave:j,afterLeave:q}=x,z=()=>r(S,d,g),ee=()=>{B(S,()=>{z(),q&&q()})};j?j(S,z,ee):ee()}else r(S,d,g)},Oe=(u,d,g,v=!1,b=!1)=>{const{type:S,props:L,ref:x,children:R,dynamicChildren:E,shapeFlag:P,patchFlag:B,dirs:j,memoIndex:q}=u;if(B===-2&&(b=!1),x!=null&&wn(x,null,g,u,!0),q!=null&&(d.renderCache[q]=void 0),P&256){d.ctx.deactivate(u);return}const z=P&1&&j,ee=!bt(u);let Q;if(ee&&(Q=L&&L.onVnodeBeforeUnmount)&&Ce(Q,d,u),P&6)Oi(u.component,g,v);else{if(P&128){u.suspense.unmount(g,v);return}z&&Me(u,null,d,"beforeUnmount"),P&64?u.type.remove(u,d,g,dt,v):E&&(S!==ye||B>0&&B&64)?je(E,d,g,!1,!0):(S===ye&&B&384||!b&&P&16)&&je(R,d,g),v&&Gr(u)}(ee&&(Q=L&&L.onVnodeUnmounted)||z)&&_e(()=>{Q&&Ce(Q,d,u),z&&Me(u,null,d,"unmounted")},g)},Gr=u=>{const{type:d,el:g,anchor:v,transition:b}=u;if(d===ye){Li(g,v);return}if(d===Pt){_(u);return}const S=()=>{s(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(u.shapeFlag&1&&b&&!b.persisted){const{leave:L,delayLeave:x}=b,R=()=>L(g,S);x?x(u.el,S,R):R()}else S()},Li=(u,d)=>{let g;for(;u!==d;)g=m(u),s(u),u=g;s(d)},Oi=(u,d,g)=>{const{bum:v,scope:b,update:S,subTree:L,um:x,m:R,a:E}=u;ys(R),ys(E),v&&fn(v),b.stop(),S&&(S.active=!1,Oe(L,u,d,g)),x&&_e(x,d),_e(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},je=(u,d,g,v=!1,b=!1,S=0)=>{for(let L=S;Lu.shapeFlag&6?Xt(u.component.subTree):u.shapeFlag&128?u.suspense.next():m(u.anchor||u.el);let Dn=!1;const zr=(u,d,g)=>{u==null?d._vnode&&Oe(d._vnode,null,null,!0):I(d._vnode||null,u,d,null,null,null,g),Dn||(Dn=!0,is(),yn(),Dn=!1),d._vnode=u},dt={p:I,um:Oe,m:nt,r:Gr,mt:ne,mc:$,pc:V,pbc:w,n:Xt,o:e};let Un,Bn;return t&&([Un,Bn]=t(dt)),{render:zr,hydrate:Un,createApp:zl(zr,Un)}}function Gn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function rt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ko(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ur(e,t,n=!1){const r=e.children,s=t.children;if(k(r)&&k(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function Wo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Wo(t)}function ys(e){if(e)for(let t=0;twt(lc);function Br(e,t){return Hn(e,null,t)}function pu(e,t){return Hn(e,null,{flush:"post"})}const rn={};function Ne(e,t,n){return Hn(e,t,n)}function Hn(e,t,{immediate:n,deep:r,flush:s,once:o,onTrack:i,onTrigger:l}=te){if(t&&o){const A=t;t=(...F)=>{A(...F),M()}}const c=ue,a=A=>r===!0?A:Xe(A,r===!1?1:void 0);let f,h=!1,m=!1;if(de(e)?(f=()=>e.value,h=_n(e)):Rt(e)?(f=()=>a(e),h=!0):k(e)?(m=!0,h=e.some(A=>Rt(A)||_n(A)),f=()=>e.map(A=>{if(de(A))return A.value;if(Rt(A))return a(A);if(K(A))return Je(A,c,2)})):K(e)?t?f=()=>Je(e,c,2):f=()=>(y&&y(),Se(e,c,3,[C])):f=xe,t&&r){const A=f;f=()=>Xe(A())}let y,C=A=>{y=p.onStop=()=>{Je(A,c,4),y=p.onStop=void 0}},I;if(Gt)if(C=xe,t?n&&Se(t,c,3,[f(),m?[]:void 0,C]):f(),s==="sync"){const A=cc();I=A.__watcherHandles||(A.__watcherHandles=[])}else return xe;let H=m?new Array(e.length).fill(rn):rn;const W=()=>{if(!(!p.active||!p.dirty))if(t){const A=p.run();(r||h||(m?A.some((F,$)=>Qe(F,H[$])):Qe(A,H)))&&(y&&y(),Se(t,c,3,[A,H===rn?void 0:m&&H[0]===rn?[]:H,C]),H=A)}else p.run()};W.allowRecurse=!!t;let D;s==="sync"?D=W:s==="post"?D=()=>_e(W,c&&c.suspense):(W.pre=!0,c&&(W.id=c.uid),D=()=>Mn(W));const p=new Ar(f,xe,D),_=oo(),M=()=>{p.stop(),_&&Cr(_.effects,p)};return t?n?W():H=p.run():s==="post"?_e(p.run.bind(p),c&&c.suspense):p.run(),I&&I.push(M),M}function ac(e,t,n){const r=this.proxy,s=oe(e)?e.includes(".")?qo(r,e):()=>r[e]:e.bind(r,r);let o;K(t)?o=t:(o=t.handler,n=t);const i=qt(this),l=Hn(s,o.bind(r),n);return i(),l}function qo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{Xe(r,t,n)});else if(eo(e)){for(const r in e)Xe(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Xe(e[r],t,n)}return e}const Wt=e=>e.type.__isKeepAlive;function uc(e,t){Go(e,"a",t)}function fc(e,t){Go(e,"da",t)}function Go(e,t,n=ue){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Fn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Wt(s.parent.vnode)&&dc(r,t,n,s),s=s.parent}}function dc(e,t,n,r){const s=Fn(t,e,r,!0);$n(()=>{Cr(r[t],s)},n)}const Ge=Symbol("_leaveCb"),sn=Symbol("_enterCb");function hc(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return xt(()=>{e.isMounted=!0}),Io(()=>{e.isUnmounting=!0}),e}const Ee=[Function,Array],zo={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ee,onEnter:Ee,onAfterEnter:Ee,onEnterCancelled:Ee,onBeforeLeave:Ee,onLeave:Ee,onAfterLeave:Ee,onLeaveCancelled:Ee,onBeforeAppear:Ee,onAppear:Ee,onAfterAppear:Ee,onAppearCancelled:Ee},Xo=e=>{const t=e.subTree;return t.component?Xo(t.component):t},pc={name:"BaseTransition",props:zo,setup(e,{slots:t}){const n=jn(),r=hc();return()=>{const s=t.default&&Jo(t.default(),!0);if(!s||!s.length)return;let o=s[0];if(s.length>1){for(const m of s)if(m.type!==me){o=m;break}}const i=J(e),{mode:l}=i;if(r.isLeaving)return zn(o);const c=vs(o);if(!c)return zn(o);let a=_r(c,i,r,n,m=>a=m);En(c,a);const f=n.subTree,h=f&&vs(f);if(h&&h.type!==me&&!lt(c,h)&&Xo(n).type!==me){const m=_r(h,i,r,n);if(En(h,m),l==="out-in"&&c.type!==me)return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},zn(o);l==="in-out"&&c.type!==me&&(m.delayLeave=(y,C,I)=>{const H=Yo(r,h);H[String(h.key)]=h,y[Ge]=()=>{C(),y[Ge]=void 0,delete a.delayedLeave},a.delayedLeave=I})}return o}}},gc=pc;function Yo(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function _r(e,t,n,r,s){const{appear:o,mode:i,persisted:l=!1,onBeforeEnter:c,onEnter:a,onAfterEnter:f,onEnterCancelled:h,onBeforeLeave:m,onLeave:y,onAfterLeave:C,onLeaveCancelled:I,onBeforeAppear:H,onAppear:W,onAfterAppear:D,onAppearCancelled:p}=t,_=String(e.key),M=Yo(n,e),A=(O,w)=>{O&&Se(O,r,9,w)},F=(O,w)=>{const N=w[1];A(O,w),k(O)?O.every(T=>T.length<=1)&&N():O.length<=1&&N()},$={mode:i,persisted:l,beforeEnter(O){let w=c;if(!n.isMounted)if(o)w=H||c;else return;O[Ge]&&O[Ge](!0);const N=M[_];N&<(e,N)&&N.el[Ge]&&N.el[Ge](),A(w,[O])},enter(O){let w=a,N=f,T=h;if(!n.isMounted)if(o)w=W||a,N=D||f,T=p||h;else return;let G=!1;const ne=O[sn]=ce=>{G||(G=!0,ce?A(T,[O]):A(N,[O]),$.delayedLeave&&$.delayedLeave(),O[sn]=void 0)};w?F(w,[O,ne]):ne()},leave(O,w){const N=String(e.key);if(O[sn]&&O[sn](!0),n.isUnmounting)return w();A(m,[O]);let T=!1;const G=O[Ge]=ne=>{T||(T=!0,w(),ne?A(I,[O]):A(C,[O]),O[Ge]=void 0,M[N]===e&&delete M[N])};M[N]=e,y?F(y,[O,G]):G()},clone(O){const w=_r(O,t,n,r,s);return s&&s(w),w}};return $}function zn(e){if(Wt(e))return e=Ze(e),e.children=null,e}function vs(e){if(!Wt(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&K(n.default))return n.default()}}function En(e,t){e.shapeFlag&6&&e.component?En(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Jo(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;oe.__isTeleport,Mt=e=>e&&(e.disabled||e.disabled===""),bs=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ws=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,yr=(e,t)=>{const n=e&&e.to;return oe(n)?t?t(n):null:n},_c={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,a){const{mc:f,pc:h,pbc:m,o:{insert:y,querySelector:C,createText:I,createComment:H}}=a,W=Mt(t.props);let{shapeFlag:D,children:p,dynamicChildren:_}=t;if(e==null){const M=t.el=I(""),A=t.anchor=I("");y(M,n,r),y(A,n,r);const F=t.target=yr(t.props,C),$=t.targetAnchor=I("");F&&(y($,F),i==="svg"||bs(F)?i="svg":(i==="mathml"||ws(F))&&(i="mathml"));const O=(w,N)=>{D&16&&f(p,w,N,s,o,i,l,c)};W?O(n,A):F&&O(F,$)}else{t.el=e.el;const M=t.anchor=e.anchor,A=t.target=e.target,F=t.targetAnchor=e.targetAnchor,$=Mt(e.props),O=$?n:A,w=$?M:F;if(i==="svg"||bs(A)?i="svg":(i==="mathml"||ws(A))&&(i="mathml"),_?(m(e.dynamicChildren,_,O,s,o,i,l),Ur(e,t,!0)):c||h(e,t,O,w,s,o,i,l,!1),W)$?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):on(t,n,M,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const N=t.target=yr(t.props,C);N&&on(t,N,null,a,0)}else $&&on(t,A,F,a,1)}Qo(t)},remove(e,t,n,{um:r,o:{remove:s}},o){const{shapeFlag:i,children:l,anchor:c,targetAnchor:a,target:f,props:h}=e;if(f&&s(a),o&&s(c),i&16){const m=o||!Mt(h);for(let y=0;y0?Re||mt:null,vc(),Dt>0&&Re&&Re.push(e),e}function mu(e,t,n,r,s,o){return ei(ri(e,t,n,r,s,o,!0))}function ti(e,t,n,r,s){return ei(ie(e,t,n,r,s,!0))}function Cn(e){return e?e.__v_isVNode===!0:!1}function lt(e,t){return e.type===t.type&&e.key===t.key}const ni=({key:e})=>e??null,hn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?oe(e)||de(e)||K(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function ri(e,t=null,n=null,r=0,s=null,o=e===ye?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ni(t),ref:t&&hn(t),scopeId:Nn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:fe};return l?(kr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=oe(n)?8:16),Dt>0&&!i&&Re&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Re.push(c),c}const ie=bc;function bc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Ro)&&(e=me),Cn(e)){const l=Ze(e,t,!0);return n&&kr(l,n),Dt>0&&!o&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag=-2,l}if(Oc(e)&&(e=e.__vccOpts),t){t=wc(t);let{class:l,style:c}=t;l&&!oe(l)&&(t.class=Tr(l)),Z(c)&&(yo(c)&&!k(c)&&(c=le({},c)),t.style=Sr(c))}const i=oe(e)?1:Ml(e)?128:mc(e)?64:Z(e)?4:K(e)?2:0;return ri(e,t,n,r,s,i,o,!0)}function wc(e){return e?yo(e)||Ho(e)?le({},e):e:null}function Ze(e,t,n=!1,r=!1){const{props:s,ref:o,patchFlag:i,children:l,transition:c}=e,a=t?Ec(s||{},t):s,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&ni(a),ref:t&&t.ref?n&&o?k(o)?o.concat(hn(t)):[o,hn(t)]:hn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ye?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ze(e.ssContent),ssFallback:e.ssFallback&&Ze(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&En(f,c.clone(f)),f}function si(e=" ",t=0){return ie(Et,null,e,t)}function _u(e,t){const n=ie(Pt,null,e);return n.staticCount=t,n}function yu(e="",t=!1){return t?(Zo(),ti(me,null,e)):ie(me,null,e)}function Ae(e){return e==null||typeof e=="boolean"?ie(me):k(e)?ie(ye,null,e.slice()):typeof e=="object"?ze(e):ie(Et,null,String(e))}function ze(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ze(e)}function kr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(k(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),kr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!Ho(t)?t._ctx=fe:s===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),r&64?(n=16,t=[si(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ec(...e){const t={};for(let n=0;nue||fe;let xn,vr;{const e=no(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),o=>{s.length>1?s.forEach(i=>i(o)):s[0](o)}};xn=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),vr=t("__VUE_SSR_SETTERS__",n=>Gt=n)}const qt=e=>{const t=ue;return xn(e),e.scope.on(),()=>{e.scope.off(),xn(t)}},Cs=()=>{ue&&ue.scope.off(),xn(null)};function oi(e){return e.vnode.shapeFlag&4}let Gt=!1;function Tc(e,t=!1){t&&vr(t);const{props:n,children:r}=e.vnode,s=oi(e);Yl(e,n,s,t),Zl(e,r);const o=s?Ac(e,t):void 0;return t&&vr(!1),o}function Ac(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Dl);const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?li(e):null,o=qt(e);tt();const i=Je(r,e,0,[e.props,s]);if(Ue(),o(),Qs(i)){if(i.then(Cs,Cs),t)return i.then(l=>{xs(e,l,t)}).catch(l=>{Kt(l,e,0)});e.asyncDep=i}else xs(e,i,t)}else ii(e,t)}function xs(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=Eo(t)),ii(e,n)}let Ss;function ii(e,t,n){const r=e.type;if(!e.render){if(!t&&Ss&&!r.render){const s=r.template||Vr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,a=le(le({isCustomElement:o,delimiters:l},i),c);r.render=Ss(s,a)}}e.render=r.render||xe}{const s=qt(e);tt();try{Bl(e)}finally{Ue(),s()}}}const Rc={get(e,t){return ve(e,"get",""),e[t]}};function li(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Rc),slots:e.slots,emit:e.emit,expose:t}}function Vn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Eo(dn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ot)return Ot[n](e)},has(t,n){return n in t||n in Ot}})):e.proxy}function Lc(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function Oc(e){return K(e)&&"__vccOpts"in e}const re=(e,t)=>hl(e,t,Gt);function br(e,t,n){const r=arguments.length;return r===2?Z(t)&&!k(t)?Cn(t)?ie(e,null,[t]):ie(e,t):ie(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Cn(n)&&(n=[n]),ie(e,t,n))}const Ic="3.4.30";/** +* @vue/runtime-dom v3.4.30 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Mc="http://www.w3.org/2000/svg",Pc="http://www.w3.org/1998/Math/MathML",Ve=typeof document<"u"?document:null,Ts=Ve&&Ve.createElement("template"),Nc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?Ve.createElementNS(Mc,e):t==="mathml"?Ve.createElementNS(Pc,e):n?Ve.createElement(e,{is:n}):Ve.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Ve.createTextNode(e),createComment:e=>Ve.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ve.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Ts.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Ts.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ke="transition",Tt="animation",Ut=Symbol("_vtc"),ci=(e,{slots:t})=>br(gc,Fc(e),t);ci.displayName="Transition";const ai={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=le({},zo,ai);const st=(e,t=[])=>{k(e)?e.forEach(n=>n(...t)):e&&e(...t)},As=e=>e?k(e)?e.some(t=>t.length>1):e.length>1:!1;function Fc(e){const t={};for(const T in e)T in ai||(t[T]=e[T]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,C=$c(s),I=C&&C[0],H=C&&C[1],{onBeforeEnter:W,onEnter:D,onEnterCancelled:p,onLeave:_,onLeaveCancelled:M,onBeforeAppear:A=W,onAppear:F=D,onAppearCancelled:$=p}=t,O=(T,G,ne)=>{ot(T,G?f:l),ot(T,G?a:i),ne&&ne()},w=(T,G)=>{T._isLeaving=!1,ot(T,h),ot(T,y),ot(T,m),G&&G()},N=T=>(G,ne)=>{const ce=T?F:D,U=()=>O(G,T,ne);st(ce,[G,U]),Rs(()=>{ot(G,T?c:o),We(G,T?f:l),As(ce)||Ls(G,r,I,U)})};return le(t,{onBeforeEnter(T){st(W,[T]),We(T,o),We(T,i)},onBeforeAppear(T){st(A,[T]),We(T,c),We(T,a)},onEnter:N(!1),onAppear:N(!0),onLeave(T,G){T._isLeaving=!0;const ne=()=>w(T,G);We(T,h),We(T,m),Vc(),Rs(()=>{T._isLeaving&&(ot(T,h),We(T,y),As(_)||Ls(T,r,H,ne))}),st(_,[T,ne])},onEnterCancelled(T){O(T,!1),st(p,[T])},onAppearCancelled(T){O(T,!0),st($,[T])},onLeaveCancelled(T){w(T),st(M,[T])}})}function $c(e){if(e==null)return null;if(Z(e))return[Xn(e.enter),Xn(e.leave)];{const t=Xn(e);return[t,t]}}function Xn(e){return $i(e)}function We(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Ut]||(e[Ut]=new Set)).add(t)}function ot(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Ut];n&&(n.delete(t),n.size||(e[Ut]=void 0))}function Rs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Hc=0;function Ls(e,t,n,r){const s=e._endId=++Hc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=jc(e,t);if(!i)return r();const a=i+"end";let f=0;const h=()=>{e.removeEventListener(a,m),o()},m=y=>{y.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[C]||"").split(", "),s=r(`${Ke}Delay`),o=r(`${Ke}Duration`),i=Os(s,o),l=r(`${Tt}Delay`),c=r(`${Tt}Duration`),a=Os(l,c);let f=null,h=0,m=0;t===Ke?i>0&&(f=Ke,h=i,m=o.length):t===Tt?a>0&&(f=Tt,h=a,m=c.length):(h=Math.max(i,a),f=h>0?i>a?Ke:Tt:null,m=f?f===Ke?o.length:c.length:0);const y=f===Ke&&/\b(transform|all)(,|$)/.test(r(`${Ke}Property`).toString());return{type:f,timeout:h,propCount:m,hasTransform:y}}function Os(e,t){for(;e.lengthIs(n)+Is(e[r])))}function Is(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Vc(){return document.body.offsetHeight}function Dc(e,t,n){const r=e[Ut];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ms=Symbol("_vod"),Uc=Symbol("_vsh"),Bc=Symbol(""),kc=/(^|;)\s*display\s*:/;function Kc(e,t,n){const r=e.style,s=oe(n);let o=!1;if(n&&!s){if(t)if(oe(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&pn(r,l,"")}else for(const i in t)n[i]==null&&pn(r,i,"");for(const i in n)i==="display"&&(o=!0),pn(r,i,n[i])}else if(s){if(t!==n){const i=r[Bc];i&&(n+=";"+i),r.cssText=n,o=kc.test(n)}}else t&&e.removeAttribute("style");Ms in e&&(e[Ms]=o?r.display:"",e[Uc]&&(r.display="none"))}const Ps=/\s*!important$/;function pn(e,t,n){if(k(n))n.forEach(r=>pn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Wc(e,t);Ps.test(n)?e.setProperty(ft(r),n.replace(Ps,""),"important"):e[r]=n}}const Ns=["Webkit","Moz","ms"],Yn={};function Wc(e,t){const n=Yn[t];if(n)return n;let r=$e(t);if(r!=="filter"&&r in e)return Yn[t]=r;r=An(r);for(let s=0;sJn||(Yc.then(()=>Jn=0),Jn=Date.now());function Qc(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Se(Zc(r,n.value),t,5,[r])};return n.value=e,n.attached=Jc(),n}function Zc(e,t){if(k(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Vs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ea=(e,t,n,r,s,o,i,l,c)=>{const a=s==="svg";t==="class"?Dc(e,r,a):t==="style"?Kc(e,n,r):kt(t)?Er(t)||zc(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ta(e,t,r,a))?(qc(e,t,r,o,i,l,c),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&$s(e,t,r,a,i,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),$s(e,t,r,a))};function ta(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Vs(t)&&K(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Vs(t)&&oe(n)?!1:t in e}const Ds=e=>{const t=e.props["onUpdate:modelValue"]||!1;return k(t)?n=>fn(t,n):t};function na(e){e.target.composing=!0}function Us(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qn=Symbol("_assign"),vu={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Qn]=Ds(s);const o=r||s.props&&s.props.type==="number";gt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=cr(l)),e[Qn](l)}),n&>(e,"change",()=>{e.value=e.value.trim()}),t||(gt(e,"compositionstart",na),gt(e,"compositionend",Us),gt(e,"change",Us))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[Qn]=Ds(i),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?cr(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},ra=["ctrl","shift","alt","meta"],sa={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)=>ra.some(n=>e[`${n}Key`]&&!t.includes(n))},bu=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const o=ft(s.key);if(t.some(i=>i===o||oa[i]===o))return e(s)})},ui=le({patchProp:ea},Nc);let Ft,Bs=!1;function ia(){return Ft||(Ft=sc(ui))}function la(){return Ft=Bs?Ft:oc(ui),Bs=!0,Ft}const Eu=(...e)=>{const t=ia().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=di(r);if(!s)return;const o=t._component;!K(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,fi(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},Cu=(...e)=>{const t=la().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=di(r);if(s)return n(s,!0,fi(s))},t};function fi(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function di(e){return oe(e)?document.querySelector(e):e}const ca=window.__VP_SITE_DATA__;function Kr(e){return oo()?(Wi(e),!0):!1}function Fe(e){return typeof e=="function"?e():wo(e)}const hi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const aa=Object.prototype.toString,ua=e=>aa.call(e)==="[object Object]",Bt=()=>{},ks=fa();function fa(){var e,t;return hi&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function da(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const pi=e=>e();function ha(e,t={}){let n,r,s=Bt;const o=l=>{clearTimeout(l),s(),s=Bt};return l=>{const c=Fe(e),a=Fe(t.maxWait);return n&&o(n),c<=0||a!==void 0&&a<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,a&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},a)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function pa(e=pi){const t=se(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:On(t),pause:n,resume:r,eventFilter:s}}function ga(e){return jn()}function gi(...e){if(e.length!==1)return bl(...e);const t=e[0];return typeof t=="function"?On(_l(()=>({get:t,set:Bt}))):se(t)}function mi(e,t,n={}){const{eventFilter:r=pi,...s}=n;return Ne(e,da(r,t),s)}function ma(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=pa(r);return{stop:mi(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Wr(e,t=!0,n){ga()?xt(e,n):t?e():In(e)}function xu(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return mi(e,t,{...o,eventFilter:ha(r,{maxWait:s})})}function Su(e,t,n){let r;de(n)?r={evaluating:n}:r={};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=Bt}=r,c=se(!s),a=i?Fr(t):se(t);let f=0;return Br(async h=>{if(!c.value)return;f++;const m=f;let y=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const C=await e(I=>{h(()=>{o&&(o.value=!1),y||I()})});m===f&&(a.value=C)}catch(C){l(C)}finally{o&&m===f&&(o.value=!1),y=!0}}),s?re(()=>(c.value=!0,a.value)):a}function _i(e){var t;const n=Fe(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Le=hi?window:void 0;function Ct(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Le):[t,n,r,s]=e,!t)return Bt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,m,y)=>(f.addEventListener(h,m,y),()=>f.removeEventListener(h,m,y)),c=Ne(()=>[_i(t),Fe(s)],([f,h])=>{if(i(),!f)return;const m=ua(h)?{...h}:h;o.push(...n.flatMap(y=>r.map(C=>l(f,y,C,m))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Kr(a),a}function _a(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Tu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Le,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=_a(t);return Ct(s,o,f=>{f.repeat&&Fe(l)||c(f)&&n(f)},i)}function ya(){const e=se(!1),t=jn();return t&&xt(()=>{e.value=!0},t),e}function va(e){const t=ya();return re(()=>(t.value,!!e()))}function yi(e,t={}){const{window:n=Le}=t,r=va(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=se(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Br(()=>{r.value&&(l(),s=n.matchMedia(Fe(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Kr(()=>{c(),l(),s=void 0}),o}const ln=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},cn="__vueuse_ssr_handlers__",ba=wa();function wa(){return cn in ln||(ln[cn]=ln[cn]||{}),ln[cn]}function vi(e,t){return ba[e]||t}function Ea(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Ca={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Ks="vueuse-storage";function qr(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:f,window:h=Le,eventFilter:m,onError:y=w=>{console.error(w)},initOnMounted:C}=r,I=(f?Fr:se)(typeof t=="function"?t():t);if(!n)try{n=vi("getDefaultStorage",()=>{var w;return(w=Le)==null?void 0:w.localStorage})()}catch(w){y(w)}if(!n)return I;const H=Fe(t),W=Ea(H),D=(s=r.serializer)!=null?s:Ca[W],{pause:p,resume:_}=ma(I,()=>A(I.value),{flush:o,deep:i,eventFilter:m});h&&l&&Wr(()=>{Ct(h,"storage",$),Ct(h,Ks,O),C&&$()}),C||$();function M(w,N){h&&h.dispatchEvent(new CustomEvent(Ks,{detail:{key:e,oldValue:w,newValue:N,storageArea:n}}))}function A(w){try{const N=n.getItem(e);if(w==null)M(N,null),n.removeItem(e);else{const T=D.write(w);N!==T&&(n.setItem(e,T),M(N,T))}}catch(N){y(N)}}function F(w){const N=w?w.newValue:n.getItem(e);if(N==null)return c&&H!=null&&n.setItem(e,D.write(H)),H;if(!w&&a){const T=D.read(N);return typeof a=="function"?a(T,H):W==="object"&&!Array.isArray(T)?{...H,...T}:T}else return typeof N!="string"?N:D.read(N)}function $(w){if(!(w&&w.storageArea!==n)){if(w&&w.key==null){I.value=H;return}if(!(w&&w.key!==e)){p();try{(w==null?void 0:w.newValue)!==D.write(I.value)&&(I.value=F(w))}catch(N){y(N)}finally{w?In(_):_()}}}}function O(w){$(w.detail)}return I}function bi(e){return yi("(prefers-color-scheme: dark)",e)}function xa(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Le,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},m=bi({window:s}),y=re(()=>m.value?"dark":"light"),C=c||(i==null?gi(r):qr(i,r,o,{window:s,listenToStorageChanges:l})),I=re(()=>C.value==="auto"?y.value:C.value),H=vi("updateHTMLAttrs",(_,M,A)=>{const F=typeof _=="string"?s==null?void 0:s.document.querySelector(_):_i(_);if(!F)return;let $;if(f&&($=s.document.createElement("style"),$.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),s.document.head.appendChild($)),M==="class"){const O=A.split(/\s/g);Object.values(h).flatMap(w=>(w||"").split(/\s/g)).filter(Boolean).forEach(w=>{O.includes(w)?F.classList.add(w):F.classList.remove(w)})}else F.setAttribute(M,A);f&&(s.getComputedStyle($).opacity,document.head.removeChild($))});function W(_){var M;H(t,n,(M=h[_])!=null?M:_)}function D(_){e.onChanged?e.onChanged(_,W):W(_)}Ne(I,D,{flush:"post",immediate:!0}),Wr(()=>D(I.value));const p=re({get(){return a?C.value:I.value},set(_){C.value=_}});try{return Object.assign(p,{store:C,system:y,state:I})}catch{return p}}function Sa(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Le}=e,s=xa({...e,onChanged:(l,c)=>{var a;e.onChanged?(a=e.onChanged)==null||a.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=re(()=>s.system?s.system.value:bi({window:r}).value?"dark":"light");return re({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";o.value===c?s.value="auto":s.value=c}})}function Zn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Au(e,t,n={}){const{window:r=Le}=n;return qr(e,t,r==null?void 0:r.localStorage,n)}function wi(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const er=new WeakMap;function Ru(e,t=!1){const n=se(t);let r=null,s="";Ne(gi(e),l=>{const c=Zn(Fe(l));if(c){const a=c;if(er.get(a)||er.set(a,a.style.overflow),a.style.overflow!=="hidden"&&(s=a.style.overflow),a.style.overflow==="hidden")return n.value=!0;if(n.value)return a.style.overflow="hidden"}},{immediate:!0});const o=()=>{const l=Zn(Fe(e));!l||n.value||(ks&&(r=Ct(l,"touchmove",c=>{Ta(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=Zn(Fe(e));!l||!n.value||(ks&&(r==null||r()),l.style.overflow=s,er.delete(l),n.value=!1)};return Kr(i),re({get(){return n.value},set(l){l?o():i()}})}function Lu(e,t,n={}){const{window:r=Le}=n;return qr(e,t,r==null?void 0:r.sessionStorage,n)}function Ou(e={}){const{window:t=Le,behavior:n="auto"}=e;if(!t)return{x:se(0),y:se(0)};const r=se(t.scrollX),s=se(t.scrollY),o=re({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=re({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Ct(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}function Iu(e={}){const{window:t=Le,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:s=!0,includeScrollbar:o=!0}=e,i=se(n),l=se(r),c=()=>{t&&(o?(i.value=t.innerWidth,l.value=t.innerHeight):(i.value=t.document.documentElement.clientWidth,l.value=t.document.documentElement.clientHeight))};if(c(),Wr(c),Ct("resize",c,{passive:!0}),s){const a=yi("(orientation: portrait)");Ne(a,()=>c())}return{width:i,height:l}}var tr={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1},nr={};const Ei=/^(?:[a-z]+:|\/\/)/i,Aa="vitepress-theme-appearance",Ra=/#.*$/,La=/[?#].*$/,Oa=/(?:(^|\/)index)?\.(?:md|html)$/,he=typeof document<"u",Ci={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Ia(e,t,n=!1){if(t===void 0)return!1;if(e=Ws(`/${e}`),n)return new RegExp(t).test(e);if(Ws(t)!==e)return!1;const r=t.match(Ra);return r?(he?location.hash:"")===r[0]:!0}function Ws(e){return decodeURI(e).replace(La,"").replace(Oa,"$1")}function Ma(e){return Ei.test(e)}function Pa(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Ma(n)&&Ia(t,`/${n}/`,!0))||"root"}function Na(e,t){var r,s,o,i,l,c,a;const n=Pa(e,t);return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Si(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function xi(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=Fa(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function Fa(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function $a(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function Si(e,t){return[...e.filter(n=>!$a(t,n)),...t]}const Ha=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ja=/^[a-z]:/i;function qs(e){const t=ja.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ha,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const rr=new Set;function Va(e){if(rr.size===0){const n=typeof process=="object"&&(nr==null?void 0:nr.VITE_EXTRA_EXTENSIONS)||(tr==null?void 0:tr.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(r=>rr.add(r))}const t=e.split(".").pop();return t==null||!rr.has(t.toLowerCase())}function Mu(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Da=Symbol(),ut=Fr(ca);function Pu(e){const t=re(()=>Na(ut.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?se(!0):n?Sa({storageKey:Aa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):se(!1),s=se(he?location.hash:"");return he&&window.addEventListener("hashchange",()=>{s.value=location.hash}),Ne(()=>e.data,()=>{s.value=he?location.hash:""}),{site:t,theme:re(()=>t.value.themeConfig),page:re(()=>e.data),frontmatter:re(()=>e.data.frontmatter),params:re(()=>e.data.params),lang:re(()=>t.value.lang),dir:re(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:re(()=>t.value.localeIndex||"root"),title:re(()=>xi(t.value,e.data)),description:re(()=>e.data.description||t.value.description),isDark:r,hash:re(()=>s.value)}}function Ua(){const e=wt(Da);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ba(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Gs(e){return Ei.test(e)||!e.startsWith("/")?e:Ba(ut.value.base,e)}function ka(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),he){const n="/";t=qs(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${qs(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let gn=[];function Nu(e){gn.push(e),$n(()=>{gn=gn.filter(t=>t!==e)})}function Ka(){let e=ut.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=zs(e,n);else if(Array.isArray(e))for(const r of e){const s=zs(r,n);if(s){t=s;break}}return t}function zs(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}const Wa=Symbol(),Ti="http://a.com",qa=()=>({path:"/",component:null,data:Ci});function Fu(e,t){const n=Ln(qa()),r={route:n,go:s};async function s(l=he?location.href:"/"){var c,a;l=sr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(he&&l!==sr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var m;if(await((m=r.onBeforePageLoad)==null?void 0:m.call(r,l))===!1)return;const f=new URL(l,Ti),h=o=f.pathname;try{let y=await e(h);if(!y)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:C,__pageData:I}=y;if(!C)throw new Error(`Invalid route component: ${C}`);n.path=he?h:Gs(h),n.component=dn(C),n.data=dn(I),he&&In(()=>{let H=ut.value.base+I.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ut.value.cleanUrls&&!H.endsWith("/")&&(H+=".html"),H!==f.pathname&&(f.pathname=H,l=H+f.search+f.hash,history.replaceState({},"",l)),f.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(D){console.warn(D)}if(W){Xs(W,f.hash);return}}window.scrollTo(0,c)})}}catch(y){if(!/fetch|Page not found/.test(y.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(y),!a)try{const C=await fetch(ut.value.base+"hashmap.json");window.__VP_HASH_MAP__=await C.json(),await i(l,c,!0);return}catch{}if(o===h){o=null,n.path=he?h:Gs(h),n.component=t?dn(t):null;const C=he?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Ci,relativePath:C}}}}return he&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:f}=a,{href:h,origin:m,pathname:y,hash:C,search:I}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),H=new URL(location.href);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&m===H.origin&&Va(y)&&(l.preventDefault(),y===H.pathname&&I===H.search?(C!==H.hash&&(history.pushState({},"",h),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:H.href,newURL:h}))),C?Xs(a,C,a.classList.contains("header-anchor")):window.scrollTo(0,0)):s(h))}},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await i(sr(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Ga(){const e=wt(Wa);if(!e)throw new Error("useRouter() is called without provider.");return e}function Ai(){return Ga().route}function Xs(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(i-window.scrollY)>window.innerHeight?window.scrollTo(0,i):window.scrollTo({left:0,top:i,behavior:"smooth"})};const o=parseInt(window.getComputedStyle(r).paddingTop,10),i=window.scrollY+r.getBoundingClientRect().top-Ka()+o;requestAnimationFrame(s)}}function sr(e){const t=new URL(e,Ti);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ut.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const or=()=>gn.forEach(e=>e()),$u=jr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Ai(),{site:n}=Ua();return()=>br(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?br(t.component,{onVnodeMounted:or,onVnodeUpdated:or,onVnodeUnmounted:or}):"404 Page Not Found"])}}),Hu=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},ju="/settings.png",Vu="/devtools.gif",Du="/font1.png",Uu="/font2.png",Bu="/i18n-ally.png",ku="/qa1.png",Ku="/vscode.png",Wu="/ui-nut.png",qu="/ui-varlet.png",Gu="/icones1.png",zu="/icones2.png",Xu="/theme.gif",Yu="/watermark.png",za="modulepreload",Xa=function(e){return"/"+e},Ys={},Ju=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),i=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));s=Promise.all(n.map(l=>{if(l=Xa(l),l in Ys)return;Ys[l]=!0;const c=l.endsWith(".css"),a=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${a}`))return;const f=document.createElement("link");if(f.rel=c?"stylesheet":za,c||(f.as="script",f.crossOrigin=""),f.href=l,i&&f.setAttribute("nonce",i),document.head.appendChild(f),c)return new Promise((h,m)=>{f.addEventListener("load",h),f.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${l}`)))})}))}return s.then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},Qu=jr({setup(e,{slots:t}){const n=se(!1);return xt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Zu(){he&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function ef(){if(he){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=o.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let a=c.textContent||"";i&&(a=a.replace(/^ *(\$|>) /gm,"").trim()),Ya(a).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function Ya(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 r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function tf(e,t){let n=!0,r=[];const s=o=>{if(n){n=!1,o.forEach(l=>{const c=ir(l);for(const a of document.head.children)if(a.isEqualNode(c)){r.push(a);return}});return}const i=o.map(ir);r.forEach((l,c)=>{const a=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));a!==-1?delete i[a]:(l==null||l.remove(),delete r[c])}),i.forEach(l=>l&&document.head.appendChild(l)),r=[...r,...i].filter(Boolean)};Br(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],a=xi(i,o);a!==document.title&&(document.title=a);const f=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==f&&h.setAttribute("content",f):ir(["meta",{name:"description",content:f}]),s(Si(i.head,Qa(c)))})}function ir([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Ja(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Qa(e){return e.filter(t=>!Ja(t))}const lr=new Set,Ri=()=>document.createElement("link"),Za=e=>{const t=Ri();t.rel="prefetch",t.href=e,document.head.appendChild(t)},eu=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let an;const tu=he&&(an=Ri())&&an.relList&&an.relList.supports&&an.relList.supports("prefetch")?Za:eu;function nf(){if(!he||!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 r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!lr.has(c)){lr.add(c);const a=ka(c);a&&tu(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):lr.add(l))})})};xt(r);const s=Ai();Ne(()=>s.path,r),$n(()=>{n&&n.disconnect()})}export{wu as $,pu as A,Fl as B,Ka as C,iu as D,au as E,ye as F,Fr as G,Nu as H,ie as I,lu as J,Ei as K,Ai as L,Ec as M,wt as N,Iu as O,Sr as P,Tu as Q,In as R,Ou as S,ci as T,he as U,On as V,uu as W,Ju as X,Ru as Y,Xl as Z,Hu as _,si as a,du as a0,bu as a1,hu as a2,Eu as a3,br as a4,_u as a5,ru as a6,ju as a7,Vu as a8,Du as a9,Lu as aA,Au as aB,xu as aC,Ga as aD,Ct as aE,Io as aF,cu as aG,vu as aH,de as aI,gu as aJ,dn as aK,Mu as aL,Uu as aa,Bu as ab,ku as ac,Ku as ad,Wu as ae,qu as af,Gu as ag,zu as ah,Xu as ai,Yu as aj,tf as ak,Wa as al,Pu as am,Da as an,$u as ao,Qu as ap,ut as aq,Cu as ar,Fu as as,ka as at,nf as au,ef as av,Zu as aw,_i as ax,Kr as ay,Su as az,ti as b,mu as c,jr as d,yu as e,Va as f,Gs as g,re as h,Ma as i,ri as j,wo as k,ou as l,Ia as m,Tr as n,Zo as o,su as p,yi as q,fu as r,se as s,nu as t,Ua as u,Ne as v,Al as w,Br as x,xt as y,$n as z}; diff --git a/assets/chunks/giscus-aTimukGI.CKTvSCx2.js b/assets/chunks/giscus-aTimukGI.CKTvSCx2.js new file mode 100644 index 0000000..901e31a --- /dev/null +++ b/assets/chunks/giscus-aTimukGI.CKTvSCx2.js @@ -0,0 +1,66 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const x=globalThis,j=x.ShadowRoot&&(x.ShadyCSS===void 0||x.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,W=Symbol(),q=new WeakMap;let ot=class{constructor(s,t,e){if(this._$cssResult$=!0,e!==W)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=s,this.t=t}get styleSheet(){let s=this.o;const t=this.t;if(j&&s===void 0){const e=t!==void 0&&t.length===1;e&&(s=q.get(t)),s===void 0&&((this.o=s=new CSSStyleSheet).replaceSync(this.cssText),e&&q.set(t,s))}return s}toString(){return this.cssText}};const pt=s=>new ot(typeof s=="string"?s:s+"",void 0,W),_t=(s,...t)=>{const e=s.length===1?s[0]:t.reduce((i,r,o)=>i+(n=>{if(n._$cssResult$===!0)return n.cssText;if(typeof n=="number")return n;throw Error("Value passed to 'css' function must be a 'css' function result: "+n+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(r)+s[o+1],s[0]);return new ot(e,s,W)},gt=(s,t)=>{if(j)s.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const e of t){const i=document.createElement("style"),r=x.litNonce;r!==void 0&&i.setAttribute("nonce",r),i.textContent=e.cssText,s.appendChild(i)}},K=j?s=>s:s=>s instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return pt(e)})(s):s;/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const{is:$t,defineProperty:ft,getOwnPropertyDescriptor:mt,getOwnPropertyNames:vt,getOwnPropertySymbols:At,getPrototypeOf:yt}=Object,E=globalThis,Y=E.trustedTypes,St=Y?Y.emptyScript:"",J=E.reactiveElementPolyfillSupport,U=(s,t)=>s,H={toAttribute(s,t){switch(t){case Boolean:s=s?St:null;break;case Object:case Array:s=s==null?s:JSON.stringify(s)}return s},fromAttribute(s,t){let e=s;switch(t){case Boolean:e=s!==null;break;case Number:e=s===null?null:Number(s);break;case Object:case Array:try{e=JSON.parse(s)}catch{e=null}}return e}},V=(s,t)=>!$t(s,t),F={attribute:!0,type:String,converter:H,reflect:!1,hasChanged:V};Symbol.metadata??(Symbol.metadata=Symbol("metadata")),E.litPropertyMetadata??(E.litPropertyMetadata=new WeakMap);class S extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??(this.l=[])).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=F){if(e.state&&(e.attribute=!1),this._$Ei(),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,e);r!==void 0&&ft(this.prototype,t,r)}}static getPropertyDescriptor(t,e,i){const{get:r,set:o}=mt(this.prototype,t)??{get(){return this[e]},set(n){this[e]=n}};return{get(){return r==null?void 0:r.call(this)},set(n){const a=r==null?void 0:r.call(this);o.call(this,n),this.requestUpdate(t,a,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??F}static _$Ei(){if(this.hasOwnProperty(U("elementProperties")))return;const t=yt(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(U("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(U("properties"))){const e=this.properties,i=[...vt(e),...At(e)];for(const r of i)this.createProperty(r,e[r])}const t=this[Symbol.metadata];if(t!==null){const e=litPropertyMetadata.get(t);if(e!==void 0)for(const[i,r]of e)this.elementProperties.set(i,r)}this._$Eh=new Map;for(const[e,i]of this.elementProperties){const r=this._$Eu(e,i);r!==void 0&&this._$Eh.set(r,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const r of i)e.unshift(K(r))}else t!==void 0&&e.push(K(t));return e}static _$Eu(t,e){const i=e.attribute;return i===!1?void 0:typeof i=="string"?i:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){var t;this._$Eg=new Promise(e=>this.enableUpdating=e),this._$AL=new Map,this._$ES(),this.requestUpdate(),(t=this.constructor.l)==null||t.forEach(e=>e(this))}addController(t){var e;(this._$E_??(this._$E_=new Set)).add(t),this.renderRoot!==void 0&&this.isConnected&&((e=t.hostConnected)==null||e.call(t))}removeController(t){var e;(e=this._$E_)==null||e.delete(t)}_$ES(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return gt(t,this.constructor.elementStyles),t}connectedCallback(){var t;this.renderRoot??(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),(t=this._$E_)==null||t.forEach(e=>{var i;return(i=e.hostConnected)==null?void 0:i.call(e)})}enableUpdating(t){}disconnectedCallback(){var t;(t=this._$E_)==null||t.forEach(e=>{var i;return(i=e.hostDisconnected)==null?void 0:i.call(e)})}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$EO(t,e){var i;const r=this.constructor.elementProperties.get(t),o=this.constructor._$Eu(t,r);if(o!==void 0&&r.reflect===!0){const n=(((i=r.converter)==null?void 0:i.toAttribute)!==void 0?r.converter:H).toAttribute(e,r.type);this._$Em=t,n==null?this.removeAttribute(o):this.setAttribute(o,n),this._$Em=null}}_$AK(t,e){var i;const r=this.constructor,o=r._$Eh.get(t);if(o!==void 0&&this._$Em!==o){const n=r.getPropertyOptions(o),a=typeof n.converter=="function"?{fromAttribute:n.converter}:((i=n.converter)==null?void 0:i.fromAttribute)!==void 0?n.converter:H;this._$Em=o,this[o]=a.fromAttribute(e,n.type),this._$Em=null}}requestUpdate(t,e,i,r=!1,o){if(t!==void 0){if(i??(i=this.constructor.getPropertyOptions(t)),!(i.hasChanged??V)(r?o:this[t],e))return;this.C(t,e,i)}this.isUpdatePending===!1&&(this._$Eg=this._$EP())}C(t,e,i){this._$AL.has(t)||this._$AL.set(t,e),i.reflect===!0&&this._$Em!==t&&(this._$Ej??(this._$Ej=new Set)).add(t)}async _$EP(){this.isUpdatePending=!0;try{await this._$Eg}catch(e){Promise.reject(e)}const t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t;if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??(this.renderRoot=this.createRenderRoot()),this._$Ep){for(const[o,n]of this._$Ep)this[o]=n;this._$Ep=void 0}const r=this.constructor.elementProperties;if(r.size>0)for(const[o,n]of r)n.wrapped!==!0||this._$AL.has(o)||this[o]===void 0||this.C(o,this[o],n)}let e=!1;const i=this._$AL;try{e=this.shouldUpdate(i),e?(this.willUpdate(i),(t=this._$E_)==null||t.forEach(r=>{var o;return(o=r.hostUpdate)==null?void 0:o.call(r)}),this.update(i)):this._$ET()}catch(r){throw e=!1,this._$ET(),r}e&&this._$AE(i)}willUpdate(t){}_$AE(t){var e;(e=this._$E_)==null||e.forEach(i=>{var r;return(r=i.hostUpdated)==null?void 0:r.call(i)}),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$ET(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$Eg}shouldUpdate(t){return!0}update(t){this._$Ej&&(this._$Ej=this._$Ej.forEach(e=>this._$EO(e,this[e]))),this._$ET()}updated(t){}firstUpdated(t){}}S.elementStyles=[],S.shadowRootOptions={mode:"open"},S[U("elementProperties")]=new Map,S[U("finalized")]=new Map,J==null||J({ReactiveElement:S}),(E.reactiveElementVersions??(E.reactiveElementVersions=[])).push("2.0.2");/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const L=globalThis,k=L.trustedTypes,Q=k?k.createPolicy("lit-html",{createHTML:s=>s}):void 0,at="$lit$",m=`lit$${(Math.random()+"").slice(9)}$`,ht="?"+m,Et=`<${ht}>`,y=document,O=()=>y.createComment(""),R=s=>s===null||typeof s!="object"&&typeof s!="function",lt=Array.isArray,bt=s=>lt(s)||typeof(s==null?void 0:s[Symbol.iterator])=="function",z=`[ +\f\r]`,w=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Z=/-->/g,X=/>/g,v=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ +\f\r"'\`<>=]|("|')|))|$)`,"g"),tt=/'/g,et=/"/g,ct=/^(?:script|style|textarea|title)$/i,Ct=s=>(t,...e)=>({_$litType$:s,strings:t,values:e}),wt=Ct(1),b=Symbol.for("lit-noChange"),c=Symbol.for("lit-nothing"),st=new WeakMap,A=y.createTreeWalker(y,129);function dt(s,t){if(!Array.isArray(s)||!s.hasOwnProperty("raw"))throw Error("invalid template strings array");return Q!==void 0?Q.createHTML(t):t}const Ut=(s,t)=>{const e=s.length-1,i=[];let r,o=t===2?"":"",n=w;for(let a=0;a"?(n=r??w,l=-1):u[1]===void 0?l=-2:(l=n.lastIndex-u[2].length,g=u[1],n=u[3]===void 0?v:u[3]==='"'?et:tt):n===et||n===tt?n=v:n===Z||n===X?n=w:(n=v,r=void 0);const f=n===v&&s[a+1].startsWith("/>")?" ":"";o+=n===w?h+Et:l>=0?(i.push(g),h.slice(0,l)+at+h.slice(l)+m+f):h+m+(l===-2?a:f)}return[dt(s,o+(s[e]||"")+(t===2?"":"")),i]};class N{constructor({strings:t,_$litType$:e},i){let r;this.parts=[];let o=0,n=0;const a=t.length-1,h=this.parts,[g,u]=Ut(t,e);if(this.el=N.createElement(g,i),A.currentNode=this.el.content,e===2){const l=this.el.content.firstChild;l.replaceWith(...l.childNodes)}for(;(r=A.nextNode())!==null&&h.length0){r.textContent=k?k.emptyScript:"";for(let f=0;f<$;f++)r.append(l[f],O()),A.nextNode(),h.push({type:2,index:++o});r.append(l[$],O())}}}else if(r.nodeType===8)if(r.data===ht)h.push({type:2,index:o});else{let l=-1;for(;(l=r.data.indexOf(m,l+1))!==-1;)h.push({type:7,index:o}),l+=m.length-1}o++}}static createElement(t,e){const i=y.createElement("template");return i.innerHTML=t,i}}function C(s,t,e=s,i){var r,o;if(t===b)return t;let n=i!==void 0?(r=e._$Co)==null?void 0:r[i]:e._$Cl;const a=R(t)?void 0:t._$litDirective$;return(n==null?void 0:n.constructor)!==a&&((o=n==null?void 0:n._$AO)==null||o.call(n,!1),a===void 0?n=void 0:(n=new a(s),n._$AT(s,e,i)),i!==void 0?(e._$Co??(e._$Co=[]))[i]=n:e._$Cl=n),n!==void 0&&(t=C(s,n._$AS(s,t.values),n,i)),t}let Pt=class{constructor(s,t){this._$AV=[],this._$AN=void 0,this._$AD=s,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(s){const{el:{content:t},parts:e}=this._$AD,i=((s==null?void 0:s.creationScope)??y).importNode(t,!0);A.currentNode=i;let r=A.nextNode(),o=0,n=0,a=e[0];for(;a!==void 0;){if(o===a.index){let h;a.type===2?h=new M(r,r.nextSibling,this,s):a.type===1?h=new a.ctor(r,a.name,a.strings,this,s):a.type===6&&(h=new Nt(r,this,s)),this._$AV.push(h),a=e[++n]}o!==(a==null?void 0:a.index)&&(r=A.nextNode(),o++)}return A.currentNode=y,i}p(s){let t=0;for(const e of this._$AV)e!==void 0&&(e.strings!==void 0?(e._$AI(s,e,t),t+=e.strings.length-2):e._$AI(s[t])),t++}};class M{get _$AU(){var t;return((t=this._$AM)==null?void 0:t._$AU)??this._$Cv}constructor(t,e,i,r){this.type=2,this._$AH=c,this._$AN=void 0,this._$AA=t,this._$AB=e,this._$AM=i,this.options=r,this._$Cv=(r==null?void 0:r.isConnected)??!0}get parentNode(){let t=this._$AA.parentNode;const e=this._$AM;return e!==void 0&&(t==null?void 0:t.nodeType)===11&&(t=e.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,e=this){t=C(this,t,e),R(t)?t===c||t==null||t===""?(this._$AH!==c&&this._$AR(),this._$AH=c):t!==this._$AH&&t!==b&&this._(t):t._$litType$!==void 0?this.g(t):t.nodeType!==void 0?this.$(t):bt(t)?this.T(t):this._(t)}k(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}$(t){this._$AH!==t&&(this._$AR(),this._$AH=this.k(t))}_(t){this._$AH!==c&&R(this._$AH)?this._$AA.nextSibling.data=t:this.$(y.createTextNode(t)),this._$AH=t}g(t){var e;const{values:i,_$litType$:r}=t,o=typeof r=="number"?this._$AC(t):(r.el===void 0&&(r.el=N.createElement(dt(r.h,r.h[0]),this.options)),r);if(((e=this._$AH)==null?void 0:e._$AD)===o)this._$AH.p(i);else{const n=new Pt(o,this),a=n.u(this.options);n.p(i),this.$(a),this._$AH=n}}_$AC(t){let e=st.get(t.strings);return e===void 0&&st.set(t.strings,e=new N(t)),e}T(t){lt(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,r=0;for(const o of t)r===e.length?e.push(i=new M(this.k(O()),this.k(O()),this,this.options)):i=e[r],i._$AI(o),r++;r2||i[0]!==""||i[1]!==""?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=c}_$AI(t,e=this,i,r){const o=this.strings;let n=!1;if(o===void 0)t=C(this,t,e,0),n=!R(t)||t!==this._$AH&&t!==b,n&&(this._$AH=t);else{const a=t;let h,g;for(t=o[0],h=0;h{const i=(e==null?void 0:e.renderBefore)??t;let r=i._$litPart$;if(r===void 0){const o=(e==null?void 0:e.renderBefore)??null;i._$litPart$=r=new M(t.insertBefore(O(),o),o,void 0,e??{})}return r._$AI(s),r};/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */let P=class extends S{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){var s;const t=super.createRenderRoot();return(s=this.renderOptions).renderBefore??(s.renderBefore=t.firstChild),t}update(s){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(s),this._$Do=Mt(t,this.renderRoot,this.renderOptions)}connectedCallback(){var s;super.connectedCallback(),(s=this._$Do)==null||s.setConnected(!0)}disconnectedCallback(){var s;super.disconnectedCallback(),(s=this._$Do)==null||s.setConnected(!1)}render(){return b}};var rt;P._$litElement$=!0,P.finalized=!0,(rt=globalThis.litElementHydrateSupport)==null||rt.call(globalThis,{LitElement:P});const nt=globalThis.litElementPolyfillSupport;nt==null||nt({LitElement:P});(globalThis.litElementVersions??(globalThis.litElementVersions=[])).push("4.0.2");/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const It=s=>(t,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(s,t)}):customElements.define(s,t)};/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const xt={attribute:!0,type:String,converter:H,reflect:!1,hasChanged:V},Ht=(s=xt,t,e)=>{const{kind:i,metadata:r}=e;let o=globalThis.litPropertyMetadata.get(r);if(o===void 0&&globalThis.litPropertyMetadata.set(r,o=new Map),o.set(e.name,s),i==="accessor"){const{name:n}=e;return{set(a){const h=t.get.call(this);t.set.call(this,a),this.requestUpdate(n,h,s)},init(a){return a!==void 0&&this.C(n,void 0,s),a}}}if(i==="setter"){const{name:n}=e;return function(a){const h=this[n];t.call(this,a),this.requestUpdate(n,h,s)}}throw Error("Unsupported decorator location: "+i)};function _(s){return(t,e)=>typeof e=="object"?Ht(s,t,e):((i,r,o)=>{const n=r.hasOwnProperty(o);return r.constructor.createProperty(o,n?{...i,wrapped:!0}:i),n?Object.getOwnPropertyDescriptor(r,o):void 0})(s,t,e)}/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const Lt=s=>s.strings===void 0;/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const kt={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},Gt=s=>(...t)=>({_$litDirective$:s,values:t});let Dt=class{constructor(s){}get _$AU(){return this._$AM._$AU}_$AT(s,t,e){this._$Ct=s,this._$AM=t,this._$Ci=e}_$AS(s,t){return this.update(s,t)}update(s,t){return this.render(...t)}};/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const T=(s,t)=>{var e;const i=s._$AN;if(i===void 0)return!1;for(const r of i)(e=r._$AO)==null||e.call(r,t,!1),T(r,t);return!0},G=s=>{let t,e;do{if((t=s._$AM)===void 0)break;e=t._$AN,e.delete(s),s=t}while((e==null?void 0:e.size)===0)},ut=s=>{for(let t;t=s._$AM;s=t){let e=t._$AN;if(e===void 0)t._$AN=e=new Set;else if(e.has(s))break;e.add(s),jt(t)}};function zt(s){this._$AN!==void 0?(G(this),this._$AM=s,ut(this)):this._$AM=s}function Bt(s,t=!1,e=0){const i=this._$AH,r=this._$AN;if(r!==void 0&&r.size!==0)if(t)if(Array.isArray(i))for(let o=e;o{s.type==kt.CHILD&&(s._$AP??(s._$AP=Bt),s._$AQ??(s._$AQ=zt))};class Wt extends Dt{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,e,i){super._$AT(t,e,i),ut(this),this.isConnected=t._$AU}_$AO(t,e=!0){var i,r;t!==this.isConnected&&(this.isConnected=t,t?(i=this.reconnected)==null||i.call(this):(r=this.disconnected)==null||r.call(this)),e&&(T(this,t),G(this))}setValue(t){if(Lt(this._$Ct))this._$Ct._$AI(t,this);else{const e=[...this._$Ct._$AH];e[this._$Ci]=t,this._$Ct._$AI(e,this,0)}}disconnected(){}reconnected(){}}/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const Vt=()=>new qt;class qt{}const B=new WeakMap,Kt=Gt(class extends Wt{render(s){return c}update(s,[t]){var e;const i=t!==this.G;return i&&this.G!==void 0&&this.ot(void 0),(i||this.rt!==this.lt)&&(this.G=t,this.ct=(e=s.options)==null?void 0:e.host,this.ot(this.lt=s.element)),c}ot(s){if(typeof this.G=="function"){const t=this.ct??globalThis;let e=B.get(t);e===void 0&&(e=new WeakMap,B.set(t,e)),e.get(this.G)!==void 0&&this.G.call(this.ct,void 0),e.set(this.G,s),s!==void 0&&this.G.call(this.ct,s)}else this.G.value=s}get rt(){var s,t;return typeof this.G=="function"?(s=B.get(this.ct??globalThis))==null?void 0:s.get(this.G):(t=this.G)==null?void 0:t.value}disconnected(){this.rt===this.lt&&this.ot(void 0)}reconnected(){this.ot(this.lt)}});var Yt=Object.defineProperty,Jt=Object.getOwnPropertyDescriptor,p=(s,t,e,i)=>{for(var r=i>1?void 0:i?Jt(t,e):t,o=s.length-1,n;o>=0;o--)(n=s[o])&&(r=(i?n(t,e,r):n(r))||r);return i&&r&&Yt(t,e,r),r};function Ft(s){return customElements.get(s)?t=>t:It(s)}let d=class extends P{constructor(){super(),this.GISCUS_SESSION_KEY="giscus-session",this.GISCUS_DEFAULT_HOST="https://giscus.app",this.ERROR_SUGGESTION="Please consider reporting this error at https://github.com/giscus/giscus/issues/new.",this.__session="",this._iframeRef=Vt(),this.messageEventHandler=this.handleMessageEvent.bind(this),this.hasLoaded=!1,this.host=this.GISCUS_DEFAULT_HOST,this.strict="0",this.reactionsEnabled="1",this.emitMetadata="0",this.inputPosition="bottom",this.theme="light",this.lang="en",this.loading="eager",this.setupSession(),window.addEventListener("message",this.messageEventHandler)}get iframeRef(){var s;return(s=this._iframeRef)==null?void 0:s.value}get _host(){try{return new URL(this.host),this.host}catch{return this.GISCUS_DEFAULT_HOST}}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("message",this.messageEventHandler)}_formatError(s){return`[giscus] An error occurred. Error message: "${s}".`}setupSession(){const s=location.href,t=new URL(s),e=localStorage.getItem(this.GISCUS_SESSION_KEY),i=t.searchParams.get("giscus")??"";if(this.__session="",i){localStorage.setItem(this.GISCUS_SESSION_KEY,JSON.stringify(i)),this.__session=i,t.searchParams.delete("giscus"),t.hash="",history.replaceState(void 0,document.title,t.toString());return}if(e)try{this.__session=JSON.parse(e)}catch(r){localStorage.removeItem(this.GISCUS_SESSION_KEY),console.warn(`${this._formatError(r==null?void 0:r.message)} Session has been cleared.`)}}signOut(){localStorage.removeItem(this.GISCUS_SESSION_KEY),this.__session="",this.update(new Map)}handleMessageEvent(s){if(s.origin!==this._host)return;const{data:t}=s;if(!(typeof t=="object"&&t.giscus))return;if(this.iframeRef&&t.giscus.resizeHeight&&(this.iframeRef.style.height=`${t.giscus.resizeHeight}px`),t.giscus.signOut){console.info("[giscus] User has logged out. Session has been cleared."),this.signOut();return}if(!t.giscus.error)return;const e=t.giscus.error;if(e.includes("Bad credentials")||e.includes("Invalid state value")||e.includes("State has expired")){if(localStorage.getItem(this.GISCUS_SESSION_KEY)!==null){console.warn(`${this._formatError(e)} Session has been cleared.`),this.signOut();return}console.error(`${this._formatError(e)} No session is stored initially. ${this.ERROR_SUGGESTION}`)}if(e.includes("Discussion not found")){console.warn(`[giscus] ${e}. A new discussion will be created if a comment/reaction is submitted.`);return}console.error(`${this._formatError(e)} ${this.ERROR_SUGGESTION}`)}sendMessage(s){var t;!((t=this.iframeRef)!=null&&t.contentWindow)||!this.hasLoaded||this.iframeRef.contentWindow.postMessage({giscus:s},this._host)}updateConfig(){const s={setConfig:{repo:this.repo,repoId:this.repoId,category:this.category,categoryId:this.categoryId,term:this.getTerm(),number:+this.getNumber(),strict:this.strict==="1",reactionsEnabled:this.reactionsEnabled==="1",emitMetadata:this.emitMetadata==="1",inputPosition:this.inputPosition,theme:this.theme,lang:this.lang}};this.sendMessage(s)}firstUpdated(){var s;(s=this.iframeRef)==null||s.addEventListener("load",()=>{var t;(t=this.iframeRef)==null||t.classList.remove("loading"),this.hasLoaded=!0,this.updateConfig()})}requestUpdate(s,t,e){if(!this.hasUpdated||s==="host"){super.requestUpdate(s,t,e);return}this.updateConfig()}getMetaContent(s,t=!1){const e=t?`meta[property='og:${s}'],`:"",i=document.querySelector(e+`meta[name='${s}']`);return i?i.content:""}_getCleanedUrl(){const s=new URL(location.href);return s.searchParams.delete("giscus"),s.hash="",s}getTerm(){switch(this.mapping){case"url":return this._getCleanedUrl().toString();case"title":return document.title;case"og:title":return this.getMetaContent("title",!0);case"specific":return this.term??"";case"number":return"";case"pathname":default:return location.pathname.length<2?"index":location.pathname.substring(1).replace(/\.\w+$/,"")}}getNumber(){return this.mapping==="number"?this.term??"":""}getIframeSrc(){const s=this._getCleanedUrl().toString(),t=`${s}${this.id?"#"+this.id:""}`,e=this.getMetaContent("description",!0),i=this.getMetaContent("giscus:backlink")||s,r={origin:t,session:this.__session,repo:this.repo,repoId:this.repoId??"",category:this.category??"",categoryId:this.categoryId??"",term:this.getTerm(),number:this.getNumber(),strict:this.strict,reactionsEnabled:this.reactionsEnabled,emitMetadata:this.emitMetadata,inputPosition:this.inputPosition,theme:this.theme,description:e,backLink:i},o=this._host,n=this.lang?`/${this.lang}`:"",a=new URLSearchParams(r);return`${o}${n}/widget?${a.toString()}`}render(){return wt` + + `}};d.styles=_t` + :host, + iframe { + width: 100%; + border: none; + min-height: 150px; + color-scheme: light dark; + } + + iframe.loading { + opacity: 0; + } + `;p([_({reflect:!0})],d.prototype,"host",2);p([_({reflect:!0})],d.prototype,"repo",2);p([_({reflect:!0})],d.prototype,"repoId",2);p([_({reflect:!0})],d.prototype,"category",2);p([_({reflect:!0})],d.prototype,"categoryId",2);p([_({reflect:!0})],d.prototype,"mapping",2);p([_({reflect:!0})],d.prototype,"term",2);p([_({reflect:!0})],d.prototype,"strict",2);p([_({reflect:!0})],d.prototype,"reactionsEnabled",2);p([_({reflect:!0})],d.prototype,"emitMetadata",2);p([_({reflect:!0})],d.prototype,"inputPosition",2);p([_({reflect:!0})],d.prototype,"theme",2);p([_({reflect:!0})],d.prototype,"lang",2);p([_({reflect:!0})],d.prototype,"loading",2);d=p([Ft("giscus-widget")],d);export{d as GiscusWidget}; diff --git a/assets/chunks/theme.LZ60Kooo.js b/assets/chunks/theme.LZ60Kooo.js new file mode 100644 index 0000000..6dfecfd --- /dev/null +++ b/assets/chunks/theme.LZ60Kooo.js @@ -0,0 +1,4 @@ +const __vite__fileDeps=["assets/chunks/VPLocalSearchBox.C8j-OOtD.js","assets/chunks/framework.D-J1Cv1C.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +import{d as _,o as s,c as u,r as c,n as H,a as ee,t as z,b as y,w as p,e as h,T as Oe,_ as $,u as et,i as Ct,f as zt,g as $e,h as P,j as v,k as i,p as j,l as q,m as re,q as Ce,s as A,v as x,x as ye,y as te,z as Fe,A as tt,B as At,C as Mt,D as ie,F as B,E as K,G as ot,H as Le,I as k,J as ue,K as nt,L as me,M as _e,N as Pe,O as Ht,P as at,Q as ze,R as De,S as st,U as Se,V as Bt,W as Ot,X as rt,Y as it,Z as lt,$ as Ft,a0 as Dt,a1 as Ut,a2 as Gt,a3 as jt,a4 as Ae,a5 as qt,a6 as Rt}from"./framework.D-J1Cv1C.js";const ct=_({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(s(),u("span",{class:H(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[ee(z(e.text),1)])],2))}}),Wt={key:0,class:"VPBackdrop"},Kt=_({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(s(),y(Oe,{name:"fade"},{default:p(()=>[e.show?(s(),u("div",Wt)):h("",!0)]),_:1}))}}),Yt=$(Kt,[["__scopeId","data-v-6fd38c7d"]]),w=et;function Zt(o,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(o,e):(o(),(n=!0)&&setTimeout(()=>n=!1,e))}}function Me(o){return/^\//.test(o)?o:`/${o}`}function Ue(o){const{pathname:e,search:t,hash:n,protocol:a}=new URL(o,"http://a.com");if(Ct(o)||o.startsWith("#")||!a.startsWith("http")||!zt(e))return o;const{site:r}=w(),l=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${n}`);return $e(l)}function ve({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:n,theme:a,hash:r}=w(),l=P(()=>{var d,b;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:((b=e.value.locales[t.value])==null?void 0:b.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:P(()=>Object.entries(e.value.locales).flatMap(([d,b])=>l.value.label===b.label?[]:{text:b.label,link:Xt(b.link||(d==="root"?"/":`/${d}/`),a.value.i18nRouting!==!1&&o,n.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+r.value})),currentLang:l}}function Xt(o,e,t,n){return e?o.replace(/\/$/,"")+Me(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):o}const Jt=o=>(j("data-v-baaf7634"),o=o(),q(),o),Qt={class:"NotFound"},xt={class:"code"},eo={class:"title"},to=Jt(()=>v("div",{class:"divider"},null,-1)),oo={class:"quote"},no={class:"action"},ao=["href","aria-label"],so=_({__name:"NotFound",setup(o){const{theme:e}=w(),{currentLang:t}=ve();return(n,a)=>{var r,l,m,d,b;return s(),u("div",Qt,[v("p",xt,z(((r=i(e).notFound)==null?void 0:r.code)??"404"),1),v("h1",eo,z(((l=i(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),to,v("blockquote",oo,z(((m=i(e).notFound)==null?void 0:m.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",no,[v("a",{class:"link",href:i($e)(i(t).link),"aria-label":((d=i(e).notFound)==null?void 0:d.linkLabel)??"go to home"},z(((b=i(e).notFound)==null?void 0:b.linkText)??"Take me home"),9,ao)])])}}}),ro=$(so,[["__scopeId","data-v-baaf7634"]]);function ut(o,e){if(Array.isArray(o))return ge(o);if(o==null)return[];e=Me(e);const t=Object.keys(o).sort((a,r)=>r.split("/").length-a.split("/").length).find(a=>e.startsWith(Me(a))),n=t?o[t]:[];return Array.isArray(n)?ge(n):ge(n.items,n.base)}function io(o){const e=[];let t=0;for(const n in o){const a=o[n];if(a.items){t=e.push(a);continue}e[t]||e.push({items:[]}),e[t].items.push(a)}return e}function lo(o){const e=[];function t(n){for(const a of n)a.text&&a.link&&e.push({text:a.text,link:a.link,docFooterText:a.docFooterText}),a.items&&t(a.items)}return t(o),e}function He(o,e){return Array.isArray(e)?e.some(t=>He(o,t)):re(o,e.link)?!0:e.items?He(o,e.items):!1}function ge(o,e){return[...o].map(t=>{const n={...t},a=n.base||e;return a&&n.link&&(n.link=a+n.link),n.items&&(n.items=ge(n.items,a)),n})}function oe(){const{frontmatter:o,page:e,theme:t}=w(),n=Ce("(min-width: 960px)"),a=A(!1),r=P(()=>{const F=t.value.sidebar,C=e.value.relativePath;return F?ut(F,C):[]}),l=A(r.value);x(r,(F,C)=>{JSON.stringify(F)!==JSON.stringify(C)&&(l.value=r.value)});const m=P(()=>o.value.sidebar!==!1&&l.value.length>0&&o.value.layout!=="home"),d=P(()=>b?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),b=P(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),L=P(()=>m.value&&n.value),g=P(()=>m.value?io(l.value):[]);function V(){a.value=!0}function N(){a.value=!1}function E(){a.value?N():V()}return{isOpen:a,sidebar:l,sidebarGroups:g,hasSidebar:m,hasAside:b,leftAside:d,isSidebarEnabled:L,open:V,close:N,toggle:E}}function co(o,e){let t;ye(()=>{t=o.value?document.activeElement:void 0}),te(()=>{window.addEventListener("keyup",n)}),Fe(()=>{window.removeEventListener("keyup",n)});function n(a){a.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function uo(o){const{page:e,hash:t}=w(),n=A(!1),a=P(()=>o.value.collapsed!=null),r=P(()=>!!o.value.link),l=A(!1),m=()=>{l.value=re(e.value.relativePath,o.value.link)};x([e,o,t],m),te(m);const d=P(()=>l.value?!0:o.value.items?He(e.value.relativePath,o.value.items):!1),b=P(()=>!!(o.value.items&&o.value.items.length));ye(()=>{n.value=!!(a.value&&o.value.collapsed)}),tt(()=>{(l.value||d.value)&&(n.value=!1)});function L(){a.value&&(n.value=!n.value)}return{collapsed:n,collapsible:a,isLink:r,isActiveLink:l,hasActiveLink:d,hasChildren:b,toggle:L}}function mo(){const{hasSidebar:o}=oe(),e=Ce("(min-width: 960px)"),t=Ce("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const Be=[];function dt(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function Ge(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{element:t,title:vo(t),link:"#"+t.id,level:n}});return po(e,o)}function vo(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function po(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,a]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;o=o.filter(l=>l.level>=n&&l.level<=a),Be.length=0;for(const{element:l,link:m}of o)Be.push({element:l,link:m});const r=[];e:for(let l=0;l=0;d--){const b=o[d];if(b.level{requestAnimationFrame(r),window.addEventListener("scroll",n)}),At(()=>{l(location.hash)}),Fe(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const m=window.scrollY,d=window.innerHeight,b=document.body.offsetHeight,L=Math.abs(m+d-b)<1,g=Be.map(({element:N,link:E})=>({link:E,top:ho(N)})).filter(({top:N})=>!Number.isNaN(N)).sort((N,E)=>N.top-E.top);if(!g.length){l(null);return}if(m<1){l(null);return}if(L){l(g[g.length-1].link);return}let V=null;for(const{link:N,top:E}of g){if(E>m+Mt()+4)break;V=N}l(V)}function l(m){a&&a.classList.remove("active"),m==null?a=null:a=o.value.querySelector(`a[href="${decodeURIComponent(m)}"]`);const d=a;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ho(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}const _o=["href","title"],go=_({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(o){function e({target:t}){const n=t.href.split("#")[1],a=document.getElementById(decodeURIComponent(n));a==null||a.focus({preventScroll:!0})}return(t,n)=>{const a=ie("VPDocOutlineItem",!0);return s(),u("ul",{class:H(["VPDocOutlineItem",t.root?"root":"nested"])},[(s(!0),u(B,null,K(t.headers,({children:r,link:l,title:m})=>(s(),u("li",null,[v("a",{class:"outline-link",href:l,onClick:e,title:m},z(m),9,_o),r!=null&&r.length?(s(),y(a,{key:0,headers:r},null,8,["headers"])):h("",!0)]))),256))],2)}}}),mt=$(go,[["__scopeId","data-v-e416873c"]]),bo={class:"content"},ko={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},$o=_({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=w(),n=ot([]);Le(()=>{n.value=Ge(e.value.outline??t.value.outline)});const a=A(),r=A();return fo(a,r),(l,m)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:H(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:a},[v("div",bo,[v("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),v("div",ko,z(i(dt)(i(t))),1),k(mt,{headers:n.value,root:!0},null,8,["headers"])])],2))}}),yo=$($o,[["__scopeId","data-v-173bcab0"]]),Lo={class:"VPDocAsideCarbonAds"},Po=_({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,n)=>(s(),u("div",Lo,[k(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),So=o=>(j("data-v-c4496806"),o=o(),q(),o),Vo={class:"VPDocAside"},wo=So(()=>v("div",{class:"spacer"},null,-1)),To=_({__name:"VPDocAside",setup(o){const{theme:e}=w();return(t,n)=>(s(),u("div",Vo,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),k(yo),c(t.$slots,"aside-outline-after",{},void 0,!0),wo,c(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(s(),y(Po,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Io=$(To,[["__scopeId","data-v-c4496806"]]);function Eo(){const{theme:o,page:e}=w();return P(()=>{const{text:t="Edit this page",pattern:n=""}=o.value.editLink||{};let a;return typeof n=="function"?a=n(e.value):a=n.replace(/:path/g,e.value.filePath),{url:a,text:t}})}function No(){const{page:o,theme:e,frontmatter:t}=w();return P(()=>{var b,L,g,V,N,E,F,C;const n=ut(e.value.sidebar,o.value.relativePath),a=lo(n),r=Co(a,Z=>Z.link.replace(/[?#].*$/,"")),l=r.findIndex(Z=>re(o.value.relativePath,Z.link)),m=((b=e.value.docFooter)==null?void 0:b.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((L=e.value.docFooter)==null?void 0:L.next)===!1&&!t.value.next||t.value.next===!1;return{prev:m?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((g=r[l-1])==null?void 0:g.docFooterText)??((V=r[l-1])==null?void 0:V.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((N=r[l-1])==null?void 0:N.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((E=r[l+1])==null?void 0:E.docFooterText)??((F=r[l+1])==null?void 0:F.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function Co(o,e){const t=new Set;return o.filter(n=>{const a=e(n);return t.has(a)?!1:t.add(a)})}const Q=_({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=P(()=>e.tag??(e.href?"a":"span")),n=P(()=>e.href&&nt.test(e.href)||e.target==="_blank");return(a,r)=>(s(),y(ue(t.value),{class:H(["VPLink",{link:a.href,"vp-external-link-icon":n.value,"no-icon":a.noIcon}]),href:a.href?i(Ue)(a.href):void 0,target:a.target??(n.value?"_blank":void 0),rel:a.rel??(n.value?"noreferrer":void 0)},{default:p(()=>[c(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),zo={class:"VPLastUpdated"},Ao=["datetime"],Mo=_({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,frontmatter:n,lang:a}=w(),r=P(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),l=P(()=>r.value.toISOString()),m=A("");return te(()=>{ye(()=>{var d,b,L;m.value=new Intl.DateTimeFormat((b=(d=e.value.lastUpdated)==null?void 0:d.formatOptions)!=null&&b.forceLocale?a.value:void 0,((L=e.value.lastUpdated)==null?void 0:L.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(d,b)=>{var L;return s(),u("p",zo,[ee(z(((L=i(e).lastUpdated)==null?void 0:L.text)||i(e).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:l.value},z(m.value),9,Ao)])}}}),Ho=$(Mo,[["__scopeId","data-v-b2c3180a"]]),vt=o=>(j("data-v-5e7854d9"),o=o(),q(),o),Bo={key:0,class:"VPDocFooter"},Oo={key:0,class:"edit-info"},Fo={key:0,class:"edit-link"},Do=vt(()=>v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),Uo={key:1,class:"last-updated"},Go={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},jo=vt(()=>v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),qo={class:"pager"},Ro=["innerHTML"],Wo=["innerHTML"],Ko={class:"pager"},Yo=["innerHTML"],Zo=["innerHTML"],Xo=_({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:n}=w(),a=Eo(),r=No(),l=P(()=>e.value.editLink&&n.value.editLink!==!1),m=P(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),d=P(()=>l.value||m.value||r.value.prev||r.value.next);return(b,L)=>{var g,V,N,E;return d.value?(s(),u("footer",Bo,[c(b.$slots,"doc-footer-before",{},void 0,!0),l.value||m.value?(s(),u("div",Oo,[l.value?(s(),u("div",Fo,[k(Q,{class:"edit-link-button",href:i(a).url,"no-icon":!0},{default:p(()=>[Do,ee(" "+z(i(a).text),1)]),_:1},8,["href"])])):h("",!0),m.value?(s(),u("div",Uo,[k(Ho)])):h("",!0)])):h("",!0),(g=i(r).prev)!=null&&g.link||(V=i(r).next)!=null&&V.link?(s(),u("nav",Go,[jo,v("div",qo,[(N=i(r).prev)!=null&&N.link?(s(),y(Q,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:p(()=>{var F;return[v("span",{class:"desc",innerHTML:((F=i(e).docFooter)==null?void 0:F.prev)||"Previous page"},null,8,Ro),v("span",{class:"title",innerHTML:i(r).prev.text},null,8,Wo)]}),_:1},8,["href"])):h("",!0)]),v("div",Ko,[(E=i(r).next)!=null&&E.link?(s(),y(Q,{key:0,class:"pager-link next",href:i(r).next.link},{default:p(()=>{var F;return[v("span",{class:"desc",innerHTML:((F=i(e).docFooter)==null?void 0:F.next)||"Next page"},null,8,Yo),v("span",{class:"title",innerHTML:i(r).next.text},null,8,Zo)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),Jo=$(Xo,[["__scopeId","data-v-5e7854d9"]]),Qo=o=>(j("data-v-e4c2a608"),o=o(),q(),o),xo={class:"container"},en=Qo(()=>v("div",{class:"aside-curtain"},null,-1)),tn={class:"aside-container"},on={class:"aside-content"},nn={class:"content"},an={class:"content-container"},sn={class:"main"},rn=_({__name:"VPDoc",setup(o){const{theme:e}=w(),t=me(),{hasSidebar:n,hasAside:a,leftAside:r}=oe(),l=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(m,d)=>{const b=ie("Content");return s(),u("div",{class:H(["VPDoc",{"has-sidebar":i(n),"has-aside":i(a)}])},[c(m.$slots,"doc-top",{},void 0,!0),v("div",xo,[i(a)?(s(),u("div",{key:0,class:H(["aside",{"left-aside":i(r)}])},[en,v("div",tn,[v("div",on,[k(Io,null,{"aside-top":p(()=>[c(m.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(m.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(m.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(m.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(m.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(m.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),v("div",nn,[v("div",an,[c(m.$slots,"doc-before",{},void 0,!0),v("main",sn,[k(b,{class:H(["vp-doc",[l.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jo,null,{"doc-footer-before":p(()=>[c(m.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(m.$slots,"doc-after",{},void 0,!0)])])]),c(m.$slots,"doc-bottom",{},void 0,!0)],2)}}}),ln=$(rn,[["__scopeId","data-v-e4c2a608"]]),cn=_({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=P(()=>e.href&&nt.test(e.href)),n=P(()=>e.tag||e.href?"a":"button");return(a,r)=>(s(),y(ue(n.value),{class:H(["VPButton",[a.size,a.theme]]),href:a.href?i(Ue)(a.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:p(()=>[ee(z(a.text),1)]),_:1},8,["class","href","target","rel"]))}}),un=$(cn,[["__scopeId","data-v-58a288e4"]]),dn=["src","alt"],mn=_({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const n=ie("VPImage",!0);return e.image?(s(),u(B,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",_e({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i($e)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,dn)):(s(),u(B,{key:1},[k(n,_e({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(n,_e({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),ke=$(mn,[["__scopeId","data-v-66129518"]]),vn=o=>(j("data-v-d23dfec6"),o=o(),q(),o),pn={class:"container"},fn={class:"main"},hn={key:0,class:"name"},_n=["innerHTML"],gn=["innerHTML"],bn=["innerHTML"],kn={key:0,class:"actions"},$n={key:0,class:"image"},yn={class:"image-container"},Ln=vn(()=>v("div",{class:"image-bg"},null,-1)),Pn=_({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=Pe("hero-image-slot-exists");return(t,n)=>(s(),u("div",{class:H(["VPHero",{"has-image":t.image||i(e)}])},[v("div",pn,[v("div",fn,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(s(),u("h1",hn,[v("span",{innerHTML:t.name,class:"clip"},null,8,_n)])):h("",!0),t.text?(s(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,gn)):h("",!0),t.tagline?(s(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,bn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(s(),u("div",kn,[(s(!0),u(B,null,K(t.actions,a=>(s(),u("div",{key:a.link,class:"action"},[k(un,{tag:"a",size:"medium",theme:a.theme,text:a.text,href:a.link,target:a.target,rel:a.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||i(e)?(s(),u("div",$n,[v("div",yn,[Ln,c(t.$slots,"home-hero-image",{},()=>[t.image?(s(),y(ke,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Sn=$(Pn,[["__scopeId","data-v-d23dfec6"]]),Vn=_({__name:"VPHomeHero",setup(o){const{frontmatter:e}=w();return(t,n)=>i(e).hero?(s(),y(Sn,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info-before":p(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":p(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":p(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":p(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":p(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),wn=o=>(j("data-v-54a50e5e"),o=o(),q(),o),Tn={class:"box"},In={key:0,class:"icon"},En=["innerHTML"],Nn=["innerHTML"],Cn=["innerHTML"],zn={key:4,class:"link-text"},An={class:"link-text-value"},Mn=wn(()=>v("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),Hn=_({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(s(),y(Q,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[v("article",Tn,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",In,[k(ke,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),y(ke,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,En)):h("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,Nn),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Cn)):h("",!0),e.linkText?(s(),u("div",zn,[v("p",An,[ee(z(e.linkText)+" ",1),Mn])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Bn=$(Hn,[["__scopeId","data-v-54a50e5e"]]),On={key:0,class:"VPFeatures"},Fn={class:"container"},Dn={class:"items"},Un=_({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=P(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,a)=>n.features?(s(),u("div",On,[v("div",Fn,[v("div",Dn,[(s(!0),u(B,null,K(n.features,r=>(s(),u("div",{key:r.title,class:H(["item",[t.value]])},[k(Bn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Gn=$(Un,[["__scopeId","data-v-4507f11b"]]),jn=_({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=w();return(t,n)=>i(e).features?(s(),y(Gn,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):h("",!0)}}),qn=_({__name:"VPHomeContent",setup(o){const{width:e}=Ht({initialWidth:0,includeScrollbar:!1});return(t,n)=>(s(),u("div",{class:"vp-doc container",style:at(i(e)?{"--vp-offset":`calc(50% - ${i(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Rn=$(qn,[["__scopeId","data-v-2f26f998"]]),Wn={class:"VPHome"},Kn=_({__name:"VPHome",setup(o){const{frontmatter:e}=w();return(t,n)=>{const a=ie("Content");return s(),u("div",Wn,[c(t.$slots,"home-hero-before",{},void 0,!0),k(Vn,null,{"home-hero-info-before":p(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),k(jn),c(t.$slots,"home-features-after",{},void 0,!0),i(e).markdownStyles!==!1?(s(),y(Rn,{key:0},{default:p(()=>[k(a)]),_:1})):(s(),y(a,{key:1}))])}}}),Yn=$(Kn,[["__scopeId","data-v-6fa276e3"]]),Zn={},Xn={class:"VPPage"};function Jn(o,e){const t=ie("Content");return s(),u("div",Xn,[c(o.$slots,"page-top"),k(t),c(o.$slots,"page-bottom")])}const Qn=$(Zn,[["render",Jn]]),xn=_({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=w(),{hasSidebar:n}=oe();return(a,r)=>(s(),u("div",{class:H(["VPContent",{"has-sidebar":i(n),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?c(a.$slots,"not-found",{key:0},()=>[k(ro)],!0):i(t).layout==="page"?(s(),y(Qn,{key:1},{"page-top":p(()=>[c(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(s(),y(Yn,{key:2},{"home-hero-before":p(()=>[c(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(s(),y(ue(i(t).layout),{key:3})):(s(),y(ln,{key:4},{"doc-top":p(()=>[c(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[c(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[c(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[c(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[c(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ea=$(xn,[["__scopeId","data-v-e01aebcb"]]),ta={class:"container"},oa=["innerHTML"],na=["innerHTML"],aa=_({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=w(),{hasSidebar:n}=oe();return(a,r)=>i(e).footer&&i(t).footer!==!1?(s(),u("footer",{key:0,class:H(["VPFooter",{"has-sidebar":i(n)}])},[v("div",ta,[i(e).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,oa)):h("",!0),i(e).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,na)):h("",!0)])],2)):h("",!0)}}),sa=$(aa,[["__scopeId","data-v-058c9c44"]]);function ra(){const{theme:o,frontmatter:e}=w(),t=ot([]),n=P(()=>t.value.length>0);return Le(()=>{t.value=Ge(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:n}}const ia=o=>(j("data-v-cf9a8269"),o=o(),q(),o),la={class:"menu-text"},ca=ia(()=>v("span",{class:"vpi-chevron-right icon"},null,-1)),ua={class:"header"},da={class:"outline"},ma=_({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=w(),n=A(!1),a=A(0),r=A(),l=A();function m(g){var V;(V=r.value)!=null&&V.contains(g.target)||(n.value=!1)}x(n,g=>{if(g){document.addEventListener("click",m);return}document.removeEventListener("click",m)}),ze("Escape",()=>{n.value=!1}),Le(()=>{n.value=!1});function d(){n.value=!n.value,a.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function b(g){g.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),De(()=>{n.value=!1}))}function L(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(g,V)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:at({"--vp-vh":a.value+"px"}),ref_key:"main",ref:r},[g.headers.length>0?(s(),u("button",{key:0,onClick:d,class:H({open:n.value})},[v("span",la,z(i(dt)(i(t))),1),ca],2)):(s(),u("button",{key:1,onClick:L},z(i(t).returnToTopLabel||"Return to top"),1)),k(Oe,{name:"flyout"},{default:p(()=>[n.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:b},[v("div",ua,[v("a",{class:"top-link",href:"#",onClick:L},z(i(t).returnToTopLabel||"Return to top"),1)]),v("div",da,[k(mt,{headers:g.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),va=$(ma,[["__scopeId","data-v-cf9a8269"]]),pa=o=>(j("data-v-ffae9a67"),o=o(),q(),o),fa={class:"container"},ha=["aria-expanded"],_a=pa(()=>v("span",{class:"vpi-align-left menu-icon"},null,-1)),ga={class:"menu-text"},ba=_({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=w(),{hasSidebar:n}=oe(),{headers:a}=ra(),{y:r}=st(),l=A(0);te(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Le(()=>{a.value=Ge(t.value.outline??e.value.outline)});const m=P(()=>a.value.length===0),d=P(()=>m.value&&!n.value),b=P(()=>({VPLocalNav:!0,"has-sidebar":n.value,empty:m.value,fixed:d.value}));return(L,g)=>i(t).layout!=="home"&&(!d.value||i(r)>=l.value)?(s(),u("div",{key:0,class:H(b.value)},[v("div",fa,[i(n)?(s(),u("button",{key:0,class:"menu","aria-expanded":L.open,"aria-controls":"VPSidebarNav",onClick:g[0]||(g[0]=V=>L.$emit("open-menu"))},[_a,v("span",ga,z(i(e).sidebarMenuLabel||"Menu"),1)],8,ha)):h("",!0),k(va,{headers:i(a),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),ka=$(ba,[["__scopeId","data-v-ffae9a67"]]);function $a(){const o=A(!1);function e(){o.value=!0,window.addEventListener("resize",a)}function t(){o.value=!1,window.removeEventListener("resize",a)}function n(){o.value?t():e()}function a(){window.outerWidth>=768&&t()}const r=me();return x(()=>r.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:n}}const ya={},La={class:"VPSwitch",type:"button",role:"switch"},Pa={class:"check"},Sa={key:0,class:"icon"};function Va(o,e){return s(),u("button",La,[v("span",Pa,[o.$slots.default?(s(),u("span",Sa,[c(o.$slots,"default",{},void 0,!0)])):h("",!0)])])}const wa=$(ya,[["render",Va],["__scopeId","data-v-4e6eee23"]]),pt=o=>(j("data-v-f4b445d6"),o=o(),q(),o),Ta=pt(()=>v("span",{class:"vpi-sun sun"},null,-1)),Ia=pt(()=>v("span",{class:"vpi-moon moon"},null,-1)),Ea=_({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=w(),n=Pe("toggle-appearance",()=>{e.value=!e.value}),a=P(()=>e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme");return(r,l)=>(s(),y(wa,{title:a.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(n)},{default:p(()=>[Ta,Ia]),_:1},8,["title","aria-checked","onClick"]))}}),je=$(Ea,[["__scopeId","data-v-f4b445d6"]]),Na={key:0,class:"VPNavBarAppearance"},Ca=_({__name:"VPNavBarAppearance",setup(o){const{site:e}=w();return(t,n)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),u("div",Na,[k(je)])):h("",!0)}}),za=$(Ca,[["__scopeId","data-v-c8debaca"]]),qe=A();let ft=!1,Ne=0;function Aa(o){const e=A(!1);if(Se){!ft&&Ma(),Ne++;const t=x(qe,n=>{var a,r,l;n===o.el.value||(a=o.el.value)!=null&&a.contains(n)?(e.value=!0,(r=o.onFocus)==null||r.call(o)):(e.value=!1,(l=o.onBlur)==null||l.call(o))});Fe(()=>{t(),Ne--,Ne||Ha()})}return Bt(e)}function Ma(){document.addEventListener("focusin",ht),ft=!0,qe.value=document.activeElement}function Ha(){document.removeEventListener("focusin",ht)}function ht(){qe.value=document.activeElement}const Ba={class:"VPMenuLink"},Oa=_({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=w();return(t,n)=>(s(),u("div",Ba,[k(Q,{class:H({active:i(re)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:p(()=>[ee(z(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Ve=$(Oa,[["__scopeId","data-v-148ccee4"]]),Fa={class:"VPMenuGroup"},Da={key:0,class:"title"},Ua=_({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(s(),u("div",Fa,[e.text?(s(),u("p",Da,z(e.text),1)):h("",!0),(s(!0),u(B,null,K(e.items,n=>(s(),u(B,null,["link"in n?(s(),y(Ve,{key:0,item:n},null,8,["item"])):h("",!0)],64))),256))]))}}),Ga=$(Ua,[["__scopeId","data-v-81836f58"]]),ja={class:"VPMenu"},qa={key:0,class:"items"},Ra=_({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(s(),u("div",ja,[e.items?(s(),u("div",qa,[(s(!0),u(B,null,K(e.items,n=>(s(),u(B,{key:n.text},["link"in n?(s(),y(Ve,{key:0,item:n},null,8,["item"])):(s(),y(Ga,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Wa=$(Ra,[["__scopeId","data-v-b6ca2d55"]]),Ka=o=>(j("data-v-5c7784f0"),o=o(),q(),o),Ya=["aria-expanded","aria-label"],Za={key:0,class:"text"},Xa=["innerHTML"],Ja=Ka(()=>v("span",{class:"vpi-chevron-down text-icon"},null,-1)),Qa={key:1,class:"vpi-more-horizontal icon"},xa={class:"menu"},es=_({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=A(!1),t=A();Aa({el:t,onBlur:n});function n(){e.value=!1}return(a,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=l=>e.value=!0),onMouseleave:r[2]||(r[2]=l=>e.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":a.label,onClick:r[0]||(r[0]=l=>e.value=!e.value)},[a.button||a.icon?(s(),u("span",Za,[a.icon?(s(),u("span",{key:0,class:H([a.icon,"option-icon"])},null,2)):h("",!0),a.button?(s(),u("span",{key:1,innerHTML:a.button},null,8,Xa)):h("",!0),Ja])):(s(),u("span",Qa))],8,Ya),v("div",xa,[k(Wa,{items:a.items},{default:p(()=>[c(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Re=$(es,[["__scopeId","data-v-5c7784f0"]]),ts=["href","aria-label","innerHTML"],os=_({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=P(()=>typeof e.icon=="object"?e.icon.svg:``);return(n,a)=>(s(),u("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,ts))}}),ns=$(os,[["__scopeId","data-v-0b9403eb"]]),as={class:"VPSocialLinks"},ss=_({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(s(),u("div",as,[(s(!0),u(B,null,K(e.links,({link:n,icon:a,ariaLabel:r})=>(s(),y(ns,{key:n,icon:a,link:n,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),We=$(ss,[["__scopeId","data-v-e3ff33b4"]]),rs={key:0,class:"group translations"},is={class:"trans-title"},ls={key:1,class:"group"},cs={class:"item appearance"},us={class:"label"},ds={class:"appearance-action"},ms={key:2,class:"group"},vs={class:"item social-links"},ps=_({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=w(),{localeLinks:n,currentLang:a}=ve({correspondingLink:!0}),r=P(()=>n.value.length&&a.value.label||e.value.appearance||t.value.socialLinks);return(l,m)=>r.value?(s(),y(Re,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(n).length&&i(a).label?(s(),u("div",rs,[v("p",is,z(i(a).label),1),(s(!0),u(B,null,K(i(n),d=>(s(),y(Ve,{key:d.link,item:d},null,8,["item"]))),128))])):h("",!0),i(e).appearance&&i(e).appearance!=="force-dark"?(s(),u("div",ls,[v("div",cs,[v("p",us,z(i(t).darkModeSwitchLabel||"Appearance"),1),v("div",ds,[k(je)])])])):h("",!0),i(t).socialLinks?(s(),u("div",ms,[v("div",vs,[k(We,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),fs=$(ps,[["__scopeId","data-v-7aa10c87"]]),hs=o=>(j("data-v-e985d409"),o=o(),q(),o),_s=["aria-expanded"],gs=hs(()=>v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)),bs=[gs],ks=_({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(s(),u("button",{type:"button",class:H(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},bs,10,_s))}}),$s=$(ks,[["__scopeId","data-v-e985d409"]]),ys=["innerHTML"],Ls=_({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=w();return(t,n)=>(s(),y(Q,{class:H({VPNavBarMenuLink:!0,active:i(re)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:p(()=>[v("span",{innerHTML:t.item.text},null,8,ys)]),_:1},8,["class","href","noIcon","target","rel"]))}}),Ps=$(Ls,[["__scopeId","data-v-f8eda10f"]]),Ss=_({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=w(),n=r=>"link"in r?re(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),a=P(()=>n(e.item));return(r,l)=>(s(),y(Re,{class:H({VPNavBarMenuGroup:!0,active:i(re)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||a.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Vs=o=>(j("data-v-a160c3e1"),o=o(),q(),o),ws={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ts=Vs(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Is=_({__name:"VPNavBarMenu",setup(o){const{theme:e}=w();return(t,n)=>i(e).nav?(s(),u("nav",ws,[Ts,(s(!0),u(B,null,K(i(e).nav,a=>(s(),u(B,{key:a.text},["link"in a?(s(),y(Ps,{key:0,item:a},null,8,["item"])):(s(),y(Ss,{key:1,item:a},null,8,["item"]))],64))),128))])):h("",!0)}}),Es=$(Is,[["__scopeId","data-v-a160c3e1"]]);function Ns(o){const{localeIndex:e,theme:t}=w();function n(a){var E,F,C;const r=a.split("."),l=(E=t.value.search)==null?void 0:E.options,m=l&&typeof l=="object",d=m&&((C=(F=l.locales)==null?void 0:F[e.value])==null?void 0:C.translations)||null,b=m&&l.translations||null;let L=d,g=b,V=o;const N=r.pop();for(const Z of r){let X=null;const D=V==null?void 0:V[Z];D&&(X=V=D);const ne=g==null?void 0:g[Z];ne&&(X=g=ne);const J=L==null?void 0:L[Z];J&&(X=L=J),D||(V=X),ne||(g=X),J||(L=X)}return(L==null?void 0:L[N])??(g==null?void 0:g[N])??(V==null?void 0:V[N])??""}return n}const Cs=["aria-label"],zs={class:"DocSearch-Button-Container"},As=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),Ms={class:"DocSearch-Button-Placeholder"},Hs=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ze=_({__name:"VPNavBarSearchButton",setup(o){const t=Ns({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(n,a)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[v("span",zs,[As,v("span",Ms,z(i(t)("button.buttonText")),1)]),Hs],8,Cs))}}),Bs={class:"VPNavBarSearch"},Os={id:"local-search"},Fs={key:1,id:"docsearch"},Ds=_({__name:"VPNavBarSearch",setup(o){const e=Ot(()=>rt(()=>import("./VPLocalSearchBox.C8j-OOtD.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:n}=w(),a=A(!1),r=A(!1);te(()=>{});function l(){a.value||(a.value=!0,setTimeout(m,16))}function m(){const g=new Event("keydown");g.key="k",g.metaKey=!0,window.dispatchEvent(g),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||m()},16)}function d(g){const V=g.target,N=V.tagName;return V.isContentEditable||N==="INPUT"||N==="SELECT"||N==="TEXTAREA"}const b=A(!1);ze("k",g=>{(g.ctrlKey||g.metaKey)&&(g.preventDefault(),b.value=!0)}),ze("/",g=>{d(g)||(g.preventDefault(),b.value=!0)});const L="local";return(g,V)=>{var N;return s(),u("div",Bs,[i(L)==="local"?(s(),u(B,{key:0},[b.value?(s(),y(i(e),{key:0,onClose:V[0]||(V[0]=E=>b.value=!1)})):h("",!0),v("div",Os,[k(Ze,{onClick:V[1]||(V[1]=E=>b.value=!0)})])],64)):i(L)==="algolia"?(s(),u(B,{key:1},[a.value?(s(),y(i(t),{key:0,algolia:((N=i(n).search)==null?void 0:N.options)??i(n).algolia,onVnodeBeforeMount:V[2]||(V[2]=E=>r.value=!0)},null,8,["algolia"])):h("",!0),r.value?h("",!0):(s(),u("div",Fs,[k(Ze,{onClick:l})]))],64)):h("",!0)])}}}),Us=_({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=w();return(t,n)=>i(e).socialLinks?(s(),y(We,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),Gs=$(Us,[["__scopeId","data-v-c9c77adc"]]),js=["href","rel","target"],qs={key:1},Rs={key:2},Ws=_({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=w(),{hasSidebar:n}=oe(),{currentLang:a}=ve(),r=P(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),l=P(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),m=P(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,b)=>(s(),u("div",{class:H(["VPNavBarTitle",{"has-sidebar":i(n)}])},[v("a",{class:"title",href:r.value??i(Ue)(i(a).link),rel:l.value,target:m.value},[c(d.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(s(),y(ke,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):h("",!0),i(t).siteTitle?(s(),u("span",qs,z(i(t).siteTitle),1)):i(t).siteTitle===void 0?(s(),u("span",Rs,z(i(e).title),1)):h("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,js)],2))}}),Ks=$(Ws,[["__scopeId","data-v-13f93eac"]]),Ys={class:"items"},Zs={class:"title"},Xs=_({__name:"VPNavBarTranslations",setup(o){const{theme:e}=w(),{localeLinks:t,currentLang:n}=ve({correspondingLink:!0});return(a,r)=>i(t).length&&i(n).label?(s(),y(Re,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(e).langMenuLabel||"Change language"},{default:p(()=>[v("div",Ys,[v("p",Zs,z(i(n).label),1),(s(!0),u(B,null,K(i(t),l=>(s(),y(Ve,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Js=$(Xs,[["__scopeId","data-v-976f6f40"]]),Qs=o=>(j("data-v-03344f85"),o=o(),q(),o),xs={class:"wrapper"},er={class:"container"},tr={class:"title"},or={class:"content"},nr={class:"content-body"},ar=Qs(()=>v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1)),sr=_({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const{y:e}=st(),{hasSidebar:t}=oe(),{frontmatter:n}=w(),a=A({});return tt(()=>{a.value={"has-sidebar":t.value,home:n.value.layout==="home",top:e.value===0}}),(r,l)=>(s(),u("div",{class:H(["VPNavBar",a.value])},[v("div",xs,[v("div",er,[v("div",tr,[k(Ks,null,{"nav-bar-title-before":p(()=>[c(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",or,[v("div",nr,[c(r.$slots,"nav-bar-content-before",{},void 0,!0),k(Ds,{class:"search"}),k(Es,{class:"menu"}),k(Js,{class:"translations"}),k(za,{class:"appearance"}),k(Gs,{class:"social-links"}),k(fs,{class:"extra"}),c(r.$slots,"nav-bar-content-after",{},void 0,!0),k($s,{class:"hamburger",active:r.isScreenOpen,onClick:l[0]||(l[0]=m=>r.$emit("toggle-screen"))},null,8,["active"])])])])]),ar],2))}}),rr=$(sr,[["__scopeId","data-v-03344f85"]]),ir={key:0,class:"VPNavScreenAppearance"},lr={class:"text"},cr=_({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=w();return(n,a)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),u("div",ir,[v("p",lr,z(i(t).darkModeSwitchLabel||"Appearance"),1),k(je)])):h("",!0)}}),ur=$(cr,[["__scopeId","data-v-1c473a56"]]),dr=_({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=Pe("close-screen");return(t,n)=>(s(),y(Q,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),mr=$(dr,[["__scopeId","data-v-41ce1968"]]),vr=_({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=Pe("close-screen");return(t,n)=>(s(),y(Q,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[ee(z(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),_t=$(vr,[["__scopeId","data-v-fa0ae97a"]]),pr={class:"VPNavScreenMenuGroupSection"},fr={key:0,class:"title"},hr=_({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(s(),u("div",pr,[e.text?(s(),u("p",fr,z(e.text),1)):h("",!0),(s(!0),u(B,null,K(e.items,n=>(s(),y(_t,{key:n.text,item:n},null,8,["item"]))),128))]))}}),_r=$(hr,[["__scopeId","data-v-6168904f"]]),gr=o=>(j("data-v-0c1ce2b1"),o=o(),q(),o),br=["aria-controls","aria-expanded"],kr=["innerHTML"],$r=gr(()=>v("span",{class:"vpi-plus button-icon"},null,-1)),yr=["id"],Lr={key:1,class:"group"},Pr=_({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=A(!1),n=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function a(){t.value=!t.value}return(r,l)=>(s(),u("div",{class:H(["VPNavScreenMenuGroup",{open:t.value}])},[v("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:a},[v("span",{class:"button-text",innerHTML:r.text},null,8,kr),$r],8,br),v("div",{id:n.value,class:"items"},[(s(!0),u(B,null,K(r.items,m=>(s(),u(B,{key:m.text},["link"in m?(s(),u("div",{key:m.text,class:"item"},[k(_t,{item:m},null,8,["item"])])):(s(),u("div",Lr,[k(_r,{text:m.text,items:m.items},null,8,["text","items"])]))],64))),128))],8,yr)],2))}}),Sr=$(Pr,[["__scopeId","data-v-0c1ce2b1"]]),Vr={key:0,class:"VPNavScreenMenu"},wr=_({__name:"VPNavScreenMenu",setup(o){const{theme:e}=w();return(t,n)=>i(e).nav?(s(),u("nav",Vr,[(s(!0),u(B,null,K(i(e).nav,a=>(s(),u(B,{key:a.text},["link"in a?(s(),y(mr,{key:0,item:a},null,8,["item"])):(s(),y(Sr,{key:1,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Tr=_({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=w();return(t,n)=>i(e).socialLinks?(s(),y(We,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),gt=o=>(j("data-v-502ed004"),o=o(),q(),o),Ir=gt(()=>v("span",{class:"vpi-languages icon lang"},null,-1)),Er=gt(()=>v("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Nr={class:"list"},Cr=_({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=ve({correspondingLink:!0}),n=A(!1);function a(){n.value=!n.value}return(r,l)=>i(e).length&&i(t).label?(s(),u("div",{key:0,class:H(["VPNavScreenTranslations",{open:n.value}])},[v("button",{class:"title",onClick:a},[Ir,ee(" "+z(i(t).label)+" ",1),Er]),v("ul",Nr,[(s(!0),u(B,null,K(i(e),m=>(s(),u("li",{key:m.link,class:"item"},[k(Q,{class:"link",href:m.link},{default:p(()=>[ee(z(m.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),zr=$(Cr,[["__scopeId","data-v-502ed004"]]),Ar={class:"container"},Mr=_({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=A(null),t=it(Se?document.body:null);return(n,a)=>(s(),y(Oe,{name:"fade",onEnter:a[0]||(a[0]=r=>t.value=!0),onAfterLeave:a[1]||(a[1]=r=>t.value=!1)},{default:p(()=>[n.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[v("div",Ar,[c(n.$slots,"nav-screen-content-before",{},void 0,!0),k(wr,{class:"menu"}),k(zr,{class:"translations"}),k(ur,{class:"appearance"}),k(Tr,{class:"social-links"}),c(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),Hr=$(Mr,[["__scopeId","data-v-ccef021a"]]),Br={key:0,class:"VPNav"},Or=_({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=$a(),{frontmatter:a}=w(),r=P(()=>a.value.navbar!==!1);return lt("close-screen",t),ye(()=>{Se&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,m)=>r.value?(s(),u("header",Br,[k(rr,{"is-screen-open":i(e),onToggleScreen:i(n)},{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(Hr,{open:i(e)},{"nav-screen-content-before":p(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Fr=$(Or,[["__scopeId","data-v-60c4bcb3"]]),bt=o=>(j("data-v-6820daf2"),o=o(),q(),o),Dr=["role","tabindex"],Ur=bt(()=>v("div",{class:"indicator"},null,-1)),Gr=bt(()=>v("span",{class:"vpi-chevron-right caret-icon"},null,-1)),jr=[Gr],qr={key:1,class:"items"},Rr=_({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:n,isLink:a,isActiveLink:r,hasActiveLink:l,hasChildren:m,toggle:d}=uo(P(()=>e.item)),b=P(()=>m.value?"section":"div"),L=P(()=>a.value?"a":"div"),g=P(()=>m.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),V=P(()=>a.value?void 0:"button"),N=P(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":a.value},{"is-active":r.value},{"has-active":l.value}]);function E(C){"key"in C&&C.key!=="Enter"||!e.item.link&&d()}function F(){e.item.link&&d()}return(C,Z)=>{const X=ie("VPSidebarItem",!0);return s(),y(ue(b.value),{class:H(["VPSidebarItem",N.value])},{default:p(()=>[C.item.text?(s(),u("div",_e({key:0,class:"item",role:V.value},Dt(C.item.items?{click:E,keydown:E}:{},!0),{tabindex:C.item.items&&0}),[Ur,C.item.link?(s(),y(Q,{key:0,tag:L.value,class:"link",href:C.item.link,rel:C.item.rel,target:C.item.target},{default:p(()=>[(s(),y(ue(g.value),{class:"text",innerHTML:C.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),y(ue(g.value),{key:1,class:"text",innerHTML:C.item.text},null,8,["innerHTML"])),C.item.collapsed!=null&&C.item.items&&C.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:F,onKeydown:Ft(F,["enter"]),tabindex:"0"},jr,32)):h("",!0)],16,Dr)):h("",!0),C.item.items&&C.item.items.length?(s(),u("div",qr,[C.depth<5?(s(!0),u(B,{key:0},K(C.item.items,D=>(s(),y(X,{key:D.text,item:D,depth:C.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Wr=$(Rr,[["__scopeId","data-v-6820daf2"]]),kt=o=>(j("data-v-8e6b745e"),o=o(),q(),o),Kr=kt(()=>v("div",{class:"curtain"},null,-1)),Yr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Zr=kt(()=>v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Xr=_({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=oe(),n=o,a=A(null),r=it(Se?document.body:null);return x([n,a],()=>{var l;n.open?(r.value=!0,(l=a.value)==null||l.focus()):r.value=!1},{immediate:!0,flush:"post"}),(l,m)=>i(t)?(s(),u("aside",{key:0,class:H(["VPSidebar",{open:l.open}]),ref_key:"navEl",ref:a,onClick:m[0]||(m[0]=Ut(()=>{},["stop"]))},[Kr,v("nav",Yr,[Zr,c(l.$slots,"sidebar-nav-before",{},void 0,!0),(s(!0),u(B,null,K(i(e),d=>(s(),u("div",{key:d.text,class:"group"},[k(Wr,{item:d,depth:0},null,8,["item"])]))),128)),c(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),Jr=$(Xr,[["__scopeId","data-v-8e6b745e"]]),Qr=_({__name:"VPSkipLink",setup(o){const e=me(),t=A();x(()=>e.path,()=>t.value.focus());function n({target:a}){const r=document.getElementById(decodeURIComponent(a.hash).slice(1));if(r){const l=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",l)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",l),r.focus(),window.scrollTo(0,0)}}return(a,r)=>(s(),u(B,null,[v("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}}),xr=$(Qr,[["__scopeId","data-v-8934bb3d"]]),ei=_({__name:"Layout",setup(o){const{isOpen:e,open:t,close:n}=oe(),a=me();x(()=>a.path,n),co(e,n);const{frontmatter:r}=w(),l=Gt(),m=P(()=>!!l["home-hero-image"]);return lt("hero-image-slot-exists",m),(d,b)=>{const L=ie("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:H(["Layout",i(r).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),k(xr),k(Yt,{class:"backdrop",show:i(e),onClick:i(n)},null,8,["show","onClick"]),k(Fr,null,{"nav-bar-title-before":p(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ka,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),k(Jr,{open:i(e)},{"sidebar-nav-before":p(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(ea,null,{"page-top":p(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(sa),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),y(L,{key:1}))}}}),ti=$(ei,[["__scopeId","data-v-839be2d9"]]),Xe={Layout:ti,enhanceApp:({app:o})=>{o.component("Badge",ct)}},oi=["id","host","repo","repoid","category","categoryid","mapping","term","strict","reactionsenabled","emitmetadata","inputposition","theme","lang","loading"],ni=_({__name:"Giscus",props:{id:{},host:{},repo:{},repoId:{},category:{},categoryId:{},mapping:{},term:{},theme:{},strict:{},reactionsEnabled:{},emitMetadata:{},inputPosition:{},lang:{},loading:{}},setup(o){const e=A(!1);return te(()=>{e.value=!0,rt(()=>import("./giscus-aTimukGI.CKTvSCx2.js"),[])}),(t,n)=>e.value?(s(),u("giscus-widget",{key:0,id:t.id,host:t.host,repo:t.repo,repoid:t.repoId,category:t.category,categoryid:t.categoryId,mapping:t.mapping,term:t.term,strict:t.strict,reactionsenabled:t.reactionsEnabled,emitmetadata:t.emitMetadata,inputposition:t.inputPosition,theme:t.theme,lang:t.lang,loading:t.loading},null,8,oi)):h("",!0)}}),Je=(o,e,t=!0)=>{var b;const n={id:"comment",host:"https://giscus.app",category:"General",mapping:"pathname",term:"Welcome to giscus!",reactionsEnabled:"1",inputPosition:"top",lang:"zh-CN",loading:"lazy",repo:"xxx/xxx",repoId:"",homePageShowComment:!1};if(o.locales){const g=document.querySelector("html").getAttribute("lang");g&&o.locales[g]&&(o.lang=o.locales[g])}const a=o.lightTheme||"light",r=o.darkTheme||"transparent_dark";let l=document.getElementById("giscus");if(l&&l.parentNode.removeChild(l),(e==null?void 0:e.value.comment)!==void 0){if(!(e!=null&&e.value.comment))return}else if(!t)return;if(!o.homePageShowComment&&(!location.pathname||location.pathname==="/"))return;const m=((b=document.querySelector("html"))==null?void 0:b.className.indexOf("dark"))!==-1,d=document.getElementsByClassName("content-container")[0];if(d){const L=document.createElement("div");L.setAttribute("id","giscus"),L.style.height="auto",L.style.marginTop="40px",L.style.borderTop="1px solid var(--vp-c-divider)",L.style.paddingTop="20px",d.append(L),jt({render:()=>Ae(ni,{...n,theme:m?r:a,...o})}).mount("#giscus")}},ai=o=>{const e=document.querySelector("html"),t=o.lightTheme||"light",n=o.darkTheme||"transparent_dark";new MutationObserver(r=>{r.forEach(l=>{if(l.type=="attributes"){let m=document.getElementById("comment");m==null||m.setAttribute("theme",e.className.indexOf("dark")!==-1?n:t)}})}).observe(e,{attributeFilter:["class"]})},si=(o,e,t=!0)=>{te(()=>{Je(o,e.frontmatter,t),ai(o)}),x(()=>e.route.path,()=>De(()=>{Je(o,e.frontmatter,t)}))};/*! medium-zoom 1.1.0 | MIT License | https://github.com/francoischalifour/medium-zoom */var se=Object.assign||function(o){for(var e=1;e1&&arguments[1]!==void 0?arguments[1]:{},n=window.Promise||function(S){function T(){}S(T,T)},a=function(S){var T=S.target;if(T===pe){E();return}D.indexOf(T)!==-1&&F({target:T})},r=function(){if(!(J||!f.original)){var S=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(Ke-S)>M.scrollOffset&&setTimeout(E,150)}},l=function(S){var T=S.key||S.keyCode;(T==="Escape"||T==="Esc"||T===27)&&E()},m=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},T=S;if(S.background&&(pe.style.background=S.background),S.container&&S.container instanceof Object&&(T.container=se({},M.container,S.container)),S.template){var O=be(S.template)?S.template:document.querySelector(S.template);T.template=O}return M=se({},M,T),D.forEach(function(U){U.dispatchEvent(ce("medium-zoom:update",{detail:{zoom:G}}))}),G},d=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return o(se({},M,S))},b=function(){for(var S=arguments.length,T=Array(S),O=0;O0?T.reduce(function(I,W){return[].concat(I,xe(W))},[]):D;return U.forEach(function(I){I.classList.remove("medium-zoom-image"),I.dispatchEvent(ce("medium-zoom:detach",{detail:{zoom:G}}))}),D=D.filter(function(I){return U.indexOf(I)===-1}),G},g=function(S,T){var O=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return D.forEach(function(U){U.addEventListener("medium-zoom:"+S,T,O)}),ne.push({type:"medium-zoom:"+S,listener:T,options:O}),G},V=function(S,T){var O=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return D.forEach(function(U){U.removeEventListener("medium-zoom:"+S,T,O)}),ne=ne.filter(function(U){return!(U.type==="medium-zoom:"+S&&U.listener.toString()===T.toString())}),G},N=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},T=S.target,O=function(){var I={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},W=void 0,Y=void 0;if(M.container)if(M.container instanceof Object)I=se({},I,M.container),W=I.width-I.left-I.right-M.margin*2,Y=I.height-I.top-I.bottom-M.margin*2;else{var le=be(M.container)?M.container:document.querySelector(M.container),ae=le.getBoundingClientRect(),we=ae.width,$t=ae.height,yt=ae.left,Lt=ae.top;I=se({},I,{width:we,height:$t,left:yt,top:Lt})}W=W||I.width-M.margin*2,Y=Y||I.height-M.margin*2;var de=f.zoomedHd||f.original,Pt=Qe(de)?W:de.naturalWidth||W,St=Qe(de)?Y:de.naturalHeight||Y,fe=de.getBoundingClientRect(),Vt=fe.top,wt=fe.left,Te=fe.width,Ie=fe.height,Tt=Math.min(Math.max(Te,Pt),W)/Te,It=Math.min(Math.max(Ie,St),Y)/Ie,Ee=Math.min(Tt,It),Et=(-wt+(W-Te)/2+M.margin+I.left)/Ee,Nt=(-Vt+(Y-Ie)/2+M.margin+I.top)/Ee,Ye="scale("+Ee+") translate3d("+Et+"px, "+Nt+"px, 0)";f.zoomed.style.transform=Ye,f.zoomedHd&&(f.zoomedHd.style.transform=Ye)};return new n(function(U){if(T&&D.indexOf(T)===-1){U(G);return}var I=function we(){J=!1,f.zoomed.removeEventListener("transitionend",we),f.original.dispatchEvent(ce("medium-zoom:opened",{detail:{zoom:G}})),U(G)};if(f.zoomed){U(G);return}if(T)f.original=T;else if(D.length>0){var W=D;f.original=W[0]}else{U(G);return}if(f.original.dispatchEvent(ce("medium-zoom:open",{detail:{zoom:G}})),Ke=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,J=!0,f.zoomed=li(f.original),document.body.appendChild(pe),M.template){var Y=be(M.template)?M.template:document.querySelector(M.template);f.template=document.createElement("div"),f.template.appendChild(Y.content.cloneNode(!0)),document.body.appendChild(f.template)}if(f.original.parentElement&&f.original.parentElement.tagName==="PICTURE"&&f.original.currentSrc&&(f.zoomed.src=f.original.currentSrc),document.body.appendChild(f.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),f.original.classList.add("medium-zoom-image--hidden"),f.zoomed.classList.add("medium-zoom-image--opened"),f.zoomed.addEventListener("click",E),f.zoomed.addEventListener("transitionend",I),f.original.getAttribute("data-zoom-src")){f.zoomedHd=f.zoomed.cloneNode(),f.zoomedHd.removeAttribute("srcset"),f.zoomedHd.removeAttribute("sizes"),f.zoomedHd.removeAttribute("loading"),f.zoomedHd.src=f.zoomed.getAttribute("data-zoom-src"),f.zoomedHd.onerror=function(){clearInterval(le),console.warn("Unable to reach the zoom image target "+f.zoomedHd.src),f.zoomedHd=null,O()};var le=setInterval(function(){f.zoomedHd.complete&&(clearInterval(le),f.zoomedHd.classList.add("medium-zoom-image--opened"),f.zoomedHd.addEventListener("click",E),document.body.appendChild(f.zoomedHd),O())},10)}else if(f.original.hasAttribute("srcset")){f.zoomedHd=f.zoomed.cloneNode(),f.zoomedHd.removeAttribute("sizes"),f.zoomedHd.removeAttribute("loading");var ae=f.zoomedHd.addEventListener("load",function(){f.zoomedHd.removeEventListener("load",ae),f.zoomedHd.classList.add("medium-zoom-image--opened"),f.zoomedHd.addEventListener("click",E),document.body.appendChild(f.zoomedHd),O()})}else O()})},E=function(){return new n(function(S){if(J||!f.original){S(G);return}var T=function O(){f.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(f.zoomed),f.zoomedHd&&document.body.removeChild(f.zoomedHd),document.body.removeChild(pe),f.zoomed.classList.remove("medium-zoom-image--opened"),f.template&&document.body.removeChild(f.template),J=!1,f.zoomed.removeEventListener("transitionend",O),f.original.dispatchEvent(ce("medium-zoom:closed",{detail:{zoom:G}})),f.original=null,f.zoomed=null,f.zoomedHd=null,f.template=null,S(G)};J=!0,document.body.classList.remove("medium-zoom--opened"),f.zoomed.style.transform="",f.zoomedHd&&(f.zoomedHd.style.transform=""),f.template&&(f.template.style.transition="opacity 150ms",f.template.style.opacity=0),f.original.dispatchEvent(ce("medium-zoom:close",{detail:{zoom:G}})),f.zoomed.addEventListener("transitionend",T)})},F=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},T=S.target;return f.original?E():N({target:T})},C=function(){return M},Z=function(){return D},X=function(){return f.original},D=[],ne=[],J=!1,Ke=0,M=t,f={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(e)==="[object Object]"?M=e:(e||typeof e=="string")&&b(e),M=se({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},M);var pe=ii(M.background);document.addEventListener("click",a),document.addEventListener("keyup",l),document.addEventListener("scroll",r),window.addEventListener("resize",E);var G={open:N,close:E,toggle:F,update:m,clone:d,attach:b,detach:L,on:g,off:V,getOptions:C,getImages:Z,getZoomedImage:X};return G};function ui(o,e){e===void 0&&(e={});var t=e.insertAt;if(!(typeof document>"u")){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",t==="top"&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=o:a.appendChild(document.createTextNode(o))}}var di=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";ui(di);const mi={},vi=qt('
作者其他作品
',2),pi=[vi];function fi(o,e){return s(),u("div",null,pi)}const hi=$(mi,[["render",fi],["__scopeId","data-v-13b2f7c0"]]),_i={key:0},gi=["src"],bi=_({__name:"ZoomImg",props:{src:String},setup(o){return(e,t)=>o.src?(s(),u("p",_i,[v("img",{"data-zoomable":"",src:i($e)(o.src),loading:"lazy"},null,8,gi)])):h("",!0)}}),$i={...Xe,Layout(){return Ae(Xe.Layout,null,{"aside-bottom":()=>Ae(hi)})},setup(){const{frontmatter:o}=Rt(et()),e=me(),t=()=>{ci("[data-zoomable]",{background:"var(--vp-c-bg)"})};te(()=>t()),x(()=>e.path,()=>De(()=>t())),si({repo:"fantastic-mobile/fantastic-mobile.github.io",repoId:"R_kgDOL53UCw",category:"Announcements",categoryId:"DIC_kwDOL53UC84CfRvQ",mapping:"pathname",inputPosition:"top",lang:"zh-CN",lightTheme:"light",darkTheme:"transparent_dark",loading:!0},{frontmatter:o,route:e},!0)},enhanceApp({app:o}){o.component("Badge",ct),o.component("ZoomImg",bi)}};export{$i as R,Ns as c,w as u}; diff --git a/assets/components_auth-all.md.DA7uNEaz.js b/assets/components_auth-all.md.DA7uNEaz.js new file mode 100644 index 0000000..5561e6e --- /dev/null +++ b/assets/components_auth-all.md.DA7uNEaz.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a5 as l}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"AuthAll 鉴权","description":"","frontmatter":{},"headers":[],"relativePath":"components/auth-all.md","filePath":"components/auth-all.md"}'),s={name:"components/auth-all.md"},o=l('

AuthAll 鉴权

Props

参数说明类型可选值默认值
value权限数据,如果传入为 array 时,全部匹配则鉴权通过,并显示 slot 内容array / string--

Slots

name说明
-需要鉴权的 HTML 内容
',5),n=[o];function r(h,d,i,c,_,f){return a(),e("div",null,n)}const p=t(s,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/components_auth-all.md.DA7uNEaz.lean.js b/assets/components_auth-all.md.DA7uNEaz.lean.js new file mode 100644 index 0000000..8e76a19 --- /dev/null +++ b/assets/components_auth-all.md.DA7uNEaz.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a5 as l}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"AuthAll 鉴权","description":"","frontmatter":{},"headers":[],"relativePath":"components/auth-all.md","filePath":"components/auth-all.md"}'),s={name:"components/auth-all.md"},o=l("",5),n=[o];function r(h,d,i,c,_,f){return a(),e("div",null,n)}const p=t(s,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/components_auth.md.C2hBKG78.js b/assets/components_auth.md.C2hBKG78.js new file mode 100644 index 0000000..2bf5827 --- /dev/null +++ b/assets/components_auth.md.C2hBKG78.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a5 as l}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"Auth 鉴权","description":"","frontmatter":{},"headers":[],"relativePath":"components/auth.md","filePath":"components/auth.md"}'),s={name:"components/auth.md"},o=l('

Auth 鉴权

Props

参数说明类型可选值默认值
value权限数据,如果传入为 array 时,匹配到其中一项则鉴权通过,并显示 slot 内容array / string--

Slots

name说明
-需要鉴权的 HTML 内容
',5),n=[o];function r(h,d,i,c,_,f){return a(),e("div",null,n)}const p=t(s,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/components_auth.md.C2hBKG78.lean.js b/assets/components_auth.md.C2hBKG78.lean.js new file mode 100644 index 0000000..ca300db --- /dev/null +++ b/assets/components_auth.md.C2hBKG78.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a5 as l}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"Auth 鉴权","description":"","frontmatter":{},"headers":[],"relativePath":"components/auth.md","filePath":"components/auth.md"}'),s={name:"components/auth.md"},o=l("",5),n=[o];function r(h,d,i,c,_,f){return a(),e("div",null,n)}const p=t(s,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/components_index.md.C5g7wdUl.js b/assets/components_index.md.C5g7wdUl.js new file mode 100644 index 0000000..ad0f6dc --- /dev/null +++ b/assets/components_index.md.C5g7wdUl.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as o}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"components/index.md","filePath":"components/index.md"}'),r={name:"components/index.md"},n=o('

介绍

框架提供一系列的组件方便快速开发。

基础组件

基础组件由 Vant 提供。

替换组件库

如果你不喜欢 Vant ,或者你想要将老项目迁移到 Fantastic-mobile 上,但老项目里使用的组件库并不是 Vant ,框架也提供了组件库替换移方案:

如果你想使用的组件库不在上述方案中,可以通过参考任何一份方案,理解替换的整理思路,并自行替换,别担心会很复杂,我们已经将大部分工作做好了。

内建组件

为了实现 UI 组件库可替换,框架内建了一些组件,这些组件仅服务于框架自身,所以不建议在业务页面内使用。但如果你需要对框架进行二次开发,并保证视觉上的一致性,这时候你就会需要用到它们。

内建组件存放在 /src/ui-kit/ 目录下,并配置了使用时自动引入。

你也可以点击 基础版专业版 查看内建组件示例页面。

扩展组件

扩展组件为框架封装的组件,组件源码完全开放,如果觉得用着不顺手,可以到 /src/components/ 目录下找到对应组件自行修改。

',11),i=[n];function l(c,s,p,h,d,_){return t(),a("div",null,i)}const b=e(r,[["render",l]]);export{u as __pageData,b as default}; diff --git a/assets/components_index.md.C5g7wdUl.lean.js b/assets/components_index.md.C5g7wdUl.lean.js new file mode 100644 index 0000000..b165b7f --- /dev/null +++ b/assets/components_index.md.C5g7wdUl.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as o}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"components/index.md","filePath":"components/index.md"}'),r={name:"components/index.md"},n=o("",11),i=[n];function l(c,s,p,h,d,_){return t(),a("div",null,i)}const b=e(r,[["render",l]]);export{u as __pageData,b as default}; diff --git a/assets/components_page-main.md.6bzHEmEC.js b/assets/components_page-main.md.6bzHEmEC.js new file mode 100644 index 0000000..6523570 --- /dev/null +++ b/assets/components_page-main.md.6bzHEmEC.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a5 as a}from"./chunks/framework.D-J1Cv1C.js";const y=JSON.parse('{"title":"PageMain 内容块","description":"","frontmatter":{},"headers":[],"relativePath":"components/page-main.md","filePath":"components/page-main.md"}'),n={name:"components/page-main.md"},s=a('

PageMain 内容块

Props

参数说明类型可选值默认值
title标题string--
collaspe是否折叠boolean-false
height展示高度,当 collaspe 为 true 时生效string--

Slots

name说明
-内容区的 HTML 内容
title标题区的 HTML 内容
',5),d=[s];function i(o,r,h,g,f,x){return l(),e("div",null,d)}const p=t(n,[["render",i]]);export{y as __pageData,p as default}; diff --git a/assets/components_page-main.md.6bzHEmEC.lean.js b/assets/components_page-main.md.6bzHEmEC.lean.js new file mode 100644 index 0000000..274a2b0 --- /dev/null +++ b/assets/components_page-main.md.6bzHEmEC.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a5 as a}from"./chunks/framework.D-J1Cv1C.js";const y=JSON.parse('{"title":"PageMain 内容块","description":"","frontmatter":{},"headers":[],"relativePath":"components/page-main.md","filePath":"components/page-main.md"}'),n={name:"components/page-main.md"},s=a("",5),d=[s];function i(o,r,h,g,f,x){return l(),e("div",null,d)}const p=t(n,[["render",i]]);export{y as __pageData,p as default}; diff --git a/assets/components_sparkline.md.goZs4Z45.js b/assets/components_sparkline.md.goZs4Z45.js new file mode 100644 index 0000000..a057916 --- /dev/null +++ b/assets/components_sparkline.md.goZs4Z45.js @@ -0,0 +1 @@ +import{_ as d,D as a,c as s,j as e,a as t,I as n,a5 as i,o as r}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"Sparkline 迷你图","description":"","frontmatter":{},"headers":[],"relativePath":"components/sparkline.md","filePath":"components/sparkline.md"}'),o={name:"components/sparkline.md"},f={id:"sparkline-迷你图",tabindex:"-1"},x=e("a",{class:"header-anchor",href:"#sparkline-迷你图","aria-label":'Permalink to "Sparkline 迷你图 "'},"​",-1),g=i('

Props

参数说明类型可选值默认值
value迷你图数据,支持一维数组和对象数组,当为对象数组时,对象内参数为 {tooltip: 'xxx', value: 1}array--
width展示宽度number-100
height展示高度number-30
stroke-width折线宽度number-3
stroke-color折线颜色string-#dc2b33
fill-color填充颜色string--
cursor-color鼠标 hover 时辅助线颜色string-#dc2b33
spot-color鼠标 hover 时辅助点颜色string-#dc2b33
tooltip鼠标 hover 时是否显示文字提示boolean-false
',2);function y(c,p,h,_,m,b){const l=a("Badge");return r(),s("div",null,[e("h1",f,[t("Sparkline 迷你图 "),n(l,{type:"pro",text:"专业版"}),t(),x]),g])}const v=d(o,[["render",y]]);export{u as __pageData,v as default}; diff --git a/assets/components_sparkline.md.goZs4Z45.lean.js b/assets/components_sparkline.md.goZs4Z45.lean.js new file mode 100644 index 0000000..96c2622 --- /dev/null +++ b/assets/components_sparkline.md.goZs4Z45.lean.js @@ -0,0 +1 @@ +import{_ as d,D as a,c as s,j as e,a as t,I as n,a5 as i,o as r}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"Sparkline 迷你图","description":"","frontmatter":{},"headers":[],"relativePath":"components/sparkline.md","filePath":"components/sparkline.md"}'),o={name:"components/sparkline.md"},f={id:"sparkline-迷你图",tabindex:"-1"},x=e("a",{class:"header-anchor",href:"#sparkline-迷你图","aria-label":'Permalink to "Sparkline 迷你图 "'},"​",-1),g=i("",2);function y(c,p,h,_,m,b){const l=a("Badge");return r(),s("div",null,[e("h1",f,[t("Sparkline 迷你图 "),n(l,{type:"pro",text:"专业版"}),t(),x]),g])}const v=d(o,[["render",y]]);export{u as __pageData,v as default}; diff --git a/assets/components_svg-icon.md.DU7jEag7.js b/assets/components_svg-icon.md.DU7jEag7.js new file mode 100644 index 0000000..559f5c1 --- /dev/null +++ b/assets/components_svg-icon.md.DU7jEag7.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a5 as a}from"./chunks/framework.D-J1Cv1C.js";const h=JSON.parse('{"title":"SvgIcon SVG图标","description":"","frontmatter":{},"headers":[],"relativePath":"components/svg-icon.md","filePath":"components/svg-icon.md"}'),n={name:"components/svg-icon.md"},s=a('

SvgIcon SVG图标

Props

参数说明类型可选值默认值
namesvg 文件名 / Iconify 图标名,详细可阅读《图标string--
flip翻转方式,支持水平、垂直以及同时翻转stringhorizontal / vertical / both-
rotate旋转角度number0 - 3600
color颜色string
size尺寸string / number
',3),d=[s];function i(o,r,g,f,c,x){return l(),e("div",null,d)}const _=t(n,[["render",i]]);export{h as __pageData,_ as default}; diff --git a/assets/components_svg-icon.md.DU7jEag7.lean.js b/assets/components_svg-icon.md.DU7jEag7.lean.js new file mode 100644 index 0000000..41dcad5 --- /dev/null +++ b/assets/components_svg-icon.md.DU7jEag7.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a5 as a}from"./chunks/framework.D-J1Cv1C.js";const h=JSON.parse('{"title":"SvgIcon SVG图标","description":"","frontmatter":{},"headers":[],"relativePath":"components/svg-icon.md","filePath":"components/svg-icon.md"}'),n={name:"components/svg-icon.md"},s=a("",3),d=[s];function i(o,r,g,f,c,x){return l(),e("div",null,d)}const _=t(n,[["render",i]]);export{h as __pageData,_ as default}; diff --git a/assets/components_trend.md.DprOyENc.js b/assets/components_trend.md.DprOyENc.js new file mode 100644 index 0000000..b91b601 --- /dev/null +++ b/assets/components_trend.md.DprOyENc.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a5 as d}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"Trend 趋势标记","description":"","frontmatter":{},"headers":[],"relativePath":"components/trend.md","filePath":"components/trend.md"}'),a={name:"components/trend.md"},n=d('

Trend 趋势标记

Props

参数说明类型可选值默认值
value内容string--
type类型stringup / downup
prefix前缀string--
suffix后缀string--
reverse颜色反转boolean-false
',3),s=[n];function r(i,o,f,x,g,y){return l(),e("div",null,s)}const c=t(a,[["render",r]]);export{_ as __pageData,c as default}; diff --git a/assets/components_trend.md.DprOyENc.lean.js b/assets/components_trend.md.DprOyENc.lean.js new file mode 100644 index 0000000..4a6f2fe --- /dev/null +++ b/assets/components_trend.md.DprOyENc.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a5 as d}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"Trend 趋势标记","description":"","frontmatter":{},"headers":[],"relativePath":"components/trend.md","filePath":"components/trend.md"}'),a={name:"components/trend.md"},n=d("",3),s=[n];function r(i,o,f,x,g,y){return l(),e("div",null,s)}const c=t(a,[["render",r]]);export{_ as __pageData,c as default}; diff --git a/assets/guide_api.md.BmpN9bDB.js b/assets/guide_api.md.BmpN9bDB.js new file mode 100644 index 0000000..a4da065 --- /dev/null +++ b/assets/guide_api.md.BmpN9bDB.js @@ -0,0 +1,19 @@ +import{_ as n,D as h,c as l,j as i,a as s,I as e,a5 as a,o as p}from"./chunks/framework.D-J1Cv1C.js";const x=JSON.parse('{"title":"常用 API","description":"","frontmatter":{},"headers":[],"relativePath":"guide/api.md","filePath":"guide/api.md"}'),k={name:"guide/api.md"},d=a(`

常用 API

接口请求

详细可阅读《与服务端交互 - 接口请求》。

ts
import api from '@/api'
+
+api.get()
+api.post()

鉴权

详细可阅读《权限 - 鉴权函数》。

ts
const { auth, authAll } = useAuth()
+
+auth()
+authAll()

页面

刷新

ts
const { reload } = useMainPage()
+
+reload()
`,10),r={id:"设置自定义标题",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#设置自定义标题","aria-label":'Permalink to "设置自定义标题 "'},"​",-1),c=a(`
ts
const { setCustomTitle } = useMainPage()
+
+setCustomTitle(title)
`,1),E={id:"重置自定义标题",tabindex:"-1"},g=i("a",{class:"header-anchor",href:"#重置自定义标题","aria-label":'Permalink to "重置自定义标题 "'},"​",-1),y=a(`
ts
const { resetCustomTitle } = useMainPage()
+
+resetCustomTitle()

事件总线

基于 mitt 简单封装,使用方法请查阅官方文档。

ts
import eventBus from '@/utils/eventBus'
+
+eventBus.on()
+eventBus.emit()
+eventBus.off()
`,4),_={id:"日期",tabindex:"-1"},u=i("a",{class:"header-anchor",href:"#日期","aria-label":'Permalink to "日期 "'},"​",-1),F=a(`

基于 dayjs 简单封装,使用方法请查阅官方文档。

ts
import dayjs from '@/utils/dayjs'
+
+dayjs()
`,2);function b(C,m,v,B,A,T){const t=h("Badge");return p(),l("div",null,[d,i("h3",r,[s("设置自定义标题 "),e(t,{type:"pro",text:"专业版"}),s(),o]),c,i("h3",E,[s("重置自定义标题 "),e(t,{type:"pro",text:"专业版"}),s(),g]),y,i("h2",_,[s("日期 "),e(t,{type:"pro",text:"专业版"}),s(),u]),F])}const P=n(k,[["render",b]]);export{x as __pageData,P as default}; diff --git a/assets/guide_api.md.BmpN9bDB.lean.js b/assets/guide_api.md.BmpN9bDB.lean.js new file mode 100644 index 0000000..afa34b6 --- /dev/null +++ b/assets/guide_api.md.BmpN9bDB.lean.js @@ -0,0 +1 @@ +import{_ as n,D as h,c as l,j as i,a as s,I as e,a5 as a,o as p}from"./chunks/framework.D-J1Cv1C.js";const x=JSON.parse('{"title":"常用 API","description":"","frontmatter":{},"headers":[],"relativePath":"guide/api.md","filePath":"guide/api.md"}'),k={name:"guide/api.md"},d=a("",10),r={id:"设置自定义标题",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#设置自定义标题","aria-label":'Permalink to "设置自定义标题 "'},"​",-1),c=a("",1),E={id:"重置自定义标题",tabindex:"-1"},g=i("a",{class:"header-anchor",href:"#重置自定义标题","aria-label":'Permalink to "重置自定义标题 "'},"​",-1),y=a("",4),_={id:"日期",tabindex:"-1"},u=i("a",{class:"header-anchor",href:"#日期","aria-label":'Permalink to "日期 "'},"​",-1),F=a("",2);function b(C,m,v,B,A,T){const t=h("Badge");return p(),l("div",null,[d,i("h3",r,[s("设置自定义标题 "),e(t,{type:"pro",text:"专业版"}),s(),o]),c,i("h3",E,[s("重置自定义标题 "),e(t,{type:"pro",text:"专业版"}),s(),g]),y,i("h2",_,[s("日期 "),e(t,{type:"pro",text:"专业版"}),s(),u]),F])}const P=n(k,[["render",b]]);export{x as __pageData,P as default}; diff --git a/assets/guide_axios.md.eiRrRE32.js b/assets/guide_axios.md.eiRrRE32.js new file mode 100644 index 0000000..ef2e344 --- /dev/null +++ b/assets/guide_axios.md.eiRrRE32.js @@ -0,0 +1,98 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const o=JSON.parse('{"title":"与服务端交互","description":"","frontmatter":{},"headers":[],"relativePath":"guide/axios.md","filePath":"guide/axios.md"}'),h={name:"guide/axios.md"},p=n(`

与服务端交互

框架使用 Axios 做为异步请求工具,并进行了简单的封装。

接口请求

设置 baseURL

在根目录 .env.* 文件里的 VITE_APP_API_BASEURL 这个参数就是配置 axios 的 baseURL

例如项目的真实接口请求地址为:

  • http://api.test.com/news/list
  • http://api.test.com/news/create
  • http://api.test.com/shop/info

则可设置为 VITE_APP_API_BASEURL = http://api.test.com/

请求调用

常用的 GET 和 POST 请求可使用以下的方法:

ts
import api from '@/api'
+
+// GET 请求
+api.get('news/list', {
+  params: {
+    page: 1,
+    size: 10,
+  },
+}).then((res) => {
+  // 后续业务代码
+})
+
+// POST 请求
+api.post('news/create', {
+  title: '新闻标题',
+  content: '新闻内容',
+}).then((res) => {
+  // 后续业务代码
+})

拦截器

/src/api/index.ts 文件里实例化了 axios 对象,并对 requestresponse 设置了拦截器,拦截器的用处就是拦截每一次的请求和响应,然后做一些全局的处理。例如接口响应报错,可以在拦截器里用统一的报错提示来展示,方便业务开发。但因为每个公司提供的接口标准不同,所以该文件拦截器部分的代码,需要开发者根据实际情况去修改调整。

代码很简单,首先初始化 axios 对象,然后 axios.interceptors.request.use()axios.interceptors.response.use() 就分别是请求和响应的拦截代码了。

参考代码里只做了简单的拦截处理,例如请求的时候会自动带上 token ,响应的时候会根据错误信息判断是登录失效还是接口报错,并做相应动作。

模块管理

如果项目里的接口很多,推荐根据模块来统一管理接口,目录为 /src/api/modules/

跨域处理

生产环境的跨域需要服务端去解决,开发环境的跨域问题可在本地设置代理解决。如果本地开发环境请求接口提示跨域,可以设置 .env.development 文件里 VITE_OPEN_PROXY = true 开启代理。

ts
import api from '@/api'
+
+api.get('news/list') // http://localhost:9000/proxy/news/list
+api.post('news/add') // http://localhost:9000/proxy/news/add

开启代理后,原有请求都会被指向到本地 http://localhost:9000/proxy ,因为 /proxy 匹配到了 vite.config.ts 里代理部分的设置,所以实际是请求依旧是 VITE_APP_API_BASEURL 所设置的地址。

ts
server: {
+  // vite.config.ts 中 proxy 配置,该配置即用于代理 API 请求
+  proxy: {
+    '/proxy': {
+      target: loadEnv(mode, process.cwd()).VITE_APP_API_BASEURL,
+      changeOrigin: command === 'serve' && loadEnv(mode, process.cwd()).VITE_OPEN_PROXY == 'true',
+      rewrite: path => path.replace(/\\/proxy/, ''),
+    },
+  },
+},

多数据源

如果项目里需要从多个不同地址的数据源请求数据,你有两种方式可以实现。

如果只是几个接口需求从其它数据源请求,你可以使用覆盖 baseURL 的方式:

ts
import api from '@/api'
+
+api.get('/new/list', {
+  baseURL: 'http://baidu.com/', // 直接覆盖 baseURL
+})

这种方式的前提是,两个数据源的 requestresponse 规则要保持一致,因为只是覆盖 baseURL ,拦截器还是用的同一套规则。

所以如果两个数据源的请求和响应是完全不同的标准,你需要给第二个数据源单独实例化一个 axios 对象。首先在 .env.* 文件里配置第二个数据源的 baseURL

# 命名可随意,以 VITE_APP_ 开头即可
+VITE_APP_API_BASEURL_2 = 此处填写接口地址

然后把 /src/api/index.ts 文件复制一份,例如就叫 /src/api/index2.ts ,并且将代码中使用到 VITE_APP_API_BASEURL 也替换为 VITE_APP_API_BASEURL_2 ,这样你就可以在页面中通过引入不同的文件分别请求两个数据源了:

ts
import api from '@/api'
+import api2 from '@/api/index2'
+
+// 请求默认数据源
+api.get('/new/list')
+// 请求第 2 个数据源
+api2.get('/new/list')

需注意,如果第二个数据源也需要开启跨域处理的话,需要在 /src/api/index2.ts 里定一个新的 proxy 路径,例如 /proxy2/

ts
const api = axios.create({
+  baseURL: import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true' ? '/proxy2/' : import.meta.env.VITE_APP_API_BASEURL_2,
+  timeout: 10000,
+  responseType: 'json',
+})

同时在 vite.config.ts 里增加一段新的 proxy 配置:

ts
server: {
+  // vite.config.ts 中 proxy 配置,该配置即用于代理 API 请求
+  proxy: {
+    '/proxy': {
+      target: loadEnv(mode, process.cwd()).VITE_APP_API_BASEURL,
+      changeOrigin: command === 'serve' && loadEnv(mode, process.cwd()).VITE_OPEN_PROXY == 'true',
+      rewrite: path => path.replace(/\\/proxy/, ''),
+    },
+    '/proxy2': {
+      target: loadEnv(mode, process.cwd()).VITE_APP_API_BASEURL_2,
+      changeOrigin: command === 'serve' && loadEnv(mode, process.cwd()).VITE_OPEN_PROXY == 'true',
+      rewrite: path => path.replace(/\\/proxy2/, ''),
+    },
+  },
+},

Mock

Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。

TIP

框架使用 vite-plugin-fake-server 提供开发和生产模拟服务。

Mock 数据编写规则请阅读 Mockjs 官方文档。

开发环境 mock

mock 文件存放在 /src/mock/ 下,建议按照不同模块区分文件夹。文件新增或修改后会自动更新,不需要手动重启,可以在代码控制台查看日志信息。

以下为示例代码:

ts
import { defineFakeRoute } from 'vite-plugin-fake-server/client'
+import Mock from 'mockjs'
+
+export default defineFakeRoute([
+  {
+    url: '/mock/news/list',
+    method: 'get',
+    response: () => {
+      return {
+        error: '',
+        status: 1,
+        data: Mock.mock({
+          'list|5-10': [
+            {
+              title: '@ctitle',
+            },
+          ],
+        }),
+      }
+    },
+  },
+])

参数获取:

  • GET:({ query }) => { }
  • POST:({ body }) => { }

为了让 mock 接口与真实接口共存,即项目开发中,部分请求 mock 接口,部分请求真实接口。需要在配置 mock 接口的时候,给 url 参数统一设置 /mock/ 前缀,并在调用接口的时候,使用 baseURL 强制修改此次请求的地址。

如下所示,其中 news/list 会请求本地的 mock 接口,而 news/create 依旧请求真实接口,即使开启跨域代理也不影响。

ts
import api from '@/api'
+
+api.get('news/list', {
+  baseURL: '/mock/',
+  params: {
+    page: 1,
+    size: 10,
+  },
+}).then((res) => {
+  // 后续业务代码
+})
+
+api.post('news/create', {
+  title: '新闻标题',
+  content: '新闻内容',
+}).then((res) => {
+  // 后续业务代码
+})

生产环境 mock

注意

生产环境一般都是调用真实接口,如果需要使用 mock 也只适用于一些简单的示例网站及预览网站。

框架默认已经配置好生产环境 mock ,如果不想让生产环境里的请求走 mock ,可在接口调用处删除 baseURL 设置,或直接删除 mock 接口文件。

需要注意一点,如果项目中有涉及到上传功能,请彻底关闭线上环境 mock ,在环境配置里设置 VITE_BUILD_MOCK = false ,不然线上环境将会报错。

开发环境与生产环境使用 mock 差异不大,比较大的区别是生产环境里调用 mock 接口,在控制台内看不到接口请求日志。

`,52),k=[p];function l(t,e,E,d,r,g){return a(),i("div",null,k)}const y=s(h,[["render",l]]);export{o as __pageData,y as default}; diff --git a/assets/guide_axios.md.eiRrRE32.lean.js b/assets/guide_axios.md.eiRrRE32.lean.js new file mode 100644 index 0000000..78b6c03 --- /dev/null +++ b/assets/guide_axios.md.eiRrRE32.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const o=JSON.parse('{"title":"与服务端交互","description":"","frontmatter":{},"headers":[],"relativePath":"guide/axios.md","filePath":"guide/axios.md"}'),h={name:"guide/axios.md"},p=n("",52),k=[p];function l(t,e,E,d,r,g){return a(),i("div",null,k)}const y=s(h,[["render",l]]);export{o as __pageData,y as default}; diff --git a/assets/guide_build.md.DEKENzfd.js b/assets/guide_build.md.DEKENzfd.js new file mode 100644 index 0000000..2a65ed5 --- /dev/null +++ b/assets/guide_build.md.DEKENzfd.js @@ -0,0 +1,13 @@ +import{_ as p,D as t,c as i,j as e,a,I as o,a5 as s,o as c}from"./chunks/framework.D-J1Cv1C.js";const C=JSON.parse('{"title":"构建与预览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/build.md","filePath":"guide/build.md"}'),d={name:"guide/build.md"},l=s(`

构建与预览

构建

项目开发完成之后,可以执行 pnpm run build 命令进行构建,构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件。

如果是需要构建测试环境,则执行 pnpm run build:test 命令,对应会在根目录生成 dist-test 文件夹。

TIP

如果最终访问地址为域名非根节点,如 https://www.example.com/app,则需要在 vite.config.ts 中设置 base 选项为 /app/,否则会出现资源引用错误。

预览

生成好的 dist 文件夹一般需要部署至服务器才算部署发布成功,但为了保证构建出来的文件能正常运行,开发者通常希望能在本地先预览一下,可执行 pnpm run servepnpm run serve:test 命令预览不同环境构建出的文件夹。

压缩

在环境配置文件里设置 VITE_BUILD_COMPRESS 即可在构建时生成 .gz.br 文件。

# 单独开启 gzip
+VITE_BUILD_COMPRESS = gzip
+
+# 单独开启 brotli ,brotli 是比 gzip 压缩率更高的算法
+VITE_BUILD_COMPRESS = brotli
+
+# 或者也可以都开启,两者可以共存
+VITE_BUILD_COMPRESS = gzip,brotli

两者均需要 nginx 安装指定模块并开启后才会生效。

`,11),r={id:"生成存档",tabindex:"-1"},_=e("a",{class:"header-anchor",href:"#生成存档","aria-label":'Permalink to "生成存档 "'},"​",-1),h=s(`

在环境配置文件里设置 VITE_BUILD_ARCHIVE 即可在构建完后成生成 .zip.tar.gz 文件。

# 生成 zip
+VITE_BUILD_ARCHIVE = zip
+
+# 生成 tar.gz
+VITE_BUILD_ARCHIVE = tar

其它设置

# 是否在打包时生成 sourcemap
+VITE_BUILD_SOURCEMAP = true
`,4);function u(b,g,m,v,I,T){const n=t("Badge");return c(),i("div",null,[l,e("h2",r,[a("生成存档 "),o(n,{type:"tip",text:"v4.5.0 新增"}),a(),_]),h])}const E=p(d,[["render",u]]);export{C as __pageData,E as default}; diff --git a/assets/guide_build.md.DEKENzfd.lean.js b/assets/guide_build.md.DEKENzfd.lean.js new file mode 100644 index 0000000..43748f0 --- /dev/null +++ b/assets/guide_build.md.DEKENzfd.lean.js @@ -0,0 +1 @@ +import{_ as p,D as t,c as i,j as e,a,I as o,a5 as s,o as c}from"./chunks/framework.D-J1Cv1C.js";const C=JSON.parse('{"title":"构建与预览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/build.md","filePath":"guide/build.md"}'),d={name:"guide/build.md"},l=s("",11),r={id:"生成存档",tabindex:"-1"},_=e("a",{class:"header-anchor",href:"#生成存档","aria-label":'Permalink to "生成存档 "'},"​",-1),h=s("",4);function u(b,g,m,v,I,T){const n=t("Badge");return c(),i("div",null,[l,e("h2",r,[a("生成存档 "),o(n,{type:"tip",text:"v4.5.0 新增"}),a(),_]),h])}const E=p(d,[["render",u]]);export{C as __pageData,E as default}; diff --git a/assets/guide_changelog.md.BE1iJTvH.js b/assets/guide_changelog.md.BE1iJTvH.js new file mode 100644 index 0000000..a064e1a --- /dev/null +++ b/assets/guide_changelog.md.BE1iJTvH.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as o}from"./chunks/framework.D-J1Cv1C.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"guide/changelog.md","filePath":"guide/changelog.md"}'),r={name:"guide/changelog.md"},s=o('

更新日志

只记录 feat/fix 以及破坏性变更。

0.1.0

基础版

正式发布

专业版

正式发布

',5),c=[s];function i(l,n,_,d,h,p){return t(),a("div",null,c)}const g=e(r,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/guide_changelog.md.BE1iJTvH.lean.js b/assets/guide_changelog.md.BE1iJTvH.lean.js new file mode 100644 index 0000000..6140375 --- /dev/null +++ b/assets/guide_changelog.md.BE1iJTvH.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as o}from"./chunks/framework.D-J1Cv1C.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"guide/changelog.md","filePath":"guide/changelog.md"}'),r={name:"guide/changelog.md"},s=o("",5),c=[s];function i(l,n,_,d,h,p){return t(),a("div",null,c)}const g=e(r,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/guide_coding-standard.md.C2Bl-4Ae.js b/assets/guide_coding-standard.md.C2Bl-4Ae.js new file mode 100644 index 0000000..0753f20 --- /dev/null +++ b/assets/guide_coding-standard.md.C2Bl-4Ae.js @@ -0,0 +1,12 @@ +import{_ as s,c as i,o as t,a5 as e}from"./chunks/framework.D-J1Cv1C.js";const E=JSON.parse('{"title":"代码规范","description":"","frontmatter":{},"headers":[],"relativePath":"guide/coding-standard.md","filePath":"guide/coding-standard.md"}'),a={name:"guide/coding-standard.md"},n=e(`

代码规范

建议

请确保已阅读《准备工作 - 开发环境》,并且按照文档说明安装好相关软件及扩展。

为保证代码风格统一,请使用 Visual Studio Code 做为开发 IDE ,框架源码里已提供相关配置文件,可直接测试效果:在保存代码时,会自动对当前文件进行代码格式化操作。

IDE 配置

配置文件为 .editorconfig ,通常情况下无需做任何修改。

ESLint 配置

配置文件为 eslint.config.js ,框架使用 antfu/eslint-config 做为基础规范,如果你对默认的规则有异议,可以查阅 ESLint 官网规则并在 eslint.config.js 文件中进行覆盖。

当你对规则进行修改后,原有的代码可能会因为规则的变动导致编辑器大量提示错误,你可以通过运行 pnpm run lint:eslint 进行一次格式校验,如果规则支持自动修复,则会将不符合规则的代码自动进行格式化。

TIP

通过修改 eslint.config.jsignores 配置可忽略无需做代码规范校验的目录或文件,例如在项目中导入了一些第三方的插件代码或组件代码,我们就可以将其进行忽略。

StyleLint 配置

配置文件为 stylelint.config.js ,如果你对默认的规则有异议,可以查阅 Stylelint 官网规则并在 stylelint.config.js 文件中进行修改。

当你对规则进行修改后,原有的代码可能会因为规则的变动导致编辑器大量提示错误,你可以通过运行 pnpm run lint:stylelint 进行一次格式校验,如果规则支持自动修复,则会将不符合规则的代码自动进行格式化。

TIP

通过修改 stylelint.config.jsignoreFiles 配置可忽略无需做代码规范校验的文件,例如在项目中导入了一些第三方的插件代码或组件代码,我们就可以将其进行忽略。

simple-git-hooks 和 lint-staged

由于 IDE 能做的事比较有限,只能对代码的书写规范进行格式化,对于一些无法自动修复的错误代码,如果没有改正到就被推送到 git 仓库,在多人协作开发时,可能会影响到别人的开发体验。所以框架集成了 simple-git-hookslint-staged 这两个依赖来解决这一问题。

在提交代码时, simple-git-hooks 会通过 lint-staged 对本次提交变更的文件进行分别进行 eslint 和 stylelint 检测,如果有报错,则会阻止本次代码提交,直到开发者修改完所有错误代码后,才允许提交到 git 仓库,这样可以确保 git 仓库里的代码不会有不规范的代码。

注意

请确保在安装依赖前,已经使用 git init 对项目进行过 git 环境初始化,如果你在安装依赖后再初始化了 git 环境,请在 git 环境初始化之后再执行一遍 pnpm install 安装命令。

此外,如果 git 仓库目录和框架目录并非同一个,则需要在 package.json 中修改 postinstall 脚本,切换到 git 所在目录。例如 git 目录是 project/ ,而框架目录是 project/fantastic-mobile/ ,则在 package.json 里找到 simple-git-hooks 配置并修改:

json
"simple-git-hooks": {
+  "pre-commit": "cd ./fantastic-mobile/ && pnpm lint-staged",
+  "preserveUnused": true
+}

修改后重新执行一下 pnpm install 即可。

移除

如果不想在 git 提交时强制进行代码规范校验,可以在 package.json 中移除 simple-git-hooks 配置:

json
{
+  "scripts": {
+    "postinstall": "simple-git-hooks", 
+  },
+  "simple-git-hooks": { 
+    "pre-commit": "pnpm lint-staged", 
+    "preserveUnused": true
+  }, 
+}

然后手动删除 .git/hooks/pre-commit 文件即可。

`,21),l=[n];function o(p,d,h,c,r,k){return t(),i("div",null,l)}const u=s(a,[["render",o]]);export{E as __pageData,u as default}; diff --git a/assets/guide_coding-standard.md.C2Bl-4Ae.lean.js b/assets/guide_coding-standard.md.C2Bl-4Ae.lean.js new file mode 100644 index 0000000..754ed80 --- /dev/null +++ b/assets/guide_coding-standard.md.C2Bl-4Ae.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as t,a5 as e}from"./chunks/framework.D-J1Cv1C.js";const E=JSON.parse('{"title":"代码规范","description":"","frontmatter":{},"headers":[],"relativePath":"guide/coding-standard.md","filePath":"guide/coding-standard.md"}'),a={name:"guide/coding-standard.md"},n=e("",21),l=[n];function o(p,d,h,c,r,k){return t(),i("div",null,l)}const u=s(a,[["render",o]]);export{E as __pageData,u as default}; diff --git a/assets/guide_configure.md.CwA-2ilh.js b/assets/guide_configure.md.CwA-2ilh.js new file mode 100644 index 0000000..ece43fd --- /dev/null +++ b/assets/guide_configure.md.CwA-2ilh.js @@ -0,0 +1,78 @@ +import{_ as s,c as i,o as a,a5 as n,a7 as l}from"./chunks/framework.D-J1Cv1C.js";const y=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/configure.md","filePath":"guide/configure.md"}'),p={name:"guide/configure.md"},t=n(`

配置

环境配置

默认提供三套环境配置,分别为:

yaml
# 应用配置面板
+VITE_APP_SETTING = true
+# 页面标题
+VITE_APP_TITLE = Fantastic-mobile
+# 接口请求地址,会设置到 axios 的 baseURL 参数上
+VITE_APP_API_BASEURL = /
+# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
+VITE_APP_DEBUG_TOOL =
+
+# 是否开启代理
+VITE_OPEN_PROXY = false
+# 是否开启开发者工具
+VITE_OPEN_DEVTOOLS = false
yaml
# 应用配置面板
+VITE_APP_SETTING = false
+# 页面标题
+VITE_APP_TITLE = Fantastic-mobile
+# 接口请求地址,会设置到 axios 的 baseURL 参数上
+VITE_APP_API_BASEURL = /
+# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
+VITE_APP_DEBUG_TOOL =
+
+# 是否在打包时启用 Mock
+VITE_BUILD_MOCK = true
+# 在构建时生成 sourcemap
+VITE_BUILD_SOURCEMAP = true
+# 在构建时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS =
+# 是否在打包后生成存档,支持 zip 和 tar
+VITE_BUILD_ARCHIVE =
yaml
# 应用配置面板
+VITE_APP_SETTING = false
+# 页面标题
+VITE_APP_TITLE = Fantastic-mobile
+# 接口请求地址,会设置到 axios 的 baseURL 参数上
+VITE_APP_API_BASEURL = /
+# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
+VITE_APP_DEBUG_TOOL =
+
+# 是否在打包时启用 Mock
+VITE_BUILD_MOCK = false
+# 在构建时生成 sourcemap
+VITE_BUILD_SOURCEMAP = false
+# 在构建时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip,brotli
+# 是否在打包后生成存档,支持 zip 和 tar
+VITE_BUILD_ARCHIVE =

其中 VITE_APP_SETTING VITE_APP_TITLE VITE_APP_API_BASEURL VITE_APP_DEBUG_TOOL 为必要配置,即不管是在开发、测试,还是生产环境都需要使用到。而其余配置则在不同环境下有不同用途,例如开发环境用于本地开发使用,测试环境和生产环境用于构建使用。

开发者可根据实际业务需求进行扩展,如果对这块不熟悉,请阅读 Vite - 环境变量和模式 章节。

注意

VITE_APP_SETTING 该变量是开启应用配置面板,目的是方便开发者在开发阶段调试,生产环境下默认关闭,也建议关闭。

应用配置(框架配置)

请在 /src/settings.ts 文件中进行配置,而 /src/settings.default.ts 为框架的默认配置,请勿在该文件内修改。

关于配置的类型定义,可以在 /src/types/globals.d.ts 文件中查阅。

ts
// 这是基础版演示源码里的自定义配置示例
+const globalSettings: Settings.all = {
+  app: {
+    enablePermission: true,
+    enableDynamicTitle: true,
+  },
+  tabbar: {
+    list: [
+      {
+        path: '/feature',
+        icon: 'i-ic:sharp-auto-awesome',
+        activeIcon: 'i-ic:twotone-auto-awesome',
+        text: '特色',
+      },
+      {
+        path: '/',
+        icon: 'i-ic:sharp-home',
+        activeIcon: 'i-ic:twotone-home',
+        text: '主页',
+      },
+      {
+        path: '/user',
+        icon: 'i-ic:baseline-person',
+        activeIcon: 'i-ic:twotone-person',
+        text: '我的',
+      },
+    ],
+  },
+  copyright: {
+    dates: '2024-present',
+    company: 'Fantastic-mobile',
+    website: 'https://fantastic-mobile.github.io',
+  },
+}

注意

文档中提供的配置介绍,如果在本地的开发环境使用中报错或者无法生效,说明你使用的版本不支持或者配置参数有变动,你可以打开 /src/settings.default.ts 查看当前版本的完整配置作为参考。

并且如果你使用的是 Visual Studio Code ,鼠标悬浮到属性上时,会有属性的介绍:

',12),e=[t];function h(k,E,d,r,c,g){return a(),i("div",null,e)}const F=s(p,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/guide_configure.md.CwA-2ilh.lean.js b/assets/guide_configure.md.CwA-2ilh.lean.js new file mode 100644 index 0000000..81c29e0 --- /dev/null +++ b/assets/guide_configure.md.CwA-2ilh.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n,a7 as l}from"./chunks/framework.D-J1Cv1C.js";const y=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/configure.md","filePath":"guide/configure.md"}'),p={name:"guide/configure.md"},t=n("",12),e=[t];function h(k,E,d,r,c,g){return a(),i("div",null,e)}const F=s(p,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/guide_devtools.md.CAkrTcVC.js b/assets/guide_devtools.md.CAkrTcVC.js new file mode 100644 index 0000000..4b438f7 --- /dev/null +++ b/assets/guide_devtools.md.CAkrTcVC.js @@ -0,0 +1,2 @@ +import{_ as e,c as a,o as t,a5 as s,a8 as o}from"./chunks/framework.D-J1Cv1C.js";const v=JSON.parse('{"title":"开发者工具","description":"","frontmatter":{},"headers":[],"relativePath":"guide/devtools.md","filePath":"guide/devtools.md"}'),i={name:"guide/devtools.md"},l=s(`

开发者工具

INFO

该特性由 Vue DevTools Next 提供技术支持。

使用介绍

.env.development 开发环境配置文件中开启:

yaml
# 是否开启开发者工具
+VITE_OPEN_DEVTOOLS = true

开启后,在本地运行时,默认会在页面底部中间显示一个开发者工具按钮,点击即可打开开发者工具。

',7),n=[l];function d(r,c,p,h,_,u){return t(),a("div",null,n)}const k=e(i,[["render",d]]);export{v as __pageData,k as default}; diff --git a/assets/guide_devtools.md.CAkrTcVC.lean.js b/assets/guide_devtools.md.CAkrTcVC.lean.js new file mode 100644 index 0000000..8cde66f --- /dev/null +++ b/assets/guide_devtools.md.CAkrTcVC.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as s,a8 as o}from"./chunks/framework.D-J1Cv1C.js";const v=JSON.parse('{"title":"开发者工具","description":"","frontmatter":{},"headers":[],"relativePath":"guide/devtools.md","filePath":"guide/devtools.md"}'),i={name:"guide/devtools.md"},l=s("",7),n=[l];function d(r,c,p,h,_,u){return t(),a("div",null,n)}const k=e(i,[["render",d]]);export{v as __pageData,k as default}; diff --git a/assets/guide_error-log.md.BGc7u-uA.js b/assets/guide_error-log.md.BGc7u-uA.js new file mode 100644 index 0000000..ed78580 --- /dev/null +++ b/assets/guide_error-log.md.BGc7u-uA.js @@ -0,0 +1,5 @@ +import{_ as i,D as t,c as n,j as a,a as s,I as l,a5 as p,o as r}from"./chunks/framework.D-J1Cv1C.js";const F=JSON.parse('{"title":"错误日志","description":"","frontmatter":{},"headers":[],"relativePath":"guide/error-log.md","filePath":"guide/error-log.md"}'),o={name:"guide/error-log.md"},h={id:"错误日志",tabindex:"-1"},d=a("a",{class:"header-anchor",href:"#错误日志","aria-label":'Permalink to "错误日志 "'},"​",-1),c=p(`

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableErrorLog: true,
+  },
+}

然后需要到 /src/utils/error.log.ts 文件里编写业务代码,框架为方便演示,将错误日志记录在 sessionStorage 里。

开发者需要根据实际业务情况修改代码,例如将增加上报信息,记录用户账号、token等数据,并且将错误日志进行上报。

由于开启错误日志监控后,Vue 相关的错误都不会在控制台里显示,所以在开发环境下即使开启错误日志也不会被启用,如果需要在开发环境下测试,可在 /src/util/error.log.ts 里修改开启的条件判断。

`,5);function k(g,E,_,y,u,m){const e=t("Badge");return r(),n("div",null,[a("h1",h,[s("错误日志 "),l(e,{type:"pro",text:"专业版"}),s(),d]),c])}const B=i(o,[["render",k]]);export{F as __pageData,B as default}; diff --git a/assets/guide_error-log.md.BGc7u-uA.lean.js b/assets/guide_error-log.md.BGc7u-uA.lean.js new file mode 100644 index 0000000..ead15aa --- /dev/null +++ b/assets/guide_error-log.md.BGc7u-uA.lean.js @@ -0,0 +1 @@ +import{_ as i,D as t,c as n,j as a,a as s,I as l,a5 as p,o as r}from"./chunks/framework.D-J1Cv1C.js";const F=JSON.parse('{"title":"错误日志","description":"","frontmatter":{},"headers":[],"relativePath":"guide/error-log.md","filePath":"guide/error-log.md"}'),o={name:"guide/error-log.md"},h={id:"错误日志",tabindex:"-1"},d=a("a",{class:"header-anchor",href:"#错误日志","aria-label":'Permalink to "错误日志 "'},"​",-1),c=p("",5);function k(g,E,_,y,u,m){const e=t("Badge");return r(),n("div",null,[a("h1",h,[s("错误日志 "),l(e,{type:"pro",text:"专业版"}),s(),d]),c])}const B=i(o,[["render",k]]);export{F as __pageData,B as default}; diff --git a/assets/guide_font.md.D4d7gLBB.js b/assets/guide_font.md.D4d7gLBB.js new file mode 100644 index 0000000..2385104 --- /dev/null +++ b/assets/guide_font.md.D4d7gLBB.js @@ -0,0 +1,4 @@ +import{_ as t,D as i,c as o,j as e,a,I as n,a5 as l,o as r,a9 as d,aa as p}from"./chunks/framework.D-J1Cv1C.js";const x=JSON.parse('{"title":"自定义字体","description":"","frontmatter":{},"headers":[],"relativePath":"guide/font.md","filePath":"guide/font.md"}'),c={name:"guide/font.md"},h={id:"自定义字体",tabindex:"-1"},k=e("a",{class:"header-anchor",href:"#自定义字体","aria-label":'Permalink to "自定义字体 "'},"​",-1),g=l('

用户访问使用了自定义字体的页面时,会自动下载字体文件,字体文件有大有小,所以不建议在非英文环境中使用。

框架预设了 Digital 7 的两套字体,除此之外,你也可以通过以下方法引入你需要的自定义字体。

找字体

访问 DaFont 或其它字体下载网站,下载 .ttf 格式的字体文件。

生成字体

因为 .ttf 格式的字体文件不是浏览器支持的字体格式,所以需要通过 .ttf 生成其它格式的字体文件。

访问 Font Squirrel,上传 .ttf 文件,并按照下面设置后,点击下载。

使用

将上一步下载的压缩包解压并放入 /src/assets/fonts/ 目录下,注意按文件夹区分,随后引入文件夹中的 stylesheet.css 即可使用,以 Digital 7 字体为例:

scss
@import '../../assets/fonts/digital-7/stylesheet.css';
+.digital-7 {
+  font-family: 'digital-7regular';
+}

字体的 font-family 名称在 stylesheet.css 里查看。

另外你也可以将 @import '../../assets/fonts/digital-7/stylesheet.css'; 这句代码放到全局引入,这样所有页面就都可以通过设置 font-family: 'digital-7regular'; 直接使用了。

`,14);function _(f,m,E,u,y,b){const s=i("Badge");return r(),o("div",null,[e("h1",h,[a("自定义字体 "),n(s,{type:"pro",text:"专业版"}),a(),k]),g])}const B=t(c,[["render",_]]);export{x as __pageData,B as default}; diff --git a/assets/guide_font.md.D4d7gLBB.lean.js b/assets/guide_font.md.D4d7gLBB.lean.js new file mode 100644 index 0000000..0dc9030 --- /dev/null +++ b/assets/guide_font.md.D4d7gLBB.lean.js @@ -0,0 +1 @@ +import{_ as t,D as i,c as o,j as e,a,I as n,a5 as l,o as r,a9 as d,aa as p}from"./chunks/framework.D-J1Cv1C.js";const x=JSON.parse('{"title":"自定义字体","description":"","frontmatter":{},"headers":[],"relativePath":"guide/font.md","filePath":"guide/font.md"}'),c={name:"guide/font.md"},h={id:"自定义字体",tabindex:"-1"},k=e("a",{class:"header-anchor",href:"#自定义字体","aria-label":'Permalink to "自定义字体 "'},"​",-1),g=l("",14);function _(f,m,E,u,y,b){const s=i("Badge");return r(),o("div",null,[e("h1",h,[a("自定义字体 "),n(s,{type:"pro",text:"专业版"}),a(),k]),g])}const B=t(c,[["render",_]]);export{x as __pageData,B as default}; diff --git a/assets/guide_global-resources.md.Ce3hhm_-.js b/assets/guide_global-resources.md.Ce3hhm_-.js new file mode 100644 index 0000000..1a558ab --- /dev/null +++ b/assets/guide_global-resources.md.Ce3hhm_-.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"全局资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/global-resources.md","filePath":"guide/global-resources.md"}'),s={name:"guide/global-resources.md"},c=t('

全局资源

图片

框架用到的图片资源都放在 /src/assets/images/ 目录下,可自行新建文件夹分类管理。

样式

样式存放目录为 /src/assets/styles/ ,因为 Vue 的文件特性,页面样式建议写在 .vue 文件里,所以该目录只存放全局样式,方便统一管理。

此目录下还有一个特殊目录,即 /src/assets/styles/resources/ ,这是全局 SCSS 资源目录,首先这个目录里只支持 .scss 文件,其次在这个目录里的文件,无需在页面上引用即可生效并使用。

同样,精灵图目录下生成的 SCSS 资源也是全局可调用的。

说明

全局 SCSS 资源并不是全局样式,是变量、@mixin 、@function 这些东西

组件

公共组件

说明

公共组件在使用时,无需手动引入,框架会在你使用时自动引入,该特性由 unplugin-vue-components 提供支持。

公共组件存放在 /src/components/ 目录下,每个组件按文件夹进行区分。

每个组件的文件夹内至少保留一个文件名为 index.vue 的组件入口(可参考 SvgIcon 组件),文件夹名称即为组件名。

推荐使用 pnpm new 指令进行组件生成,详细可查看《代码文件自动生成》。

局部组件

局部组件没有提供专门的存放目录,我们建议采用就近原则,你可以在每个模块的文件夹下,建立一个 components 文件夹专门用于存放局部组件。

',16),r=[c];function l(d,n,i,p,u,h){return o(),a("div",null,r)}const b=e(s,[["render",l]]);export{_ as __pageData,b as default}; diff --git a/assets/guide_global-resources.md.Ce3hhm_-.lean.js b/assets/guide_global-resources.md.Ce3hhm_-.lean.js new file mode 100644 index 0000000..760f314 --- /dev/null +++ b/assets/guide_global-resources.md.Ce3hhm_-.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"全局资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/global-resources.md","filePath":"guide/global-resources.md"}'),s={name:"guide/global-resources.md"},c=t("",16),r=[c];function l(d,n,i,p,u,h){return o(),a("div",null,r)}const b=e(s,[["render",l]]);export{_ as __pageData,b as default}; diff --git a/assets/guide_i18n.md.f4Xaz9vk.js b/assets/guide_i18n.md.f4Xaz9vk.js new file mode 100644 index 0000000..c990fbe --- /dev/null +++ b/assets/guide_i18n.md.f4Xaz9vk.js @@ -0,0 +1,40 @@ +import{_ as n,D as e,c as l,j as i,a as s,I as t,a5 as h,o as p,ab as k}from"./chunks/framework.D-J1Cv1C.js";const A=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/i18n.md","filePath":"guide/i18n.md"}'),r={name:"guide/i18n.md"},d={id:"国际化",tabindex:"-1"},E=i("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化 "'},"​",-1),c=h('

INFO

该特性由 vue-i18n 提供技术支持。

vscode 扩展

如果使用 vscode 进行开发,推荐安装 i18n Ally 这个扩展。

安装该扩展后,代码里可以实时查看对应语言的内容。

语言包

语言包存放在 /src/locales/lang/ 目录下,因为 Element Plus 本身也有自己的语言包,所以在做国际化支持的时候,框架的语言包和 Element Plus 的语言包需要进行数据合并,可点击这里查看 Element Plus 的语言包文件。

假设你已经在 /src/locales/lang/ 目录下新增并配置好了一个日文语言包 ja.json ,然后你需要到 /src/locales/index.ts 文件里做以下调整:

ts
import elementLocaleZhCN from 'element-plus/dist/locale/zh-cn.mjs'
+import elementLocaleZhTW from 'element-plus/dist/locale/zh-tw.mjs'
+import elementLocaleEn from 'element-plus/dist/locale/en.mjs'
+// 引入 Element Plus 的日文语言包
+import elementLocaleJa from 'element-plus/dist/locale/ja.mjs'
+
+function getElementLocales() {
+  const locales: {
+    [key: string]: any
+  } = {}
+  for (const key in messages) {
+    locales[key] = {}
+    switch (key) {
+      case 'zh-cn':
+        Object.assign(locales[key], elementLocaleZhCN, { labelName: '中文(简体)' })
+        break
+      case 'zh-tw':
+        Object.assign(locales[key], elementLocaleZhTW, { labelName: '中文(繁體)' })
+        break
+      case 'en':
+        Object.assign(locales[key], elementLocaleEn, { labelName: 'English' })
+        break
+      // 在这里增加一个 case 选项,其中 labelName 会在语言选择器里显示
+      case 'ja':
+        Object.assign(locales[key], elementLocaleJa, { labelName: '日本語' })
+        break
+    }
+  }
+  return locales
+}

路由设置

以中文(简体)为例,打开 /src/locales/lang/zh-cn.json 文件可以看到路由相关的配置,在 route 对象里可以扩展需要开启国际化支持的路由。

json
{
+  "pages": {
+    "navbar": {
+      "root": "导航栏",
+      "default": "默认导航栏",
+      "none": "无导航栏"
+    }
+  }
+}

如果需要新增某个路由的国际化支持,光设置好中文(简体)的还不行,其它语言包文件里也要同步添加。当都设置好后,可在该路由的 title 参数上直接设置对应 key 值,例如:

ts
meta: {
+  title: 'pages.navbar.default',
+},

单页组件

如果每个页面都要做国际化支持,那语言包文件就会变得无比庞大且难以维护,推荐在每个页面组件里使用 <i18n> 自定义块进行语言维护,可访问 /src/views/feature/function/i18n.vue 查看示例。

更多 vue-i18n 的使用技巧请参考官方文档。

与服务端交互

所有的请求均会在请求头里带上 Accept-Language ,后端可根据这一状态信息做动态数据国际化处理。

`,19);function o(g,y,F,u,m,b){const a=e("Badge");return p(),l("div",null,[i("h1",d,[s("国际化 "),t(a,{type:"pro",text:"专业版"}),s(),E]),c])}const B=n(r,[["render",o]]);export{A as __pageData,B as default}; diff --git a/assets/guide_i18n.md.f4Xaz9vk.lean.js b/assets/guide_i18n.md.f4Xaz9vk.lean.js new file mode 100644 index 0000000..4ad6ca6 --- /dev/null +++ b/assets/guide_i18n.md.f4Xaz9vk.lean.js @@ -0,0 +1 @@ +import{_ as n,D as e,c as l,j as i,a as s,I as t,a5 as h,o as p,ab as k}from"./chunks/framework.D-J1Cv1C.js";const A=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/i18n.md","filePath":"guide/i18n.md"}'),r={name:"guide/i18n.md"},d={id:"国际化",tabindex:"-1"},E=i("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化 "'},"​",-1),c=h("",19);function o(g,y,F,u,m,b){const a=e("Badge");return p(),l("div",null,[i("h1",d,[s("国际化 "),t(a,{type:"pro",text:"专业版"}),s(),E]),c])}const B=n(r,[["render",o]]);export{A as __pageData,B as default}; diff --git a/assets/guide_intro.md.BqwfDzTF.js b/assets/guide_intro.md.BqwfDzTF.js new file mode 100644 index 0000000..b5a42b4 --- /dev/null +++ b/assets/guide_intro.md.BqwfDzTF.js @@ -0,0 +1 @@ +import{_ as s,D as o,c as r,j as e,a as t,I as i,a5 as c,o as n}from"./chunks/framework.D-J1Cv1C.js";const T=JSON.parse('{"title":"文档说明","description":"","frontmatter":{},"headers":[],"relativePath":"guide/intro.md","filePath":"guide/intro.md"}'),l={name:"guide/intro.md"},d=c('

文档说明

⭐⭐⭐⭐⭐

相信你已经准备或正在使用 Fantastic-mobile 进行开发工作了,在此之前,希望你可以去 Github 或者 Gitee(码云) 帮我点个 ⭐ ,这将是对我极大的鼓励。

star

star

',2),_=e("p",null,[t("如果你准备好了,那我们就"),e("a",{href:"/guide/ready.html"},"开始"),t("吧~")],-1);function p(m,h,g,b,f,u){const a=o("Badge");return n(),r("div",null,[d,e("p",null,[t("文档中标记 "),i(a,{type:"pro",text:"专业版"}),t(" 的地方,表示该功能仅提供于专业版使用,使用基础版的开发者可直接跳过阅读。")]),_])}const v=s(l,[["render",p]]);export{T as __pageData,v as default}; diff --git a/assets/guide_intro.md.BqwfDzTF.lean.js b/assets/guide_intro.md.BqwfDzTF.lean.js new file mode 100644 index 0000000..afac837 --- /dev/null +++ b/assets/guide_intro.md.BqwfDzTF.lean.js @@ -0,0 +1 @@ +import{_ as s,D as o,c as r,j as e,a as t,I as i,a5 as c,o as n}from"./chunks/framework.D-J1Cv1C.js";const T=JSON.parse('{"title":"文档说明","description":"","frontmatter":{},"headers":[],"relativePath":"guide/intro.md","filePath":"guide/intro.md"}'),l={name:"guide/intro.md"},d=c("",2),_=e("p",null,[t("如果你准备好了,那我们就"),e("a",{href:"/guide/ready.html"},"开始"),t("吧~")],-1);function p(m,h,g,b,f,u){const a=o("Badge");return n(),r("div",null,[d,e("p",null,[t("文档中标记 "),i(a,{type:"pro",text:"专业版"}),t(" 的地方,表示该功能仅提供于专业版使用,使用基础版的开发者可直接跳过阅读。")]),_])}const v=s(l,[["render",p]]);export{T as __pageData,v as default}; diff --git a/assets/guide_keep-alive.md.BguaEZ4O.js b/assets/guide_keep-alive.md.BguaEZ4O.js new file mode 100644 index 0000000..f7ac095 --- /dev/null +++ b/assets/guide_keep-alive.md.BguaEZ4O.js @@ -0,0 +1,36 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const o=JSON.parse('{"title":"页面缓存","description":"","frontmatter":{},"headers":[],"relativePath":"guide/keep-alive.md","filePath":"guide/keep-alive.md"}'),t={name:"guide/keep-alive.md"},e=n(`

页面缓存

注意

开启缓存必须保证每个页面组件必须设置 name ,并且确保 name 唯一。

我们只要在需要进行缓存的路由 meta 对象里配置 cache 参数即可。这个参数可接受以下 3 种类型:

  • boolean
  • string
  • string[]

boolean 很好理解,当设置为 true 时,该页面只要一被访问,就会被缓存。例如有一个新闻管理的模块,我们把新闻列表页设置为 cache: true 后并访问,然后从新闻列表页点击某条记录进入新闻详情页,这时候再从新闻详情页返回新闻列表页时,新闻列表页上的数据是不会重新加载,而是保留了当时离开时的状态。

但这个方案也有一个弊端,就是该页面一旦访问就永久被缓存住了(除非手动进行浏览器刷新),如果用户从新闻列表页进入的不是新闻详情页,而是其它模块的页面,比如上一级页面,这时候其实是不希望新闻列表页被缓存的。这种情况下,框架支持设置 stringstring[] 两个类型的参数值。

首先不管设置 string 还是 string[] ,你需要设置的值,都是路由的 name 。

怎么理解呢?还是用上面的例子,如果有两个模块,一个新闻管理,一个用户管理。当从新闻列表页进入新闻详情页的时候,需要对新闻列表页进行缓存,而从新闻列表页进入用户列表页,则不需要对新闻列表页进行缓存,我们就可以对新闻列表页的路由设置成:

src/views/
+└── news/
+    ├── [id].vue
+    └── index.vue
vue
<!-- /src/views/news/index.vue -->
+<script setup lang="ts">
+definePage({
+  meta: {
+    title: '新闻列表页',
+    cache: '/news/[id]',
+  },
+})
+</script>

这表示从新闻列表页进入新闻详情页时,新闻列表页才会被缓存,进入其它任何页面都不会缓存。

当然也可将 cache 设置成 name 数组。

src/views/
+└── news/
+    ├── create.vue
+    ├── detail.[id].vue
+    └── index.vue
vue
<!-- /src/views/news/index.vue -->
+<script setup lang="ts">
+definePage({
+  meta: {
+    title: '新闻列表页',
+    cache: ['/news/detail.[id]', '/news/create'],
+  },
+})
+</script>

这样就表示从新闻列表页进入新闻详情页新增新闻页时,新闻列表页才会被缓存,进入其它任何页面都不会缓存。


还有一种场景,就是某个页面始终开启缓存,仅在某些特定条件下才关闭缓存。例如有一个新闻管理的模块,我们希望新增新闻页始终开启缓存,因为在进行新增操作时,可能需要跳转到新闻分类管理的页面进行新增分类的操作,或者是其他页面进行一些操作,当返回新增新闻页时,需要将它缓存。一旦新闻新增成功,返回到新闻列表页时,新增新闻页就不再需要缓存了。

我们只要在需要进行缓存的路由 meta 对象里配置 noCache 参数即可。这个参数可接受以下 2 种类型:

  • string
  • string[]

针对上述场景,我们就可以对新增新闻页的路由设置成:

src/views/
+└── news/
+    ├── create.vue
+    └── index.vue
vue
<!-- /src/views/news/create.vue -->
+<script setup lang="ts">
+definePage({
+  meta: {
+    title: '新增新闻页',
+    cache: true,
+    noCache: '/news/',
+  },
+})
+</script>
`,22),p=[e];function l(h,k,g,r,d,E){return a(),i("div",null,p)}const y=s(t,[["render",l]]);export{o as __pageData,y as default}; diff --git a/assets/guide_keep-alive.md.BguaEZ4O.lean.js b/assets/guide_keep-alive.md.BguaEZ4O.lean.js new file mode 100644 index 0000000..a62a65f --- /dev/null +++ b/assets/guide_keep-alive.md.BguaEZ4O.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const o=JSON.parse('{"title":"页面缓存","description":"","frontmatter":{},"headers":[],"relativePath":"guide/keep-alive.md","filePath":"guide/keep-alive.md"}'),t={name:"guide/keep-alive.md"},e=n("",22),p=[e];function l(h,k,g,r,d,E){return a(),i("div",null,p)}const y=s(t,[["render",l]]);export{o as __pageData,y as default}; diff --git a/assets/guide_login.md.CmsD9wCN.js b/assets/guide_login.md.CmsD9wCN.js new file mode 100644 index 0000000..4414c2b --- /dev/null +++ b/assets/guide_login.md.CmsD9wCN.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as i,a5 as c}from"./chunks/framework.D-J1Cv1C.js";const g=JSON.parse('{"title":"登录","description":"","frontmatter":{},"headers":[],"relativePath":"guide/login.md","filePath":"guide/login.md"}'),l={name:"guide/login.md"},t=c('

登录

说明

如果业务不需要用户体系,可以直接将 /src/views/login.vue 文件删除或修改为 _login.vue ,这样就不会生成登录路由。

开发者在接入登录功能的时候,经常会遇到一些问题,比如:

  • 替换真实接口后,无法正常登录
  • 登录接口请求成功,但依旧提示登录
  • ...

针对这些问题你需要依次检查以下几点:

  1. .env.development 里检查接口请求地址是否正确。
  2. /src/api/index.ts 里修改响应拦截器里的代码,按照实际情况进行调整。例如什么状态下是请求成功,什么状态下是请求异常,并进行错误提示。
  3. /src/api/modules/user.ts 里修改 login 函数,确保接口可以请求成功。
  4. /src/store/modules/user.ts 里修改 isLogin 计算属性,这部分需要根据实际存储的用户信息去判断是否登录。
',6),s=[t];function d(a,n,r,_,p,u){return i(),o("div",null,s)}const h=e(l,[["render",d]]);export{g as __pageData,h as default}; diff --git a/assets/guide_login.md.CmsD9wCN.lean.js b/assets/guide_login.md.CmsD9wCN.lean.js new file mode 100644 index 0000000..c65446a --- /dev/null +++ b/assets/guide_login.md.CmsD9wCN.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as i,a5 as c}from"./chunks/framework.D-J1Cv1C.js";const g=JSON.parse('{"title":"登录","description":"","frontmatter":{},"headers":[],"relativePath":"guide/login.md","filePath":"guide/login.md"}'),l={name:"guide/login.md"},t=c("",6),s=[t];function d(a,n,r,_,p,u){return i(),o("div",null,s)}const h=e(l,[["render",d]]);export{g as __pageData,h as default}; diff --git a/assets/guide_mobile-support.md.Dbl0b72M.js b/assets/guide_mobile-support.md.Dbl0b72M.js new file mode 100644 index 0000000..bae095a --- /dev/null +++ b/assets/guide_mobile-support.md.Dbl0b72M.js @@ -0,0 +1,29 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const o=JSON.parse('{"title":"移动端支持","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mobile-support.md","filePath":"guide/mobile-support.md"}'),h={name:"guide/mobile-support.md"},l=n(`

移动端支持

本套件支持使用 vw/vh 做为移动端的布局单位,并默认集成了 postcss-px2vp 插件。

使用也很简单,只需将根目录下 postcss.config.js 文件里的注释代码开启即可:

js
module.exports = {
+  plugins: {
+    'postcss-px2vp': {
+      // 需要转换的单位,默认为"px"
+      unitToConvert: 'px',
+      // 设计稿的视口宽度
+      viewportWidth: 320,
+      // 单位转换后保留的精度
+      unitPrecision: 5,
+      // 能转化为 vw 的属性列表
+      propList: ['*'],
+      // 希望使用的视口单位
+      viewportUnit: 'vw',
+      // 字体使用的视口单位
+      fontViewportUnit: 'vw',
+      // 需要忽略的 CSS 选择器,不会转为视口单位,使用原有的 px 等单位
+      selectorBlackList: [],
+      // 设置最小的转换数值,如果为 1 的话,只有大于 1 的值会被转换
+      minPixelValue: 1,
+      // 媒体查询里的单位是否需要转换单位
+      mediaQuery: false,
+      // 是否直接更换属性值,而不添加备用属性
+      replace: true,
+      // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
+      exclude: [],
+    },
+    autoprefixer: {},
+  },
+}

最后在开发中就可以直接使用 px 了,最终输出就是 vw 。

`,5),p=[l];function t(e,k,E,g,d,r){return a(),i("div",null,p)}const y=s(h,[["render",t]]);export{o as __pageData,y as default}; diff --git a/assets/guide_mobile-support.md.Dbl0b72M.lean.js b/assets/guide_mobile-support.md.Dbl0b72M.lean.js new file mode 100644 index 0000000..65e29bc --- /dev/null +++ b/assets/guide_mobile-support.md.Dbl0b72M.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const o=JSON.parse('{"title":"移动端支持","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mobile-support.md","filePath":"guide/mobile-support.md"}'),h={name:"guide/mobile-support.md"},l=n("",5),p=[l];function t(e,k,E,g,d,r){return a(),i("div",null,p)}const y=s(h,[["render",t]]);export{o as __pageData,y as default}; diff --git a/assets/guide_page-layout.md.CqsasEls.js b/assets/guide_page-layout.md.CqsasEls.js new file mode 100644 index 0000000..7f71d97 --- /dev/null +++ b/assets/guide_page-layout.md.CqsasEls.js @@ -0,0 +1,75 @@ +import{_ as l,D as n,c as h,j as s,a as t,I as a,a5 as e,o as p}from"./chunks/framework.D-J1Cv1C.js";const Vs=JSON.parse('{"title":"PageLayout 组件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/page-layout.md","filePath":"guide/page-layout.md"}'),d={name:"guide/page-layout.md"},k=e(`

PageLayout 组件

<PageLayout> 组件是本框架区别于其他 H5 框架的最重要的特性。它提供了页面整体布局的基础,包括顶部导航栏、顶部标签栏、返回顶部、记录滚动位置等特性。

基本用法

vue
<template>
+  <PageLayout :navbar="false" tabbar copyright>
+    <!-- ... -->
+  </PageLayout>
+</template>

本组件不是一个可以随处使用的组件,它必须应用在根节点,并且一个页面里只能有一个 <PageLayout> 组件。

Props

`,6),g={tabindex:"0"},E=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"参数"),s("th",{style:{"text-align":"left"}},"说明"),s("th",{style:{"text-align":"left"}},"类型"),s("th",{style:{"text-align":"left"}},"可选值"),s("th",{style:{"text-align":"left"}},"默认值")])],-1),r={style:{"text-align":"left"}},o=s("td",{style:{"text-align":"left"}},"导航栏标题是否居中",-1),y=s("td",{style:{"text-align":"left"}},"boolean",-1),c=s("td",{style:{"text-align":"left"}},"-",-1),_=s("td",{style:{"text-align":"left"}},"true",-1),b=s("tr",null,[s("td",{style:{"text-align":"left"}},"navbar"),s("td",{style:{"text-align":"left"}},[t("是否启用导航栏,默认使用应用配置 "),s("code",null,"navbar.enable")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),x={style:{"text-align":"left"}},F=s("td",{style:{"text-align":"left"}},[t("导航栏模式,默认使用应用配置 "),s("code",null,"navbar.mode")],-1),u=s("td",{style:{"text-align":"left"}},"string",-1),f=s("td",{style:{"text-align":"left"}},"static / fixed / show-hide-fixed / sticky",-1),C=s("td",{style:{"text-align":"left"}},"-",-1),v={style:{"text-align":"left"}},m=s("td",{style:{"text-align":"left"}},"从预设中设置展示在导航栏左侧的图标按钮",-1),B=s("td",{style:{"text-align":"left"}},"string / string[]",-1),A=s("td",{style:{"text-align":"left"}},"back / home / forward / i18n",-1),D=s("td",{style:{"text-align":"left"}},"-",-1),P={style:{"text-align":"left"}},T=s("td",{style:{"text-align":"left"}},"从预设中选择展示在导航栏右侧的图标按钮",-1),S=s("td",{style:{"text-align":"left"}},"string / string[]",-1),q=s("td",{style:{"text-align":"left"}},"back / home / forward / i18n",-1),I=s("td",{style:{"text-align":"left"}},"-",-1),V=s("tr",null,[s("td",{style:{"text-align":"left"}},"tabbar"),s("td",{style:{"text-align":"left"}},[t("是否启用标签栏,默认使用应用配置 "),s("code",null,"tabbar.enable")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),N={style:{"text-align":"left"}},L=s("td",{style:{"text-align":"left"}},"标签栏名称,如果应用配置里配置了多套标签栏,需设置当前页面使用哪套标签栏,默认使用第一套",-1),w=s("td",{style:{"text-align":"left"}},"string",-1),R=s("td",{style:{"text-align":"left"}},"-",-1),$=s("td",{style:{"text-align":"left"}},"-",-1),M=s("tr",null,[s("td",{style:{"text-align":"left"}},"copyright"),s("td",{style:{"text-align":"left"}},[t("是否展示底部版权信息,默认使用应用配置 "),s("code",null,"copyright.enable")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),j=s("tr",null,[s("td",{style:{"text-align":"left"}},"backTop"),s("td",{style:{"text-align":"left"}},[t("是否启用返回顶部按钮,默认使用应用配置 "),s("code",null,"app.enableBackTop")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),H={style:{"text-align":"left"}},J=s("td",{style:{"text-align":"left"}},"是否记忆滚动位置(前提条件:需开启页面缓存)",-1),O=s("td",{style:{"text-align":"left"}},"boolean",-1),W=s("td",{style:{"text-align":"left"}},"-",-1),z=s("td",{style:{"text-align":"left"}},"-",-1),G={style:{"text-align":"left"}},K=s("td",{style:{"text-align":"left"}},"设置竖向滚动条位置",-1),Q=s("td",{style:{"text-align":"left"}},"number",-1),U=s("td",{style:{"text-align":"left"}},"-",-1),X=s("td",{style:{"text-align":"left"}},"-",-1),Y={style:{"text-align":"left"}},Z=s("td",{style:{"text-align":"left"}},"设置横向滚动条位置",-1),ss=s("td",{style:{"text-align":"left"}},"number",-1),ts=s("td",{style:{"text-align":"left"}},"-",-1),is=s("td",{style:{"text-align":"left"}},"-",-1),as={style:{"text-align":"left"}},es=s("td",{style:{"text-align":"left"}},"是否在设置滚动条位置时使用动画过渡",-1),ls=s("td",{style:{"text-align":"left"}},"boolean",-1),ns=s("td",{style:{"text-align":"left"}},"-",-1),hs=s("td",{style:{"text-align":"left"}},"-",-1),ps=e('

Slots

插槽名说明
-页面区域
navbar导航栏标题区域
navbar-start导航栏左侧图标区域
navbar-end导航栏右侧图标区域
tabbar标签栏区域

Events

',3),ds={tabindex:"0"},ks=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"事件名"),s("th",{style:{"text-align":"left"}},"说明")])],-1),gs=s("tr",null,[s("td",{style:{"text-align":"left"}},"scroll"),s("td",{style:{"text-align":"left"}},"页面滚动时触发")],-1),Es={style:{"text-align":"left"}},rs=s("td",{style:{"text-align":"left"}},"页面滚动到顶部时触发",-1),os={style:{"text-align":"left"}},ys=s("td",{style:{"text-align":"left"}},"页面滚动到底部时触发",-1),cs=e(`

导航栏

enable

可以将导航栏全局开启,这样所有页面默认都会显示导航栏。

ts
const globalSettings: Settings.all = {
+  navbar: {
+    enable: true,
+  },
+}

或者也可以提供一段正则表达式,例如下面这段配置表示页面在微信环境下默认不显示导航栏:

ts
const globalSettings: Settings.all = {
+  navbar: {
+    enable: !/MicroMessenger/i.test(window.navigator.userAgent),
+  },
+}
`,6),_s={id:"mode",tabindex:"-1"},bs=s("a",{class:"header-anchor",href:"#mode","aria-label":'Permalink to "mode "'},"​",-1),xs=e(`

全局设置导航栏模式,默认为 static

  • 'static' 静止,跟随页面滚动
  • 'fixed' 固定,不跟随页面滚动,始终固定在顶部
  • 'show-hide-fixed' 显隐固定,默认隐藏,页面滚动时显示
  • 'sticky' 粘性,页面往下滚动时隐藏,往上滚动时显示
ts
const globalSettings: Settings.all = {
+  navbar: {
+    mode: 'fixed',
+  },
+}

标签栏

enable

可以将标签栏全局开启,这样所有页面默认都会显示标签栏。

ts
const globalSettings: Settings.all = {
+  tabbar: {
+    enable: true,
+  },
+}

list

标签栏展示数据:

ts
const globalSettings: Settings.all = {
+  tabbar: {
+    list: [
+      {
+        path: '/',
+        icon: 'i-ic:sharp-home',
+        text: '主页',
+      },
+      {
+        path: '/user',
+        icon: 'i-ic:baseline-person',
+        text: '我的',
+      },
+    ],
+  },
+}

专业版支持配置多套标签栏,然后通过 tabbarName 属性指定当前页面使用哪套标签栏:

ts
const globalSettings: Settings.all = {
+  tabbar: {
+    list: [
+      {
+        name: 'tabbar1',
+        list: [
+          {
+            path: '/',
+            icon: 'i-ic:sharp-home',
+            text: '主页',
+          },
+          {
+            path: '/user',
+            icon: 'i-ic:baseline-person',
+            text: '我的',
+          },
+        ],
+      },
+      {
+        name: 'tabbar2',
+        list: [
+          {
+            path: '/list',
+            icon: 'i-ic:sharp-list',
+            text: '列表',
+          },
+          {
+            path: '/setting',
+            icon: 'i-ic:sharp-settings',
+            text: '设置',
+          },
+        ],
+      },
+    ],
+  },
+}
vue
<template>
+  <PageLayout tabbar-name="tabbar2">
+    <!-- ... -->
+  </PageLayout>
+</template>

path

跳转路由地址

类型默认值说明
string/跳转路由地址

icon

类型默认值说明
string/显示图标

该项配置最终会通过 <SvgIcon /> 组件进行展示,意味着你可以使用自定义图标,也可使用 Iconify 提供的图标,详细可阅读《图标》。

`,19),Fs={id:"activeicon",tabindex:"-1"},us=s("a",{class:"header-anchor",href:"#activeicon","aria-label":'Permalink to "activeIcon "'},"​",-1),fs=e('
类型默认值说明
string/激活时显示图标

该项配置最终会通过 <SvgIcon /> 组件进行展示,意味着你可以使用自定义图标,也可使用 Iconify 提供的图标,详细可阅读《图标》。

text

类型默认值说明
string/显示文字
',4),Cs={id:"badge",tabindex:"-1"},vs=s("a",{class:"header-anchor",href:"#badge","aria-label":'Permalink to "badge "'},"​",-1),ms=e('

设置不同的类型值,展示效果也会不同。

  • boolean 展示形式为点,当值为 false 时隐藏
  • number 展示形式为文本,当值小于等于 0 时隐藏
  • string 展示形式为文本,当值为空时隐藏

如果标记需要动态更新,请设置为箭头函数形式,并返回外部变量,例如搭配 pinia 一起使用。

ts
badge: () => globalStore.number
',4);function Bs(As,Ds,Ps,Ts,Ss,qs){const i=n("Badge");return p(),h("div",null,[k,s("table",g,[E,s("tbody",null,[s("tr",null,[s("td",r,[t("titleCenter "),a(i,{type:"pro",text:"专业版"})]),o,y,c,_]),b,s("tr",null,[s("td",x,[t("navbarMode "),a(i,{type:"pro",text:"专业版"})]),F,u,f,C]),s("tr",null,[s("td",v,[t("navbarStartSide "),a(i,{type:"pro",text:"专业版"})]),m,B,A,D]),s("tr",null,[s("td",P,[t("navbarEndSide "),a(i,{type:"pro",text:"专业版"})]),T,S,q,I]),V,s("tr",null,[s("td",N,[t("tabbarName "),a(i,{type:"pro",text:"专业版"})]),L,w,R,$]),M,j,s("tr",null,[s("td",H,[t("savedPosition "),a(i,{type:"pro",text:"专业版"})]),J,O,W,z]),s("tr",null,[s("td",G,[t("scrollTop "),a(i,{type:"pro",text:"专业版"}),t(),a(i,{type:"tip",text:"v0.2.0 新增"})]),K,Q,U,X]),s("tr",null,[s("td",Y,[t("scrollLeft "),a(i,{type:"pro",text:"专业版"}),t(),a(i,{type:"tip",text:"v0.2.0 新增"})]),Z,ss,ts,is]),s("tr",null,[s("td",as,[t("scrollWithAnimation "),a(i,{type:"pro",text:"专业版"}),t(),a(i,{type:"tip",text:"v0.2.0 新增"})]),es,ls,ns,hs])])]),ps,s("table",ds,[ks,s("tbody",null,[gs,s("tr",null,[s("td",Es,[t("reachTop "),a(i,{type:"tip",text:"v0.2.0 新增"})]),rs]),s("tr",null,[s("td",os,[t("reachBottom "),a(i,{type:"tip",text:"v0.2.0 新增"})]),ys])])]),cs,s("h3",_s,[t("mode "),a(i,{type:"pro",text:"专业版"}),t(),bs]),xs,s("h4",Fs,[t("activeIcon "),a(i,{type:"pro",text:"专业版"}),t(),us]),fs,s("h4",Cs,[t("badge "),a(i,{type:"pro",text:"专业版"}),t(),vs]),ms])}const Ns=l(d,[["render",Bs]]);export{Vs as __pageData,Ns as default}; diff --git a/assets/guide_page-layout.md.CqsasEls.lean.js b/assets/guide_page-layout.md.CqsasEls.lean.js new file mode 100644 index 0000000..1ca8672 --- /dev/null +++ b/assets/guide_page-layout.md.CqsasEls.lean.js @@ -0,0 +1 @@ +import{_ as l,D as n,c as h,j as s,a as t,I as a,a5 as e,o as p}from"./chunks/framework.D-J1Cv1C.js";const Vs=JSON.parse('{"title":"PageLayout 组件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/page-layout.md","filePath":"guide/page-layout.md"}'),d={name:"guide/page-layout.md"},k=e("",6),g={tabindex:"0"},E=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"参数"),s("th",{style:{"text-align":"left"}},"说明"),s("th",{style:{"text-align":"left"}},"类型"),s("th",{style:{"text-align":"left"}},"可选值"),s("th",{style:{"text-align":"left"}},"默认值")])],-1),r={style:{"text-align":"left"}},o=s("td",{style:{"text-align":"left"}},"导航栏标题是否居中",-1),y=s("td",{style:{"text-align":"left"}},"boolean",-1),c=s("td",{style:{"text-align":"left"}},"-",-1),_=s("td",{style:{"text-align":"left"}},"true",-1),b=s("tr",null,[s("td",{style:{"text-align":"left"}},"navbar"),s("td",{style:{"text-align":"left"}},[t("是否启用导航栏,默认使用应用配置 "),s("code",null,"navbar.enable")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),x={style:{"text-align":"left"}},F=s("td",{style:{"text-align":"left"}},[t("导航栏模式,默认使用应用配置 "),s("code",null,"navbar.mode")],-1),u=s("td",{style:{"text-align":"left"}},"string",-1),f=s("td",{style:{"text-align":"left"}},"static / fixed / show-hide-fixed / sticky",-1),C=s("td",{style:{"text-align":"left"}},"-",-1),v={style:{"text-align":"left"}},m=s("td",{style:{"text-align":"left"}},"从预设中设置展示在导航栏左侧的图标按钮",-1),B=s("td",{style:{"text-align":"left"}},"string / string[]",-1),A=s("td",{style:{"text-align":"left"}},"back / home / forward / i18n",-1),D=s("td",{style:{"text-align":"left"}},"-",-1),P={style:{"text-align":"left"}},T=s("td",{style:{"text-align":"left"}},"从预设中选择展示在导航栏右侧的图标按钮",-1),S=s("td",{style:{"text-align":"left"}},"string / string[]",-1),q=s("td",{style:{"text-align":"left"}},"back / home / forward / i18n",-1),I=s("td",{style:{"text-align":"left"}},"-",-1),V=s("tr",null,[s("td",{style:{"text-align":"left"}},"tabbar"),s("td",{style:{"text-align":"left"}},[t("是否启用标签栏,默认使用应用配置 "),s("code",null,"tabbar.enable")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),N={style:{"text-align":"left"}},L=s("td",{style:{"text-align":"left"}},"标签栏名称,如果应用配置里配置了多套标签栏,需设置当前页面使用哪套标签栏,默认使用第一套",-1),w=s("td",{style:{"text-align":"left"}},"string",-1),R=s("td",{style:{"text-align":"left"}},"-",-1),$=s("td",{style:{"text-align":"left"}},"-",-1),M=s("tr",null,[s("td",{style:{"text-align":"left"}},"copyright"),s("td",{style:{"text-align":"left"}},[t("是否展示底部版权信息,默认使用应用配置 "),s("code",null,"copyright.enable")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),j=s("tr",null,[s("td",{style:{"text-align":"left"}},"backTop"),s("td",{style:{"text-align":"left"}},[t("是否启用返回顶部按钮,默认使用应用配置 "),s("code",null,"app.enableBackTop")]),s("td",{style:{"text-align":"left"}},"boolean"),s("td",{style:{"text-align":"left"}},"-"),s("td",{style:{"text-align":"left"}},"-")],-1),H={style:{"text-align":"left"}},J=s("td",{style:{"text-align":"left"}},"是否记忆滚动位置(前提条件:需开启页面缓存)",-1),O=s("td",{style:{"text-align":"left"}},"boolean",-1),W=s("td",{style:{"text-align":"left"}},"-",-1),z=s("td",{style:{"text-align":"left"}},"-",-1),G={style:{"text-align":"left"}},K=s("td",{style:{"text-align":"left"}},"设置竖向滚动条位置",-1),Q=s("td",{style:{"text-align":"left"}},"number",-1),U=s("td",{style:{"text-align":"left"}},"-",-1),X=s("td",{style:{"text-align":"left"}},"-",-1),Y={style:{"text-align":"left"}},Z=s("td",{style:{"text-align":"left"}},"设置横向滚动条位置",-1),ss=s("td",{style:{"text-align":"left"}},"number",-1),ts=s("td",{style:{"text-align":"left"}},"-",-1),is=s("td",{style:{"text-align":"left"}},"-",-1),as={style:{"text-align":"left"}},es=s("td",{style:{"text-align":"left"}},"是否在设置滚动条位置时使用动画过渡",-1),ls=s("td",{style:{"text-align":"left"}},"boolean",-1),ns=s("td",{style:{"text-align":"left"}},"-",-1),hs=s("td",{style:{"text-align":"left"}},"-",-1),ps=e("",3),ds={tabindex:"0"},ks=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"事件名"),s("th",{style:{"text-align":"left"}},"说明")])],-1),gs=s("tr",null,[s("td",{style:{"text-align":"left"}},"scroll"),s("td",{style:{"text-align":"left"}},"页面滚动时触发")],-1),Es={style:{"text-align":"left"}},rs=s("td",{style:{"text-align":"left"}},"页面滚动到顶部时触发",-1),os={style:{"text-align":"left"}},ys=s("td",{style:{"text-align":"left"}},"页面滚动到底部时触发",-1),cs=e("",6),_s={id:"mode",tabindex:"-1"},bs=s("a",{class:"header-anchor",href:"#mode","aria-label":'Permalink to "mode "'},"​",-1),xs=e("",19),Fs={id:"activeicon",tabindex:"-1"},us=s("a",{class:"header-anchor",href:"#activeicon","aria-label":'Permalink to "activeIcon "'},"​",-1),fs=e("",4),Cs={id:"badge",tabindex:"-1"},vs=s("a",{class:"header-anchor",href:"#badge","aria-label":'Permalink to "badge "'},"​",-1),ms=e("",4);function Bs(As,Ds,Ps,Ts,Ss,qs){const i=n("Badge");return p(),h("div",null,[k,s("table",g,[E,s("tbody",null,[s("tr",null,[s("td",r,[t("titleCenter "),a(i,{type:"pro",text:"专业版"})]),o,y,c,_]),b,s("tr",null,[s("td",x,[t("navbarMode "),a(i,{type:"pro",text:"专业版"})]),F,u,f,C]),s("tr",null,[s("td",v,[t("navbarStartSide "),a(i,{type:"pro",text:"专业版"})]),m,B,A,D]),s("tr",null,[s("td",P,[t("navbarEndSide "),a(i,{type:"pro",text:"专业版"})]),T,S,q,I]),V,s("tr",null,[s("td",N,[t("tabbarName "),a(i,{type:"pro",text:"专业版"})]),L,w,R,$]),M,j,s("tr",null,[s("td",H,[t("savedPosition "),a(i,{type:"pro",text:"专业版"})]),J,O,W,z]),s("tr",null,[s("td",G,[t("scrollTop "),a(i,{type:"pro",text:"专业版"}),t(),a(i,{type:"tip",text:"v0.2.0 新增"})]),K,Q,U,X]),s("tr",null,[s("td",Y,[t("scrollLeft "),a(i,{type:"pro",text:"专业版"}),t(),a(i,{type:"tip",text:"v0.2.0 新增"})]),Z,ss,ts,is]),s("tr",null,[s("td",as,[t("scrollWithAnimation "),a(i,{type:"pro",text:"专业版"}),t(),a(i,{type:"tip",text:"v0.2.0 新增"})]),es,ls,ns,hs])])]),ps,s("table",ds,[ks,s("tbody",null,[gs,s("tr",null,[s("td",Es,[t("reachTop "),a(i,{type:"tip",text:"v0.2.0 新增"})]),rs]),s("tr",null,[s("td",os,[t("reachBottom "),a(i,{type:"tip",text:"v0.2.0 新增"})]),ys])])]),cs,s("h3",_s,[t("mode "),a(i,{type:"pro",text:"专业版"}),t(),bs]),xs,s("h4",Fs,[t("activeIcon "),a(i,{type:"pro",text:"专业版"}),t(),us]),fs,s("h4",Cs,[t("badge "),a(i,{type:"pro",text:"专业版"}),t(),vs]),ms])}const Ns=l(d,[["render",Bs]]);export{Vs as __pageData,Ns as default}; diff --git a/assets/guide_permission.md.BFNZDjnV.js b/assets/guide_permission.md.BFNZDjnV.js new file mode 100644 index 0000000..b7b669c --- /dev/null +++ b/assets/guide_permission.md.BFNZDjnV.js @@ -0,0 +1,56 @@ +import{_ as s,c as i,o as a,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const c=JSON.parse('{"title":"权限","description":"","frontmatter":{},"headers":[],"relativePath":"guide/permission.md","filePath":"guide/permission.md"}'),n={name:"guide/permission.md"},h=t(`

权限

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enablePermission: true,
+  },
+}

然后在 /src/api/modules/user.ts 文件里找到 getPermissions 的方法,该方法用于登录成功后获取用户权限。在实际开发中,需要手动进行修改,框架默认通过 mock 模拟获取用户权限。

在演示源码中,默认提供了两组权限,你可以在“权限验证”导航里切换帐号查看不同权限下的效果。如果使用的不是 admintest 用户名登录,则在导航栏里看不到“权限验证”导航入口。

路由权限

在路由的 meta 配置项中,其中有一个 auth 参数,这个就是用来配置路由的权限,一个路由可以配置多个权限,当配置多个权限时,只要满足其中任何一个,则视为用户有访问该路由的权限,如下:

ts
meta: {
+  auth: ['news.browse', 'news.edit'],
+},

框架内部鉴权的逻辑是字符串比对,所以建议对权限有个统一的格式,例如为 xxx.yyy ,其中 xxx 表示模块名, yyy 表示操作类型。那么上面那个例子就表示:

  • news.browse 新闻模块的浏览权限
  • news.edit 新闻模块的编辑权限

路由权限是比较暴力的,即没有权限则该路由页面无法访问,并且也不会在导航栏中显示。但在实际业务中,遇到更多的情况通常是,可以访问路由页面,但会根据不同权限,使用页面里的不同功能,这时候就需要用到下面三种鉴权方式。

鉴权组件

页面中某个模块,当前用户具备该权限是如何显示,不具备该权限又是如何显示,针对这样的需求,框架提供了 <Auth><AuthAll> 组件,具体使用如下:

template
<!-- 单权限验证 -->
+<Auth :value="'department.create'">
+  <p>你有该权限</p>
+  <template #no-auth>
+    <p>你没有该权限</p>
+  </template>
+</Auth>
+
+<!-- 多权限验证,用户只要具备其中任何一个权限,则验证通过 -->
+<Auth :value="['department.create', 'department.edit']">
+  <p>你有该权限</p>
+  <template #no-auth>
+    <p>你没有该权限</p>
+  </template>
+</Auth>
+
+<!-- 多权限验证,用户必须具备全部权限,才验证通过 -->
+<AuthAll :value="['department.create', 'department.edit']">
+  <p>你有该权限</p>
+  <template #no-auth>
+    <p>你没有该权限</p>
+  </template>
+</AuthAll>

鉴权指令

对于单个元素,也提供了 v-authv-auth-all 鉴权指令,使用上对比鉴权组件更方便,当然它能做的事情也更简单。

template
<!-- 单权限验证 -->
+<button v-auth="'department.create'">新增部门</button>
+
+<!-- 多权限验证,用户只要具备其中任何一个权限,则验证通过 -->
+<button v-auth="['department.create', 'department.edit']">新增部门</button>
+
+<!-- 多权限验证,用户必须具备全部权限,才验证通过 -->
+<button v-auth-all="['department.create', 'department.edit']">新增部门</button>

鉴权函数

鉴权组件和鉴权指令控制的是页面上的元素,而鉴权函数则更多是使用在业务流程代码里的权限判断。

ts
import useAuth from '@/utils/composables/useAuth'
+const { auth, authAll } = useAuth()
+
+// 单权限验证,返回 true 或 false
+auth('department.create')
+
+// 多权限验证,用户只要具备其中任何一个权限,则验证通过,返回 true 或 false
+auth(['department.create', 'department.edit'])
+
+// 多权限验证,用户必须具备全部权限,才验证通过,返回 true 或 false
+authAll(['department.create', 'department.edit'])

小技巧

由于权限配置不涉及角色,所以在实现上会更灵活,开发者可自行扩展出角色层,根据不同角色动态设置该角色所拥有的权限,然后用户与角色挂钩,这样就无需繁琐的给每个用户重复分配权限。

当然了,业务有大有小,针对一些简单场景,对权限没有这么多复杂的要求,也可以将角色直接配置到 auth 里。

vue
<script setup lang="ts">
+definePage({
+  meta: {
+    auth: 'admin'
+  },
+})
+</script>
+
+<template>
+  <!-- ... -->
+</template>

如上所示,如果用户是 admin 权限,则可以访问该路由。

`,25),l=[h];function p(k,e,E,d,r,g){return a(),i("div",null,l)}const o=s(n,[["render",p]]);export{c as __pageData,o as default}; diff --git a/assets/guide_permission.md.BFNZDjnV.lean.js b/assets/guide_permission.md.BFNZDjnV.lean.js new file mode 100644 index 0000000..24e3f63 --- /dev/null +++ b/assets/guide_permission.md.BFNZDjnV.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const c=JSON.parse('{"title":"权限","description":"","frontmatter":{},"headers":[],"relativePath":"guide/permission.md","filePath":"guide/permission.md"}'),n={name:"guide/permission.md"},h=t("",25),l=[h];function p(k,e,E,d,r,g){return a(),i("div",null,l)}const o=s(n,[["render",p]]);export{c as __pageData,o as default}; diff --git a/assets/guide_plop.md.Dz4YQc8b.js b/assets/guide_plop.md.Dz4YQc8b.js new file mode 100644 index 0000000..ca7d16a --- /dev/null +++ b/assets/guide_plop.md.Dz4YQc8b.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as a,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"代码文件自动生成","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plop.md","filePath":"guide/plop.md"}'),c={name:"guide/plop.md"},p=t('

代码文件自动生成

开发过程中,避免不了手动去频繁创建页面、组件等文件,并且还要在文件里写一些必要的代码,是不是觉得很麻烦?现在你可以用更简洁的方式来处理这一切。

说明

该功能基于 plop 实现,在扩展新的模式前,请先详细阅读 plop 文档。

本套件默认提供了 3 种模式,通过 pnpm run new 指令可以自行选择。

  • page 页面文件
  • component 组件文件
  • store 全局状态文件

除了默认提供的 3 种模式,你还可以自定义新的模式,其原理就是通过预设模板,按照特定规则创建文件或者文件夹。

预设模板文件存放在 ./plop-templates/ 目录下,并在 ./plopfile.js 文件里进行引用,你可以参考现有 3 种模式的目录结构进行创建新的模板。

page

page 模式下,只能在 /src/views/ 目录下选择指定的文件夹进行生成,生成的文件中,部分关键位置会被替换掉,例如 <page-header /> 中的 title 会按照你输入的中文名称替换,页面的 name 会根据当前文件目录和文件名自动生成,确保唯一。

component

component 模式可以选择生成的是全局组件还是局部组件,全局组件生成目录为 /src/components/ ,局部组件则在 /src/views/ 目录下选择指定的文件夹进行生成。

store

store 模式则会在 /src/store/modules/ 目录下生成一个对应的文件。

',13),r=[p];function d(l,s,n,i,h,m){return a(),o("div",null,r)}const f=e(c,[["render",d]]);export{u as __pageData,f as default}; diff --git a/assets/guide_plop.md.Dz4YQc8b.lean.js b/assets/guide_plop.md.Dz4YQc8b.lean.js new file mode 100644 index 0000000..4b2dbc5 --- /dev/null +++ b/assets/guide_plop.md.Dz4YQc8b.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as a,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"代码文件自动生成","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plop.md","filePath":"guide/plop.md"}'),c={name:"guide/plop.md"},p=t("",13),r=[p];function d(l,s,n,i,h,m){return a(),o("div",null,r)}const f=e(c,[["render",d]]);export{u as __pageData,f as default}; diff --git a/assets/guide_q-a.md.CP91v9MW.js b/assets/guide_q-a.md.CP91v9MW.js new file mode 100644 index 0000000..fd5ecb5 --- /dev/null +++ b/assets/guide_q-a.md.CP91v9MW.js @@ -0,0 +1,33 @@ +import{_ as s,c as i,o as a,a5 as t,ac as n}from"./chunks/framework.D-J1Cv1C.js";const y=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/q-a.md","filePath":"guide/q-a.md"}'),e={name:"guide/q-a.md"},l=t('

常见问题

安装依赖时有警告

这是一个可以无视的警告,因为依赖已经安装成功了。

如果对这个问题感兴趣,可以浏览下这个 issue ,里面有给出一个忽略警告的方案,就是在 package.json 中添加:

json
{
+  "pnpm": {
+    "peerDependencyRules": {
+      "ignoreMissing": [
+        "postcss",
+        "rollup"
+      ]
+    }
+  }
+}

这样你下次再安装依赖的时候,就不会出现该警告了。

为什么本地开发环境首次载入很慢

主要是 Vite 的原因,具体可以阅读这篇文章了解《为什么有人说 vite 快,有人却说 vite 慢?》。

Vite 4.3 显著提升了开发服务器的性能,具体可以阅读这篇文章了解《Vite 4.3 is out!》,同时框架 v3.0.0 版本开始,vite 也升级到了 4.3 版本。

项目 URL 里的 # 号能不能去掉

这是因为路由默认使用的是 Hash 模式,你可以在 /src/router/index.ts 修改为 HTML5 模式,但需要注意,开启 HTML5 模式,服务器也需要做相应的配置调整,详细可阅读《Vue-router 不同的历史模式》。

页面切换后显示空白

因为路由切换有使用到 <transition> 动画,而 <transition> 组件无法处理多个根节点的组件,所以请检查路由对应所有的页面文件的根节点是否均为单个。

错误示例:

vue
<template>
+  <!-- 需要注意,注释也会被视为一个节点 -->
+  <h1>text h1</h1>
+  <h2>text h2</h2>
+</template>
+
+<template>
+  没有节点也是不行的
+</template>

正确示例:

vue
<template>
+  <div>
+    <h1>text h1</h1>
+    <h2>text h2</h2>
+  </div>
+</template>
+
+<template>
+  <div>
+    这样就没问题啦
+  <div>
+</template>

相关 Issue 说明。

开发环境修改代码后,路由跳转导致页面空白

参考这个 issue ,未来 Vue 官方可能会修复这个问题,目前只能手动刷新浏览器。

构建报错,提示内存溢出

构建时失败并在错误信息里提示 Reached heap limit Allocation failed - JavaScript heap out of memory

你可以执行 pnpm add cross-env -D 安装 cross-env 依赖,并在 package.json 里修改构建脚本指令:

json
{
+  "scripts": {
+    "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vue-tsc --noEmit && vite build"
+  }
+}

其中 8192 表示内存空间大小。

不会 TypeScript 怎么办

不管个人还是团队、产品或者项目,从长远考虑我们都建议你学习 TypeScript,因为它是未来的趋势,而且大部分框架、库、插件都是用 TypeScript 开发的,足以证明它是构建一款成熟稳健产品的基石。

但考虑到实际情况,会各种客观原因存在,如果必须要用传统 JavaScript 进行开发,你可以在 tsconfig.json 里将 allowJs 设置为 true 即可,框架原有的 TypeScript 代码不会受到影响,并且你也可以在项目中使用 JavaScript 编写代码。

`,29),p=[l];function h(k,E,r,d,o,c){return a(),i("div",null,p)}const u=s(e,[["render",h]]);export{y as __pageData,u as default}; diff --git a/assets/guide_q-a.md.CP91v9MW.lean.js b/assets/guide_q-a.md.CP91v9MW.lean.js new file mode 100644 index 0000000..a9162f7 --- /dev/null +++ b/assets/guide_q-a.md.CP91v9MW.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as t,ac as n}from"./chunks/framework.D-J1Cv1C.js";const y=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/q-a.md","filePath":"guide/q-a.md"}'),e={name:"guide/q-a.md"},l=t("",29),p=[l];function h(k,E,r,d,o,c){return a(),i("div",null,p)}const u=s(e,[["render",h]]);export{y as __pageData,u as default}; diff --git a/assets/guide_ready.md.PAoY2SCM.js b/assets/guide_ready.md.PAoY2SCM.js new file mode 100644 index 0000000..c53434d --- /dev/null +++ b/assets/guide_ready.md.PAoY2SCM.js @@ -0,0 +1,7 @@ +import{_ as e,c as a,o as t,a5 as i,ad as s}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"准备工作","description":"","frontmatter":{},"headers":[],"relativePath":"guide/ready.md","filePath":"guide/ready.md"}'),r={name:"guide/ready.md"},l=i(`

准备工作

源码

阅读开发文档前,请确保手上已经有 Fantastic-mobile 源码,因为文档中提及的内容,都是需要在本地项目中编写或修改代码并运行才能呈现的。

源码分为两种:

  • 框架源码 不含示例代码,可直接用于实际开发
  • 演示源码 同演示站,在框架源码基础上,提供了大量示例代码

基础版

Github Releases 页面下载最新版本的压缩包,如下图所示:

或者也可以从 Github/Gitee 上拉取源码,但需要注意,直接拉取源码可能会包含未发布的内容,最终发布时可能会有变动,请谨慎使用。

sh
# 拉取框架源码
+git clone https://github.com/fantastic-mobile/basic.git
+# 拉取演示源码
+git clone -b example https://github.com/fantastic-mobile/basic.git
sh
# 拉取框架源码
+git clone https://gitee.com/fantastic-mobile/basic.git
+# 拉取演示源码
+git clone -b example https://gitee.com/fantastic-mobile/basic.git

专业版

专业版用户会被邀请加入到 Fantastic-mobile Github 官方组织,加入组织后可访问专业版私有仓库,源码获取方式和基础版无差异,只是源码仓库不同。

如果你想获取专业版源码,可以点这里去购买。

开发环境

使用本框架前,需要在本地依次安装好 Node.js, pnpm, Git(非必须) 和 Visual Studio Code

注意

package.json 文件中有限制 node 要求版本,建议使用最新 LTS 版本。

然后在 Visual Studio Code 里安装好以下扩展:

在 Visual Studio Code 里打开源码文件夹,右下角会自动提示需要安装的依赖,直接点击安装即可。

额外推荐

以上为开发时必备扩展,以下则是作者推荐安装的扩展,安装它们将在一定程度上提升开发效率。

技术栈

了解并熟悉框架使用到的技术栈,能让你使用本框架更得心应手。

',22),n=[l];function o(h,p,c,d,k,g){return t(),a("div",null,n)}const b=e(r,[["render",o]]);export{u as __pageData,b as default}; diff --git a/assets/guide_ready.md.PAoY2SCM.lean.js b/assets/guide_ready.md.PAoY2SCM.lean.js new file mode 100644 index 0000000..c43fe91 --- /dev/null +++ b/assets/guide_ready.md.PAoY2SCM.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as i,ad as s}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"准备工作","description":"","frontmatter":{},"headers":[],"relativePath":"guide/ready.md","filePath":"guide/ready.md"}'),r={name:"guide/ready.md"},l=i("",22),n=[l];function o(h,p,c,d,k,g){return t(),a("div",null,n)}const b=e(r,[["render",o]]);export{u as __pageData,b as default}; diff --git a/assets/guide_replace-to-nut.md.Cg3KO3ql.js b/assets/guide_replace-to-nut.md.Cg3KO3ql.js new file mode 100644 index 0000000..214e45e --- /dev/null +++ b/assets/guide_replace-to-nut.md.Cg3KO3ql.js @@ -0,0 +1,63 @@ +import{_ as s,c as i,o as a,a5 as n,ae as t}from"./chunks/framework.D-J1Cv1C.js";const c=JSON.parse('{"title":"替换为 NutUI","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-nut.md","filePath":"guide/replace-to-nut.md"}'),h={name:"guide/replace-to-nut.md"},l=n(`

替换为 NutUI

由于框架默认使用的是 Vant 组件库,并且演示源码中大量示例也使用了 Vant,如果你需要使用 NutUI,请拉取框架源码分支,或者到 Github Releases 页面下载框架源码压缩包。

专业版用户也同样,请到专业版仓库下载框架源码。

安装

sh
# 安装依赖
+pnpm install
+
+# 安装 NutUI
+pnpm add @nutui/nutui @nutui/touch-emulator

代码调整

基础版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import NutUI from '@nutui/nutui'
+import '@nutui/nutui/dist/style.css'
+import '@nutui/touch-emulator'
+
+function install(app: App) {
+  app.use(NutUI)
+}
+
+export default { install }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { Locale } from '@nutui/nutui'
+import zhCN from '@nutui/nutui/dist/packages/locale/lang/zh-CN'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+Locale.use('zh-CN', zhCN)
+</script>
+
+<template>
+  <NutConfigProvider :theme="settingsStore.currentColorScheme" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </NutConfigProvider>
+</template>
专业版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import NutUI from '@nutui/nutui'
+import '@nutui/nutui/dist/style.css'
+import '@nutui/touch-emulator'
+import zhCN from '@nutui/nutui/dist/packages/locale/lang/zh-CN'
+import enUS from '@nutui/nutui/dist/packages/locale/lang/en-US'
+
+function install(app: App) {
+  app.use(NutUI)
+}
+
+// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
+const locales: Record<string, any> = {
+  'zh-cn': zhCN,
+  'en-us': enUS,
+}
+
+export default { install }
+export { locales }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { Locale } from 'vant'
+import { locales } from './index'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+watch(() => settingsStore.lang, () => {
+  Locale.use(settingsStore.lang, locales[settingsStore.lang])
+})
+</script>
+
+<template>
+  <NutConfigProvider :theme="settingsStore.currentColorScheme" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </NutConfigProvider>
+</template>

修改登录页

由于登录页使用了 Vant 组件,并且删除会导致框架无法正常使用,所以此处需要开发者自行修改或者重新制作登录页,或者也可以参考下方示例中已经修改好的登录页。

卸载

sh
# 卸载 Vant
+pnpm remove vant @vant/touch-emulator

完成

至此,你已经将框架中的 Vant 组件库替换为 NutUI 组件库,并且可以开始使用 NutUI 进行业务开发了。

示例

如果对上述的步骤还有不清楚的地方,可以访问此仓库查看示例源码,以及此链接查看示例网站。

',17),p=[l];function k(e,r,E,d,g,y){return a(),i("div",null,p)}const F=s(h,[["render",k]]);export{c as __pageData,F as default}; diff --git a/assets/guide_replace-to-nut.md.Cg3KO3ql.lean.js b/assets/guide_replace-to-nut.md.Cg3KO3ql.lean.js new file mode 100644 index 0000000..7ca5665 --- /dev/null +++ b/assets/guide_replace-to-nut.md.Cg3KO3ql.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n,ae as t}from"./chunks/framework.D-J1Cv1C.js";const c=JSON.parse('{"title":"替换为 NutUI","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-nut.md","filePath":"guide/replace-to-nut.md"}'),h={name:"guide/replace-to-nut.md"},l=n("",17),p=[l];function k(e,r,E,d,g,y){return a(),i("div",null,p)}const F=s(h,[["render",k]]);export{c as __pageData,F as default}; diff --git a/assets/guide_replace-to-varlet.md.ZYN0cTJ3.js b/assets/guide_replace-to-varlet.md.ZYN0cTJ3.js new file mode 100644 index 0000000..172dc6f --- /dev/null +++ b/assets/guide_replace-to-varlet.md.ZYN0cTJ3.js @@ -0,0 +1,73 @@ +import{_ as s,c as i,o as a,a5 as n,af as l}from"./chunks/framework.D-J1Cv1C.js";const F=JSON.parse('{"title":"替换为 Varlet","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-varlet.md","filePath":"guide/replace-to-varlet.md"}'),t={name:"guide/replace-to-varlet.md"},h=n(`

替换为 Varlet

由于框架默认使用的是 Vant 组件库,并且演示源码中大量示例也使用了 Vant,如果你需要使用 Varlet,请拉取框架源码分支,或者到 Github Releases 页面下载框架源码压缩包。

专业版用户也同样,请到专业版仓库下载框架源码。

安装

sh
# 安装依赖
+pnpm install
+
+# 安装 NutUI
+pnpm add @varlet/ui @varlet/touch-emulator

代码调整

基础版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import Varlet from '@varlet/ui'
+import '@varlet/ui/es/style'
+import '@varlet/touch-emulator'
+
+function install(app: App) {
+  app.use(Varlet)
+}
+
+export default { install }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { Locale, StyleProvider, Themes } from '@varlet/ui'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+watch(() => settingsStore.currentColorScheme, (val) => {
+  if (val === 'light') {
+    StyleProvider(null)
+  }
+  else {
+    StyleProvider(Themes.dark)
+  }
+})
+</script>
+
+<template>
+  <VarLocaleProvider locale="zh-CN" :messages="Locale.zhCN" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </VarLocaleProvider>
+</template>
专业版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import Varlet, { Locale } from '@varlet/ui'
+import '@varlet/ui/es/style'
+import '@varlet/touch-emulator'
+import enUS from 'vant/es/locale/lang/en-US'
+import zhCN from 'vant/es/locale/lang/zh-CN'
+
+function install(app: App) {
+  app.use(Varlet)
+}
+
+// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
+const locales: Record<string, any> = {
+  'zh-cn': Locale.zhCN,
+  'en-us': Locale.enUS,
+}
+
+export default { install }
+export { locales }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { locales } from './index'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+watch(() => settingsStore.currentColorScheme, (val) => {
+  if (val === 'light') {
+    StyleProvider(null)
+  }
+  else {
+    StyleProvider(Themes.dark)
+  }
+})
+</script>
+
+<template>
+  <VarLocaleProvider :locale="settingsStore.lang" :messages="locales[settingsStore.lang]" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </VarLocaleProvider>
+</template>

修改登录页

由于登录页使用了 Vant 组件,并且删除会导致框架无法正常使用,所以此处需要开发者自行修改或者重新制作登录页,或者也可以参考下方示例中已经修改好的登录页。

卸载

sh
# 卸载 Vant
+pnpm remove vant @vant/touch-emulator

完成

至此,你已经将框架中的 Vant 组件库替换为 Varlet 组件库,并且可以开始使用 Varlet 进行业务开发了。

示例

如果对上述的步骤还有不清楚的地方,可以访问此仓库查看示例源码,以及此链接查看示例网站。

',17),p=[h];function k(e,r,E,d,g,y){return a(),i("div",null,p)}const c=s(t,[["render",k]]);export{F as __pageData,c as default}; diff --git a/assets/guide_replace-to-varlet.md.ZYN0cTJ3.lean.js b/assets/guide_replace-to-varlet.md.ZYN0cTJ3.lean.js new file mode 100644 index 0000000..cdaa31f --- /dev/null +++ b/assets/guide_replace-to-varlet.md.ZYN0cTJ3.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n,af as l}from"./chunks/framework.D-J1Cv1C.js";const F=JSON.parse('{"title":"替换为 Varlet","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-varlet.md","filePath":"guide/replace-to-varlet.md"}'),t={name:"guide/replace-to-varlet.md"},h=n("",17),p=[h];function k(e,r,E,d,g,y){return a(),i("div",null,p)}const c=s(t,[["render",k]]);export{F as __pageData,c as default}; diff --git a/assets/guide_router.md.D9QTFdeu.js b/assets/guide_router.md.D9QTFdeu.js new file mode 100644 index 0000000..da11dba --- /dev/null +++ b/assets/guide_router.md.D9QTFdeu.js @@ -0,0 +1,32 @@ +import{_ as e,c as a,o as s,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const k=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/router.md","filePath":"guide/router.md"}'),n={name:"guide/router.md"},i=t(`

路由

框架无需手动配置路由,而是基于文件系统自动生成路由,意味着开发者只需在 /src/views/ 目录下创建文件,就会根据文件目录自动生成对应的路由,该能力由 unplugin-vue-router 提供。

配置规范

如果对 unplugin-vue-router 的规范还不了解,建议先阅读官方文档。框架在此基础上,预设了一些规范。以下面的目录结构为例:

目录结构                       路由地址                    路由 name
+
+src/views/
+├── _about
+│   └── index.vue
+├── example
+│   ├── _test.vue
+│   ├── components
+│   │   └── dialog.vue
+│   ├── svgicon.vue          /example/svgicon           /example/svgicon
+│   └── index.vue            /example                   /example/
+├── cart
+│   ├── detail
+│   │   └── [id].vue         /cart/detail/:id           /cart/detail/[id]
+│   └── index.vue            /cart                      /cart/
+├── news
+│   ├── detail.[id].vue      /news/detail/:id           /news/detail.[id]
+│   └── index.vue            /news                      /news/
+├── [...all].vue             /:all(.*)                  /[...all]
+├── index.vue                /                          /
+└── login.vue                /login                     /login

通过上面的示例,可以看出几个规范:

  • 文件夹或文件名开头为 _ 的不会生成路由
  • 所有 components 文件夹下的文件均不会生成路由
  • index.vue 文件会生成一个空路由,例如 /src/views/news/index.vue -> /news 路由
  • 路由参数通过 [ ] 将参数名包裹,例如 /src/views/user_[id].vue -> /user_:id 路由。设置可以添加多个参数 /src/views/product_[skuId]_[seoDescription].vue
  • 路由 name 默认为文件路径,也可通过 definePage().vue 文件内设置并覆盖

注意

默认生成的路由可能为嵌套路由,但为了用一套 API 统一处理页面缓存,框架会将所有路由均处理成一级路由,并在 App.vue 里处理缓存逻辑。意味着如果同时创建 /src/views/users/index.vue/src/views/users.vue 组件,/src/views/users/index.vue 不会在 /src/views/users.vue<RouterView> 中呈现。

这也意味着 /src/views/users/detail/[id].vue/src/views/users/detail.[id].vue 生成的路由和行为都是一样的,只有路由 name 有区别。

这与 unplugin-vue-router 默认行为略有不同。

definePage()

通过 definePage() 可以修改路由对象或添加路由元信息:

vue
<script setup lang="ts">
+definePage({
+  name: 'example',
+  meta: {
+    title: '示例'
+  },
+})
+</script>
+
+<template>
+  <!-- ... -->
+</template>

警告

不能在 definePage() 中使用变量,因为其传递的参数会在构建时提取并从 <script setup> 中删除。

路由元信息

title

类型默认值说明
string/浏览器及页面中展示的标题

支持设置 i18n 对应的 key 值,详细可阅读《国际化》。

cache

类型默认值说明
boolean / string / string[]/是否对该页面进行缓存
  • boolean 设置为 true 时,该路由页面会被一直缓存
  • string 设置某个目标路由的 name ,表示当前路由页面跳转到设置的 name 对应的路由页面时,则将当前路由页面进行缓存,否则不缓存
  • string[] ,可设置一个目标路由的 name 数组

当类型为 stringstring[] 时,可以更精细的去控制页面缓存的逻辑。例如从列表页进入详情页,则需要将列表页进行缓存;而从列表页进入其它页面,则无需将列表页进行缓存。详细可阅读《页面缓存》。

noCache

类型默认值说明
string / string[]/是否对该页面清除缓存,需设置 cache 才会生效
  • string 设置某个目标路由的 name ,表示当前路由页面跳转到设置的 name 对应的路由页面时,则将当前路由页面清除缓存,否则不清除缓存
  • string[] ,可设置一个目标路由的 name 数组

该属性通常搭配 cache: true 使用,可以更精细的去控制页面取消缓存的逻辑。详细可阅读《页面缓存》。

auth

类型默认值说明
boolean / string / string[]/该路由访问权限
  • boolean 设置为 true 时,该路由仅登录用户可访问
  • string 设置某个权限的名称,表示当前路由仅允许具备该权限的用户可访问
  • string[] 设置多个权限的名称数组,表示当前路由允许具备其中一个权限的用户可访问

当类型为 stringstring[] 时,可以更精细的去控制页面权限,不具备访问权限则会显示 403 页面,详细可阅读《权限 - 路由权限》。

`,28),l=[i];function p(d,c,h,r,o,g){return s(),a("div",null,l)}const E=e(n,[["render",p]]);export{k as __pageData,E as default}; diff --git a/assets/guide_router.md.D9QTFdeu.lean.js b/assets/guide_router.md.D9QTFdeu.lean.js new file mode 100644 index 0000000..74a322f --- /dev/null +++ b/assets/guide_router.md.D9QTFdeu.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as s,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const k=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/router.md","filePath":"guide/router.md"}'),n={name:"guide/router.md"},i=t("",28),l=[i];function p(d,c,h,r,o,g){return s(),a("div",null,l)}const E=e(n,[["render",p]]);export{k as __pageData,E as default}; diff --git a/assets/guide_start.md.CQ8Y9Aeo.js b/assets/guide_start.md.CQ8Y9Aeo.js new file mode 100644 index 0000000..12a6030 --- /dev/null +++ b/assets/guide_start.md.CQ8Y9Aeo.js @@ -0,0 +1,6 @@ +import{_ as s,c as a,o as e,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"开始","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start.md","filePath":"guide/start.md"}'),t={name:"guide/start.md"},i=n(`

开始

准备工作完成后,在源码文件夹根目录下依次执行以下命令:

sh
# 安装依赖
+# 注意,必须使用 pnpm 安装依赖,请勿使用 npm 或 yarn 安装依赖
+pnpm install
+
+# 运行
+pnpm run dev

运行成功后,会自动访问页面,默认地址为 http://localhost:9000

报错

如果无法正常安装依赖,可能是因为 npm 默认源无法访问,可以尝试执行 pnpm config set registry https://registry.npmmirror.com/ 切换为国内 npmmirror 镜像源(也可以使用 nrm 一键切换源),然后删除根目录下 /node_modules 文件夹并重新安装依赖。

如果依旧无法运行(基本不太可能),可尝试删除根目录下 /node_modules 文件夹与 pnpm-lock.yaml 文件后,再删除 package.json"preinstall": "npx only-allow pnpm" 这句脚本,最后使用 npm / yarn 或其他包管理工具进行安装依赖。但需要清楚一点,这样操作后,将无法与官方环境锁定的依赖包版本保持一致,可能会出现无法预知的问题,非必要情况下,请勿使用该方案。

`,5),p=[i];function o(l,c,r,d,h,k){return e(),a("div",null,p)}const g=s(t,[["render",o]]);export{_ as __pageData,g as default}; diff --git a/assets/guide_start.md.CQ8Y9Aeo.lean.js b/assets/guide_start.md.CQ8Y9Aeo.lean.js new file mode 100644 index 0000000..d63335c --- /dev/null +++ b/assets/guide_start.md.CQ8Y9Aeo.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as e,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"开始","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start.md","filePath":"guide/start.md"}'),t={name:"guide/start.md"},i=n("",5),p=[i];function o(l,c,r,d,h,k){return e(),a("div",null,p)}const g=s(t,[["render",o]]);export{_ as __pageData,g as default}; diff --git a/assets/guide_storage.md.DOKcJ7lZ.js b/assets/guide_storage.md.DOKcJ7lZ.js new file mode 100644 index 0000000..5a13e65 --- /dev/null +++ b/assets/guide_storage.md.DOKcJ7lZ.js @@ -0,0 +1,17 @@ +import{_ as e,D as t,c as n,j as i,a as s,I as l,a5 as p,o as h}from"./chunks/framework.D-J1Cv1C.js";const v=JSON.parse('{"title":"私有 Storage 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/storage.md","filePath":"guide/storage.md"}'),k={name:"guide/storage.md"},r={id:"私有-storage-数据",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#私有-storage-数据","aria-label":'Permalink to "私有 Storage 数据 "'},"​",-1),g=p(`

由于 localStorage 和 sessionStorage 的同源策略,同一域名下的 storage 数据会共享。如果你恰好需要在同一域名下部署两套(及以上)系统,不可避免会出现 storage 数据冲突,框架提供了一个 storage 类来解决这个问题。

解决同源 storage 数据冲突的方式就是增加前缀区分,首先需要在应用配置中设置一个唯一且不重名的前缀:

ts
const globalSettings: Settings.all = {
+  app: {
+    storagePrefix: 'fm_',
+  },
+}

然后在需要使用到 storage 的地方引入:

ts
import storage from '@/utils/storage'

这个类封装了 setItem()getItem()removeItem()clear() 方法,同时还增加了一个 has() 方法用来判断对象是否存在:

ts
// localStorage
+storage.local.has(key)
+storage.local.get(key)
+storage.local.set(key, value)
+storage.local.remove(key)
+storage.local.clear()
+
+// sessionStorage
+storage.session.has(key)
+storage.session.get(key)
+storage.session.set(key, value)
+storage.session.remove(key)
+storage.session.clear()

注意

由于 localStorage 有容量上限,一般为 5M ,如果一同域名下部署两套系统,意味着两套系统共享 5M 容量,所以不建议在同一域名部署太多套系统,避免出现 localStorage 不够用的情况。

`,8);function d(E,c,y,F,_,m){const a=t("Badge");return h(),n("div",null,[i("h1",r,[s("私有 Storage 数据 "),l(a,{type:"pro",text:"专业版"}),s(),o]),g])}const C=e(k,[["render",d]]);export{v as __pageData,C as default}; diff --git a/assets/guide_storage.md.DOKcJ7lZ.lean.js b/assets/guide_storage.md.DOKcJ7lZ.lean.js new file mode 100644 index 0000000..90c4ac1 --- /dev/null +++ b/assets/guide_storage.md.DOKcJ7lZ.lean.js @@ -0,0 +1 @@ +import{_ as e,D as t,c as n,j as i,a as s,I as l,a5 as p,o as h}from"./chunks/framework.D-J1Cv1C.js";const v=JSON.parse('{"title":"私有 Storage 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/storage.md","filePath":"guide/storage.md"}'),k={name:"guide/storage.md"},r={id:"私有-storage-数据",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#私有-storage-数据","aria-label":'Permalink to "私有 Storage 数据 "'},"​",-1),g=p("",8);function d(E,c,y,F,_,m){const a=t("Badge");return h(),n("div",null,[i("h1",r,[s("私有 Storage 数据 "),l(a,{type:"pro",text:"专业版"}),s(),o]),g])}const C=e(k,[["render",d]]);export{v as __pageData,C as default}; diff --git a/assets/guide_store.md.BpEcm4ka.js b/assets/guide_store.md.BpEcm4ka.js new file mode 100644 index 0000000..0ad92d9 --- /dev/null +++ b/assets/guide_store.md.BpEcm4ka.js @@ -0,0 +1,16 @@ +import{_ as s,c as i,o as a,a5 as e}from"./chunks/framework.D-J1Cv1C.js";const g=JSON.parse('{"title":"全局状态管理","description":"","frontmatter":{},"headers":[],"relativePath":"guide/store.md","filePath":"guide/store.md"}'),n={name:"guide/store.md"},t=e(`

全局状态管理

TIP

Pinia 已正式成为 Vue.js 官方状态库,如果你对 Pinia 还不熟悉,除了通过 Pinia 官网学习外,我还收集了一些文字/视频的介绍,可以帮助你快速上手。

全局状态文件存放在 /src/store/modules/ 目录下,请按模块进行区分。同时请保证文件名和文件内唯一ID保持一致,建议使用 pnpm new 指令进行创建。

例如新建一个 example.ts 的文件:

ts
const useExampleStore = defineStore(
+  // 唯一ID
+  'example',
+  () => {
+    const someThing = ref(0)
+
+    return {
+      someThing,
+    }
+  },
+)
+
+export default useExampleStore

使用方法:

ts
import useExampleStore from '@/store/modules/example'
+const exampleStore = useExampleStore()
+
+exampleStore.someThing
`,7),l=[t];function p(h,k,r,d,o,c){return a(),i("div",null,l)}const y=s(n,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/guide_store.md.BpEcm4ka.lean.js b/assets/guide_store.md.BpEcm4ka.lean.js new file mode 100644 index 0000000..a9b43cb --- /dev/null +++ b/assets/guide_store.md.BpEcm4ka.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as e}from"./chunks/framework.D-J1Cv1C.js";const g=JSON.parse('{"title":"全局状态管理","description":"","frontmatter":{},"headers":[],"relativePath":"guide/store.md","filePath":"guide/store.md"}'),n={name:"guide/store.md"},t=e("",7),l=[t];function p(h,k,r,d,o,c){return a(),i("div",null,l)}const y=s(n,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/guide_svg-icon.md.Ce1T8AF7.js b/assets/guide_svg-icon.md.Ce1T8AF7.js new file mode 100644 index 0000000..6870331 --- /dev/null +++ b/assets/guide_svg-icon.md.Ce1T8AF7.js @@ -0,0 +1,12 @@ +import{_ as s,c as i,o as a,a5 as t,ag as n,ah as e}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"图标","description":"","frontmatter":{},"headers":[],"relativePath":"guide/svg-icon.md","filePath":"guide/svg-icon.md"}'),l={name:"guide/svg-icon.md"},h=t(`

图标

框架提供了三种使用图标的方式,你可以根据自己的使用需求自行选择。

自定义图标

你可以去阿里巴巴矢量图标库,或者其它支持下载 SVG 图标文件的网站,又或者是设计师绘制的 SVG 文件,将准备好的 SVG 图标文件放到 /src/assets/icons/ 目录下,然后在页面中就可以通过 SvgIcon 组件使用了,name 就是 svg 的文件名。

vue
<!-- /src/assets/icons/example.svg -->
+<SvgIcon name="example" />

Iconify 图标

介绍

Iconify 提供 100+ 套图标集,有 100,000+ 个图标可以免费使用。

除了可以在 Iconify 官网上查找搜需要的图标,你还可以在 Icônes 网站 上查找,这是一个基于 Iconify 的在线图标搜索网站,它比 Iconify 官网的操作更直观。

Unocss 方案

说明

Unocss 方案采用了 CSS 去处理图标的展示,框架大部分核心模块里采用的是这种方式,如果你对其中的技术细节感兴趣,可以阅读这篇 Unocss 作者的《聊聊纯 CSS 图标》这篇文章。

框架已经做好了所有配置,使用方式也极为简单,你只需进入 Iconify 官网 上查找 Iconify 提供的所有图标,然后点击需要使用的图标,复制图标名称,在任意原生 HTML 标签上通过设置 class ,格式为 i-{集合名}:{图标名},例如:

vue
<div class="i-ep:arrow-right" />
+<i class="i-ep:search" />

当然你同样也可以通过 SvgIcon 使用它。

vue
<SvgIcon name="i-ep:arrow-right" />

在使用 Unocss 图标时,需要注意以下两点:

  • 图标字符串不支持拼接

    vue
    <!-- 这样不会生效 -->
    +<SvgIcon :name="'i-ep' + ':search'" />
  • 图标字符串不支持异步返回

    vue
    <!-- 这样不会生效 -->
    +<!-- 假设 name 是异步请求返回的数据,name 为 i-ep:search -->
    +<SvgIcon :name="name" />

如果确实有以上需求,你可以使用 Iconify 原生提供的方案。

Iconify 原生方案

说明

框架保留了 Iconify 官方提供的使用方式,格式为 {集合名}:{图标名}

vue
<script setup>
+import { Icon } from '@iconify/vue'
+</script>
+
+<template>
+  <Icon icon="ep:arrow-right" />
+</template>

当然这么使用并没有很方便,依旧还是需要手动导入一个 Icon 组件。如果你也觉得麻烦的话,那么你可以使用 SvgIcon 组件来展示,框架已经帮你做好的所有处理。

vue
<SvgIcon name="ep:arrow-right" />
`,24),p=[h];function k(o,r,c,d,E,g){return a(),i("div",null,p)}const v=s(l,[["render",k]]);export{u as __pageData,v as default}; diff --git a/assets/guide_svg-icon.md.Ce1T8AF7.lean.js b/assets/guide_svg-icon.md.Ce1T8AF7.lean.js new file mode 100644 index 0000000..8c1be02 --- /dev/null +++ b/assets/guide_svg-icon.md.Ce1T8AF7.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as t,ag as n,ah as e}from"./chunks/framework.D-J1Cv1C.js";const u=JSON.parse('{"title":"图标","description":"","frontmatter":{},"headers":[],"relativePath":"guide/svg-icon.md","filePath":"guide/svg-icon.md"}'),l={name:"guide/svg-icon.md"},h=t("",24),p=[h];function k(o,r,c,d,E,g){return a(),i("div",null,p)}const v=s(l,[["render",k]]);export{u as __pageData,v as default}; diff --git a/assets/guide_theme.md.DoCHY_Cl.js b/assets/guide_theme.md.DoCHY_Cl.js new file mode 100644 index 0000000..6528fff --- /dev/null +++ b/assets/guide_theme.md.DoCHY_Cl.js @@ -0,0 +1,129 @@ +import{_ as k,D as l,c as p,j as i,a as s,I as h,a5 as a,o as t,ai as e}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"主题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/theme.md","filePath":"guide/theme.md"}'),E={name:"guide/theme.md"},r=a(`

主题

框架主题

主题配色存放在 /themes/index.ts 文件中,基础版和专业版内容略有不同。

基础版

ts
import { hex2rgba } from '@unocss/preset-mini/utils'
+
+export const lightTheme = {
+  // 颜色主题
+  'color-scheme': 'light',
+  // 内置 UI
+  '--ui-primary': hex2rgba('#0f0f0f')!.join(' '),
+  '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
+  // 主体
+  '--g-bg': '#f2f2f2',
+  '--g-container-bg': '#fff',
+  '--g-border-color': '#DCDFE6',
+  // 导航栏
+  '--g-navbar-bg': '#fff',
+  '--g-navbar-color': '#0f0f0f',
+  // 标签栏
+  '--g-tabbar-bg': '#fff',
+  '--g-tabbar-color': '#6f6f6f',
+  '--g-tabbar-active-color': '#0f0f0f',
+}
+
+export const darkTheme = {
+  // 颜色主题
+  'color-scheme': 'dark',
+  // 内置 UI
+  '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
+  '--ui-text': hex2rgba('#242b33')!.join(' '),
+  // 主体
+  '--g-bg': '#0a0a0a',
+  '--g-container-bg': '#141414',
+  '--g-border-color': '#15191e',
+  // 导航栏
+  '--g-navbar-bg': '#141414',
+  '--g-navbar-color': '#e5e5e5',
+  // 标签栏
+  '--g-tabbar-bg': '#141414',
+  '--g-tabbar-color': '#6f6f6f',
+  '--g-tabbar-active-color': '#e5e5e5',
+}

专业版

与基础版不同,专业版默认提供了 12 款主题,明亮和暗黑模式各 6 款,并且主题在运行时共存,可实现动态切换。

ts
import { hex2rgba } from '@unocss/preset-mini/utils'
+
+export default {
+  light: {
+    // 颜色主题
+    'color-scheme': 'light',
+    // 内置 UI
+    '--ui-primary': hex2rgba('#0f0f0f')!.join(' '),
+    '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
+    // 主体
+    '--g-bg': '#f2f2f2',
+    '--g-container-bg': '#fff',
+    '--g-border-color': '#DCDFE6',
+    // 导航栏
+    '--g-navbar-bg': '#fff',
+    '--g-navbar-color': '#0f0f0f',
+    // 标签栏
+    '--g-tabbar-bg': '#fff',
+    '--g-tabbar-color': '#6f6f6f',
+    '--g-tabbar-active-color': '#0f0f0f',
+  },
+  ...
+  dark: {
+    // 颜色主题
+    'color-scheme': 'dark',
+    // 内置 UI
+    '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
+    '--ui-text': hex2rgba('#242b33')!.join(' '),
+    // 主体
+    '--g-bg': '#0a0a0a',
+    '--g-container-bg': '#141414',
+    '--g-border-color': '#15191e',
+    // 导航栏
+    '--g-navbar-bg': '#141414',
+    '--g-navbar-color': '#e5e5e5',
+    // 标签栏
+    '--g-tabbar-bg': '#141414',
+    '--g-tabbar-color': '#6f6f6f',
+    '--g-tabbar-active-color': '#e5e5e5',
+  },
+  ...
+}

如果框架提供的主题风格满足不了你的需求,你还可以自定义新的主题。

ts
import { hex2rgba } from '@unocss/preset-mini/utils'
+
+export default {
+  newThemeName: { // 主题名称
+    // 颜色主题
+    'color-scheme': 'light',
+    // 内置 UI
+    '--ui-primary': hex2rgba('#0f0f0f')!.join(' '),
+    '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
+    // 主体
+    '--g-bg': '#f2f2f2',
+    '--g-container-bg': '#fff',
+    '--g-border-color': '#DCDFE6',
+    // 导航栏
+    '--g-navbar-bg': '#fff',
+    '--g-navbar-color': '#0f0f0f',
+    // 标签栏
+    '--g-tabbar-bg': '#fff',
+    '--g-tabbar-color': '#6f6f6f',
+    '--g-tabbar-active-color': '#0f0f0f',
+  },
+}

最后在应用配置中使用该主题:

ts
const globalSettings: Settings.all = {
+  app: {
+    // 如果主题是暗黑模式下使用的,则 darkTheme: 'newThemeName'
+    lightTheme: 'newThemeName',
+  },
+}

颜色方案

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    /**
+     * 留空跟随系统
+     * light 明亮模式
+     * dark 暗黑模式
+     */
+    colorScheme: '',
+  },
+}
`,16),g={id:"哀悼模式",tabindex:"-1"},d=i("a",{class:"header-anchor",href:"#哀悼模式","aria-label":'Permalink to "哀悼模式 "'},"​",-1),F=a(`

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableMournMode: true,
+  },
+}
`,2),y={id:"色弱模式",tabindex:"-1"},c=i("a",{class:"header-anchor",href:"#色弱模式","aria-label":'Permalink to "色弱模式 "'},"​",-1),o=a(`

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableColorAmblyopiaMode: true,
+  },
+}

开发注意

如果只在明亮或暗黑模式中,选择其中一种模式进行业务开发,那没有什么需要注意的,你可以按照以往的开发习惯进行开发,这也是框架推荐的方式。

但如果需要让用户可以自己选择明亮或暗黑模式,或者是根据浏览器主题来判断是使用明亮还是暗黑模式。这时候开发则需要注意,业务页面里使用到的颜色将不能写成固定值(例如 color 、background-color 、border-color 、box-shadow 等有涉及到颜色的属性),因为同一个色值是无法顾及到明亮和暗黑两种模式的。

这时候我们建议使用 UnoCSS 进行样式编写,例如 text-dark dark-text-whitebg-green dark-bg-red 。如果你不习惯使用 UnoCSS ,那也可以使用下面这种方法,在页面中去自定义一些颜色。

scss
div {
+  color: #000;
+
+  [data-theme="dark"] & {
+    color: #fff;
+  }
+}

最后分享一篇关于暗黑模式的文章《教你巧用UI设计中的暗黑模式——Dark Mode》,希望帮助你更好地在暗黑模式下开发出优秀的页面。

`,8);function C(B,b,D,A,f,u){const n=l("Badge");return t(),p("div",null,[r,i("h2",g,[s("哀悼模式 "),h(n,{type:"tip",text:"v0.2.0 新增"}),s(),d]),F,i("h2",y,[s("色弱模式 "),h(n,{type:"tip",text:"v0.2.0 新增"}),s(),c]),o])}const v=k(E,[["render",C]]);export{_ as __pageData,v as default}; diff --git a/assets/guide_theme.md.DoCHY_Cl.lean.js b/assets/guide_theme.md.DoCHY_Cl.lean.js new file mode 100644 index 0000000..f2f4795 --- /dev/null +++ b/assets/guide_theme.md.DoCHY_Cl.lean.js @@ -0,0 +1 @@ +import{_ as k,D as l,c as p,j as i,a as s,I as h,a5 as a,o as t,ai as e}from"./chunks/framework.D-J1Cv1C.js";const _=JSON.parse('{"title":"主题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/theme.md","filePath":"guide/theme.md"}'),E={name:"guide/theme.md"},r=a("",16),g={id:"哀悼模式",tabindex:"-1"},d=i("a",{class:"header-anchor",href:"#哀悼模式","aria-label":'Permalink to "哀悼模式 "'},"​",-1),F=a("",2),y={id:"色弱模式",tabindex:"-1"},c=i("a",{class:"header-anchor",href:"#色弱模式","aria-label":'Permalink to "色弱模式 "'},"​",-1),o=a("",8);function C(B,b,D,A,f,u){const n=l("Badge");return t(),p("div",null,[r,i("h2",g,[s("哀悼模式 "),h(n,{type:"tip",text:"v0.2.0 新增"}),s(),d]),F,i("h2",y,[s("色弱模式 "),h(n,{type:"tip",text:"v0.2.0 新增"}),s(),c]),o])}const v=k(E,[["render",C]]);export{_ as __pageData,v as default}; diff --git a/assets/guide_title.md.4qYTrMaW.js b/assets/guide_title.md.4qYTrMaW.js new file mode 100644 index 0000000..4edd0ff --- /dev/null +++ b/assets/guide_title.md.4qYTrMaW.js @@ -0,0 +1,5 @@ +import{_ as s,c as i,o as a,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const E=JSON.parse('{"title":"动态标题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/title.md","filePath":"guide/title.md"}'),e={name:"guide/title.md"},n=t(`

动态标题

让网页标题显示路由配置的 meta.title 字段。

使用

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableDynamicTitle: true,
+  },
+}
`,5),l=[n];function h(p,d,k,r,o,c){return a(),i("div",null,l)}const _=s(e,[["render",h]]);export{E as __pageData,_ as default}; diff --git a/assets/guide_title.md.4qYTrMaW.lean.js b/assets/guide_title.md.4qYTrMaW.lean.js new file mode 100644 index 0000000..21088d0 --- /dev/null +++ b/assets/guide_title.md.4qYTrMaW.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as t}from"./chunks/framework.D-J1Cv1C.js";const E=JSON.parse('{"title":"动态标题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/title.md","filePath":"guide/title.md"}'),e={name:"guide/title.md"},n=t("",5),l=[n];function h(p,d,k,r,o,c){return a(),i("div",null,l)}const _=s(e,[["render",h]]);export{E as __pageData,_ as default}; diff --git a/assets/guide_upgrade.md.MYKFZrm3.js b/assets/guide_upgrade.md.MYKFZrm3.js new file mode 100644 index 0000000..8f31be5 --- /dev/null +++ b/assets/guide_upgrade.md.MYKFZrm3.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as o}from"./chunks/framework.D-J1Cv1C.js";const g=JSON.parse('{"title":"框架更新","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade.md","filePath":"guide/upgrade.md"}'),r={name:"guide/upgrade.md"},i=o('

框架更新

首先明确一点,Fantastic-mobile 无法像 npm 的插件一样更新,不仅我们的框架如此,其实大部分 H5 开发框架都是如此。

因为本质上这类框架其实是一个初始框架,开发者会根据自身需求去修改,然后基于业务开展业务代码编写。所以一旦下载开始使用,基本是无法更新的,你在哪个时间点开始使用,项目就固定在什么版本了。

那有没有解决办法么?其实也有,参考如下:

  1. 在基于 Fantastic-mobile 做项目开发时尽量避免框架自带模块或组件的改动,或者改动地方做一个文档记录,可以清楚知道改动了哪些,这样当你需要进行新版本更新时,按照之前记录的文档可以有个大致的迁移方案,而业务代码则可以直接拷贝过去。
  2. 我们尽量在提交代码时标明每次提交改动的变更记录说明,这样你可以选择性的更新部分新代码到项目中,也就是局部更新。这种方案也是作者在公司内部项目经常使用的,因为大部分项目是无需全局更新到新版的,只需将必要的一些新特性或 bug 修复同步到原有项目中即可。
  3. 使用文件比较工具,例如 Beyond Compare,这款工具可以直接对比文件夹,可以清晰的列出文件夹内所有文件的差异,可以协助升级工作开展。
',5),n=[i];function s(_,d,c,l,p,u){return t(),a("div",null,n)}const h=e(r,[["render",s]]);export{g as __pageData,h as default}; diff --git a/assets/guide_upgrade.md.MYKFZrm3.lean.js b/assets/guide_upgrade.md.MYKFZrm3.lean.js new file mode 100644 index 0000000..0453f79 --- /dev/null +++ b/assets/guide_upgrade.md.MYKFZrm3.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as o}from"./chunks/framework.D-J1Cv1C.js";const g=JSON.parse('{"title":"框架更新","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade.md","filePath":"guide/upgrade.md"}'),r={name:"guide/upgrade.md"},i=o("",5),n=[i];function s(_,d,c,l,p,u){return t(),a("div",null,n)}const h=e(r,[["render",s]]);export{g as __pageData,h as default}; diff --git a/assets/guide_viewport.md.CQxsQl-3.js b/assets/guide_viewport.md.CQxsQl-3.js new file mode 100644 index 0000000..4ba9de1 --- /dev/null +++ b/assets/guide_viewport.md.CQxsQl-3.js @@ -0,0 +1 @@ +import{_ as s,c as o,o as r,j as e,a as t}from"./chunks/framework.D-J1Cv1C.js";const w=JSON.parse('{"title":"浏览器适配","description":"","frontmatter":{},"headers":[],"relativePath":"guide/viewport.md","filePath":"guide/viewport.md"}'),a={name:"guide/viewport.md"},n=e("h1",{id:"浏览器适配",tabindex:"-1"},[t("浏览器适配 "),e("a",{class:"header-anchor",href:"#浏览器适配","aria-label":'Permalink to "浏览器适配"'},"​")],-1),p=e("p",null,[t("框架设计基于 375px 宽度设计稿,并使用 postcss 插件 "),e("a",{href:"https://github.com/wswmsword/postcss-mobile-forever",target:"_blank",rel:"noreferrer"},"postcss-mobile-forever"),t(" 将 px 单位转换成 vw 单位从而实现移动端适配。相对于其他同类 px 转 vw 单位的 postcss 插件,postcss-mobile-forever 提供了更加细致的适配策略,也兼顾了桌面端的使用场景。")],-1),c=e("p",null,[t("同时框架还使用到了 UnoCSS 预设 "),e("a",{href:"https://unocss.dev/presets/rem-to-px",target:"_blank",rel:"noreferrer"},"@unocss/preset-rem-to-px"),t(" ,使得基于 UnoCSS 编写的样式也能通过一套方案转换成 vw 单位。")],-1),i=e("p",null,"作为开发者,只需要在开发前,将设计稿转换为 375px 宽度,然后即可开始开发。",-1),l=[n,p,c,i];function d(_,h,m,f,u,v){return r(),o("div",null,l)}const b=s(a,[["render",d]]);export{w as __pageData,b as default}; diff --git a/assets/guide_viewport.md.CQxsQl-3.lean.js b/assets/guide_viewport.md.CQxsQl-3.lean.js new file mode 100644 index 0000000..4ba9de1 --- /dev/null +++ b/assets/guide_viewport.md.CQxsQl-3.lean.js @@ -0,0 +1 @@ +import{_ as s,c as o,o as r,j as e,a as t}from"./chunks/framework.D-J1Cv1C.js";const w=JSON.parse('{"title":"浏览器适配","description":"","frontmatter":{},"headers":[],"relativePath":"guide/viewport.md","filePath":"guide/viewport.md"}'),a={name:"guide/viewport.md"},n=e("h1",{id:"浏览器适配",tabindex:"-1"},[t("浏览器适配 "),e("a",{class:"header-anchor",href:"#浏览器适配","aria-label":'Permalink to "浏览器适配"'},"​")],-1),p=e("p",null,[t("框架设计基于 375px 宽度设计稿,并使用 postcss 插件 "),e("a",{href:"https://github.com/wswmsword/postcss-mobile-forever",target:"_blank",rel:"noreferrer"},"postcss-mobile-forever"),t(" 将 px 单位转换成 vw 单位从而实现移动端适配。相对于其他同类 px 转 vw 单位的 postcss 插件,postcss-mobile-forever 提供了更加细致的适配策略,也兼顾了桌面端的使用场景。")],-1),c=e("p",null,[t("同时框架还使用到了 UnoCSS 预设 "),e("a",{href:"https://unocss.dev/presets/rem-to-px",target:"_blank",rel:"noreferrer"},"@unocss/preset-rem-to-px"),t(" ,使得基于 UnoCSS 编写的样式也能通过一套方案转换成 vw 单位。")],-1),i=e("p",null,"作为开发者,只需要在开发前,将设计稿转换为 375px 宽度,然后即可开始开发。",-1),l=[n,p,c,i];function d(_,h,m,f,u,v){return r(),o("div",null,l)}const b=s(a,[["render",d]]);export{w as __pageData,b as default}; diff --git a/assets/guide_vue3-composition-api.md.BWg9K3cK.js b/assets/guide_vue3-composition-api.md.BWg9K3cK.js new file mode 100644 index 0000000..67ba64d --- /dev/null +++ b/assets/guide_vue3-composition-api.md.BWg9K3cK.js @@ -0,0 +1,25 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const c=JSON.parse('{"title":"使用 Composition API 开发","description":"","frontmatter":{},"headers":[],"relativePath":"guide/vue3-composition-api.md","filePath":"guide/vue3-composition-api.md"}'),t={name:"guide/vue3-composition-api.md"},p=n(`

使用 Composition API 开发

Composition API 是 Vue3 全新提供的一种语法,对于从 Vue2 就在使用的开发者,如果一时半会没办法立马上手 Composition API ,你依旧可以在项目中使用 Options API 做开发。当然我们更建议你使用 Composition API 进行开发,它比 Options API 更灵活且易读。

使用

如果你还不熟悉 Composition API ,那么我们建议你阅读 Vue3 官方文档了解;如果你已经熟悉 Composition API ,那么我们建议你在开发的时候,使用 <script setup> 语法糖进行开发,它将提高很多开发上的效率。

同时得益于 unplugin-auto-import 的特性,在 <script setup> 里无需导入相关 API ,该依赖会自动导入(默认支持 vue,vue-router 和 pinia )。

vue
<script setup lang="ts">
+// 无需手动 import 相关 API
+import { computed, ref } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+
+const count = ref(0)
+const doubled = computed(() => count.value * 2)
+
+const route = useRoute()
+const router = useRouter()
+console.log(route.path)
+router.push('/dashboard')
+</script>

组件 name

<script setup> 可以和普通的 <script> 一起使用,所以可以这样定义组件 name:

vue
<script lang="ts">
+export default {
+  name: 'componentName',
+}
+</script>
+
+<script setup lang="ts">
+...
+</script>

Vue 3.3 开始,你可以使用 defineOptions<script setup> 里定义组件的 name:

vue
<script setup lang="ts">
+defineOptions({
+  name: 'ComponentName',
+})
+</script>
`,11),h=[p];function l(e,k,r,E,d,o){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{c as __pageData,y as default}; diff --git a/assets/guide_vue3-composition-api.md.BWg9K3cK.lean.js b/assets/guide_vue3-composition-api.md.BWg9K3cK.lean.js new file mode 100644 index 0000000..1047be5 --- /dev/null +++ b/assets/guide_vue3-composition-api.md.BWg9K3cK.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.D-J1Cv1C.js";const c=JSON.parse('{"title":"使用 Composition API 开发","description":"","frontmatter":{},"headers":[],"relativePath":"guide/vue3-composition-api.md","filePath":"guide/vue3-composition-api.md"}'),t={name:"guide/vue3-composition-api.md"},p=n("",11),h=[p];function l(e,k,r,E,d,o){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{c as __pageData,y as default}; diff --git a/assets/guide_watermark.md.hhPmfVdr.js b/assets/guide_watermark.md.hhPmfVdr.js new file mode 100644 index 0000000..346018b --- /dev/null +++ b/assets/guide_watermark.md.hhPmfVdr.js @@ -0,0 +1,17 @@ +import{_ as t,D as n,c as e,j as a,a as s,I as p,a5 as l,o as h,aj as k}from"./chunks/framework.D-J1Cv1C.js";const b=JSON.parse('{"title":"页面水印","description":"","frontmatter":{},"headers":[],"relativePath":"guide/watermark.md","filePath":"guide/watermark.md"}'),r={name:"guide/watermark.md"},d={id:"页面水印",tabindex:"-1"},E=a("a",{class:"header-anchor",href:"#页面水印","aria-label":'Permalink to "页面水印 "'},"​",-1),o=l(`

使用

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableWatermark: true,
+  },
+}

效果如下:

设置水印内容

/src/store/modules/watermark.ts 中可修改水印展示内容,以及其他水印相关配置。

水印同时支持动态更新,示例:

vue
<script setup lang="ts">
+import useWatermarkStore from '@/store/modules/watermark'
+
+const watermarkStore = useWatermarkStore()
+
+watermarkStore.update({
+  text: '设置水印',
+  // 更多设置项请查看 /src/utils/watermark.ts 中 settingsType 类型定义
+})
+
+// 重置水印,恢复到默认设置
+watermarkStore.update()
+</script>
`,9);function g(c,y,m,F,u,_){const i=n("Badge");return h(),e("div",null,[a("h1",d,[s("页面水印 "),p(i,{type:"pro",text:"专业版"}),s(),E]),o])}const B=t(r,[["render",g]]);export{b as __pageData,B as default}; diff --git a/assets/guide_watermark.md.hhPmfVdr.lean.js b/assets/guide_watermark.md.hhPmfVdr.lean.js new file mode 100644 index 0000000..55b682e --- /dev/null +++ b/assets/guide_watermark.md.hhPmfVdr.lean.js @@ -0,0 +1 @@ +import{_ as t,D as n,c as e,j as a,a as s,I as p,a5 as l,o as h,aj as k}from"./chunks/framework.D-J1Cv1C.js";const b=JSON.parse('{"title":"页面水印","description":"","frontmatter":{},"headers":[],"relativePath":"guide/watermark.md","filePath":"guide/watermark.md"}'),r={name:"guide/watermark.md"},d={id:"页面水印",tabindex:"-1"},E=a("a",{class:"header-anchor",href:"#页面水印","aria-label":'Permalink to "页面水印 "'},"​",-1),o=l("",9);function g(c,y,m,F,u,_){const i=n("Badge");return h(),e("div",null,[a("h1",d,[s("页面水印 "),p(i,{type:"pro",text:"专业版"}),s(),E]),o])}const B=t(r,[["render",g]]);export{b as __pageData,B as default}; diff --git a/assets/guide_why.md.DvOsftQ3.js b/assets/guide_why.md.DvOsftQ3.js new file mode 100644 index 0000000..fb0d7e5 --- /dev/null +++ b/assets/guide_why.md.DvOsftQ3.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a5 as r}from"./chunks/framework.D-J1Cv1C.js";const d=JSON.parse('{"title":"为什么选择我们 ?","description":"","frontmatter":{},"headers":[],"relativePath":"guide/why.md","filePath":"guide/why.md"}'),o={name:"guide/why.md"},n=r('

为什么选择我们 ?

是模板,更是框架

Fantastic-mobile 与市面上大部分移动端 H5 模板不同之处在于,它针对通用场景提供了一套标准且易于扩展设计,通过简单的配置即可轻松完成页面的设计和布局。同时也提供了一些常用的组件和工具函数,让开发者可以更加专注于业务逻辑的开发。

这也是为什么我们自称为「框架」,而不仅仅是「模板」的原因。

如果你在使用过 Fantastic-mobile 后,认为它还达不到你心中框架的标准,也请告诉我们有哪些可改进的地方,因为我们最终的目标是希望 Fantastic-mobile 能够成为你的得力助手,让你的开发工作高效且愉快

为什么不是它们 ?

以上 3 款模板都很成熟,也是社区内人气较高的项目。但正如上面所说,Fantastic-mobile 从一开始就不打算仅仅只是做一个 H5 模版。所以,如果你正在做技术选型,不如先了解一下我们这款框架,再决定是否要继续使用其他 H5 模板。

并且你不需要担心技术栈上的差异,因为 Vue3 整体的生态已经非常成熟,几乎形成了一套社区默认的技术栈。也就是说,以上 3 款模板和 Fantastic-mobile 使用到的技术栈,几乎是一样的。

用一句简单的话概括就是:人无我有,人有我优

',10),i=[n];function s(l,h,c,_,p,m){return a(),t("div",null,i)}const b=e(o,[["render",s]]);export{d as __pageData,b as default}; diff --git a/assets/guide_why.md.DvOsftQ3.lean.js b/assets/guide_why.md.DvOsftQ3.lean.js new file mode 100644 index 0000000..fb3eac2 --- /dev/null +++ b/assets/guide_why.md.DvOsftQ3.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a5 as r}from"./chunks/framework.D-J1Cv1C.js";const d=JSON.parse('{"title":"为什么选择我们 ?","description":"","frontmatter":{},"headers":[],"relativePath":"guide/why.md","filePath":"guide/why.md"}'),o={name:"guide/why.md"},n=r("",10),i=[n];function s(l,h,c,_,p,m){return a(),t("div",null,i)}const b=e(o,[["render",s]]);export{d as __pageData,b as default}; diff --git a/assets/index.md.CO37Rkx6.js b/assets/index.md.CO37Rkx6.js new file mode 100644 index 0000000..1fa30eb --- /dev/null +++ b/assets/index.md.CO37Rkx6.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.D-J1Cv1C.js";const p=JSON.parse('{"title":"Fantastic-mobile","titleTemplate":"开箱即用的移动端 H5 框架","description":"","frontmatter":{"layout":"home","title":"Fantastic-mobile","titleTemplate":"开箱即用的移动端 H5 框架","hero":{"name":"Fantastic-mobile","text":"自成一派的 H5 框架","tagline":"开箱即用,提供舒适开发体验","image":{"src":"/logo-with-shadow.png","alt":"Fantastic-mobile"},"actions":[{"theme":"brand","text":"开始","link":"/guide/intro"},{"theme":"alt","text":"为什么选我们 ?","link":"/guide/why"},{"theme":"alt","text":"更新日志","link":"/guide/changelog"},{"theme":"cta buy","text":"专业版,限时优惠价 369 元","link":"/buy"},{"theme":"cta","text":"演示地址:基础版 ↗","link":"https://fantastic-mobile.github.io/basic-example"},{"theme":"cta","text":"演示地址:专业版 ↗","link":"https://fantastic-mobile.github.io/pro-example"}]},"features":[{"icon":"💪","title":"先进的技术栈","details":"Vite + Vue3 + Vue-router + Pinia + UnoCSS + TypeScript ,采用业内先进的技术栈,使框架始终保持新鲜"},{"icon":"🗺️","title":"文件系统路由","details":"根据文件夹及文件目录,自动生成路由,并提供友好的 TypeScript 支持"},{"icon":"🔑","title":"全场景权限验证","details":"内置鉴权组件、鉴权指令和鉴权函数,真正实现各种场景下的权限验证"},{"icon":"🧊","title":"页面缓存","details":"轻松设置页面缓存,应对各种需求场景,并提供简单易懂的 API 方便开发者快速集成"},{"icon":"🌐","title":"面向国际","details":"内置业内通用国际化解决方案,通过简单配置实现多国语言切换"},{"icon":"📦","title":"丰富的组件","details":"内置常用组件,提高开发效率;同时提供组件快速生成工具"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),a={name:"index.md"};function n(l,o,c,s,m,r){return i(),e("div")}const h=t(a,[["render",n]]);export{p as __pageData,h as default}; diff --git a/assets/index.md.CO37Rkx6.lean.js b/assets/index.md.CO37Rkx6.lean.js new file mode 100644 index 0000000..1fa30eb --- /dev/null +++ b/assets/index.md.CO37Rkx6.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.D-J1Cv1C.js";const p=JSON.parse('{"title":"Fantastic-mobile","titleTemplate":"开箱即用的移动端 H5 框架","description":"","frontmatter":{"layout":"home","title":"Fantastic-mobile","titleTemplate":"开箱即用的移动端 H5 框架","hero":{"name":"Fantastic-mobile","text":"自成一派的 H5 框架","tagline":"开箱即用,提供舒适开发体验","image":{"src":"/logo-with-shadow.png","alt":"Fantastic-mobile"},"actions":[{"theme":"brand","text":"开始","link":"/guide/intro"},{"theme":"alt","text":"为什么选我们 ?","link":"/guide/why"},{"theme":"alt","text":"更新日志","link":"/guide/changelog"},{"theme":"cta buy","text":"专业版,限时优惠价 369 元","link":"/buy"},{"theme":"cta","text":"演示地址:基础版 ↗","link":"https://fantastic-mobile.github.io/basic-example"},{"theme":"cta","text":"演示地址:专业版 ↗","link":"https://fantastic-mobile.github.io/pro-example"}]},"features":[{"icon":"💪","title":"先进的技术栈","details":"Vite + Vue3 + Vue-router + Pinia + UnoCSS + TypeScript ,采用业内先进的技术栈,使框架始终保持新鲜"},{"icon":"🗺️","title":"文件系统路由","details":"根据文件夹及文件目录,自动生成路由,并提供友好的 TypeScript 支持"},{"icon":"🔑","title":"全场景权限验证","details":"内置鉴权组件、鉴权指令和鉴权函数,真正实现各种场景下的权限验证"},{"icon":"🧊","title":"页面缓存","details":"轻松设置页面缓存,应对各种需求场景,并提供简单易懂的 API 方便开发者快速集成"},{"icon":"🌐","title":"面向国际","details":"内置业内通用国际化解决方案,通过简单配置实现多国语言切换"},{"icon":"📦","title":"丰富的组件","details":"内置常用组件,提高开发效率;同时提供组件快速生成工具"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),a={name:"index.md"};function n(l,o,c,s,m,r){return i(),e("div")}const h=t(a,[["render",n]]);export{p as __pageData,h as default}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000..b6b603d Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000..def40a4 Binary files /dev/null and b/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ diff --git a/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 new file mode 100644 index 0000000..e070c3d Binary files /dev/null and b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000..a3c16ca Binary files /dev/null and b/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000..2210a89 Binary files /dev/null and b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ diff --git a/assets/inter-italic-latin.C2AdPX0b.woff2 b/assets/inter-italic-latin.C2AdPX0b.woff2 new file mode 100644 index 0000000..790d62d Binary files /dev/null and b/assets/inter-italic-latin.C2AdPX0b.woff2 differ diff --git a/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/assets/inter-italic-vietnamese.BSbpV94h.woff2 new file mode 100644 index 0000000..1eec077 Binary files /dev/null and b/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 new file mode 100644 index 0000000..2cfe615 Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ diff --git a/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 new file mode 100644 index 0000000..e3886dd Binary files /dev/null and b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000..36d6748 Binary files /dev/null and b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000..2bed1e8 Binary files /dev/null and b/assets/inter-roman-greek.BBVDIX6e.woff2 differ diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000..9a8d1e2 Binary files /dev/null and b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000..07d3c53 Binary files /dev/null and b/assets/inter-roman-latin.Di8DUHzh.woff2 differ diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000..57bdc22 Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/assets/style.CEn7_h9_.css b/assets/style.CEn7_h9_.css new file mode 100644 index 0000000..2719944 --- /dev/null +++ b/assets/style.CEn7_h9_.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-6fd38c7d]{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-6fd38c7d],.VPBackdrop.fade-leave-to[data-v-6fd38c7d]{opacity:0}.VPBackdrop.fade-leave-active[data-v-6fd38c7d]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-6fd38c7d]{display:none}}.NotFound[data-v-baaf7634]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-baaf7634]{padding:96px 32px 168px}}.code[data-v-baaf7634]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-baaf7634]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-baaf7634]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-baaf7634]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-baaf7634]{padding-top:20px}.link[data-v-baaf7634]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-baaf7634]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-e416873c]{position:relative;z-index:1}.nested[data-v-e416873c]{padding-right:16px;padding-left:16px}.outline-link[data-v-e416873c]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-e416873c]:hover,.outline-link.active[data-v-e416873c]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-e416873c]{padding-left:13px}.VPDocAsideOutline[data-v-173bcab0]{display:none}.VPDocAsideOutline.has-outline[data-v-173bcab0]{display:block}.content[data-v-173bcab0]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-173bcab0]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-173bcab0]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-c4496806]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-c4496806]{flex-grow:1}.VPDocAside[data-v-c4496806] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-c4496806] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-c4496806] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-b2c3180a]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-b2c3180a]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-5e7854d9]{margin-top:64px}.edit-info[data-v-5e7854d9]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-5e7854d9]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-5e7854d9]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-5e7854d9]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-5e7854d9]{margin-right:8px}.prev-next[data-v-5e7854d9]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-5e7854d9]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-5e7854d9]{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-5e7854d9]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-5e7854d9]{margin-left:auto;text-align:right}.desc[data-v-5e7854d9]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-5e7854d9]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-e4c2a608]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-e4c2a608]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-e4c2a608]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-e4c2a608]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-e4c2a608]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-e4c2a608]{display:flex;justify-content:center}.VPDoc .aside[data-v-e4c2a608]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-e4c2a608]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-e4c2a608]{max-width:1104px}}.container[data-v-e4c2a608]{margin:0 auto;width:100%}.aside[data-v-e4c2a608]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-e4c2a608]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-e4c2a608]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-e4c2a608]::-webkit-scrollbar{display:none}.aside-curtain[data-v-e4c2a608]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-e4c2a608]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-e4c2a608]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-e4c2a608]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-e4c2a608]{order:1;margin:0;min-width:640px}}.content-container[data-v-e4c2a608]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-e4c2a608]{max-width:688px}.VPButton[data-v-58a288e4]{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-58a288e4]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-58a288e4]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-58a288e4]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-58a288e4]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-58a288e4]: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-58a288e4]: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-58a288e4]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-58a288e4]: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-58a288e4]: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-58a288e4]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-58a288e4]: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-58a288e4]: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-66129518]{display:none}.dark .VPImage.light[data-v-66129518]{display:none}.VPHero[data-v-d23dfec6]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-d23dfec6]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-d23dfec6]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-d23dfec6]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-d23dfec6]{flex-direction:row}}.main[data-v-d23dfec6]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-d23dfec6]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-d23dfec6]{text-align:left}}@media (min-width: 960px){.main[data-v-d23dfec6]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-d23dfec6]{max-width:592px}}.name[data-v-d23dfec6],.text[data-v-d23dfec6]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-d23dfec6],.VPHero.has-image .text[data-v-d23dfec6]{margin:0 auto}.name[data-v-d23dfec6]{color:var(--vp-home-hero-name-color)}.clip[data-v-d23dfec6]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-d23dfec6],.text[data-v-d23dfec6]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-d23dfec6],.text[data-v-d23dfec6]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-d23dfec6],.VPHero.has-image .text[data-v-d23dfec6]{margin:0}}.tagline[data-v-d23dfec6]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-d23dfec6]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-d23dfec6]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-d23dfec6]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-d23dfec6]{margin:0}}.actions[data-v-d23dfec6]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-d23dfec6]{justify-content:center}@media (min-width: 640px){.actions[data-v-d23dfec6]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-d23dfec6]{justify-content:flex-start}}.action[data-v-d23dfec6]{flex-shrink:0;padding:6px}.image[data-v-d23dfec6]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-d23dfec6]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-d23dfec6]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-d23dfec6]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-d23dfec6]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-d23dfec6]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-d23dfec6]{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-d23dfec6]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-d23dfec6]{width:320px;height:320px}}[data-v-d23dfec6] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-d23dfec6] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-d23dfec6] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-54a50e5e]{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-54a50e5e]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-54a50e5e]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-54a50e5e]>.VPImage{margin-bottom:20px}.icon[data-v-54a50e5e]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-54a50e5e]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-54a50e5e]{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-54a50e5e]{padding-top:8px}.link-text-value[data-v-54a50e5e]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-54a50e5e]{margin-left:6px}.VPFeatures[data-v-4507f11b]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-4507f11b]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-4507f11b]{padding:0 64px}}.container[data-v-4507f11b]{margin:0 auto;max-width:1152px}.items[data-v-4507f11b]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-4507f11b]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-4507f11b],.item.grid-4[data-v-4507f11b],.item.grid-6[data-v-4507f11b]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-4507f11b],.item.grid-4[data-v-4507f11b]{width:50%}.item.grid-3[data-v-4507f11b],.item.grid-6[data-v-4507f11b]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-4507f11b]{width:25%}}.container[data-v-2f26f998]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-2f26f998]{padding:0 48px}}@media (min-width: 960px){.container[data-v-2f26f998]{width:100%;padding:0 64px}}.vp-doc[data-v-2f26f998] .VPHomeSponsors,.vp-doc[data-v-2f26f998] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-2f26f998] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-2f26f998] .VPHomeSponsors a,.vp-doc[data-v-2f26f998] .VPTeamPage a{text-decoration:none}.VPHome[data-v-6fa276e3]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-6fa276e3]{margin-bottom:128px}}.VPContent[data-v-e01aebcb]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-e01aebcb]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-e01aebcb]{margin:0}@media (min-width: 960px){.VPContent[data-v-e01aebcb]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-e01aebcb]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-e01aebcb]{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-058c9c44]{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-058c9c44]{display:none}.VPFooter[data-v-058c9c44] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-058c9c44] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-058c9c44]{padding:32px}}.container[data-v-058c9c44]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-058c9c44],.copyright[data-v-058c9c44]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-cf9a8269]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-cf9a8269]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-cf9a8269]{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-cf9a8269]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-cf9a8269]{color:var(--vp-c-text-1)}.icon[data-v-cf9a8269]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-cf9a8269]{font-size:14px}.icon[data-v-cf9a8269]{font-size:16px}}.open>.icon[data-v-cf9a8269]{transform:rotate(90deg)}.items[data-v-cf9a8269]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-cf9a8269]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-cf9a8269]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-cf9a8269]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-cf9a8269]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-cf9a8269]{transition:all .2s ease-out}.flyout-leave-active[data-v-cf9a8269]{transition:all .15s ease-in}.flyout-enter-from[data-v-cf9a8269],.flyout-leave-to[data-v-cf9a8269]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-ffae9a67]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-ffae9a67]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-ffae9a67]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-ffae9a67]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-ffae9a67]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-ffae9a67]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-ffae9a67]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-ffae9a67]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-ffae9a67]{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-ffae9a67]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-ffae9a67]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-ffae9a67]{display:none}}.menu-icon[data-v-ffae9a67]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-ffae9a67]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-ffae9a67]{padding:12px 32px 11px}}.VPSwitch[data-v-4e6eee23]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4e6eee23]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4e6eee23]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4e6eee23]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4e6eee23] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4e6eee23] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-f4b445d6]{opacity:1}.moon[data-v-f4b445d6],.dark .sun[data-v-f4b445d6]{opacity:0}.dark .moon[data-v-f4b445d6]{opacity:1}.dark .VPSwitchAppearance[data-v-f4b445d6] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-c8debaca]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-c8debaca]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-148ccee4]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-148ccee4]{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-148ccee4]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-148ccee4]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-81836f58]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-81836f58]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-81836f58]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-81836f58]{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-b6ca2d55]{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-b6ca2d55] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-b6ca2d55] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-b6ca2d55] .group:last-child{padding-bottom:0}.VPMenu[data-v-b6ca2d55] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-b6ca2d55] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-b6ca2d55] .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-b6ca2d55] .action{padding-left:24px}.VPFlyout[data-v-5c7784f0]{position:relative}.VPFlyout[data-v-5c7784f0]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-5c7784f0]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-5c7784f0]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-5c7784f0]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-5c7784f0]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-5c7784f0],.button[aria-expanded=true]+.menu[data-v-5c7784f0]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-5c7784f0]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-5c7784f0]{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-5c7784f0]{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-5c7784f0]{margin-right:0;font-size:16px}.text-icon[data-v-5c7784f0]{margin-left:4px;font-size:14px}.icon[data-v-5c7784f0]{font-size:20px;transition:fill .25s}.menu[data-v-5c7784f0]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-0b9403eb]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-0b9403eb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-0b9403eb]>svg,.VPSocialLink[data-v-0b9403eb]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e3ff33b4]{display:flex;justify-content:center}.VPNavBarExtra[data-v-7aa10c87]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-7aa10c87]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-7aa10c87]{display:none}}.trans-title[data-v-7aa10c87]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-7aa10c87],.item.social-links[data-v-7aa10c87]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-7aa10c87]{min-width:176px}.appearance-action[data-v-7aa10c87]{margin-right:-2px}.social-links-list[data-v-7aa10c87]{margin:-4px -8px}.VPNavBarHamburger[data-v-e985d409]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-e985d409]{display:none}}.container[data-v-e985d409]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-e985d409]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-e985d409]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-e985d409]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-e985d409]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-e985d409]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-e985d409]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-e985d409],.VPNavBarHamburger.active:hover .middle[data-v-e985d409],.VPNavBarHamburger.active:hover .bottom[data-v-e985d409]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-e985d409],.middle[data-v-e985d409],.bottom[data-v-e985d409]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-e985d409]{top:0;left:0;transform:translate(0)}.middle[data-v-e985d409]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-e985d409]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-f8eda10f]{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-f8eda10f],.VPNavBarMenuLink[data-v-f8eda10f]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-a160c3e1]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-a160c3e1]{display:flex}}/*! @docsearch/css 3.6.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--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}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-c9c77adc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-c9c77adc]{display:flex;align-items:center}}.title[data-v-13f93eac]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-13f93eac]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-13f93eac]{border-bottom-color:var(--vp-c-divider)}}[data-v-13f93eac] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-976f6f40]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-976f6f40]{display:flex;align-items:center}}.title[data-v-976f6f40]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-03344f85]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .5s}.VPNavBar[data-v-03344f85]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-03344f85]:not(.home){background-color:transparent}.VPNavBar[data-v-03344f85]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-03344f85]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-03344f85]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-03344f85]{padding:0}}.container[data-v-03344f85]{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-03344f85],.container>.content[data-v-03344f85]{pointer-events:none}.container[data-v-03344f85] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-03344f85]{max-width:100%}}.title[data-v-03344f85]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-03344f85]{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-03344f85]{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-03344f85]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-03344f85]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-03344f85]{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-03344f85]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-03344f85]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-03344f85]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-03344f85]{column-gap:.5rem}}.menu+.translations[data-v-03344f85]:before,.menu+.appearance[data-v-03344f85]:before,.menu+.social-links[data-v-03344f85]:before,.translations+.appearance[data-v-03344f85]:before,.appearance+.social-links[data-v-03344f85]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-03344f85]:before,.translations+.appearance[data-v-03344f85]:before{margin-right:16px}.appearance+.social-links[data-v-03344f85]:before{margin-left:16px}.social-links[data-v-03344f85]{margin-right:-8px}.divider[data-v-03344f85]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-03344f85]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-03344f85]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-03344f85]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-03344f85]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-03344f85]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-03344f85]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-1c473a56]{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-1c473a56]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-41ce1968]{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-41ce1968]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-fa0ae97a]{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-fa0ae97a]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-6168904f]{display:block}.title[data-v-6168904f]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-0c1ce2b1]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-0c1ce2b1]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-0c1ce2b1]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-0c1ce2b1]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-0c1ce2b1]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-0c1ce2b1]{transform:rotate(45deg)}.button[data-v-0c1ce2b1]{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-0c1ce2b1]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-0c1ce2b1]{transition:transform .25s}.group[data-v-0c1ce2b1]:first-child{padding-top:0}.group+.group[data-v-0c1ce2b1],.group+.item[data-v-0c1ce2b1]{padding-top:4px}.VPNavScreenTranslations[data-v-502ed004]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-502ed004]{height:auto}.title[data-v-502ed004]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-502ed004]{font-size:16px}.icon.lang[data-v-502ed004]{margin-right:8px}.icon.chevron[data-v-502ed004]{margin-left:4px}.list[data-v-502ed004]{padding:4px 0 0 24px}.link[data-v-502ed004]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-ccef021a]{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-ccef021a],.VPNavScreen.fade-leave-active[data-v-ccef021a]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-ccef021a],.VPNavScreen.fade-leave-active .container[data-v-ccef021a]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-ccef021a],.VPNavScreen.fade-leave-to[data-v-ccef021a]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-ccef021a],.VPNavScreen.fade-leave-to .container[data-v-ccef021a]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-ccef021a]{display:none}}.container[data-v-ccef021a]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-ccef021a],.menu+.appearance[data-v-ccef021a],.translations+.appearance[data-v-ccef021a]{margin-top:24px}.menu+.social-links[data-v-ccef021a]{margin-top:16px}.appearance+.social-links[data-v-ccef021a]{margin-top:16px}.VPNav[data-v-60c4bcb3]{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-60c4bcb3]{position:fixed}}.VPSidebarItem.level-0[data-v-6820daf2]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-6820daf2]{padding-bottom:10px}.item[data-v-6820daf2]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-6820daf2]{cursor:pointer}.indicator[data-v-6820daf2]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-6820daf2],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-6820daf2],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-6820daf2],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-6820daf2]{background-color:var(--vp-c-brand-1)}.link[data-v-6820daf2]{display:flex;align-items:center;flex-grow:1}.text[data-v-6820daf2]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-6820daf2]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-6820daf2],.VPSidebarItem.level-2 .text[data-v-6820daf2],.VPSidebarItem.level-3 .text[data-v-6820daf2],.VPSidebarItem.level-4 .text[data-v-6820daf2],.VPSidebarItem.level-5 .text[data-v-6820daf2]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-6820daf2],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-6820daf2],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-6820daf2],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-6820daf2],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-6820daf2],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-6820daf2]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-6820daf2],.VPSidebarItem.level-1.has-active>.item>.text[data-v-6820daf2],.VPSidebarItem.level-2.has-active>.item>.text[data-v-6820daf2],.VPSidebarItem.level-3.has-active>.item>.text[data-v-6820daf2],.VPSidebarItem.level-4.has-active>.item>.text[data-v-6820daf2],.VPSidebarItem.level-5.has-active>.item>.text[data-v-6820daf2],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-6820daf2],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-6820daf2],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-6820daf2],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-6820daf2],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-6820daf2],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-6820daf2]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-6820daf2],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-6820daf2],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-6820daf2],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-6820daf2],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-6820daf2],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-6820daf2]{color:var(--vp-c-brand-1)}.caret[data-v-6820daf2]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-6820daf2]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-6820daf2]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-6820daf2]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-6820daf2]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-6820daf2],.VPSidebarItem.level-2 .items[data-v-6820daf2],.VPSidebarItem.level-3 .items[data-v-6820daf2],.VPSidebarItem.level-4 .items[data-v-6820daf2],.VPSidebarItem.level-5 .items[data-v-6820daf2]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-6820daf2]{display:none}.VPSidebar[data-v-8e6b745e]{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-8e6b745e]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-8e6b745e]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-8e6b745e]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-8e6b745e]{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-8e6b745e]{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-8e6b745e]{outline:0}.group+.group[data-v-8e6b745e]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-8e6b745e]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-8934bb3d]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-8934bb3d]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-8934bb3d]{top:14px;left:16px}}.Layout[data-v-839be2d9]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-0ba66496]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-0ba66496]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-0ba66496]{margin:128px 0}}.VPHomeSponsors[data-v-0ba66496]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-0ba66496]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-0ba66496]{padding:0 64px}}.container[data-v-0ba66496]{margin:0 auto;max-width:1152px}.love[data-v-0ba66496]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-0ba66496]{display:inline-block}.message[data-v-0ba66496]{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-0ba66496]{padding-top:32px}.action[data-v-0ba66496]{padding-top:40px;text-align:center}.VPTeamPage[data-v-dcbf514f]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-dcbf514f]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-dcbf514f-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-dcbf514f-s],.VPTeamMembers+.VPTeamPageSection[data-v-dcbf514f-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-dcbf514f-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-dcbf514f-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-dcbf514f-s],.VPTeamMembers+.VPTeamPageSection[data-v-dcbf514f-s]{margin-top:96px}}.VPTeamMembers[data-v-dcbf514f-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-dcbf514f-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-dcbf514f-s]{padding:0 64px}}.VPTeamPageTitle[data-v-3b50f985]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-3b50f985]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-3b50f985]{padding:80px 64px 48px}}.title[data-v-3b50f985]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-3b50f985]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-3b50f985]{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-3b50f985]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-20676b58]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-20676b58]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-20676b58]{padding:0 64px}}.title[data-v-20676b58]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-20676b58]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-20676b58]{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-20676b58]{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-20676b58]{padding-top:40px}.VPTeamMembersItem[data-v-c2c0cc4a]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-c2c0cc4a]{padding:32px}.VPTeamMembersItem.small .data[data-v-c2c0cc4a]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-c2c0cc4a]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-c2c0cc4a]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-c2c0cc4a]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-c2c0cc4a]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-c2c0cc4a]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-c2c0cc4a]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-c2c0cc4a]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-c2c0cc4a]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-c2c0cc4a]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-c2c0cc4a]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-c2c0cc4a]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-c2c0cc4a]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-c2c0cc4a]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-c2c0cc4a]{text-align:center}.avatar[data-v-c2c0cc4a]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-c2c0cc4a]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-c2c0cc4a]{margin:0;font-weight:600}.affiliation[data-v-c2c0cc4a]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-c2c0cc4a]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-c2c0cc4a]:hover{color:var(--vp-c-brand-1)}.desc[data-v-c2c0cc4a]{margin:0 auto}.desc[data-v-c2c0cc4a] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-c2c0cc4a]{display:flex;justify-content:center;height:56px}.sp-link[data-v-c2c0cc4a]{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-c2c0cc4a]:hover,.sp .sp-link.link[data-v-c2c0cc4a]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-c2c0cc4a]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-161e45be]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-161e45be]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-161e45be]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-161e45be]{max-width:876px}.VPTeamMembers.medium .container[data-v-161e45be]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-161e45be]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-161e45be]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-161e45be]{max-width:760px}.container[data-v-161e45be]{display:grid;gap:24px;margin:0 auto;max-width:1152px}@font-face{font-family:Fira Code;src:url(/assets/FiraCode-Light.fY4l71KA.woff2) format("woff2"),url(/assets/FiraCode-Light.B1hbeU4w.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Fira Code;src:url(/assets/FiraCode-Regular.jAL9VymT.woff2) format("woff2"),url(/assets/FiraCode-Regular.B8-kG0vS.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Fira Code;src:url(/assets/FiraCode-Medium.-YTCSZkP.woff2) format("woff2"),url(/assets/FiraCode-Medium.B7pixCnj.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Fira Code;src:url(/assets/FiraCode-SemiBold.BiAOBdH0.woff2) format("woff2"),url(/assets/FiraCode-SemiBold.C_qsBl7p.woff) format("woff");font-weight:600;font-style:normal}@font-face{font-family:Fira Code;src:url(/assets/FiraCode-Bold.DzhvDiv4.woff2) format("woff2"),url(/assets/FiraCode-Bold.DeMYoWdo.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Fira Code VF;src:url(/assets/FiraCode-VF.Bc8wnsZt.woff2) format("woff2-variations"),url(/assets/FiraCode-VF.B-gPkBGS.woff) format("woff-variations");font-weight:300 700;font-style:normal}:root{--vp-sidebar-width: 294px}:root{--vp-font-family-mono: ui-monospace, SFMono-Regular, "Fira Code", "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #AE3FF5 30%, #6EC0F9 );--vp-home-hero-image-background-image: linear-gradient( -45deg, #6EC0F9 50%, #0eeeee 50% );--vp-home-hero-image-filter: blur(40px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(72px)}}.VPFeature{position:relative}.VPFeature .icon{margin-bottom:8px}.VPFeature .title{position:absolute;top:36px;left:85px;font-size:18px}.medium-zoom-overlay{z-index:30}.medium-zoom-image{z-index:30;max-height:500px}.VPBadge.pro{border-color:#daa520;color:#333;background-color:#e7c605}a.cta{text-align:center;border-radius:8px}a.cta:hover{border-color:var(--vp-c-brand);background-color:var(--c-bg-accent)}a.cta.buy{border-color:#daa520}.sponsors-aside-text[data-v-13b2f7c0]{color:var(--vp-c-text-3);display:block;margin:3em 0 1em;font-weight:700;font-size:12px;text-transform:uppercase;letter-spacing:.4px}.sponsor-container[data-v-13b2f7c0]{--max-width: 100%;display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--max-width),1fr));column-gap:4px}.sponsor-item[data-v-13b2f7c0]{margin:2px 0;background-color:var(--vp-c-bg-soft);display:flex;justify-content:center;align-items:center;gap:12px;padding-inline:20px;border-radius:2px;transition:background-color .2s ease;height:calc(var(--max-width) / 2 - 6px);font-size:13px}.sponsor-item.action[data-v-13b2f7c0]{font-size:11px;color:var(--vt-c-text-3)}.sponsor-item img[data-v-13b2f7c0]{max-width:calc(var(--max-width) - 30px);max-height:calc(var(--max-width) / 2 - 20px)}.sponsor-item .info[data-v-13b2f7c0]{display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:4px}.sponsor-item .info .main[data-v-13b2f7c0]{font-weight:700;font-size:14px;line-height:1.5;color:var(--vp-c-text-1)}.sponsor-item .info .sub[data-v-13b2f7c0]{font-size:12px;line-height:1.2;color:var(--vp-c-text-3)}.special .sponsor-item[data-v-13b2f7c0]{height:160px}.special .sponsor-item img[data-v-13b2f7c0]{max-width:300px;max-height:150px}.dark .aside .sponsor-item[data-v-13b2f7c0],.dark .landing .sponsor-item[data-v-13b2f7c0]{background-color:var(--vp-c-gray-soft)}.aside .sponsor-item img[data-v-13b2f7c0],.landing .sponsor-item img[data-v-13b2f7c0]{transition:filter .2s ease}.dark .aside .sponsor-item img[data-v-13b2f7c0],.dark .landing .sponsor-item img[data-v-13b2f7c0]{filter:grayscale(1) invert(1)}.dark .sponsor-item:hover img[data-v-13b2f7c0]{filter:none}.sponsor-container.platinum.aside[data-v-13b2f7c0]{--max-width: 110px;column-gap:1px}.aside .sponsor-item[data-v-13b2f7c0]{margin:1px 0}.aside .special .sponsor-item[data-v-13b2f7c0]{width:100%;height:70px}.aside .special .sponsor-item img[data-v-13b2f7c0]{max-width:120px;max-height:36px}.VPLocalSearchBox[data-v-50b67a39]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-50b67a39]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-50b67a39]{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: 767px){.shell[data-v-50b67a39]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-50b67a39]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-50b67a39]{padding:0 8px}}.search-bar[data-v-50b67a39]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-50b67a39]{display:block;font-size:18px}.navigate-icon[data-v-50b67a39]{display:block;font-size:14px}.search-icon[data-v-50b67a39]{margin:8px}@media (max-width: 767px){.search-icon[data-v-50b67a39]{display:none}}.search-input[data-v-50b67a39]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-50b67a39]{padding:6px 4px}}.search-actions[data-v-50b67a39]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-50b67a39]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-50b67a39]{display:none}}.search-actions button[data-v-50b67a39]{padding:8px}.search-actions button[data-v-50b67a39]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-50b67a39]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-50b67a39]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-50b67a39]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-50b67a39]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-50b67a39]{display:none}}.search-keyboard-shortcuts kbd[data-v-50b67a39]{background:#8080801a;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-50b67a39]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-50b67a39]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-50b67a39]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-50b67a39]{margin:8px}}.titles[data-v-50b67a39]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-50b67a39]{display:flex;align-items:center;gap:4px}.title.main[data-v-50b67a39]{font-weight:500}.title-icon[data-v-50b67a39]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-50b67a39]{opacity:.5}.result.selected[data-v-50b67a39]{--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-50b67a39]{position:relative}.excerpt[data-v-50b67a39]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-50b67a39]{opacity:1}.excerpt[data-v-50b67a39] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-50b67a39] mark,.excerpt[data-v-50b67a39] 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-50b67a39] .vp-code-group .tabs{display:none}.excerpt[data-v-50b67a39] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-50b67a39]{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-50b67a39]{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-50b67a39],.result.selected .title-icon[data-v-50b67a39]{color:var(--vp-c-brand-1)!important}.no-results[data-v-50b67a39]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-50b67a39]{flex:none} diff --git a/assets/support.md.B0h1OKPf.js b/assets/support.md.B0h1OKPf.js new file mode 100644 index 0000000..5ecb294 --- /dev/null +++ b/assets/support.md.B0h1OKPf.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as r}from"./chunks/framework.D-J1Cv1C.js";const f=JSON.parse('{"title":"技术支持","description":"","frontmatter":{},"headers":[],"relativePath":"support.md","filePath":"support.md"}'),s={name:"support.md"},o=r('

技术支持

基础版

在使用框架的过程中难免会遇到问题,优先推荐在仓库提交 Issue ,你可以更详细描述问题产生的操作步骤,或者提供完整的最小复现,这样做可以让更多的人参与讨论,也方便后人查阅。

专业版

购买专业版的用户会邀请到专业版的微信群,并在群内提供技术支持。

',6),i=[o];function l(n,c,_,h,p,u){return t(),a("div",null,i)}const m=e(s,[["render",l]]);export{f as __pageData,m as default}; diff --git a/assets/support.md.B0h1OKPf.lean.js b/assets/support.md.B0h1OKPf.lean.js new file mode 100644 index 0000000..8dc97b7 --- /dev/null +++ b/assets/support.md.B0h1OKPf.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as r}from"./chunks/framework.D-J1Cv1C.js";const f=JSON.parse('{"title":"技术支持","description":"","frontmatter":{},"headers":[],"relativePath":"support.md","filePath":"support.md"}'),s={name:"support.md"},o=r("",6),i=[o];function l(n,c,_,h,p,u){return t(),a("div",null,i)}const m=e(s,[["render",l]]);export{f as __pageData,m as default}; diff --git a/buy.html b/buy.html new file mode 100644 index 0000000..a906d81 --- /dev/null +++ b/buy.html @@ -0,0 +1,28 @@ + + + + + + 购买专业版 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

购买专业版

专业版超值优惠合集①:Fantastic-mobile + Fantastic-admin

原价:¥599.00 Fantastic-mobile + ¥1199.00 Fantastic-admin = ¥1798.00

合集优惠价:1099.00 (本价格不参与任何限时优惠活动)

请加作者微信进行购买

专业版超值优惠合集②:Fantastic-mobile + One-step-admin

原价:¥599.00 Fantastic-mobile + ¥999.00 One-step-admin = ¥1598.00

合集优惠价:899.00 (本价格不参与任何限时优惠活动)

请加作者微信进行购买

专业版超值优惠合集③:Fantastic-mobile + Fantastic-admin + One-step-admin

原价:¥599.00 Fantastic-mobile + ¥1199.00 Fantastic-admin + ¥999.00 One-step-admin = ¥2797.00

合集优惠价:1499.00 (本价格不参与任何限时优惠活动)

请加作者微信进行购买

购买流程

  1. 请先加作者微信进行在线咨询。

  1. 通过微信支付宝扫码支付,并在备注里留下手机/微信/QQ/邮箱等任意一种联系方式。
  2. 支付成功后需提供:
    • 付款截图凭证
    • 授权邮箱号(常用邮箱)。专业版客户的唯一凭证,用于接收框架相关通知公告的唯一方式,但通常情况下我们不会随意打扰你。
    • Github 用户名。专业版源码托管在 Github 平台,需提供你的 Github 用户名,我们会邀请你加入组织。
  3. 同意邀请后,进入专业版开发者私有组织,获取源码。

支付方式

领红包

若你打算使用支付宝进行付款,可以先扫下面这个二维码领取红包。

Fantastic-mobile 专业版
限时优惠:369.00
原价:¥599.00
专业版用户可加入专业版微信群(群内提供框架技术支持),除此之外,每一位专业版用户可免费绑定一位开发者(不支持换绑),绑定的开发者同样可加入专业版微信群,额外绑定更多开发者为 100 元/人。

使用说明

  • 购买者可将本产品用于任意「符合国家法律法规」的应用平台,禁止用于黄赌毒等危害国家安全与稳定的网站。
  • 本产品购买后可用于开发商业项目,不限制域名和项目数量。
  • 购买者需保证不传播产品源码,不得直接对本产品(或简单包装成同类产品)进行二次转售或发布。无论有意或无意,我们有权利收回产品授权及更新权限。
  • 本产品的源码(包含全部源码,及部分源码片段),在未经我们许可下,不可以用于任何形式的开源项目,否则我们有权利收回产品授权及更新权限。
  • 因使用本产品所产生的损害及风险,包括但不限于个人损害、商业赢利丧失、贸易中断、商业信息丢失或任何其它经济损失,需由购买者自行承担,我们不承担任何责任。
  • 虚拟物品不支持退货退款。
  • 最终解释权归 Fantastic-mobile 所有。

专业版与基础版区别

⭐功能与服务⭐基础版专业版
长期维护更新,提供新特性
开发与构建工具Vue 3 / Vite
UI 组件库默认使用 Vant ,可替换成任意 UI 组件库
主题风格明亮 1 款 / 暗黑 1 款明亮 6 款 / 暗黑 6 款
布局组件部分功能完整功能
导航栏预设按钮(布局组件)
导航栏模式(布局组件)
导航栏标题非居中(布局组件)
导航栏自定义标题(布局组件)
多套标签栏(布局组件)
标签栏角标(布局组件)
全方位权限验证
扩展组件5 个6 个
国际化
Mock 数据
错误日志上报
业务应用静态页面
团队代码规范
框架版权信息需保留可删除
技术支持查看
演示地址访问访问
+ + + + \ No newline at end of file diff --git a/components/auth-all.html b/components/auth-all.html new file mode 100644 index 0000000..df3ac10 --- /dev/null +++ b/components/auth-all.html @@ -0,0 +1,28 @@ + + + + + + AuthAll 鉴权 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

AuthAll 鉴权

Props

参数说明类型可选值默认值
value权限数据,如果传入为 array 时,全部匹配则鉴权通过,并显示 slot 内容array / string--

Slots

name说明
-需要鉴权的 HTML 内容
+ + + + \ No newline at end of file diff --git a/components/auth.html b/components/auth.html new file mode 100644 index 0000000..b53962d --- /dev/null +++ b/components/auth.html @@ -0,0 +1,28 @@ + + + + + + Auth 鉴权 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

Auth 鉴权

Props

参数说明类型可选值默认值
value权限数据,如果传入为 array 时,匹配到其中一项则鉴权通过,并显示 slot 内容array / string--

Slots

name说明
-需要鉴权的 HTML 内容
+ + + + \ No newline at end of file diff --git a/components/index.html b/components/index.html new file mode 100644 index 0000000..23f19da --- /dev/null +++ b/components/index.html @@ -0,0 +1,28 @@ + + + + + + 介绍 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

介绍

框架提供一系列的组件方便快速开发。

基础组件

基础组件由 Vant 提供。

替换组件库

如果你不喜欢 Vant ,或者你想要将老项目迁移到 Fantastic-mobile 上,但老项目里使用的组件库并不是 Vant ,框架也提供了组件库替换移方案:

如果你想使用的组件库不在上述方案中,可以通过参考任何一份方案,理解替换的整理思路,并自行替换,别担心会很复杂,我们已经将大部分工作做好了。

内建组件

为了实现 UI 组件库可替换,框架内建了一些组件,这些组件仅服务于框架自身,所以不建议在业务页面内使用。但如果你需要对框架进行二次开发,并保证视觉上的一致性,这时候你就会需要用到它们。

内建组件存放在 /src/ui-kit/ 目录下,并配置了使用时自动引入。

你也可以点击 基础版专业版 查看内建组件示例页面。

扩展组件

扩展组件为框架封装的组件,组件源码完全开放,如果觉得用着不顺手,可以到 /src/components/ 目录下找到对应组件自行修改。

+ + + + \ No newline at end of file diff --git a/components/page-main.html b/components/page-main.html new file mode 100644 index 0000000..e14763c --- /dev/null +++ b/components/page-main.html @@ -0,0 +1,28 @@ + + + + + + PageMain 内容块 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

PageMain 内容块

Props

参数说明类型可选值默认值
title标题string--
collaspe是否折叠boolean-false
height展示高度,当 collaspe 为 true 时生效string--

Slots

name说明
-内容区的 HTML 内容
title标题区的 HTML 内容
+ + + + \ No newline at end of file diff --git a/components/sparkline.html b/components/sparkline.html new file mode 100644 index 0000000..88ca751 --- /dev/null +++ b/components/sparkline.html @@ -0,0 +1,28 @@ + + + + + + Sparkline 迷你图 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

Sparkline 迷你图 专业版

Props

参数说明类型可选值默认值
value迷你图数据,支持一维数组和对象数组,当为对象数组时,对象内参数为 {tooltip: 'xxx', value: 1}array--
width展示宽度number-100
height展示高度number-30
stroke-width折线宽度number-3
stroke-color折线颜色string-#dc2b33
fill-color填充颜色string--
cursor-color鼠标 hover 时辅助线颜色string-#dc2b33
spot-color鼠标 hover 时辅助点颜色string-#dc2b33
tooltip鼠标 hover 时是否显示文字提示boolean-false
+ + + + \ No newline at end of file diff --git a/components/svg-icon.html b/components/svg-icon.html new file mode 100644 index 0000000..704dc4a --- /dev/null +++ b/components/svg-icon.html @@ -0,0 +1,28 @@ + + + + + + SvgIcon SVG图标 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

SvgIcon SVG图标

Props

参数说明类型可选值默认值
namesvg 文件名 / Iconify 图标名,详细可阅读《图标string--
flip翻转方式,支持水平、垂直以及同时翻转stringhorizontal / vertical / both-
rotate旋转角度number0 - 3600
color颜色string
size尺寸string / number
+ + + + \ No newline at end of file diff --git a/components/trend.html b/components/trend.html new file mode 100644 index 0000000..7d26bc5 --- /dev/null +++ b/components/trend.html @@ -0,0 +1,28 @@ + + + + + + Trend 趋势标记 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

Trend 趋势标记

Props

参数说明类型可选值默认值
value内容string--
type类型stringup / downup
prefix前缀string--
suffix后缀string--
reverse颜色反转boolean-false
+ + + + \ No newline at end of file diff --git a/devtools.gif b/devtools.gif new file mode 100644 index 0000000..d7ca84e Binary files /dev/null and b/devtools.gif differ diff --git a/favicon.ico b/favicon.ico new file mode 100755 index 0000000..0778dfc Binary files /dev/null and b/favicon.ico differ diff --git a/font1.png b/font1.png new file mode 100644 index 0000000..7a72fdc Binary files /dev/null and b/font1.png differ diff --git a/font2.png b/font2.png new file mode 100644 index 0000000..e53aa5b Binary files /dev/null and b/font2.png differ diff --git a/friend-wechat.png b/friend-wechat.png new file mode 100644 index 0000000..0832dfd Binary files /dev/null and b/friend-wechat.png differ diff --git a/guide/api.html b/guide/api.html new file mode 100644 index 0000000..e5387ec --- /dev/null +++ b/guide/api.html @@ -0,0 +1,46 @@ + + + + + + 常用 API | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

常用 API

接口请求

详细可阅读《与服务端交互 - 接口请求》。

ts
import api from '@/api'
+
+api.get()
+api.post()

鉴权

详细可阅读《权限 - 鉴权函数》。

ts
const { auth, authAll } = useAuth()
+
+auth()
+authAll()

页面

刷新

ts
const { reload } = useMainPage()
+
+reload()

设置自定义标题 专业版

ts
const { setCustomTitle } = useMainPage()
+
+setCustomTitle(title)

重置自定义标题 专业版

ts
const { resetCustomTitle } = useMainPage()
+
+resetCustomTitle()

事件总线

基于 mitt 简单封装,使用方法请查阅官方文档。

ts
import eventBus from '@/utils/eventBus'
+
+eventBus.on()
+eventBus.emit()
+eventBus.off()

日期 专业版

基于 dayjs 简单封装,使用方法请查阅官方文档。

ts
import dayjs from '@/utils/dayjs'
+
+dayjs()
+ + + + \ No newline at end of file diff --git a/guide/axios.html b/guide/axios.html new file mode 100644 index 0000000..2ff010f --- /dev/null +++ b/guide/axios.html @@ -0,0 +1,125 @@ + + + + + + 与服务端交互 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

与服务端交互

框架使用 Axios 做为异步请求工具,并进行了简单的封装。

接口请求

设置 baseURL

在根目录 .env.* 文件里的 VITE_APP_API_BASEURL 这个参数就是配置 axios 的 baseURL

例如项目的真实接口请求地址为:

  • http://api.test.com/news/list
  • http://api.test.com/news/create
  • http://api.test.com/shop/info

则可设置为 VITE_APP_API_BASEURL = http://api.test.com/

请求调用

常用的 GET 和 POST 请求可使用以下的方法:

ts
import api from '@/api'
+
+// GET 请求
+api.get('news/list', {
+  params: {
+    page: 1,
+    size: 10,
+  },
+}).then((res) => {
+  // 后续业务代码
+})
+
+// POST 请求
+api.post('news/create', {
+  title: '新闻标题',
+  content: '新闻内容',
+}).then((res) => {
+  // 后续业务代码
+})

拦截器

/src/api/index.ts 文件里实例化了 axios 对象,并对 requestresponse 设置了拦截器,拦截器的用处就是拦截每一次的请求和响应,然后做一些全局的处理。例如接口响应报错,可以在拦截器里用统一的报错提示来展示,方便业务开发。但因为每个公司提供的接口标准不同,所以该文件拦截器部分的代码,需要开发者根据实际情况去修改调整。

代码很简单,首先初始化 axios 对象,然后 axios.interceptors.request.use()axios.interceptors.response.use() 就分别是请求和响应的拦截代码了。

参考代码里只做了简单的拦截处理,例如请求的时候会自动带上 token ,响应的时候会根据错误信息判断是登录失效还是接口报错,并做相应动作。

模块管理

如果项目里的接口很多,推荐根据模块来统一管理接口,目录为 /src/api/modules/

跨域处理

生产环境的跨域需要服务端去解决,开发环境的跨域问题可在本地设置代理解决。如果本地开发环境请求接口提示跨域,可以设置 .env.development 文件里 VITE_OPEN_PROXY = true 开启代理。

ts
import api from '@/api'
+
+api.get('news/list') // http://localhost:9000/proxy/news/list
+api.post('news/add') // http://localhost:9000/proxy/news/add

开启代理后,原有请求都会被指向到本地 http://localhost:9000/proxy ,因为 /proxy 匹配到了 vite.config.ts 里代理部分的设置,所以实际是请求依旧是 VITE_APP_API_BASEURL 所设置的地址。

ts
server: {
+  // vite.config.ts 中 proxy 配置,该配置即用于代理 API 请求
+  proxy: {
+    '/proxy': {
+      target: loadEnv(mode, process.cwd()).VITE_APP_API_BASEURL,
+      changeOrigin: command === 'serve' && loadEnv(mode, process.cwd()).VITE_OPEN_PROXY == 'true',
+      rewrite: path => path.replace(/\/proxy/, ''),
+    },
+  },
+},

多数据源

如果项目里需要从多个不同地址的数据源请求数据,你有两种方式可以实现。

如果只是几个接口需求从其它数据源请求,你可以使用覆盖 baseURL 的方式:

ts
import api from '@/api'
+
+api.get('/new/list', {
+  baseURL: 'http://baidu.com/', // 直接覆盖 baseURL
+})

这种方式的前提是,两个数据源的 requestresponse 规则要保持一致,因为只是覆盖 baseURL ,拦截器还是用的同一套规则。

所以如果两个数据源的请求和响应是完全不同的标准,你需要给第二个数据源单独实例化一个 axios 对象。首先在 .env.* 文件里配置第二个数据源的 baseURL

# 命名可随意,以 VITE_APP_ 开头即可
+VITE_APP_API_BASEURL_2 = 此处填写接口地址

然后把 /src/api/index.ts 文件复制一份,例如就叫 /src/api/index2.ts ,并且将代码中使用到 VITE_APP_API_BASEURL 也替换为 VITE_APP_API_BASEURL_2 ,这样你就可以在页面中通过引入不同的文件分别请求两个数据源了:

ts
import api from '@/api'
+import api2 from '@/api/index2'
+
+// 请求默认数据源
+api.get('/new/list')
+// 请求第 2 个数据源
+api2.get('/new/list')

需注意,如果第二个数据源也需要开启跨域处理的话,需要在 /src/api/index2.ts 里定一个新的 proxy 路径,例如 /proxy2/

ts
const api = axios.create({
+  baseURL: import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true' ? '/proxy2/' : import.meta.env.VITE_APP_API_BASEURL_2,
+  timeout: 10000,
+  responseType: 'json',
+})

同时在 vite.config.ts 里增加一段新的 proxy 配置:

ts
server: {
+  // vite.config.ts 中 proxy 配置,该配置即用于代理 API 请求
+  proxy: {
+    '/proxy': {
+      target: loadEnv(mode, process.cwd()).VITE_APP_API_BASEURL,
+      changeOrigin: command === 'serve' && loadEnv(mode, process.cwd()).VITE_OPEN_PROXY == 'true',
+      rewrite: path => path.replace(/\/proxy/, ''),
+    },
+    '/proxy2': {
+      target: loadEnv(mode, process.cwd()).VITE_APP_API_BASEURL_2,
+      changeOrigin: command === 'serve' && loadEnv(mode, process.cwd()).VITE_OPEN_PROXY == 'true',
+      rewrite: path => path.replace(/\/proxy2/, ''),
+    },
+  },
+},

Mock

Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。

TIP

框架使用 vite-plugin-fake-server 提供开发和生产模拟服务。

Mock 数据编写规则请阅读 Mockjs 官方文档。

开发环境 mock

mock 文件存放在 /src/mock/ 下,建议按照不同模块区分文件夹。文件新增或修改后会自动更新,不需要手动重启,可以在代码控制台查看日志信息。

以下为示例代码:

ts
import { defineFakeRoute } from 'vite-plugin-fake-server/client'
+import Mock from 'mockjs'
+
+export default defineFakeRoute([
+  {
+    url: '/mock/news/list',
+    method: 'get',
+    response: () => {
+      return {
+        error: '',
+        status: 1,
+        data: Mock.mock({
+          'list|5-10': [
+            {
+              title: '@ctitle',
+            },
+          ],
+        }),
+      }
+    },
+  },
+])

参数获取:

  • GET:({ query }) => { }
  • POST:({ body }) => { }

为了让 mock 接口与真实接口共存,即项目开发中,部分请求 mock 接口,部分请求真实接口。需要在配置 mock 接口的时候,给 url 参数统一设置 /mock/ 前缀,并在调用接口的时候,使用 baseURL 强制修改此次请求的地址。

如下所示,其中 news/list 会请求本地的 mock 接口,而 news/create 依旧请求真实接口,即使开启跨域代理也不影响。

ts
import api from '@/api'
+
+api.get('news/list', {
+  baseURL: '/mock/',
+  params: {
+    page: 1,
+    size: 10,
+  },
+}).then((res) => {
+  // 后续业务代码
+})
+
+api.post('news/create', {
+  title: '新闻标题',
+  content: '新闻内容',
+}).then((res) => {
+  // 后续业务代码
+})

生产环境 mock

注意

生产环境一般都是调用真实接口,如果需要使用 mock 也只适用于一些简单的示例网站及预览网站。

框架默认已经配置好生产环境 mock ,如果不想让生产环境里的请求走 mock ,可在接口调用处删除 baseURL 设置,或直接删除 mock 接口文件。

需要注意一点,如果项目中有涉及到上传功能,请彻底关闭线上环境 mock ,在环境配置里设置 VITE_BUILD_MOCK = false ,不然线上环境将会报错。

开发环境与生产环境使用 mock 差异不大,比较大的区别是生产环境里调用 mock 接口,在控制台内看不到接口请求日志。

+ + + + \ No newline at end of file diff --git a/guide/build.html b/guide/build.html new file mode 100644 index 0000000..9903f44 --- /dev/null +++ b/guide/build.html @@ -0,0 +1,40 @@ + + + + + + 构建与预览 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

构建与预览

构建

项目开发完成之后,可以执行 pnpm run build 命令进行构建,构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件。

如果是需要构建测试环境,则执行 pnpm run build:test 命令,对应会在根目录生成 dist-test 文件夹。

TIP

如果最终访问地址为域名非根节点,如 https://www.example.com/app,则需要在 vite.config.ts 中设置 base 选项为 /app/,否则会出现资源引用错误。

预览

生成好的 dist 文件夹一般需要部署至服务器才算部署发布成功,但为了保证构建出来的文件能正常运行,开发者通常希望能在本地先预览一下,可执行 pnpm run servepnpm run serve:test 命令预览不同环境构建出的文件夹。

压缩

在环境配置文件里设置 VITE_BUILD_COMPRESS 即可在构建时生成 .gz.br 文件。

# 单独开启 gzip
+VITE_BUILD_COMPRESS = gzip
+
+# 单独开启 brotli ,brotli 是比 gzip 压缩率更高的算法
+VITE_BUILD_COMPRESS = brotli
+
+# 或者也可以都开启,两者可以共存
+VITE_BUILD_COMPRESS = gzip,brotli

两者均需要 nginx 安装指定模块并开启后才会生效。

生成存档 v4.5.0 新增

在环境配置文件里设置 VITE_BUILD_ARCHIVE 即可在构建完后成生成 .zip.tar.gz 文件。

# 生成 zip
+VITE_BUILD_ARCHIVE = zip
+
+# 生成 tar.gz
+VITE_BUILD_ARCHIVE = tar

其它设置

# 是否在打包时生成 sourcemap
+VITE_BUILD_SOURCEMAP = true
+ + + + \ No newline at end of file diff --git a/guide/changelog.html b/guide/changelog.html new file mode 100644 index 0000000..30cc971 --- /dev/null +++ b/guide/changelog.html @@ -0,0 +1,28 @@ + + + + + + 更新日志 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/coding-standard.html b/guide/coding-standard.html new file mode 100644 index 0000000..59ac33a --- /dev/null +++ b/guide/coding-standard.html @@ -0,0 +1,39 @@ + + + + + + 代码规范 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

代码规范

建议

请确保已阅读《准备工作 - 开发环境》,并且按照文档说明安装好相关软件及扩展。

为保证代码风格统一,请使用 Visual Studio Code 做为开发 IDE ,框架源码里已提供相关配置文件,可直接测试效果:在保存代码时,会自动对当前文件进行代码格式化操作。

IDE 配置

配置文件为 .editorconfig ,通常情况下无需做任何修改。

ESLint 配置

配置文件为 eslint.config.js ,框架使用 antfu/eslint-config 做为基础规范,如果你对默认的规则有异议,可以查阅 ESLint 官网规则并在 eslint.config.js 文件中进行覆盖。

当你对规则进行修改后,原有的代码可能会因为规则的变动导致编辑器大量提示错误,你可以通过运行 pnpm run lint:eslint 进行一次格式校验,如果规则支持自动修复,则会将不符合规则的代码自动进行格式化。

TIP

通过修改 eslint.config.jsignores 配置可忽略无需做代码规范校验的目录或文件,例如在项目中导入了一些第三方的插件代码或组件代码,我们就可以将其进行忽略。

StyleLint 配置

配置文件为 stylelint.config.js ,如果你对默认的规则有异议,可以查阅 Stylelint 官网规则并在 stylelint.config.js 文件中进行修改。

当你对规则进行修改后,原有的代码可能会因为规则的变动导致编辑器大量提示错误,你可以通过运行 pnpm run lint:stylelint 进行一次格式校验,如果规则支持自动修复,则会将不符合规则的代码自动进行格式化。

TIP

通过修改 stylelint.config.jsignoreFiles 配置可忽略无需做代码规范校验的文件,例如在项目中导入了一些第三方的插件代码或组件代码,我们就可以将其进行忽略。

simple-git-hooks 和 lint-staged

由于 IDE 能做的事比较有限,只能对代码的书写规范进行格式化,对于一些无法自动修复的错误代码,如果没有改正到就被推送到 git 仓库,在多人协作开发时,可能会影响到别人的开发体验。所以框架集成了 simple-git-hookslint-staged 这两个依赖来解决这一问题。

在提交代码时, simple-git-hooks 会通过 lint-staged 对本次提交变更的文件进行分别进行 eslint 和 stylelint 检测,如果有报错,则会阻止本次代码提交,直到开发者修改完所有错误代码后,才允许提交到 git 仓库,这样可以确保 git 仓库里的代码不会有不规范的代码。

注意

请确保在安装依赖前,已经使用 git init 对项目进行过 git 环境初始化,如果你在安装依赖后再初始化了 git 环境,请在 git 环境初始化之后再执行一遍 pnpm install 安装命令。

此外,如果 git 仓库目录和框架目录并非同一个,则需要在 package.json 中修改 postinstall 脚本,切换到 git 所在目录。例如 git 目录是 project/ ,而框架目录是 project/fantastic-mobile/ ,则在 package.json 里找到 simple-git-hooks 配置并修改:

json
"simple-git-hooks": {
+  "pre-commit": "cd ./fantastic-mobile/ && pnpm lint-staged",
+  "preserveUnused": true
+}

修改后重新执行一下 pnpm install 即可。

移除

如果不想在 git 提交时强制进行代码规范校验,可以在 package.json 中移除 simple-git-hooks 配置:

json
{
+  "scripts": {
+    "postinstall": "simple-git-hooks", 
+  },
+  "simple-git-hooks": { 
+    "pre-commit": "pnpm lint-staged", 
+    "preserveUnused": true
+  }, 
+}

然后手动删除 .git/hooks/pre-commit 文件即可。

+ + + + \ No newline at end of file diff --git a/guide/configure.html b/guide/configure.html new file mode 100644 index 0000000..c68e02a --- /dev/null +++ b/guide/configure.html @@ -0,0 +1,105 @@ + + + + + + 配置 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

配置

环境配置

默认提供三套环境配置,分别为:

yaml
# 应用配置面板
+VITE_APP_SETTING = true
+# 页面标题
+VITE_APP_TITLE = Fantastic-mobile
+# 接口请求地址,会设置到 axios 的 baseURL 参数上
+VITE_APP_API_BASEURL = /
+# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
+VITE_APP_DEBUG_TOOL =
+
+# 是否开启代理
+VITE_OPEN_PROXY = false
+# 是否开启开发者工具
+VITE_OPEN_DEVTOOLS = false
yaml
# 应用配置面板
+VITE_APP_SETTING = false
+# 页面标题
+VITE_APP_TITLE = Fantastic-mobile
+# 接口请求地址,会设置到 axios 的 baseURL 参数上
+VITE_APP_API_BASEURL = /
+# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
+VITE_APP_DEBUG_TOOL =
+
+# 是否在打包时启用 Mock
+VITE_BUILD_MOCK = true
+# 在构建时生成 sourcemap
+VITE_BUILD_SOURCEMAP = true
+# 在构建时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS =
+# 是否在打包后生成存档,支持 zip 和 tar
+VITE_BUILD_ARCHIVE =
yaml
# 应用配置面板
+VITE_APP_SETTING = false
+# 页面标题
+VITE_APP_TITLE = Fantastic-mobile
+# 接口请求地址,会设置到 axios 的 baseURL 参数上
+VITE_APP_API_BASEURL = /
+# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
+VITE_APP_DEBUG_TOOL =
+
+# 是否在打包时启用 Mock
+VITE_BUILD_MOCK = false
+# 在构建时生成 sourcemap
+VITE_BUILD_SOURCEMAP = false
+# 在构建时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip,brotli
+# 是否在打包后生成存档,支持 zip 和 tar
+VITE_BUILD_ARCHIVE =

其中 VITE_APP_SETTING VITE_APP_TITLE VITE_APP_API_BASEURL VITE_APP_DEBUG_TOOL 为必要配置,即不管是在开发、测试,还是生产环境都需要使用到。而其余配置则在不同环境下有不同用途,例如开发环境用于本地开发使用,测试环境和生产环境用于构建使用。

开发者可根据实际业务需求进行扩展,如果对这块不熟悉,请阅读 Vite - 环境变量和模式 章节。

注意

VITE_APP_SETTING 该变量是开启应用配置面板,目的是方便开发者在开发阶段调试,生产环境下默认关闭,也建议关闭。

应用配置(框架配置)

请在 /src/settings.ts 文件中进行配置,而 /src/settings.default.ts 为框架的默认配置,请勿在该文件内修改。

关于配置的类型定义,可以在 /src/types/globals.d.ts 文件中查阅。

ts
// 这是基础版演示源码里的自定义配置示例
+const globalSettings: Settings.all = {
+  app: {
+    enablePermission: true,
+    enableDynamicTitle: true,
+  },
+  tabbar: {
+    list: [
+      {
+        path: '/feature',
+        icon: 'i-ic:sharp-auto-awesome',
+        activeIcon: 'i-ic:twotone-auto-awesome',
+        text: '特色',
+      },
+      {
+        path: '/',
+        icon: 'i-ic:sharp-home',
+        activeIcon: 'i-ic:twotone-home',
+        text: '主页',
+      },
+      {
+        path: '/user',
+        icon: 'i-ic:baseline-person',
+        activeIcon: 'i-ic:twotone-person',
+        text: '我的',
+      },
+    ],
+  },
+  copyright: {
+    dates: '2024-present',
+    company: 'Fantastic-mobile',
+    website: 'https://fantastic-mobile.github.io',
+  },
+}

注意

文档中提供的配置介绍,如果在本地的开发环境使用中报错或者无法生效,说明你使用的版本不支持或者配置参数有变动,你可以打开 /src/settings.default.ts 查看当前版本的完整配置作为参考。

并且如果你使用的是 Visual Studio Code ,鼠标悬浮到属性上时,会有属性的介绍:

+ + + + \ No newline at end of file diff --git a/guide/devtools.html b/guide/devtools.html new file mode 100644 index 0000000..9c413c6 --- /dev/null +++ b/guide/devtools.html @@ -0,0 +1,29 @@ + + + + + + 开发者工具 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

开发者工具

INFO

该特性由 Vue DevTools Next 提供技术支持。

使用介绍

.env.development 开发环境配置文件中开启:

yaml
# 是否开启开发者工具
+VITE_OPEN_DEVTOOLS = true

开启后,在本地运行时,默认会在页面底部中间显示一个开发者工具按钮,点击即可打开开发者工具。

+ + + + \ No newline at end of file diff --git a/guide/error-log.html b/guide/error-log.html new file mode 100644 index 0000000..11bd960 --- /dev/null +++ b/guide/error-log.html @@ -0,0 +1,32 @@ + + + + + + 错误日志 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

错误日志 专业版

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableErrorLog: true,
+  },
+}

然后需要到 /src/utils/error.log.ts 文件里编写业务代码,框架为方便演示,将错误日志记录在 sessionStorage 里。

开发者需要根据实际业务情况修改代码,例如将增加上报信息,记录用户账号、token等数据,并且将错误日志进行上报。

由于开启错误日志监控后,Vue 相关的错误都不会在控制台里显示,所以在开发环境下即使开启错误日志也不会被启用,如果需要在开发环境下测试,可在 /src/util/error.log.ts 里修改开启的条件判断。

+ + + + \ No newline at end of file diff --git a/guide/font.html b/guide/font.html new file mode 100644 index 0000000..d8cc49e --- /dev/null +++ b/guide/font.html @@ -0,0 +1,31 @@ + + + + + + 自定义字体 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

自定义字体 专业版

用户访问使用了自定义字体的页面时,会自动下载字体文件,字体文件有大有小,所以不建议在非英文环境中使用。

框架预设了 Digital 7 的两套字体,除此之外,你也可以通过以下方法引入你需要的自定义字体。

找字体

访问 DaFont 或其它字体下载网站,下载 .ttf 格式的字体文件。

生成字体

因为 .ttf 格式的字体文件不是浏览器支持的字体格式,所以需要通过 .ttf 生成其它格式的字体文件。

访问 Font Squirrel,上传 .ttf 文件,并按照下面设置后,点击下载。

使用

将上一步下载的压缩包解压并放入 /src/assets/fonts/ 目录下,注意按文件夹区分,随后引入文件夹中的 stylesheet.css 即可使用,以 Digital 7 字体为例:

scss
@import '../../assets/fonts/digital-7/stylesheet.css';
+.digital-7 {
+  font-family: 'digital-7regular';
+}

字体的 font-family 名称在 stylesheet.css 里查看。

另外你也可以将 @import '../../assets/fonts/digital-7/stylesheet.css'; 这句代码放到全局引入,这样所有页面就都可以通过设置 font-family: 'digital-7regular'; 直接使用了。

+ + + + \ No newline at end of file diff --git a/guide/global-resources.html b/guide/global-resources.html new file mode 100644 index 0000000..b30138e --- /dev/null +++ b/guide/global-resources.html @@ -0,0 +1,28 @@ + + + + + + 全局资源 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

全局资源

图片

框架用到的图片资源都放在 /src/assets/images/ 目录下,可自行新建文件夹分类管理。

样式

样式存放目录为 /src/assets/styles/ ,因为 Vue 的文件特性,页面样式建议写在 .vue 文件里,所以该目录只存放全局样式,方便统一管理。

此目录下还有一个特殊目录,即 /src/assets/styles/resources/ ,这是全局 SCSS 资源目录,首先这个目录里只支持 .scss 文件,其次在这个目录里的文件,无需在页面上引用即可生效并使用。

同样,精灵图目录下生成的 SCSS 资源也是全局可调用的。

说明

全局 SCSS 资源并不是全局样式,是变量、@mixin 、@function 这些东西

组件

公共组件

说明

公共组件在使用时,无需手动引入,框架会在你使用时自动引入,该特性由 unplugin-vue-components 提供支持。

公共组件存放在 /src/components/ 目录下,每个组件按文件夹进行区分。

每个组件的文件夹内至少保留一个文件名为 index.vue 的组件入口(可参考 SvgIcon 组件),文件夹名称即为组件名。

推荐使用 pnpm new 指令进行组件生成,详细可查看《代码文件自动生成》。

局部组件

局部组件没有提供专门的存放目录,我们建议采用就近原则,你可以在每个模块的文件夹下,建立一个 components 文件夹专门用于存放局部组件。

+ + + + \ No newline at end of file diff --git a/guide/i18n.html b/guide/i18n.html new file mode 100644 index 0000000..06a454d --- /dev/null +++ b/guide/i18n.html @@ -0,0 +1,67 @@ + + + + + + 国际化 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

国际化 专业版

INFO

该特性由 vue-i18n 提供技术支持。

vscode 扩展

如果使用 vscode 进行开发,推荐安装 i18n Ally 这个扩展。

安装该扩展后,代码里可以实时查看对应语言的内容。

语言包

语言包存放在 /src/locales/lang/ 目录下,因为 Element Plus 本身也有自己的语言包,所以在做国际化支持的时候,框架的语言包和 Element Plus 的语言包需要进行数据合并,可点击这里查看 Element Plus 的语言包文件。

假设你已经在 /src/locales/lang/ 目录下新增并配置好了一个日文语言包 ja.json ,然后你需要到 /src/locales/index.ts 文件里做以下调整:

ts
import elementLocaleZhCN from 'element-plus/dist/locale/zh-cn.mjs'
+import elementLocaleZhTW from 'element-plus/dist/locale/zh-tw.mjs'
+import elementLocaleEn from 'element-plus/dist/locale/en.mjs'
+// 引入 Element Plus 的日文语言包
+import elementLocaleJa from 'element-plus/dist/locale/ja.mjs'
+
+function getElementLocales() {
+  const locales: {
+    [key: string]: any
+  } = {}
+  for (const key in messages) {
+    locales[key] = {}
+    switch (key) {
+      case 'zh-cn':
+        Object.assign(locales[key], elementLocaleZhCN, { labelName: '中文(简体)' })
+        break
+      case 'zh-tw':
+        Object.assign(locales[key], elementLocaleZhTW, { labelName: '中文(繁體)' })
+        break
+      case 'en':
+        Object.assign(locales[key], elementLocaleEn, { labelName: 'English' })
+        break
+      // 在这里增加一个 case 选项,其中 labelName 会在语言选择器里显示
+      case 'ja':
+        Object.assign(locales[key], elementLocaleJa, { labelName: '日本語' })
+        break
+    }
+  }
+  return locales
+}

路由设置

以中文(简体)为例,打开 /src/locales/lang/zh-cn.json 文件可以看到路由相关的配置,在 route 对象里可以扩展需要开启国际化支持的路由。

json
{
+  "pages": {
+    "navbar": {
+      "root": "导航栏",
+      "default": "默认导航栏",
+      "none": "无导航栏"
+    }
+  }
+}

如果需要新增某个路由的国际化支持,光设置好中文(简体)的还不行,其它语言包文件里也要同步添加。当都设置好后,可在该路由的 title 参数上直接设置对应 key 值,例如:

ts
meta: {
+  title: 'pages.navbar.default',
+},

单页组件

如果每个页面都要做国际化支持,那语言包文件就会变得无比庞大且难以维护,推荐在每个页面组件里使用 <i18n> 自定义块进行语言维护,可访问 /src/views/feature/function/i18n.vue 查看示例。

更多 vue-i18n 的使用技巧请参考官方文档。

与服务端交互

所有的请求均会在请求头里带上 Accept-Language ,后端可根据这一状态信息做动态数据国际化处理。

+ + + + \ No newline at end of file diff --git a/guide/intro.html b/guide/intro.html new file mode 100644 index 0000000..0bb957d --- /dev/null +++ b/guide/intro.html @@ -0,0 +1,28 @@ + + + + + + 文档说明 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

文档说明

⭐⭐⭐⭐⭐

相信你已经准备或正在使用 Fantastic-mobile 进行开发工作了,在此之前,希望你可以去 Github 或者 Gitee(码云) 帮我点个 ⭐ ,这将是对我极大的鼓励。

star

star

文档中标记 专业版 的地方,表示该功能仅提供于专业版使用,使用基础版的开发者可直接跳过阅读。

如果你准备好了,那我们就开始吧~

+ + + + \ No newline at end of file diff --git a/guide/keep-alive.html b/guide/keep-alive.html new file mode 100644 index 0000000..7deeb04 --- /dev/null +++ b/guide/keep-alive.html @@ -0,0 +1,63 @@ + + + + + + 页面缓存 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

页面缓存

注意

开启缓存必须保证每个页面组件必须设置 name ,并且确保 name 唯一。

我们只要在需要进行缓存的路由 meta 对象里配置 cache 参数即可。这个参数可接受以下 3 种类型:

  • boolean
  • string
  • string[]

boolean 很好理解,当设置为 true 时,该页面只要一被访问,就会被缓存。例如有一个新闻管理的模块,我们把新闻列表页设置为 cache: true 后并访问,然后从新闻列表页点击某条记录进入新闻详情页,这时候再从新闻详情页返回新闻列表页时,新闻列表页上的数据是不会重新加载,而是保留了当时离开时的状态。

但这个方案也有一个弊端,就是该页面一旦访问就永久被缓存住了(除非手动进行浏览器刷新),如果用户从新闻列表页进入的不是新闻详情页,而是其它模块的页面,比如上一级页面,这时候其实是不希望新闻列表页被缓存的。这种情况下,框架支持设置 stringstring[] 两个类型的参数值。

首先不管设置 string 还是 string[] ,你需要设置的值,都是路由的 name 。

怎么理解呢?还是用上面的例子,如果有两个模块,一个新闻管理,一个用户管理。当从新闻列表页进入新闻详情页的时候,需要对新闻列表页进行缓存,而从新闻列表页进入用户列表页,则不需要对新闻列表页进行缓存,我们就可以对新闻列表页的路由设置成:

src/views/
+└── news/
+    ├── [id].vue
+    └── index.vue
vue
<!-- /src/views/news/index.vue -->
+<script setup lang="ts">
+definePage({
+  meta: {
+    title: '新闻列表页',
+    cache: '/news/[id]',
+  },
+})
+</script>

这表示从新闻列表页进入新闻详情页时,新闻列表页才会被缓存,进入其它任何页面都不会缓存。

当然也可将 cache 设置成 name 数组。

src/views/
+└── news/
+    ├── create.vue
+    ├── detail.[id].vue
+    └── index.vue
vue
<!-- /src/views/news/index.vue -->
+<script setup lang="ts">
+definePage({
+  meta: {
+    title: '新闻列表页',
+    cache: ['/news/detail.[id]', '/news/create'],
+  },
+})
+</script>

这样就表示从新闻列表页进入新闻详情页新增新闻页时,新闻列表页才会被缓存,进入其它任何页面都不会缓存。


还有一种场景,就是某个页面始终开启缓存,仅在某些特定条件下才关闭缓存。例如有一个新闻管理的模块,我们希望新增新闻页始终开启缓存,因为在进行新增操作时,可能需要跳转到新闻分类管理的页面进行新增分类的操作,或者是其他页面进行一些操作,当返回新增新闻页时,需要将它缓存。一旦新闻新增成功,返回到新闻列表页时,新增新闻页就不再需要缓存了。

我们只要在需要进行缓存的路由 meta 对象里配置 noCache 参数即可。这个参数可接受以下 2 种类型:

  • string
  • string[]

针对上述场景,我们就可以对新增新闻页的路由设置成:

src/views/
+└── news/
+    ├── create.vue
+    └── index.vue
vue
<!-- /src/views/news/create.vue -->
+<script setup lang="ts">
+definePage({
+  meta: {
+    title: '新增新闻页',
+    cache: true,
+    noCache: '/news/',
+  },
+})
+</script>
+ + + + \ No newline at end of file diff --git a/guide/login.html b/guide/login.html new file mode 100644 index 0000000..ba66ed2 --- /dev/null +++ b/guide/login.html @@ -0,0 +1,28 @@ + + + + + + 登录 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/guide/mobile-support.html b/guide/mobile-support.html new file mode 100644 index 0000000..bdb300d --- /dev/null +++ b/guide/mobile-support.html @@ -0,0 +1,56 @@ + + + + + + 移动端支持 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

移动端支持

本套件支持使用 vw/vh 做为移动端的布局单位,并默认集成了 postcss-px2vp 插件。

使用也很简单,只需将根目录下 postcss.config.js 文件里的注释代码开启即可:

js
module.exports = {
+  plugins: {
+    'postcss-px2vp': {
+      // 需要转换的单位,默认为"px"
+      unitToConvert: 'px',
+      // 设计稿的视口宽度
+      viewportWidth: 320,
+      // 单位转换后保留的精度
+      unitPrecision: 5,
+      // 能转化为 vw 的属性列表
+      propList: ['*'],
+      // 希望使用的视口单位
+      viewportUnit: 'vw',
+      // 字体使用的视口单位
+      fontViewportUnit: 'vw',
+      // 需要忽略的 CSS 选择器,不会转为视口单位,使用原有的 px 等单位
+      selectorBlackList: [],
+      // 设置最小的转换数值,如果为 1 的话,只有大于 1 的值会被转换
+      minPixelValue: 1,
+      // 媒体查询里的单位是否需要转换单位
+      mediaQuery: false,
+      // 是否直接更换属性值,而不添加备用属性
+      replace: true,
+      // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
+      exclude: [],
+    },
+    autoprefixer: {},
+  },
+}

最后在开发中就可以直接使用 px 了,最终输出就是 vw 。

+ + + + \ No newline at end of file diff --git a/guide/page-layout.html b/guide/page-layout.html new file mode 100644 index 0000000..b17b7c0 --- /dev/null +++ b/guide/page-layout.html @@ -0,0 +1,102 @@ + + + + + + PageLayout 组件 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

PageLayout 组件

<PageLayout> 组件是本框架区别于其他 H5 框架的最重要的特性。它提供了页面整体布局的基础,包括顶部导航栏、顶部标签栏、返回顶部、记录滚动位置等特性。

基本用法

vue
<template>
+  <PageLayout :navbar="false" tabbar copyright>
+    <!-- ... -->
+  </PageLayout>
+</template>

本组件不是一个可以随处使用的组件,它必须应用在根节点,并且一个页面里只能有一个 <PageLayout> 组件。

Props

参数说明类型可选值默认值
titleCenter 专业版导航栏标题是否居中boolean-true
navbar是否启用导航栏,默认使用应用配置 navbar.enableboolean--
navbarMode 专业版导航栏模式,默认使用应用配置 navbar.modestringstatic / fixed / show-hide-fixed / sticky-
navbarStartSide 专业版从预设中设置展示在导航栏左侧的图标按钮string / string[]back / home / forward / i18n-
navbarEndSide 专业版从预设中选择展示在导航栏右侧的图标按钮string / string[]back / home / forward / i18n-
tabbar是否启用标签栏,默认使用应用配置 tabbar.enableboolean--
tabbarName 专业版标签栏名称,如果应用配置里配置了多套标签栏,需设置当前页面使用哪套标签栏,默认使用第一套string--
copyright是否展示底部版权信息,默认使用应用配置 copyright.enableboolean--
backTop是否启用返回顶部按钮,默认使用应用配置 app.enableBackTopboolean--
savedPosition 专业版是否记忆滚动位置(前提条件:需开启页面缓存)boolean--
scrollTop 专业版 v0.2.0 新增设置竖向滚动条位置number--
scrollLeft 专业版 v0.2.0 新增设置横向滚动条位置number--
scrollWithAnimation 专业版 v0.2.0 新增是否在设置滚动条位置时使用动画过渡boolean--

Slots

插槽名说明
-页面区域
navbar导航栏标题区域
navbar-start导航栏左侧图标区域
navbar-end导航栏右侧图标区域
tabbar标签栏区域

Events

事件名说明
scroll页面滚动时触发
reachTop v0.2.0 新增页面滚动到顶部时触发
reachBottom v0.2.0 新增页面滚动到底部时触发

导航栏

enable

可以将导航栏全局开启,这样所有页面默认都会显示导航栏。

ts
const globalSettings: Settings.all = {
+  navbar: {
+    enable: true,
+  },
+}

或者也可以提供一段正则表达式,例如下面这段配置表示页面在微信环境下默认不显示导航栏:

ts
const globalSettings: Settings.all = {
+  navbar: {
+    enable: !/MicroMessenger/i.test(window.navigator.userAgent),
+  },
+}

mode 专业版

全局设置导航栏模式,默认为 static

  • 'static' 静止,跟随页面滚动
  • 'fixed' 固定,不跟随页面滚动,始终固定在顶部
  • 'show-hide-fixed' 显隐固定,默认隐藏,页面滚动时显示
  • 'sticky' 粘性,页面往下滚动时隐藏,往上滚动时显示
ts
const globalSettings: Settings.all = {
+  navbar: {
+    mode: 'fixed',
+  },
+}

标签栏

enable

可以将标签栏全局开启,这样所有页面默认都会显示标签栏。

ts
const globalSettings: Settings.all = {
+  tabbar: {
+    enable: true,
+  },
+}

list

标签栏展示数据:

ts
const globalSettings: Settings.all = {
+  tabbar: {
+    list: [
+      {
+        path: '/',
+        icon: 'i-ic:sharp-home',
+        text: '主页',
+      },
+      {
+        path: '/user',
+        icon: 'i-ic:baseline-person',
+        text: '我的',
+      },
+    ],
+  },
+}

专业版支持配置多套标签栏,然后通过 tabbarName 属性指定当前页面使用哪套标签栏:

ts
const globalSettings: Settings.all = {
+  tabbar: {
+    list: [
+      {
+        name: 'tabbar1',
+        list: [
+          {
+            path: '/',
+            icon: 'i-ic:sharp-home',
+            text: '主页',
+          },
+          {
+            path: '/user',
+            icon: 'i-ic:baseline-person',
+            text: '我的',
+          },
+        ],
+      },
+      {
+        name: 'tabbar2',
+        list: [
+          {
+            path: '/list',
+            icon: 'i-ic:sharp-list',
+            text: '列表',
+          },
+          {
+            path: '/setting',
+            icon: 'i-ic:sharp-settings',
+            text: '设置',
+          },
+        ],
+      },
+    ],
+  },
+}
vue
<template>
+  <PageLayout tabbar-name="tabbar2">
+    <!-- ... -->
+  </PageLayout>
+</template>

path

跳转路由地址

类型默认值说明
string/跳转路由地址

icon

类型默认值说明
string/显示图标

该项配置最终会通过 <SvgIcon /> 组件进行展示,意味着你可以使用自定义图标,也可使用 Iconify 提供的图标,详细可阅读《图标》。

activeIcon 专业版

类型默认值说明
string/激活时显示图标

该项配置最终会通过 <SvgIcon /> 组件进行展示,意味着你可以使用自定义图标,也可使用 Iconify 提供的图标,详细可阅读《图标》。

text

类型默认值说明
string/显示文字

badge 专业版

设置不同的类型值,展示效果也会不同。

  • boolean 展示形式为点,当值为 false 时隐藏
  • number 展示形式为文本,当值小于等于 0 时隐藏
  • string 展示形式为文本,当值为空时隐藏

如果标记需要动态更新,请设置为箭头函数形式,并返回外部变量,例如搭配 pinia 一起使用。

ts
badge: () => globalStore.number
+ + + + \ No newline at end of file diff --git a/guide/permission.html b/guide/permission.html new file mode 100644 index 0000000..5375bac --- /dev/null +++ b/guide/permission.html @@ -0,0 +1,83 @@ + + + + + + 权限 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

权限

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enablePermission: true,
+  },
+}

然后在 /src/api/modules/user.ts 文件里找到 getPermissions 的方法,该方法用于登录成功后获取用户权限。在实际开发中,需要手动进行修改,框架默认通过 mock 模拟获取用户权限。

在演示源码中,默认提供了两组权限,你可以在“权限验证”导航里切换帐号查看不同权限下的效果。如果使用的不是 admintest 用户名登录,则在导航栏里看不到“权限验证”导航入口。

路由权限

在路由的 meta 配置项中,其中有一个 auth 参数,这个就是用来配置路由的权限,一个路由可以配置多个权限,当配置多个权限时,只要满足其中任何一个,则视为用户有访问该路由的权限,如下:

ts
meta: {
+  auth: ['news.browse', 'news.edit'],
+},

框架内部鉴权的逻辑是字符串比对,所以建议对权限有个统一的格式,例如为 xxx.yyy ,其中 xxx 表示模块名, yyy 表示操作类型。那么上面那个例子就表示:

  • news.browse 新闻模块的浏览权限
  • news.edit 新闻模块的编辑权限

路由权限是比较暴力的,即没有权限则该路由页面无法访问,并且也不会在导航栏中显示。但在实际业务中,遇到更多的情况通常是,可以访问路由页面,但会根据不同权限,使用页面里的不同功能,这时候就需要用到下面三种鉴权方式。

鉴权组件

页面中某个模块,当前用户具备该权限是如何显示,不具备该权限又是如何显示,针对这样的需求,框架提供了 <Auth><AuthAll> 组件,具体使用如下:

template
<!-- 单权限验证 -->
+<Auth :value="'department.create'">
+  <p>你有该权限</p>
+  <template #no-auth>
+    <p>你没有该权限</p>
+  </template>
+</Auth>
+
+<!-- 多权限验证,用户只要具备其中任何一个权限,则验证通过 -->
+<Auth :value="['department.create', 'department.edit']">
+  <p>你有该权限</p>
+  <template #no-auth>
+    <p>你没有该权限</p>
+  </template>
+</Auth>
+
+<!-- 多权限验证,用户必须具备全部权限,才验证通过 -->
+<AuthAll :value="['department.create', 'department.edit']">
+  <p>你有该权限</p>
+  <template #no-auth>
+    <p>你没有该权限</p>
+  </template>
+</AuthAll>

鉴权指令

对于单个元素,也提供了 v-authv-auth-all 鉴权指令,使用上对比鉴权组件更方便,当然它能做的事情也更简单。

template
<!-- 单权限验证 -->
+<button v-auth="'department.create'">新增部门</button>
+
+<!-- 多权限验证,用户只要具备其中任何一个权限,则验证通过 -->
+<button v-auth="['department.create', 'department.edit']">新增部门</button>
+
+<!-- 多权限验证,用户必须具备全部权限,才验证通过 -->
+<button v-auth-all="['department.create', 'department.edit']">新增部门</button>

鉴权函数

鉴权组件和鉴权指令控制的是页面上的元素,而鉴权函数则更多是使用在业务流程代码里的权限判断。

ts
import useAuth from '@/utils/composables/useAuth'
+const { auth, authAll } = useAuth()
+
+// 单权限验证,返回 true 或 false
+auth('department.create')
+
+// 多权限验证,用户只要具备其中任何一个权限,则验证通过,返回 true 或 false
+auth(['department.create', 'department.edit'])
+
+// 多权限验证,用户必须具备全部权限,才验证通过,返回 true 或 false
+authAll(['department.create', 'department.edit'])

小技巧

由于权限配置不涉及角色,所以在实现上会更灵活,开发者可自行扩展出角色层,根据不同角色动态设置该角色所拥有的权限,然后用户与角色挂钩,这样就无需繁琐的给每个用户重复分配权限。

当然了,业务有大有小,针对一些简单场景,对权限没有这么多复杂的要求,也可以将角色直接配置到 auth 里。

vue
<script setup lang="ts">
+definePage({
+  meta: {
+    auth: 'admin'
+  },
+})
+</script>
+
+<template>
+  <!-- ... -->
+</template>

如上所示,如果用户是 admin 权限,则可以访问该路由。

+ + + + \ No newline at end of file diff --git a/guide/plop.html b/guide/plop.html new file mode 100644 index 0000000..ddb81ec --- /dev/null +++ b/guide/plop.html @@ -0,0 +1,28 @@ + + + + + + 代码文件自动生成 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

代码文件自动生成

开发过程中,避免不了手动去频繁创建页面、组件等文件,并且还要在文件里写一些必要的代码,是不是觉得很麻烦?现在你可以用更简洁的方式来处理这一切。

说明

该功能基于 plop 实现,在扩展新的模式前,请先详细阅读 plop 文档。

本套件默认提供了 3 种模式,通过 pnpm run new 指令可以自行选择。

  • page 页面文件
  • component 组件文件
  • store 全局状态文件

除了默认提供的 3 种模式,你还可以自定义新的模式,其原理就是通过预设模板,按照特定规则创建文件或者文件夹。

预设模板文件存放在 ./plop-templates/ 目录下,并在 ./plopfile.js 文件里进行引用,你可以参考现有 3 种模式的目录结构进行创建新的模板。

page

page 模式下,只能在 /src/views/ 目录下选择指定的文件夹进行生成,生成的文件中,部分关键位置会被替换掉,例如 <page-header /> 中的 title 会按照你输入的中文名称替换,页面的 name 会根据当前文件目录和文件名自动生成,确保唯一。

component

component 模式可以选择生成的是全局组件还是局部组件,全局组件生成目录为 /src/components/ ,局部组件则在 /src/views/ 目录下选择指定的文件夹进行生成。

store

store 模式则会在 /src/store/modules/ 目录下生成一个对应的文件。

+ + + + \ No newline at end of file diff --git a/guide/q-a.html b/guide/q-a.html new file mode 100644 index 0000000..0524f54 --- /dev/null +++ b/guide/q-a.html @@ -0,0 +1,60 @@ + + + + + + 常见问题 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

常见问题

安装依赖时有警告

这是一个可以无视的警告,因为依赖已经安装成功了。

如果对这个问题感兴趣,可以浏览下这个 issue ,里面有给出一个忽略警告的方案,就是在 package.json 中添加:

json
{
+  "pnpm": {
+    "peerDependencyRules": {
+      "ignoreMissing": [
+        "postcss",
+        "rollup"
+      ]
+    }
+  }
+}

这样你下次再安装依赖的时候,就不会出现该警告了。

为什么本地开发环境首次载入很慢

主要是 Vite 的原因,具体可以阅读这篇文章了解《为什么有人说 vite 快,有人却说 vite 慢?》。

Vite 4.3 显著提升了开发服务器的性能,具体可以阅读这篇文章了解《Vite 4.3 is out!》,同时框架 v3.0.0 版本开始,vite 也升级到了 4.3 版本。

项目 URL 里的 # 号能不能去掉

这是因为路由默认使用的是 Hash 模式,你可以在 /src/router/index.ts 修改为 HTML5 模式,但需要注意,开启 HTML5 模式,服务器也需要做相应的配置调整,详细可阅读《Vue-router 不同的历史模式》。

页面切换后显示空白

因为路由切换有使用到 <transition> 动画,而 <transition> 组件无法处理多个根节点的组件,所以请检查路由对应所有的页面文件的根节点是否均为单个。

错误示例:

vue
<template>
+  <!-- 需要注意,注释也会被视为一个节点 -->
+  <h1>text h1</h1>
+  <h2>text h2</h2>
+</template>
+
+<template>
+  没有节点也是不行的
+</template>

正确示例:

vue
<template>
+  <div>
+    <h1>text h1</h1>
+    <h2>text h2</h2>
+  </div>
+</template>
+
+<template>
+  <div>
+    这样就没问题啦
+  <div>
+</template>

相关 Issue 说明。

开发环境修改代码后,路由跳转导致页面空白

参考这个 issue ,未来 Vue 官方可能会修复这个问题,目前只能手动刷新浏览器。

构建报错,提示内存溢出

构建时失败并在错误信息里提示 Reached heap limit Allocation failed - JavaScript heap out of memory

你可以执行 pnpm add cross-env -D 安装 cross-env 依赖,并在 package.json 里修改构建脚本指令:

json
{
+  "scripts": {
+    "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vue-tsc --noEmit && vite build"
+  }
+}

其中 8192 表示内存空间大小。

不会 TypeScript 怎么办

不管个人还是团队、产品或者项目,从长远考虑我们都建议你学习 TypeScript,因为它是未来的趋势,而且大部分框架、库、插件都是用 TypeScript 开发的,足以证明它是构建一款成熟稳健产品的基石。

但考虑到实际情况,会各种客观原因存在,如果必须要用传统 JavaScript 进行开发,你可以在 tsconfig.json 里将 allowJs 设置为 true 即可,框架原有的 TypeScript 代码不会受到影响,并且你也可以在项目中使用 JavaScript 编写代码。

+ + + + \ No newline at end of file diff --git a/guide/ready.html b/guide/ready.html new file mode 100644 index 0000000..f1bdce8 --- /dev/null +++ b/guide/ready.html @@ -0,0 +1,34 @@ + + + + + + 准备工作 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

准备工作

源码

阅读开发文档前,请确保手上已经有 Fantastic-mobile 源码,因为文档中提及的内容,都是需要在本地项目中编写或修改代码并运行才能呈现的。

源码分为两种:

  • 框架源码 不含示例代码,可直接用于实际开发
  • 演示源码 同演示站,在框架源码基础上,提供了大量示例代码

基础版

Github Releases 页面下载最新版本的压缩包,如下图所示:

或者也可以从 Github/Gitee 上拉取源码,但需要注意,直接拉取源码可能会包含未发布的内容,最终发布时可能会有变动,请谨慎使用。

sh
# 拉取框架源码
+git clone https://github.com/fantastic-mobile/basic.git
+# 拉取演示源码
+git clone -b example https://github.com/fantastic-mobile/basic.git
sh
# 拉取框架源码
+git clone https://gitee.com/fantastic-mobile/basic.git
+# 拉取演示源码
+git clone -b example https://gitee.com/fantastic-mobile/basic.git

专业版

专业版用户会被邀请加入到 Fantastic-mobile Github 官方组织,加入组织后可访问专业版私有仓库,源码获取方式和基础版无差异,只是源码仓库不同。

如果你想获取专业版源码,可以点这里去购买。

开发环境

使用本框架前,需要在本地依次安装好 Node.js, pnpm, Git(非必须) 和 Visual Studio Code

注意

package.json 文件中有限制 node 要求版本,建议使用最新 LTS 版本。

然后在 Visual Studio Code 里安装好以下扩展:

在 Visual Studio Code 里打开源码文件夹,右下角会自动提示需要安装的依赖,直接点击安装即可。

额外推荐

以上为开发时必备扩展,以下则是作者推荐安装的扩展,安装它们将在一定程度上提升开发效率。

技术栈

了解并熟悉框架使用到的技术栈,能让你使用本框架更得心应手。

+ + + + \ No newline at end of file diff --git a/guide/replace-to-nut.html b/guide/replace-to-nut.html new file mode 100644 index 0000000..8d27d22 --- /dev/null +++ b/guide/replace-to-nut.html @@ -0,0 +1,90 @@ + + + + + + 替换为 NutUI | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

替换为 NutUI

由于框架默认使用的是 Vant 组件库,并且演示源码中大量示例也使用了 Vant,如果你需要使用 NutUI,请拉取框架源码分支,或者到 Github Releases 页面下载框架源码压缩包。

专业版用户也同样,请到专业版仓库下载框架源码。

安装

sh
# 安装依赖
+pnpm install
+
+# 安装 NutUI
+pnpm add @nutui/nutui @nutui/touch-emulator

代码调整

基础版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import NutUI from '@nutui/nutui'
+import '@nutui/nutui/dist/style.css'
+import '@nutui/touch-emulator'
+
+function install(app: App) {
+  app.use(NutUI)
+}
+
+export default { install }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { Locale } from '@nutui/nutui'
+import zhCN from '@nutui/nutui/dist/packages/locale/lang/zh-CN'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+Locale.use('zh-CN', zhCN)
+</script>
+
+<template>
+  <NutConfigProvider :theme="settingsStore.currentColorScheme" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </NutConfigProvider>
+</template>
专业版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import NutUI from '@nutui/nutui'
+import '@nutui/nutui/dist/style.css'
+import '@nutui/touch-emulator'
+import zhCN from '@nutui/nutui/dist/packages/locale/lang/zh-CN'
+import enUS from '@nutui/nutui/dist/packages/locale/lang/en-US'
+
+function install(app: App) {
+  app.use(NutUI)
+}
+
+// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
+const locales: Record<string, any> = {
+  'zh-cn': zhCN,
+  'en-us': enUS,
+}
+
+export default { install }
+export { locales }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { Locale } from 'vant'
+import { locales } from './index'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+watch(() => settingsStore.lang, () => {
+  Locale.use(settingsStore.lang, locales[settingsStore.lang])
+})
+</script>
+
+<template>
+  <NutConfigProvider :theme="settingsStore.currentColorScheme" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </NutConfigProvider>
+</template>

修改登录页

由于登录页使用了 Vant 组件,并且删除会导致框架无法正常使用,所以此处需要开发者自行修改或者重新制作登录页,或者也可以参考下方示例中已经修改好的登录页。

卸载

sh
# 卸载 Vant
+pnpm remove vant @vant/touch-emulator

完成

至此,你已经将框架中的 Vant 组件库替换为 NutUI 组件库,并且可以开始使用 NutUI 进行业务开发了。

示例

如果对上述的步骤还有不清楚的地方,可以访问此仓库查看示例源码,以及此链接查看示例网站。

+ + + + \ No newline at end of file diff --git a/guide/replace-to-varlet.html b/guide/replace-to-varlet.html new file mode 100644 index 0000000..c89f196 --- /dev/null +++ b/guide/replace-to-varlet.html @@ -0,0 +1,100 @@ + + + + + + 替换为 Varlet | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

替换为 Varlet

由于框架默认使用的是 Vant 组件库,并且演示源码中大量示例也使用了 Vant,如果你需要使用 Varlet,请拉取框架源码分支,或者到 Github Releases 页面下载框架源码压缩包。

专业版用户也同样,请到专业版仓库下载框架源码。

安装

sh
# 安装依赖
+pnpm install
+
+# 安装 NutUI
+pnpm add @varlet/ui @varlet/touch-emulator

代码调整

基础版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import Varlet from '@varlet/ui'
+import '@varlet/ui/es/style'
+import '@varlet/touch-emulator'
+
+function install(app: App) {
+  app.use(Varlet)
+}
+
+export default { install }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { Locale, StyleProvider, Themes } from '@varlet/ui'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+watch(() => settingsStore.currentColorScheme, (val) => {
+  if (val === 'light') {
+    StyleProvider(null)
+  }
+  else {
+    StyleProvider(Themes.dark)
+  }
+})
+</script>
+
+<template>
+  <VarLocaleProvider locale="zh-CN" :messages="Locale.zhCN" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </VarLocaleProvider>
+</template>
专业版

整体修改 /src/ui-provider/index.ts 文件

ts
import type { App } from 'vue'
+import Varlet, { Locale } from '@varlet/ui'
+import '@varlet/ui/es/style'
+import '@varlet/touch-emulator'
+import enUS from 'vant/es/locale/lang/en-US'
+import zhCN from 'vant/es/locale/lang/zh-CN'
+
+function install(app: App) {
+  app.use(Varlet)
+}
+
+// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
+const locales: Record<string, any> = {
+  'zh-cn': Locale.zhCN,
+  'en-us': Locale.enUS,
+}
+
+export default { install }
+export { locales }

整体修改 /src/ui-provider/index.vue 文件

vue
<script setup lang="ts">
+import { locales } from './index'
+import useSettingsStore from '@/store/modules/settings'
+
+const settingsStore = useSettingsStore()
+
+watch(() => settingsStore.currentColorScheme, (val) => {
+  if (val === 'light') {
+    StyleProvider(null)
+  }
+  else {
+    StyleProvider(Themes.dark)
+  }
+})
+</script>
+
+<template>
+  <VarLocaleProvider :locale="settingsStore.lang" :messages="locales[settingsStore.lang]" class="min-h-vh supports-[(min-height:100dvh)]:min-h-dvh">
+    <slot />
+  </VarLocaleProvider>
+</template>

修改登录页

由于登录页使用了 Vant 组件,并且删除会导致框架无法正常使用,所以此处需要开发者自行修改或者重新制作登录页,或者也可以参考下方示例中已经修改好的登录页。

卸载

sh
# 卸载 Vant
+pnpm remove vant @vant/touch-emulator

完成

至此,你已经将框架中的 Vant 组件库替换为 Varlet 组件库,并且可以开始使用 Varlet 进行业务开发了。

示例

如果对上述的步骤还有不清楚的地方,可以访问此仓库查看示例源码,以及此链接查看示例网站。

+ + + + \ No newline at end of file diff --git a/guide/router.html b/guide/router.html new file mode 100644 index 0000000..b2c7089 --- /dev/null +++ b/guide/router.html @@ -0,0 +1,59 @@ + + + + + + 路由 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

路由

框架无需手动配置路由,而是基于文件系统自动生成路由,意味着开发者只需在 /src/views/ 目录下创建文件,就会根据文件目录自动生成对应的路由,该能力由 unplugin-vue-router 提供。

配置规范

如果对 unplugin-vue-router 的规范还不了解,建议先阅读官方文档。框架在此基础上,预设了一些规范。以下面的目录结构为例:

目录结构                       路由地址                    路由 name
+
+src/views/
+├── _about
+│   └── index.vue
+├── example
+│   ├── _test.vue
+│   ├── components
+│   │   └── dialog.vue
+│   ├── svgicon.vue          /example/svgicon           /example/svgicon
+│   └── index.vue            /example                   /example/
+├── cart
+│   ├── detail
+│   │   └── [id].vue         /cart/detail/:id           /cart/detail/[id]
+│   └── index.vue            /cart                      /cart/
+├── news
+│   ├── detail.[id].vue      /news/detail/:id           /news/detail.[id]
+│   └── index.vue            /news                      /news/
+├── [...all].vue             /:all(.*)                  /[...all]
+├── index.vue                /                          /
+└── login.vue                /login                     /login

通过上面的示例,可以看出几个规范:

  • 文件夹或文件名开头为 _ 的不会生成路由
  • 所有 components 文件夹下的文件均不会生成路由
  • index.vue 文件会生成一个空路由,例如 /src/views/news/index.vue -> /news 路由
  • 路由参数通过 [ ] 将参数名包裹,例如 /src/views/user_[id].vue -> /user_:id 路由。设置可以添加多个参数 /src/views/product_[skuId]_[seoDescription].vue
  • 路由 name 默认为文件路径,也可通过 definePage().vue 文件内设置并覆盖

注意

默认生成的路由可能为嵌套路由,但为了用一套 API 统一处理页面缓存,框架会将所有路由均处理成一级路由,并在 App.vue 里处理缓存逻辑。意味着如果同时创建 /src/views/users/index.vue/src/views/users.vue 组件,/src/views/users/index.vue 不会在 /src/views/users.vue<RouterView> 中呈现。

这也意味着 /src/views/users/detail/[id].vue/src/views/users/detail.[id].vue 生成的路由和行为都是一样的,只有路由 name 有区别。

这与 unplugin-vue-router 默认行为略有不同。

definePage()

通过 definePage() 可以修改路由对象或添加路由元信息:

vue
<script setup lang="ts">
+definePage({
+  name: 'example',
+  meta: {
+    title: '示例'
+  },
+})
+</script>
+
+<template>
+  <!-- ... -->
+</template>

警告

不能在 definePage() 中使用变量,因为其传递的参数会在构建时提取并从 <script setup> 中删除。

路由元信息

title

类型默认值说明
string/浏览器及页面中展示的标题

支持设置 i18n 对应的 key 值,详细可阅读《国际化》。

cache

类型默认值说明
boolean / string / string[]/是否对该页面进行缓存
  • boolean 设置为 true 时,该路由页面会被一直缓存
  • string 设置某个目标路由的 name ,表示当前路由页面跳转到设置的 name 对应的路由页面时,则将当前路由页面进行缓存,否则不缓存
  • string[] ,可设置一个目标路由的 name 数组

当类型为 stringstring[] 时,可以更精细的去控制页面缓存的逻辑。例如从列表页进入详情页,则需要将列表页进行缓存;而从列表页进入其它页面,则无需将列表页进行缓存。详细可阅读《页面缓存》。

noCache

类型默认值说明
string / string[]/是否对该页面清除缓存,需设置 cache 才会生效
  • string 设置某个目标路由的 name ,表示当前路由页面跳转到设置的 name 对应的路由页面时,则将当前路由页面清除缓存,否则不清除缓存
  • string[] ,可设置一个目标路由的 name 数组

该属性通常搭配 cache: true 使用,可以更精细的去控制页面取消缓存的逻辑。详细可阅读《页面缓存》。

auth

类型默认值说明
boolean / string / string[]/该路由访问权限
  • boolean 设置为 true 时,该路由仅登录用户可访问
  • string 设置某个权限的名称,表示当前路由仅允许具备该权限的用户可访问
  • string[] 设置多个权限的名称数组,表示当前路由允许具备其中一个权限的用户可访问

当类型为 stringstring[] 时,可以更精细的去控制页面权限,不具备访问权限则会显示 403 页面,详细可阅读《权限 - 路由权限》。

+ + + + \ No newline at end of file diff --git a/guide/start.html b/guide/start.html new file mode 100644 index 0000000..3cab239 --- /dev/null +++ b/guide/start.html @@ -0,0 +1,33 @@ + + + + + + 开始 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

开始

准备工作完成后,在源码文件夹根目录下依次执行以下命令:

sh
# 安装依赖
+# 注意,必须使用 pnpm 安装依赖,请勿使用 npm 或 yarn 安装依赖
+pnpm install
+
+# 运行
+pnpm run dev

运行成功后,会自动访问页面,默认地址为 http://localhost:9000

报错

如果无法正常安装依赖,可能是因为 npm 默认源无法访问,可以尝试执行 pnpm config set registry https://registry.npmmirror.com/ 切换为国内 npmmirror 镜像源(也可以使用 nrm 一键切换源),然后删除根目录下 /node_modules 文件夹并重新安装依赖。

如果依旧无法运行(基本不太可能),可尝试删除根目录下 /node_modules 文件夹与 pnpm-lock.yaml 文件后,再删除 package.json"preinstall": "npx only-allow pnpm" 这句脚本,最后使用 npm / yarn 或其他包管理工具进行安装依赖。但需要清楚一点,这样操作后,将无法与官方环境锁定的依赖包版本保持一致,可能会出现无法预知的问题,非必要情况下,请勿使用该方案。

+ + + + \ No newline at end of file diff --git a/guide/storage.html b/guide/storage.html new file mode 100644 index 0000000..d3cd4c2 --- /dev/null +++ b/guide/storage.html @@ -0,0 +1,44 @@ + + + + + + 私有 Storage 数据 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

私有 Storage 数据 专业版

由于 localStorage 和 sessionStorage 的同源策略,同一域名下的 storage 数据会共享。如果你恰好需要在同一域名下部署两套(及以上)系统,不可避免会出现 storage 数据冲突,框架提供了一个 storage 类来解决这个问题。

解决同源 storage 数据冲突的方式就是增加前缀区分,首先需要在应用配置中设置一个唯一且不重名的前缀:

ts
const globalSettings: Settings.all = {
+  app: {
+    storagePrefix: 'fm_',
+  },
+}

然后在需要使用到 storage 的地方引入:

ts
import storage from '@/utils/storage'

这个类封装了 setItem()getItem()removeItem()clear() 方法,同时还增加了一个 has() 方法用来判断对象是否存在:

ts
// localStorage
+storage.local.has(key)
+storage.local.get(key)
+storage.local.set(key, value)
+storage.local.remove(key)
+storage.local.clear()
+
+// sessionStorage
+storage.session.has(key)
+storage.session.get(key)
+storage.session.set(key, value)
+storage.session.remove(key)
+storage.session.clear()

注意

由于 localStorage 有容量上限,一般为 5M ,如果一同域名下部署两套系统,意味着两套系统共享 5M 容量,所以不建议在同一域名部署太多套系统,避免出现 localStorage 不够用的情况。

+ + + + \ No newline at end of file diff --git a/guide/store.html b/guide/store.html new file mode 100644 index 0000000..cc3fabf --- /dev/null +++ b/guide/store.html @@ -0,0 +1,43 @@ + + + + + + 全局状态管理 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

全局状态管理

TIP

Pinia 已正式成为 Vue.js 官方状态库,如果你对 Pinia 还不熟悉,除了通过 Pinia 官网学习外,我还收集了一些文字/视频的介绍,可以帮助你快速上手。

全局状态文件存放在 /src/store/modules/ 目录下,请按模块进行区分。同时请保证文件名和文件内唯一ID保持一致,建议使用 pnpm new 指令进行创建。

例如新建一个 example.ts 的文件:

ts
const useExampleStore = defineStore(
+  // 唯一ID
+  'example',
+  () => {
+    const someThing = ref(0)
+
+    return {
+      someThing,
+    }
+  },
+)
+
+export default useExampleStore

使用方法:

ts
import useExampleStore from '@/store/modules/example'
+const exampleStore = useExampleStore()
+
+exampleStore.someThing
+ + + + \ No newline at end of file diff --git a/guide/svg-icon.html b/guide/svg-icon.html new file mode 100644 index 0000000..44973d7 --- /dev/null +++ b/guide/svg-icon.html @@ -0,0 +1,39 @@ + + + + + + 图标 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

图标

框架提供了三种使用图标的方式,你可以根据自己的使用需求自行选择。

自定义图标

你可以去阿里巴巴矢量图标库,或者其它支持下载 SVG 图标文件的网站,又或者是设计师绘制的 SVG 文件,将准备好的 SVG 图标文件放到 /src/assets/icons/ 目录下,然后在页面中就可以通过 SvgIcon 组件使用了,name 就是 svg 的文件名。

vue
<!-- /src/assets/icons/example.svg -->
+<SvgIcon name="example" />

Iconify 图标

介绍

Iconify 提供 100+ 套图标集,有 100,000+ 个图标可以免费使用。

除了可以在 Iconify 官网上查找搜需要的图标,你还可以在 Icônes 网站 上查找,这是一个基于 Iconify 的在线图标搜索网站,它比 Iconify 官网的操作更直观。

Unocss 方案

说明

Unocss 方案采用了 CSS 去处理图标的展示,框架大部分核心模块里采用的是这种方式,如果你对其中的技术细节感兴趣,可以阅读这篇 Unocss 作者的《聊聊纯 CSS 图标》这篇文章。

框架已经做好了所有配置,使用方式也极为简单,你只需进入 Iconify 官网 上查找 Iconify 提供的所有图标,然后点击需要使用的图标,复制图标名称,在任意原生 HTML 标签上通过设置 class ,格式为 i-{集合名}:{图标名},例如:

vue
<div class="i-ep:arrow-right" />
+<i class="i-ep:search" />

当然你同样也可以通过 SvgIcon 使用它。

vue
<SvgIcon name="i-ep:arrow-right" />

在使用 Unocss 图标时,需要注意以下两点:

  • 图标字符串不支持拼接

    vue
    <!-- 这样不会生效 -->
    +<SvgIcon :name="'i-ep' + ':search'" />
  • 图标字符串不支持异步返回

    vue
    <!-- 这样不会生效 -->
    +<!-- 假设 name 是异步请求返回的数据,name 为 i-ep:search -->
    +<SvgIcon :name="name" />

如果确实有以上需求,你可以使用 Iconify 原生提供的方案。

Iconify 原生方案

说明

框架保留了 Iconify 官方提供的使用方式,格式为 {集合名}:{图标名}

vue
<script setup>
+import { Icon } from '@iconify/vue'
+</script>
+
+<template>
+  <Icon icon="ep:arrow-right" />
+</template>

当然这么使用并没有很方便,依旧还是需要手动导入一个 Icon 组件。如果你也觉得麻烦的话,那么你可以使用 SvgIcon 组件来展示,框架已经帮你做好的所有处理。

vue
<SvgIcon name="ep:arrow-right" />
+ + + + \ No newline at end of file diff --git a/guide/theme.html b/guide/theme.html new file mode 100644 index 0000000..62bb98a --- /dev/null +++ b/guide/theme.html @@ -0,0 +1,156 @@ + + + + + + 主题 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

主题

框架主题

主题配色存放在 /themes/index.ts 文件中,基础版和专业版内容略有不同。

基础版

ts
import { hex2rgba } from '@unocss/preset-mini/utils'
+
+export const lightTheme = {
+  // 颜色主题
+  'color-scheme': 'light',
+  // 内置 UI
+  '--ui-primary': hex2rgba('#0f0f0f')!.join(' '),
+  '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
+  // 主体
+  '--g-bg': '#f2f2f2',
+  '--g-container-bg': '#fff',
+  '--g-border-color': '#DCDFE6',
+  // 导航栏
+  '--g-navbar-bg': '#fff',
+  '--g-navbar-color': '#0f0f0f',
+  // 标签栏
+  '--g-tabbar-bg': '#fff',
+  '--g-tabbar-color': '#6f6f6f',
+  '--g-tabbar-active-color': '#0f0f0f',
+}
+
+export const darkTheme = {
+  // 颜色主题
+  'color-scheme': 'dark',
+  // 内置 UI
+  '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
+  '--ui-text': hex2rgba('#242b33')!.join(' '),
+  // 主体
+  '--g-bg': '#0a0a0a',
+  '--g-container-bg': '#141414',
+  '--g-border-color': '#15191e',
+  // 导航栏
+  '--g-navbar-bg': '#141414',
+  '--g-navbar-color': '#e5e5e5',
+  // 标签栏
+  '--g-tabbar-bg': '#141414',
+  '--g-tabbar-color': '#6f6f6f',
+  '--g-tabbar-active-color': '#e5e5e5',
+}

专业版

与基础版不同,专业版默认提供了 12 款主题,明亮和暗黑模式各 6 款,并且主题在运行时共存,可实现动态切换。

ts
import { hex2rgba } from '@unocss/preset-mini/utils'
+
+export default {
+  light: {
+    // 颜色主题
+    'color-scheme': 'light',
+    // 内置 UI
+    '--ui-primary': hex2rgba('#0f0f0f')!.join(' '),
+    '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
+    // 主体
+    '--g-bg': '#f2f2f2',
+    '--g-container-bg': '#fff',
+    '--g-border-color': '#DCDFE6',
+    // 导航栏
+    '--g-navbar-bg': '#fff',
+    '--g-navbar-color': '#0f0f0f',
+    // 标签栏
+    '--g-tabbar-bg': '#fff',
+    '--g-tabbar-color': '#6f6f6f',
+    '--g-tabbar-active-color': '#0f0f0f',
+  },
+  ...
+  dark: {
+    // 颜色主题
+    'color-scheme': 'dark',
+    // 内置 UI
+    '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
+    '--ui-text': hex2rgba('#242b33')!.join(' '),
+    // 主体
+    '--g-bg': '#0a0a0a',
+    '--g-container-bg': '#141414',
+    '--g-border-color': '#15191e',
+    // 导航栏
+    '--g-navbar-bg': '#141414',
+    '--g-navbar-color': '#e5e5e5',
+    // 标签栏
+    '--g-tabbar-bg': '#141414',
+    '--g-tabbar-color': '#6f6f6f',
+    '--g-tabbar-active-color': '#e5e5e5',
+  },
+  ...
+}

如果框架提供的主题风格满足不了你的需求,你还可以自定义新的主题。

ts
import { hex2rgba } from '@unocss/preset-mini/utils'
+
+export default {
+  newThemeName: { // 主题名称
+    // 颜色主题
+    'color-scheme': 'light',
+    // 内置 UI
+    '--ui-primary': hex2rgba('#0f0f0f')!.join(' '),
+    '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
+    // 主体
+    '--g-bg': '#f2f2f2',
+    '--g-container-bg': '#fff',
+    '--g-border-color': '#DCDFE6',
+    // 导航栏
+    '--g-navbar-bg': '#fff',
+    '--g-navbar-color': '#0f0f0f',
+    // 标签栏
+    '--g-tabbar-bg': '#fff',
+    '--g-tabbar-color': '#6f6f6f',
+    '--g-tabbar-active-color': '#0f0f0f',
+  },
+}

最后在应用配置中使用该主题:

ts
const globalSettings: Settings.all = {
+  app: {
+    // 如果主题是暗黑模式下使用的,则 darkTheme: 'newThemeName'
+    lightTheme: 'newThemeName',
+  },
+}

颜色方案

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    /**
+     * 留空跟随系统
+     * light 明亮模式
+     * dark 暗黑模式
+     */
+    colorScheme: '',
+  },
+}

哀悼模式 v0.2.0 新增

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableMournMode: true,
+  },
+}

色弱模式 v0.2.0 新增

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableColorAmblyopiaMode: true,
+  },
+}

开发注意

如果只在明亮或暗黑模式中,选择其中一种模式进行业务开发,那没有什么需要注意的,你可以按照以往的开发习惯进行开发,这也是框架推荐的方式。

但如果需要让用户可以自己选择明亮或暗黑模式,或者是根据浏览器主题来判断是使用明亮还是暗黑模式。这时候开发则需要注意,业务页面里使用到的颜色将不能写成固定值(例如 color 、background-color 、border-color 、box-shadow 等有涉及到颜色的属性),因为同一个色值是无法顾及到明亮和暗黑两种模式的。

这时候我们建议使用 UnoCSS 进行样式编写,例如 text-dark dark-text-whitebg-green dark-bg-red 。如果你不习惯使用 UnoCSS ,那也可以使用下面这种方法,在页面中去自定义一些颜色。

scss
div {
+  color: #000;
+
+  [data-theme="dark"] & {
+    color: #fff;
+  }
+}

最后分享一篇关于暗黑模式的文章《教你巧用UI设计中的暗黑模式——Dark Mode》,希望帮助你更好地在暗黑模式下开发出优秀的页面。

+ + + + \ No newline at end of file diff --git a/guide/title.html b/guide/title.html new file mode 100644 index 0000000..7f054af --- /dev/null +++ b/guide/title.html @@ -0,0 +1,32 @@ + + + + + + 动态标题 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/upgrade.html b/guide/upgrade.html new file mode 100644 index 0000000..12b426e --- /dev/null +++ b/guide/upgrade.html @@ -0,0 +1,28 @@ + + + + + + 框架更新 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

框架更新

首先明确一点,Fantastic-mobile 无法像 npm 的插件一样更新,不仅我们的框架如此,其实大部分 H5 开发框架都是如此。

因为本质上这类框架其实是一个初始框架,开发者会根据自身需求去修改,然后基于业务开展业务代码编写。所以一旦下载开始使用,基本是无法更新的,你在哪个时间点开始使用,项目就固定在什么版本了。

那有没有解决办法么?其实也有,参考如下:

  1. 在基于 Fantastic-mobile 做项目开发时尽量避免框架自带模块或组件的改动,或者改动地方做一个文档记录,可以清楚知道改动了哪些,这样当你需要进行新版本更新时,按照之前记录的文档可以有个大致的迁移方案,而业务代码则可以直接拷贝过去。
  2. 我们尽量在提交代码时标明每次提交改动的变更记录说明,这样你可以选择性的更新部分新代码到项目中,也就是局部更新。这种方案也是作者在公司内部项目经常使用的,因为大部分项目是无需全局更新到新版的,只需将必要的一些新特性或 bug 修复同步到原有项目中即可。
  3. 使用文件比较工具,例如 Beyond Compare,这款工具可以直接对比文件夹,可以清晰的列出文件夹内所有文件的差异,可以协助升级工作开展。
+ + + + \ No newline at end of file diff --git a/guide/viewport.html b/guide/viewport.html new file mode 100644 index 0000000..a860284 --- /dev/null +++ b/guide/viewport.html @@ -0,0 +1,28 @@ + + + + + + 浏览器适配 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

浏览器适配

框架设计基于 375px 宽度设计稿,并使用 postcss 插件 postcss-mobile-forever 将 px 单位转换成 vw 单位从而实现移动端适配。相对于其他同类 px 转 vw 单位的 postcss 插件,postcss-mobile-forever 提供了更加细致的适配策略,也兼顾了桌面端的使用场景。

同时框架还使用到了 UnoCSS 预设 @unocss/preset-rem-to-px ,使得基于 UnoCSS 编写的样式也能通过一套方案转换成 vw 单位。

作为开发者,只需要在开发前,将设计稿转换为 375px 宽度,然后即可开始开发。

+ + + + \ No newline at end of file diff --git a/guide/vue3-composition-api.html b/guide/vue3-composition-api.html new file mode 100644 index 0000000..1bdbea9 --- /dev/null +++ b/guide/vue3-composition-api.html @@ -0,0 +1,52 @@ + + + + + + 使用 Composition API 开发 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

使用 Composition API 开发

Composition API 是 Vue3 全新提供的一种语法,对于从 Vue2 就在使用的开发者,如果一时半会没办法立马上手 Composition API ,你依旧可以在项目中使用 Options API 做开发。当然我们更建议你使用 Composition API 进行开发,它比 Options API 更灵活且易读。

使用

如果你还不熟悉 Composition API ,那么我们建议你阅读 Vue3 官方文档了解;如果你已经熟悉 Composition API ,那么我们建议你在开发的时候,使用 <script setup> 语法糖进行开发,它将提高很多开发上的效率。

同时得益于 unplugin-auto-import 的特性,在 <script setup> 里无需导入相关 API ,该依赖会自动导入(默认支持 vue,vue-router 和 pinia )。

vue
<script setup lang="ts">
+// 无需手动 import 相关 API
+import { computed, ref } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+
+const count = ref(0)
+const doubled = computed(() => count.value * 2)
+
+const route = useRoute()
+const router = useRouter()
+console.log(route.path)
+router.push('/dashboard')
+</script>

组件 name

<script setup> 可以和普通的 <script> 一起使用,所以可以这样定义组件 name:

vue
<script lang="ts">
+export default {
+  name: 'componentName',
+}
+</script>
+
+<script setup lang="ts">
+...
+</script>

Vue 3.3 开始,你可以使用 defineOptions<script setup> 里定义组件的 name:

vue
<script setup lang="ts">
+defineOptions({
+  name: 'ComponentName',
+})
+</script>
+ + + + \ No newline at end of file diff --git a/guide/watermark.html b/guide/watermark.html new file mode 100644 index 0000000..eb05dea --- /dev/null +++ b/guide/watermark.html @@ -0,0 +1,44 @@ + + + + + + 页面水印 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

页面水印 专业版

使用

在应用配置中设置:

ts
const globalSettings: Settings.all = {
+  app: {
+    enableWatermark: true,
+  },
+}

效果如下:

设置水印内容

/src/store/modules/watermark.ts 中可修改水印展示内容,以及其他水印相关配置。

水印同时支持动态更新,示例:

vue
<script setup lang="ts">
+import useWatermarkStore from '@/store/modules/watermark'
+
+const watermarkStore = useWatermarkStore()
+
+watermarkStore.update({
+  text: '设置水印',
+  // 更多设置项请查看 /src/utils/watermark.ts 中 settingsType 类型定义
+})
+
+// 重置水印,恢复到默认设置
+watermarkStore.update()
+</script>
+ + + + \ No newline at end of file diff --git a/guide/why.html b/guide/why.html new file mode 100644 index 0000000..0785a5c --- /dev/null +++ b/guide/why.html @@ -0,0 +1,28 @@ + + + + + + 为什么选择我们 ? | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

为什么选择我们 ?

是模板,更是框架

Fantastic-mobile 与市面上大部分移动端 H5 模板不同之处在于,它针对通用场景提供了一套标准且易于扩展设计,通过简单的配置即可轻松完成页面的设计和布局。同时也提供了一些常用的组件和工具函数,让开发者可以更加专注于业务逻辑的开发。

这也是为什么我们自称为「框架」,而不仅仅是「模板」的原因。

如果你在使用过 Fantastic-mobile 后,认为它还达不到你心中框架的标准,也请告诉我们有哪些可改进的地方,因为我们最终的目标是希望 Fantastic-mobile 能够成为你的得力助手,让你的开发工作高效且愉快

为什么不是它们 ?

以上 3 款模板都很成熟,也是社区内人气较高的项目。但正如上面所说,Fantastic-mobile 从一开始就不打算仅仅只是做一个 H5 模版。所以,如果你正在做技术选型,不如先了解一下我们这款框架,再决定是否要继续使用其他 H5 模板。

并且你不需要担心技术栈上的差异,因为 Vue3 整体的生态已经非常成熟,几乎形成了一套社区默认的技术栈。也就是说,以上 3 款模板和 Fantastic-mobile 使用到的技术栈,几乎是一样的。

用一句简单的话概括就是:人无我有,人有我优

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 0000000..3c6a82c --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"components_svg-icon.md":"DU7jEag7","guide_build.md":"DEKENzfd","components_trend.md":"DprOyENc","components_sparkline.md":"goZs4Z45","guide_theme.md":"DoCHY_Cl","guide_coding-standard.md":"C2Bl-4Ae","buy.md":"CS2ibG6n","components_auth-all.md":"DA7uNEaz","guide_devtools.md":"CAkrTcVC","guide_axios.md":"eiRrRE32","components_index.md":"C5g7wdUl","guide_ready.md":"PAoY2SCM","components_auth.md":"C2hBKG78","guide_plop.md":"Dz4YQc8b","guide_changelog.md":"BE1iJTvH","guide_global-resources.md":"Ce3hhm_-","guide_permission.md":"BFNZDjnV","support.md":"B0h1OKPf","index.md":"CO37Rkx6","guide_why.md":"DvOsftQ3","guide_vue3-composition-api.md":"BWg9K3cK","guide_router.md":"D9QTFdeu","guide_login.md":"CmsD9wCN","guide_api.md":"BmpN9bDB","guide_replace-to-nut.md":"Cg3KO3ql","guide_mobile-support.md":"Dbl0b72M","guide_error-log.md":"BGc7u-uA","guide_i18n.md":"f4Xaz9vk","guide_keep-alive.md":"BguaEZ4O","components_page-main.md":"6bzHEmEC","guide_store.md":"BpEcm4ka","guide_title.md":"4qYTrMaW","guide_page-layout.md":"CqsasEls","guide_font.md":"D4d7gLBB","guide_intro.md":"BqwfDzTF","guide_replace-to-varlet.md":"ZYN0cTJ3","guide_upgrade.md":"MYKFZrm3","guide_start.md":"CQ8Y9Aeo","guide_viewport.md":"CQxsQl-3","guide_storage.md":"DOKcJ7lZ","guide_watermark.md":"hhPmfVdr","guide_svg-icon.md":"Ce1T8AF7","guide_configure.md":"CwA-2ilh","guide_q-a.md":"CP91v9MW"} diff --git a/i18n-ally.png b/i18n-ally.png new file mode 100644 index 0000000..b46c38c Binary files /dev/null and b/i18n-ally.png differ diff --git a/icones1.png b/icones1.png new file mode 100644 index 0000000..8f35bc5 Binary files /dev/null and b/icones1.png differ diff --git a/icones2.png b/icones2.png new file mode 100644 index 0000000..72f13e5 Binary files /dev/null and b/icones2.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..31160e4 --- /dev/null +++ b/index.html @@ -0,0 +1,28 @@ + + + + + + Fantastic-mobile | 开箱即用的移动端 H5 框架 + + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/logo-with-shadow.png b/logo-with-shadow.png new file mode 100644 index 0000000..8813f3b Binary files /dev/null and b/logo-with-shadow.png differ diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..cec3101 Binary files /dev/null and b/logo.png differ diff --git a/preview.png b/preview.png new file mode 100644 index 0000000..23712e6 Binary files /dev/null and b/preview.png differ diff --git a/preview1.png b/preview1.png new file mode 100644 index 0000000..e52adb0 Binary files /dev/null and b/preview1.png differ diff --git a/preview2.png b/preview2.png new file mode 100644 index 0000000..9d46b52 Binary files /dev/null and b/preview2.png differ diff --git a/preview3.png b/preview3.png new file mode 100644 index 0000000..ef1a9ad Binary files /dev/null and b/preview3.png differ diff --git a/preview4.png b/preview4.png new file mode 100644 index 0000000..6684eca Binary files /dev/null and b/preview4.png differ diff --git a/qa1.png b/qa1.png new file mode 100644 index 0000000..7266351 Binary files /dev/null and b/qa1.png differ diff --git a/qrcode-alipay-hongbao.jpg b/qrcode-alipay-hongbao.jpg new file mode 100644 index 0000000..735045c Binary files /dev/null and b/qrcode-alipay-hongbao.jpg differ diff --git a/qrcode-alipay.png b/qrcode-alipay.png new file mode 100644 index 0000000..0a9628e Binary files /dev/null and b/qrcode-alipay.png differ diff --git a/qrcode-wechat.png b/qrcode-wechat.png new file mode 100644 index 0000000..edda40a Binary files /dev/null and b/qrcode-wechat.png differ diff --git a/settings.png b/settings.png new file mode 100644 index 0000000..256bbea Binary files /dev/null and b/settings.png differ diff --git a/support.html b/support.html new file mode 100644 index 0000000..6e8bdce --- /dev/null +++ b/support.html @@ -0,0 +1,28 @@ + + + + + + 技术支持 | Fantastic-mobile 官方文档 + + + + + + + + + + + + + + + + + +
Skip to content

技术支持

基础版

在使用框架的过程中难免会遇到问题,优先推荐在仓库提交 Issue ,你可以更详细描述问题产生的操作步骤,或者提供完整的最小复现,这样做可以让更多的人参与讨论,也方便后人查阅。

专业版

购买专业版的用户会邀请到专业版的微信群,并在群内提供技术支持。

+ + + + \ No newline at end of file diff --git a/theme.gif b/theme.gif new file mode 100644 index 0000000..3e80430 Binary files /dev/null and b/theme.gif differ diff --git a/ui-nut.png b/ui-nut.png new file mode 100644 index 0000000..5eb3a33 Binary files /dev/null and b/ui-nut.png differ diff --git a/ui-varlet.png b/ui-varlet.png new file mode 100644 index 0000000..3a5df63 Binary files /dev/null and b/ui-varlet.png differ diff --git a/vscode.png b/vscode.png new file mode 100644 index 0000000..d6f6893 Binary files /dev/null and b/vscode.png differ diff --git a/watermark.png b/watermark.png new file mode 100644 index 0000000..e7c758f Binary files /dev/null and b/watermark.png differ