diff --git a/404.html b/404.html new file mode 100644 index 00000000..46ec1f74 --- /dev/null +++ b/404.html @@ -0,0 +1,30 @@ + + + + + + 404 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..146b5d55 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +one-step-admin.hurui.me \ 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 00000000..74e57c4c 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 00000000..349dc36a 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 00000000..1c1ebc68 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 00000000..eeaa3036 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 00000000..7f1d7709 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 00000000..19251b0f 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 00000000..8816b695 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 00000000..f8b63fb0 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 00000000..ccbefc88 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 00000000..97857dbc 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 00000000..c3407eda 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 00000000..e755a9dc Binary files /dev/null and b/assets/FiraCode-VF.Bc8wnsZt.woff2 differ diff --git a/assets/app.AaxqJnlp.js b/assets/app.AaxqJnlp.js new file mode 100644 index 00000000..7d0d7d13 --- /dev/null +++ b/assets/app.AaxqJnlp.js @@ -0,0 +1 @@ +import{R as p}from"./chunks/theme.CuJNMu0w.js";import{U as o,a8 as u,a9 as c,aa as l,ab as f,ac as d,ad as m,ae as h,af as g,ag as A,ah as y,d as P,u as v,y as w,x as C,ai as R,aj as b,ak as E,a5 as S}from"./chunks/framework.Bhh1y9_T.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(p),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return w(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),b(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function j(){globalThis.__VITEPRESS__=!0;const e=D(),a=x();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function x(){return g(T)}function D(){let e=o,a;return A(t=>{let n=y(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{j as createApp}; diff --git a/assets/buy.md.BpDcuvJD.js b/assets/buy.md.BpDcuvJD.js new file mode 100644 index 00000000..ca4569b0 --- /dev/null +++ b/assets/buy.md.BpDcuvJD.js @@ -0,0 +1 @@ +import{c as l,j as t,k as e,a6 as r,a,o as i,g as n}from"./chunks/framework.Bhh1y9_T.js";const d=r('

购买专业版

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

原价:¥999.00 One-step-admin + ¥1199.00 Fantastic-admin = ¥2198.00

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

请加作者微信进行购买

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

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

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

请加作者微信进行购买

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

原价:¥999.00 One-step-admin + ¥1199.00 Fantastic-admin + ¥599.00 Fantastic-mobile = ¥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),u=["src"],m={style:{display:"table",margin:"1rem auto"}},_=t("tr",null,[t("th",{colspan:"2",style:{"text-align":"center"}},"One-step-admin 专业版")],-1),b=t("tr",null,[t("td",{colspan:"2",align:"center"},[t("div",null,[a("限时优惠:"),t("b",{style:{color:"#ff4400"}},[a("¥"),t("span",{style:{"font-size":"24px"}},"699"),a(".00")])]),t("b",{style:{color:"#ccc"}},"原价:¥999.00")])],-1),f={align:"center"},y=["src"],x={align:"center"},k=["src"],P=t("tr",null,[t("td",{colspan:"2",align:"center"},[t("p",{style:{margin:"0"}},"产品生命周期内提供长期更新维护")])],-1),T=r('
企业/团队购买

如果你有以下场景需求,推荐购买企业/团队版:

One-step-admin 专业版 (企业/团队版)
限时优惠:2799.00
原价:¥3599.00
⭐服务⭐个人企业/团队
允许加入 Github 组织账号数15
是否允许二开后交付源码
提供独立技术支持微信群
是否可以开发票支持开普票,价格已含税

使用说明

专业版与基础版区别

⭐功能与服务⭐基础版专业版
长期维护更新,提供新特性
定期修复 bug
开发与构建工具Vue 3 / Vite
UI 组件库Element Plus
页面布局3 套5 套
主题风格明亮 1 款 / 暗黑 1 款明亮 6 款 / 暗黑 6 款
导航路由配置项5 个8 个
外链导航
窗口 API支持部分
窗口右键功能
窗口预览模式
窗口专注模式
窗口拖拽排序
收藏夹
全方位权限验证
扩展组件12 个20 个
用户偏好设置
国际化
Mock 数据
错误日志上报
文件自动生成支持部分
业务应用静态页面
团队代码规范
框架版权信息需保留可删除
技术支持查看
演示地址访问访问

什么场景需要 One-step-admin

为什么选择 One-step-admin

',9),S=JSON.parse('{"title":"购买专业版","description":"","frontmatter":{},"headers":[],"relativePath":"buy.md","filePath":"buy.md"}'),q={name:"buy.md"},F=Object.assign(q,{setup(O){return(w,V)=>(i(),l("div",null,[d,t("p",s,[t("img",{src:e(n)("/friend-wechat.png"),width:"300"},null,8,c)]),o,t("div",g,[h,p,t("img",{src:e(n)("/qrcode-alipay-hongbao.jpg"),width:"200"},null,8,u)]),t("table",m,[_,b,t("tr",null,[t("td",f,[t("img",{src:e(n)("/qrcode-wechat-699.png")},null,8,y)]),t("td",x,[t("img",{src:e(n)("/qrcode-alipay-699.png")},null,8,k)])]),P]),T]))}});export{S as __pageData,F as default}; diff --git a/assets/buy.md.BpDcuvJD.lean.js b/assets/buy.md.BpDcuvJD.lean.js new file mode 100644 index 00000000..30a4161a --- /dev/null +++ b/assets/buy.md.BpDcuvJD.lean.js @@ -0,0 +1 @@ +import{c as l,j as t,k as e,a6 as r,a,o as i,g as n}from"./chunks/framework.Bhh1y9_T.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),u=["src"],m={style:{display:"table",margin:"1rem auto"}},_=t("tr",null,[t("th",{colspan:"2",style:{"text-align":"center"}},"One-step-admin 专业版")],-1),b=t("tr",null,[t("td",{colspan:"2",align:"center"},[t("div",null,[a("限时优惠:"),t("b",{style:{color:"#ff4400"}},[a("¥"),t("span",{style:{"font-size":"24px"}},"699"),a(".00")])]),t("b",{style:{color:"#ccc"}},"原价:¥999.00")])],-1),f={align:"center"},y=["src"],x={align:"center"},k=["src"],P=t("tr",null,[t("td",{colspan:"2",align:"center"},[t("p",{style:{margin:"0"}},"产品生命周期内提供长期更新维护")])],-1),T=r("",9),S=JSON.parse('{"title":"购买专业版","description":"","frontmatter":{},"headers":[],"relativePath":"buy.md","filePath":"buy.md"}'),q={name:"buy.md"},F=Object.assign(q,{setup(O){return(w,V)=>(i(),l("div",null,[d,t("p",s,[t("img",{src:e(n)("/friend-wechat.png"),width:"300"},null,8,c)]),o,t("div",g,[h,p,t("img",{src:e(n)("/qrcode-alipay-hongbao.jpg"),width:"200"},null,8,u)]),t("table",m,[_,b,t("tr",null,[t("td",f,[t("img",{src:e(n)("/qrcode-wechat-699.png")},null,8,y)]),t("td",x,[t("img",{src:e(n)("/qrcode-alipay-699.png")},null,8,k)])]),P]),T]))}});export{S as __pageData,F as default}; diff --git a/assets/chunks/@localSearchIndexroot.DVgFrklj.js b/assets/chunks/@localSearchIndexroot.DVgFrklj.js new file mode 100644 index 00000000..89849c30 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.DVgFrklj.js @@ -0,0 +1 @@ +const t='{"documentCount":315,"nextId":315,"documentIds":{"0":"/buy.html#购买专业版","1":"/buy.html#购买流程","2":"/buy.html#支付方式","3":"/buy.html#使用说明","4":"/buy.html#专业版与基础版区别","5":"/buy.html#什么场景需要-one-step-admin","6":"/buy.html#为什么选择-one-step-admin","7":"/components/action-container.html#actioncontainer-固定底部操作栏","8":"/components/action-container.html#slot","9":"/components/auth-all.html#authall-鉴权","10":"/components/auth-all.html#props","11":"/components/auth-all.html#slots","12":"/components/auth.html#auth-鉴权","13":"/components/auth.html#props","14":"/components/auth.html#slots","15":"/components/chip.html#chip-纸片","16":"/components/chip.html#props","17":"/components/chip.html#events","18":"/components/colorful-card.html#colorfulcard-多彩渐变卡片","19":"/components/colorful-card.html#props","20":"/components/file-upload.html#fileupload-文件上传","21":"/components/file-upload.html#props","22":"/components/icon-picker.html#iconpicker-图标选择器","23":"/components/icon-picker.html#props","24":"/components/i18n-selector.html#i18nselector-国际化选择器","25":"/components/i18n-selector.html#slots","26":"/components/image-preview.html#imagepreview-图片预览","27":"/components/image-preview.html#props","28":"/components/image-upload.html#imageupload-单图上传","29":"/components/image-upload.html#props","30":"/components/images-upload.html#imagesupload-多图上传","31":"/components/images-upload.html#props","32":"/components/#介绍","33":"/components/#基础组件","34":"/components/#内建组件","35":"/components/#扩展组件","36":"/components/page-header.html#pageheader-页头","37":"/components/page-header.html#props","38":"/components/page-header.html#slots","39":"/components/page-main.html#pagemain-内容块","40":"/components/page-main.html#props","41":"/components/page-main.html#slots","42":"/components/pcas-cascader.html#pcascascader-省市区街道联动","43":"/components/pcas-cascader.html#props","44":"/components/search-bar.html#searchbar-搜索面板","45":"/components/search-bar.html#props","46":"/components/search-bar.html#slots","47":"/components/search-bar.html#events","48":"/components/sparkline.html#sparkline-迷你图","49":"/components/sparkline.html#props","50":"/components/storage-box.html#storagebox-储存箱","51":"/components/storage-box.html#props","52":"/components/storage-box.html#slots","53":"/components/storage-box.html#events","54":"/components/svg-icon.html#svgicon-svg图标","55":"/components/svg-icon.html#props","56":"/components/trend.html#trend-趋势标记","57":"/components/trend.html#props","58":"/guide/api.html#常用-api","59":"/guide/api.html#接口请求","60":"/guide/api.html#鉴权","61":"/guide/api.html#主导航","62":"/guide/api.html#切换","63":"/guide/api.html#窗口","64":"/guide/api.html#新增窗口","65":"/guide/api.html#关闭窗口","66":"/guide/api.html#窗口全屏切换","67":"/guide/api.html#判断窗口是否全屏","68":"/guide/api.html#窗口刷新","69":"/guide/api.html#事件总线","70":"/guide/api.html#日期","71":"/guide/axios.html#与服务端交互","72":"/guide/axios.html#接口请求","73":"/guide/axios.html#设置-baseurl","74":"/guide/axios.html#请求调用","75":"/guide/axios.html#拦截器","76":"/guide/axios.html#模块管理","77":"/guide/axios.html#跨域处理","78":"/guide/axios.html#多数据源","79":"/guide/axios.html#mock","80":"/guide/axios.html#开发环境-mock","81":"/guide/axios.html#生产环境-mock","82":"/guide/build.html#构建与预览","83":"/guide/build.html#构建","84":"/guide/build.html#预览","85":"/guide/build.html#压缩","86":"/guide/build.html#其它设置","87":"/guide/changelog.html#更新日志","88":"/guide/changelog.html#_4-7-0","89":"/guide/changelog.html#_4-6-0","90":"/guide/changelog.html#_4-5-0","91":"/guide/changelog.html#_4-4-1","92":"/guide/changelog.html#_4-4-0","93":"/guide/changelog.html#_4-3-0","94":"/guide/changelog.html#_4-2-3","95":"/guide/changelog.html#_4-2-2","96":"/guide/changelog.html#_4-2-1","97":"/guide/changelog.html#_4-2-0","98":"/guide/changelog.html#_4-1-0","99":"/guide/changelog.html#_4-0-1","100":"/guide/changelog.html#_4-0-0","101":"/guide/changelog.html#_3-1-3","102":"/guide/changelog.html#_3-1-2","103":"/guide/changelog.html#_3-1-1","104":"/guide/changelog.html#_3-1-0","105":"/guide/changelog.html#_3-0-0","106":"/guide/changelog.html#_2-3-2","107":"/guide/changelog.html#_2-3-1","108":"/guide/changelog.html#_2-3-0","109":"/guide/changelog.html#_2-2-0","110":"/guide/changelog.html#_2-1-0","111":"/guide/changelog.html#_2-0-0","112":"/guide/changelog.html#v1-0-0","113":"/guide/coding-standard.html#代码规范","114":"/guide/coding-standard.html#ide-配置","115":"/guide/coding-standard.html#eslint-配置","116":"/guide/coding-standard.html#stylelint-配置","117":"/guide/coding-standard.html#simple-git-hooks-和-lint-staged","118":"/guide/coding-standard.html#移除","119":"/guide/components.html#介绍","120":"/guide/components.html#基础组件","121":"/guide/components.html#扩展组件","122":"/guide/configure.html#配置","123":"/guide/configure.html#环境配置","124":"/guide/configure.html#应用配置-框架配置","125":"/guide/error-log.html#错误日志","126":"/guide/favorites.html#收藏夹","127":"/guide/favorites.html#处理请求","128":"/guide/copyright.html#版权信息","129":"/guide/copyright.html#使用","130":"/guide/copyright.html#网站运行日期","131":"/guide/copyright.html#公司名称","132":"/guide/copyright.html#网站地址","133":"/guide/copyright.html#备案号","134":"/guide/font.html#自定义字体","135":"/guide/font.html#找字体","136":"/guide/font.html#生成字体","137":"/guide/font.html#使用","138":"/guide/i18n.html#国际化","139":"/guide/i18n.html#vscode-扩展","140":"/guide/i18n.html#语言选择器","141":"/guide/i18n.html#语言包","142":"/guide/i18n.html#导航设置","143":"/guide/i18n.html#框架设置","144":"/guide/i18n.html#单页组件","145":"/guide/i18n.html#与服务端交互","146":"/guide/i18n.html#关闭国际化","147":"/guide/intro.html#文档说明","148":"/guide/layout.html#布局","149":"/guide/layout.html#导航栏模式","150":"/guide/layout.html#顶部模式","151":"/guide/layout.html#侧边栏模式-含主导航","152":"/guide/layout.html#侧边栏模式-无主导航","153":"/guide/layout.html#侧边栏精简模式","154":"/guide/layout.html#顶部精简模式","155":"/guide/layout.html#侧边栏面板模式","156":"/guide/layout.html#顶部面板模式","157":"/guide/layout.html#变量","158":"/guide/login.html#登录","159":"/guide/menu.html#导航","160":"/guide/menu.html#基本配置","161":"/guide/menu.html#一级导航","162":"/guide/menu.html#多级导航","163":"/guide/menu.html#外链","164":"/guide/menu.html#主导航","165":"/guide/menu.html#导航配置","166":"/guide/menu.html#title","167":"/guide/menu.html#windowname","168":"/guide/menu.html#windowwidth","169":"/guide/menu.html#i18n","170":"/guide/menu.html#notitle","171":"/guide/menu.html#icon","172":"/guide/menu.html#auth","173":"/guide/menu.html#badge","174":"/guide/menu.html#params","175":"/guide/menu.html#后端生成","176":"/guide/permission.html#权限","177":"/guide/permission.html#鉴权组件","178":"/guide/permission.html#鉴权指令","179":"/guide/permission.html#鉴权函数","180":"/guide/plop-module.html#标准模块","181":"/guide/plop-module.html#用法说明","182":"/guide/plop-module.html#特性介绍","183":"/guide/plop.html#代码文件自动生成","184":"/guide/plop.html#page","185":"/guide/plop.html#component","186":"/guide/plop.html#store","187":"/guide/plop.html#mock","188":"/guide/plop.html#module","189":"/guide/preferences.html#用户偏好设置","190":"/guide/preferences.html#开启","191":"/guide/preferences.html#定制偏好设置内容","192":"/guide/preferences.html#处理请求","193":"/guide/q-a.html#常见问题","194":"/guide/q-a.html#安装依赖时有警告","195":"/guide/q-a.html#为什么本地开发环境首次载入很慢","196":"/guide/q-a.html#项目-url-里的-号能不能去掉","197":"/guide/q-a.html#构建报错-提示内存溢出","198":"/guide/q-a.html#直接修改构建产物的接口地址","199":"/guide/q-a.html#不会-typescript-怎么办","200":"/guide/ready.html#准备工作","201":"/guide/ready.html#源码","202":"/guide/ready.html#基础版","203":"/guide/ready.html#专业版","204":"/guide/ready.html#开发环境","205":"/guide/ready.html#技术栈","206":"/guide/replace-to-antd.html#替换为-ant-design-vue","207":"/guide/replace-to-antd.html#安装","208":"/guide/replace-to-antd.html#代码调整","209":"/guide/replace-to-antd.html#修改登录页","210":"/guide/replace-to-antd.html#卸载","211":"/guide/replace-to-antd.html#完成","212":"/guide/replace-to-antd.html#示例","213":"/guide/replace-to-arco.html#替换为-arco-design-vue","214":"/guide/replace-to-arco.html#安装","215":"/guide/replace-to-arco.html#代码调整","216":"/guide/replace-to-arco.html#修改登录页","217":"/guide/replace-to-arco.html#卸载","218":"/guide/replace-to-arco.html#完成","219":"/guide/replace-to-arco.html#示例","220":"/guide/replace-to-idux.html#替换为-idux","221":"/guide/replace-to-idux.html#安装","222":"/guide/replace-to-idux.html#代码调整","223":"/guide/replace-to-idux.html#修改登录页","224":"/guide/replace-to-idux.html#卸载","225":"/guide/replace-to-idux.html#完成","226":"/guide/replace-to-idux.html#示例","227":"/guide/replace-to-naive.html#替换为-naive-ui","228":"/guide/replace-to-naive.html#安装","229":"/guide/replace-to-naive.html#代码调整","230":"/guide/replace-to-naive.html#修改登录页","231":"/guide/replace-to-naive.html#卸载","232":"/guide/replace-to-naive.html#完成","233":"/guide/replace-to-naive.html#示例","234":"/guide/replace-to-tdesign.html#替换为-tdesign","235":"/guide/replace-to-tdesign.html#安装","236":"/guide/replace-to-tdesign.html#代码调整","237":"/guide/replace-to-tdesign.html#修改登录页","238":"/guide/replace-to-tdesign.html#卸载","239":"/guide/replace-to-tdesign.html#完成","240":"/guide/replace-to-tdesign.html#示例","241":"/guide/replace-to-vexip.html#替换为-vexip-ui","242":"/guide/replace-to-vexip.html#安装","243":"/guide/replace-to-vexip.html#代码调整","244":"/guide/replace-to-vexip.html#修改登录页","245":"/guide/replace-to-vexip.html#卸载","246":"/guide/replace-to-vexip.html#完成","247":"/guide/replace-to-vexip.html#示例","248":"/guide/resources.html#资源","249":"/guide/resources.html#图片","250":"/guide/resources.html#全局公共","251":"/guide/resources.html#局部私有","252":"/guide/resources.html#样式","253":"/guide/resources.html#全局公共-1","254":"/guide/resources.html#局部私有-1","255":"/guide/resources.html#unocss","256":"/guide/resources.html#postcss","257":"/guide/resources.html#scss","258":"/guide/resources.html#组件","259":"/guide/resources.html#全局公共-2","260":"/guide/resources.html#局部私有-2","261":"/guide/router.html#路由","262":"/guide/router.html#免登录页面","263":"/guide/rtl.html#rtl-模式","264":"/guide/rtl.html#使用","265":"/guide/start.html#开始","266":"/guide/storage.html#私有-storage-数据","267":"/guide/store.html#全局状态管理","268":"/guide/svg-icon.html#图标","269":"/guide/svg-icon.html#自定义图标","270":"/guide/svg-icon.html#iconify-图标","271":"/guide/svg-icon.html#unocss-方案","272":"/guide/svg-icon.html#iconify-原生方案","273":"/guide/svg-icon.html#离线-内网环境使用","274":"/guide/svg-icon.html#图标选择器","275":"/guide/theme.html#主题","276":"/guide/theme.html#框架主题","277":"/guide/theme.html#基础版","278":"/guide/theme.html#专业版","279":"/guide/theme.html#颜色方案","280":"/guide/theme.html#哀悼模式","281":"/guide/theme.html#色弱模式","282":"/guide/theme.html#导航栏风格","283":"/guide/theme.html#风格","284":"/guide/theme.html#圆角","285":"/guide/theme.html#开发注意","286":"/guide/toolbar.html#工具栏","287":"/guide/toolbar.html#窗口预览","288":"/guide/toolbar.html#收藏夹","289":"/guide/toolbar.html#导航搜索","290":"/guide/toolbar.html#通知中心","291":"/guide/toolbar.html#国际化","292":"/guide/toolbar.html#浏览器全屏","293":"/guide/toolbar.html#颜色主题","294":"/guide/toolbar.html#布局","295":"/guide/upgrade.html#框架更新","296":"/guide/vue3-composition-api.html#使用-composition-api-开发","297":"/guide/vue3-composition-api.html#使用","298":"/guide/vue3-composition-api.html#组件-name","299":"/guide/watermark.html#页面水印","300":"/guide/watermark.html#使用","301":"/guide/watermark.html#设置水印内容","302":"/guide/why.html#为什么选择我们","303":"/guide/why.html#长期且稳定","304":"/guide/why.html#高效的交互方式","305":"/guide/why.html#窗口最大化","306":"/guide/why.html#快速定位操作窗口","307":"/guide/why.html#专注模式","308":"/guide/why.html#窗口排序","309":"/guide/why.html#继承自-fantastic-admin","310":"/guide/why.html#为什么不是-fantastic-admin","311":"/guide/window.html#窗口","312":"/support.html#技术支持","313":"/support.html#基础版","314":"/support.html#专业版"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,25],"1":[1,1,23],"2":[1,1,47],"3":[1,1,32],"4":[1,1,57],"5":[4,1,36],"6":[4,1,45],"7":[2,1,1],"8":[1,2,8],"9":[2,1,1],"10":[1,2,16],"11":[1,2,6],"12":[2,1,1],"13":[1,2,16],"14":[1,2,6],"15":[2,1,1],"16":[1,2,17],"17":[1,2,6],"18":[2,1,1],"19":[1,2,29],"20":[2,1,1],"21":[1,2,44],"22":[2,1,1],"23":[1,2,14],"24":[2,1,1],"25":[1,2,6],"26":[2,1,1],"27":[1,2,13],"28":[2,1,1],"29":[1,2,44],"30":[2,1,1],"31":[1,2,47],"32":[1,1,2],"33":[1,1,82],"34":[1,1,17],"35":[1,1,14],"36":[2,1,1],"37":[1,2,11],"38":[1,2,8],"39":[2,1,1],"40":[1,2,19],"41":[1,2,8],"42":[2,1,1],"43":[1,2,28],"44":[2,1,1],"45":[1,2,16],"46":[1,2,9],"47":[1,2,8],"48":[2,1,1],"49":[1,2,40],"50":[2,1,1],"51":[1,2,16],"52":[1,2,6],"53":[1,2,8],"54":[2,1,1],"55":[1,2,30],"56":[2,1,1],"57":[1,2,20],"58":[2,1,1],"59":[1,2,9],"60":[1,2,13],"61":[1,2,1],"62":[1,3,10],"63":[1,2,1],"64":[1,3,11],"65":[1,3,8],"66":[1,3,8],"67":[1,3,10],"68":[1,3,8],"69":[1,2,12],"70":[1,2,8],"71":[1,1,5],"72":[1,1,1],"73":[2,2,24],"74":[1,2,28],"75":[1,2,33],"76":[1,1,7],"77":[1,1,59],"78":[1,1,100],"79":[1,1,18],"80":[2,2,79],"81":[2,2,28],"82":[1,1,1],"83":[1,1,33],"84":[1,1,13],"85":[1,1,21],"86":[1,1,10],"87":[1,1,5],"88":[3,1,34],"89":[3,1,41],"90":[3,1,40],"91":[2,1,14],"92":[2,1,29],"93":[3,1,33],"94":[3,1,4],"95":[2,1,4],"96":[3,1,14],"97":[3,1,66],"98":[3,1,35],"99":[3,1,14],"100":[2,1,167],"101":[2,1,4],"102":[3,1,4],"103":[2,1,4],"104":[3,1,13],"105":[2,1,61],"106":[2,1,4],"107":[3,1,4],"108":[3,1,29],"109":[2,1,20],"110":[3,1,18],"111":[2,1,13],"112":[2,1,9],"113":[1,1,17],"114":[2,1,4],"115":[2,1,29],"116":[2,1,24],"117":[6,1,72],"118":[1,7,27],"119":[1,1,15],"120":[1,1,63],"121":[1,1,1],"122":[1,1,1],"123":[1,1,86],"124":[3,1,43],"125":[1,1,34],"126":[1,1,4],"127":[1,1,35],"128":[1,1,2],"129":[1,1,10],"130":[1,1,11],"131":[1,1,12],"132":[1,1,17],"133":[1,1,9],"134":[1,1,11],"135":[1,1,7],"136":[1,1,13],"137":[1,1,28],"138":[1,1,6],"139":[2,1,10],"140":[1,1,24],"141":[1,1,68],"142":[1,1,14],"143":[1,1,37],"144":[1,1,15],"145":[1,1,5],"146":[1,1,19],"147":[1,1,22],"148":[1,1,13],"149":[1,1,13],"150":[1,2,14],"151":[3,2,14],"152":[3,2,14],"153":[1,2,15],"154":[1,2,15],"155":[1,2,10],"156":[1,2,10],"157":[1,1,12],"158":[1,1,35],"159":[1,1,12],"160":[1,1,1],"161":[1,2,16],"162":[1,2,14],"163":[1,2,21],"164":[1,2,22],"165":[1,1,1],"166":[1,2,16],"167":[1,2,9],"168":[1,2,11],"169":[1,2,12],"170":[1,2,9],"171":[1,2,21],"172":[1,2,20],"173":[1,2,29],"174":[1,2,14],"175":[1,1,31],"176":[1,1,37],"177":[1,1,34],"178":[1,1,27],"179":[1,1,25],"180":[1,1,16],"181":[1,1,65],"182":[1,1,123],"183":[1,1,46],"184":[1,1,20],"185":[1,1,9],"186":[1,1,6],"187":[1,1,8],"188":[1,1,11],"189":[1,1,4],"190":[1,1,10],"191":[1,1,42],"192":[1,1,36],"193":[1,1,1],"194":[1,1,18],"195":[1,1,21],"196":[4,1,17],"197":[2,1,39],"198":[1,1,63],"199":[3,1,28],"200":[1,1,1],"201":[1,1,11],"202":[1,2,40],"203":[1,2,6],"204":[1,1,79],"205":[1,1,12],"206":[4,1,23],"207":[1,4,15],"208":[1,4,103],"209":[1,4,8],"210":[1,4,9],"211":[1,4,12],"212":[1,4,4],"213":[4,1,23],"214":[1,4,15],"215":[1,4,125],"216":[1,4,8],"217":[1,4,9],"218":[1,4,12],"219":[1,4,4],"220":[2,1,21],"221":[1,2,11],"222":[1,2,108],"223":[1,2,8],"224":[1,2,9],"225":[1,2,10],"226":[1,2,4],"227":[3,1,22],"228":[1,3,12],"229":[1,3,95],"230":[1,3,8],"231":[1,3,9],"232":[1,3,11],"233":[1,3,4],"234":[2,1,21],"235":[1,2,11],"236":[1,2,131],"237":[1,2,8],"238":[1,2,9],"239":[1,2,10],"240":[1,2,4],"241":[3,1,22],"242":[1,3,11],"243":[1,3,92],"244":[1,3,8],"245":[1,3,9],"246":[1,3,11],"247":[1,3,4],"248":[1,1,1],"249":[1,1,1],"250":[1,2,7],"251":[1,2,6],"252":[1,1,1],"253":[1,2,21],"254":[1,2,14],"255":[1,3,29],"256":[1,3,29],"257":[1,3,25],"258":[1,1,1],"259":[1,2,27],"260":[1,2,6],"261":[1,1,12],"262":[1,1,40],"263":[2,1,1],"264":[1,2,11],"265":[1,1,72],"266":[3,1,60],"267":[1,1,57],"268":[1,1,3],"269":[1,1,25],"270":[2,1,20],"271":[2,2,58],"272":[2,2,32],"273":[2,2,39],"274":[1,1,11],"275":[1,1,1],"276":[1,1,7],"277":[1,2,51],"278":[1,2,77],"279":[1,1,14],"280":[1,1,10],"281":[1,1,10],"282":[1,1,1],"283":[1,2,21],"284":[1,2,11],"285":[1,1,41],"286":[1,1,2],"287":[1,1,10],"288":[1,1,12],"289":[1,1,10],"290":[1,1,24],"291":[1,1,15],"292":[1,1,10],"293":[1,1,13],"294":[1,1,24],"295":[1,1,57],"296":[4,1,18],"297":[1,4,47],"298":[2,4,26],"299":[1,1,1],"300":[1,1,11],"301":[1,1,34],"302":[2,1,8],"303":[1,2,11],"304":[1,2,4],"305":[1,2,6],"306":[1,2,2],"307":[1,2,3],"308":[1,2,2],"309":[3,2,18],"310":[4,2,33],"311":[1,1,20],"312":[1,1,1],"313":[1,1,10],"314":[1,1,2]},"averageFieldLength":[1.3746031746031746,1.5873015873015872,20.809523809523796],"storedFields":{"0":{"title":"购买专业版","titles":[]},"1":{"title":"购买流程","titles":["购买专业版"]},"2":{"title":"支付方式","titles":["购买专业版"]},"3":{"title":"使用说明","titles":["购买专业版"]},"4":{"title":"专业版与基础版区别","titles":["购买专业版"]},"5":{"title":"什么场景需要 One-step-admin","titles":["购买专业版"]},"6":{"title":"为什么选择 One-step-admin","titles":["购买专业版"]},"7":{"title":"ActionContainer 固定底部操作栏","titles":[]},"8":{"title":"Slot","titles":["ActionContainer 固定底部操作栏"]},"9":{"title":"AuthAll 鉴权","titles":[]},"10":{"title":"Props","titles":["AuthAll 鉴权"]},"11":{"title":"Slots","titles":["AuthAll 鉴权"]},"12":{"title":"Auth 鉴权","titles":[]},"13":{"title":"Props","titles":["Auth 鉴权"]},"14":{"title":"Slots","titles":["Auth 鉴权"]},"15":{"title":"Chip 纸片","titles":[]},"16":{"title":"Props","titles":["Chip 纸片"]},"17":{"title":"Events","titles":["Chip 纸片"]},"18":{"title":"ColorfulCard 多彩渐变卡片","titles":[]},"19":{"title":"Props","titles":["ColorfulCard 多彩渐变卡片"]},"20":{"title":"FileUpload 文件上传","titles":[]},"21":{"title":"Props","titles":["FileUpload 文件上传"]},"22":{"title":"IconPicker 图标选择器","titles":[]},"23":{"title":"Props","titles":["IconPicker 图标选择器"]},"24":{"title":"I18nSelector 国际化选择器","titles":[]},"25":{"title":"Slots","titles":["I18nSelector 国际化选择器"]},"26":{"title":"ImagePreview 图片预览","titles":[]},"27":{"title":"Props","titles":["ImagePreview 图片预览"]},"28":{"title":"ImageUpload 单图上传","titles":[]},"29":{"title":"Props","titles":["ImageUpload 单图上传"]},"30":{"title":"ImagesUpload 多图上传","titles":[]},"31":{"title":"Props","titles":["ImagesUpload 多图上传"]},"32":{"title":"介绍","titles":[]},"33":{"title":"基础组件","titles":["介绍"]},"34":{"title":"内建组件","titles":["介绍"]},"35":{"title":"扩展组件","titles":["介绍"]},"36":{"title":"PageHeader 页头","titles":[]},"37":{"title":"Props","titles":["PageHeader 页头"]},"38":{"title":"Slots","titles":["PageHeader 页头"]},"39":{"title":"PageMain 内容块","titles":[]},"40":{"title":"Props","titles":["PageMain 内容块"]},"41":{"title":"Slots","titles":["PageMain 内容块"]},"42":{"title":"PcasCascader 省市区街道联动","titles":[]},"43":{"title":"Props","titles":["PcasCascader 省市区街道联动"]},"44":{"title":"SearchBar 搜索面板","titles":[]},"45":{"title":"Props","titles":["SearchBar 搜索面板"]},"46":{"title":"Slots","titles":["SearchBar 搜索面板"]},"47":{"title":"Events","titles":["SearchBar 搜索面板"]},"48":{"title":"Sparkline 迷你图","titles":[]},"49":{"title":"Props","titles":["Sparkline 迷你图"]},"50":{"title":"StorageBox 储存箱","titles":[]},"51":{"title":"Props","titles":["StorageBox 储存箱"]},"52":{"title":"Slots","titles":["StorageBox 储存箱"]},"53":{"title":"Events","titles":["StorageBox 储存箱"]},"54":{"title":"SvgIcon SVG图标","titles":[]},"55":{"title":"Props","titles":["SvgIcon SVG图标"]},"56":{"title":"Trend 趋势标记","titles":[]},"57":{"title":"Props","titles":["Trend 趋势标记"]},"58":{"title":"常用 API","titles":[]},"59":{"title":"接口请求","titles":["常用 API"]},"60":{"title":"鉴权","titles":["常用 API"]},"61":{"title":"主导航","titles":["常用 API"]},"62":{"title":"切换","titles":["常用 API","主导航"]},"63":{"title":"窗口","titles":["常用 API"]},"64":{"title":"新增窗口","titles":["常用 API","窗口"]},"65":{"title":"关闭窗口","titles":["常用 API","窗口"]},"66":{"title":"窗口全屏切换","titles":["常用 API","窗口"]},"67":{"title":"判断窗口是否全屏","titles":["常用 API","窗口"]},"68":{"title":"窗口刷新","titles":["常用 API","窗口"]},"69":{"title":"事件总线","titles":["常用 API"]},"70":{"title":"日期","titles":["常用 API"]},"71":{"title":"与服务端交互","titles":[]},"72":{"title":"接口请求","titles":["与服务端交互"]},"73":{"title":"设置 baseURL","titles":["与服务端交互","接口请求"]},"74":{"title":"请求调用","titles":["与服务端交互","接口请求"]},"75":{"title":"拦截器","titles":["与服务端交互","接口请求"]},"76":{"title":"模块管理","titles":["与服务端交互"]},"77":{"title":"跨域处理","titles":["与服务端交互"]},"78":{"title":"多数据源","titles":["与服务端交互"]},"79":{"title":"Mock","titles":["与服务端交互"]},"80":{"title":"开发环境 mock","titles":["与服务端交互","Mock"]},"81":{"title":"生产环境 mock","titles":["与服务端交互","Mock"]},"82":{"title":"构建与预览","titles":[]},"83":{"title":"构建","titles":["构建与预览"]},"84":{"title":"预览","titles":["构建与预览"]},"85":{"title":"压缩","titles":["构建与预览"]},"86":{"title":"其它设置","titles":["构建与预览"]},"87":{"title":"更新日志","titles":[]},"88":{"title":"4.7.0","titles":["更新日志"]},"89":{"title":"4.6.0","titles":["更新日志"]},"90":{"title":"4.5.0","titles":["更新日志"]},"91":{"title":"4.4.1","titles":["更新日志"]},"92":{"title":"4.4.0","titles":["更新日志"]},"93":{"title":"4.3.0","titles":["更新日志"]},"94":{"title":"4.2.3","titles":["更新日志"]},"95":{"title":"4.2.2","titles":["更新日志"]},"96":{"title":"4.2.1","titles":["更新日志"]},"97":{"title":"4.2.0","titles":["更新日志"]},"98":{"title":"4.1.0","titles":["更新日志"]},"99":{"title":"4.0.1","titles":["更新日志"]},"100":{"title":"4.0.0","titles":["更新日志"]},"101":{"title":"3.1.3","titles":["更新日志"]},"102":{"title":"3.1.2","titles":["更新日志"]},"103":{"title":"3.1.1","titles":["更新日志"]},"104":{"title":"3.1.0","titles":["更新日志"]},"105":{"title":"3.0.0","titles":["更新日志"]},"106":{"title":"2.3.2","titles":["更新日志"]},"107":{"title":"2.3.1","titles":["更新日志"]},"108":{"title":"2.3.0","titles":["更新日志"]},"109":{"title":"2.2.0","titles":["更新日志"]},"110":{"title":"2.1.0","titles":["更新日志"]},"111":{"title":"2.0.0","titles":["更新日志"]},"112":{"title":"v1.0.0","titles":["更新日志"]},"113":{"title":"代码规范","titles":[]},"114":{"title":"IDE 配置","titles":["代码规范"]},"115":{"title":"ESLint 配置","titles":["代码规范"]},"116":{"title":"StyleLint 配置","titles":["代码规范"]},"117":{"title":"simple-git-hooks 和 lint-staged","titles":["代码规范"]},"118":{"title":"移除","titles":["代码规范","simple-git-hooks 和 lint-staged"]},"119":{"title":"介绍","titles":[]},"120":{"title":"基础组件","titles":["介绍"]},"121":{"title":"扩展组件","titles":["介绍"]},"122":{"title":"配置","titles":[]},"123":{"title":"环境配置","titles":["配置"]},"124":{"title":"应用配置(框架配置)","titles":["配置"]},"125":{"title":"错误日志","titles":[]},"126":{"title":"收藏夹","titles":[]},"127":{"title":"处理请求","titles":["收藏夹"]},"128":{"title":"版权信息","titles":[]},"129":{"title":"使用","titles":["版权信息"]},"130":{"title":"网站运行日期","titles":["版权信息"]},"131":{"title":"公司名称","titles":["版权信息"]},"132":{"title":"网站地址","titles":["版权信息"]},"133":{"title":"备案号","titles":["版权信息"]},"134":{"title":"自定义字体","titles":[]},"135":{"title":"找字体","titles":["自定义字体"]},"136":{"title":"生成字体","titles":["自定义字体"]},"137":{"title":"使用","titles":["自定义字体"]},"138":{"title":"国际化","titles":[]},"139":{"title":"vscode 扩展","titles":["国际化"]},"140":{"title":"语言选择器","titles":["国际化"]},"141":{"title":"语言包","titles":["国际化"]},"142":{"title":"导航设置","titles":["国际化"]},"143":{"title":"框架设置","titles":["国际化"]},"144":{"title":"单页组件","titles":["国际化"]},"145":{"title":"与服务端交互","titles":["国际化"]},"146":{"title":"关闭国际化","titles":["国际化"]},"147":{"title":"文档说明","titles":[]},"148":{"title":"布局","titles":[]},"149":{"title":"导航栏模式","titles":["布局"]},"150":{"title":"顶部模式","titles":["布局","导航栏模式"]},"151":{"title":"侧边栏模式(含主导航)","titles":["布局","导航栏模式"]},"152":{"title":"侧边栏模式(无主导航)","titles":["布局","导航栏模式"]},"153":{"title":"侧边栏精简模式","titles":["布局","导航栏模式"]},"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":"title","titles":["导航","导航配置"]},"167":{"title":"windowName","titles":["导航","导航配置"]},"168":{"title":"windowWidth","titles":["导航","导航配置"]},"169":{"title":"i18n","titles":["导航","导航配置"]},"170":{"title":"noTitle","titles":["导航","导航配置"]},"171":{"title":"icon","titles":["导航","导航配置"]},"172":{"title":"auth","titles":["导航","导航配置"]},"173":{"title":"badge","titles":["导航","导航配置"]},"174":{"title":"params","titles":["导航","导航配置"]},"175":{"title":"后端生成","titles":["导航"]},"176":{"title":"权限","titles":[]},"177":{"title":"鉴权组件","titles":["权限"]},"178":{"title":"鉴权指令","titles":["权限"]},"179":{"title":"鉴权函数","titles":["权限"]},"180":{"title":"标准模块","titles":[]},"181":{"title":"用法说明","titles":[]},"182":{"title":"特性介绍","titles":["用法说明"]},"183":{"title":"代码文件自动生成","titles":[]},"184":{"title":"page","titles":["代码文件自动生成"]},"185":{"title":"component","titles":["代码文件自动生成"]},"186":{"title":"store","titles":["代码文件自动生成"]},"187":{"title":"mock","titles":["代码文件自动生成"]},"188":{"title":"module","titles":["代码文件自动生成"]},"189":{"title":"用户偏好设置","titles":[]},"190":{"title":"开启","titles":["用户偏好设置"]},"191":{"title":"定制偏好设置内容","titles":["用户偏好设置"]},"192":{"title":"处理请求","titles":["用户偏好设置"]},"193":{"title":"常见问题","titles":[]},"194":{"title":"安装依赖时有警告","titles":["常见问题"]},"195":{"title":"为什么本地开发环境首次载入很慢","titles":["常见问题"]},"196":{"title":"项目 URL 里的 # 号能不能去掉","titles":["常见问题"]},"197":{"title":"构建报错,提示内存溢出","titles":["常见问题"]},"198":{"title":"直接修改构建产物的接口地址","titles":["常见问题"]},"199":{"title":"不会 TypeScript 怎么办","titles":["常见问题"]},"200":{"title":"准备工作","titles":[]},"201":{"title":"源码","titles":["准备工作"]},"202":{"title":"基础版","titles":["准备工作","源码"]},"203":{"title":"专业版","titles":["准备工作","源码"]},"204":{"title":"开发环境","titles":["准备工作"]},"205":{"title":"技术栈","titles":["准备工作"]},"206":{"title":"替换为 Ant Design Vue","titles":[]},"207":{"title":"安装","titles":["替换为 Ant Design Vue"]},"208":{"title":"代码调整","titles":["替换为 Ant Design Vue"]},"209":{"title":"修改登录页","titles":["替换为 Ant Design Vue"]},"210":{"title":"卸载","titles":["替换为 Ant Design Vue"]},"211":{"title":"完成","titles":["替换为 Ant Design Vue"]},"212":{"title":"示例","titles":["替换为 Ant Design Vue"]},"213":{"title":"替换为 Arco Design Vue","titles":[]},"214":{"title":"安装","titles":["替换为 Arco Design Vue"]},"215":{"title":"代码调整","titles":["替换为 Arco Design Vue"]},"216":{"title":"修改登录页","titles":["替换为 Arco Design Vue"]},"217":{"title":"卸载","titles":["替换为 Arco Design Vue"]},"218":{"title":"完成","titles":["替换为 Arco Design Vue"]},"219":{"title":"示例","titles":["替换为 Arco Design Vue"]},"220":{"title":"替换为 iDux","titles":[]},"221":{"title":"安装","titles":["替换为 iDux"]},"222":{"title":"代码调整","titles":["替换为 iDux"]},"223":{"title":"修改登录页","titles":["替换为 iDux"]},"224":{"title":"卸载","titles":["替换为 iDux"]},"225":{"title":"完成","titles":["替换为 iDux"]},"226":{"title":"示例","titles":["替换为 iDux"]},"227":{"title":"替换为 Naive UI","titles":[]},"228":{"title":"安装","titles":["替换为 Naive UI"]},"229":{"title":"代码调整","titles":["替换为 Naive UI"]},"230":{"title":"修改登录页","titles":["替换为 Naive UI"]},"231":{"title":"卸载","titles":["替换为 Naive UI"]},"232":{"title":"完成","titles":["替换为 Naive UI"]},"233":{"title":"示例","titles":["替换为 Naive UI"]},"234":{"title":"替换为 TDesign","titles":[]},"235":{"title":"安装","titles":["替换为 TDesign"]},"236":{"title":"代码调整","titles":["替换为 TDesign"]},"237":{"title":"修改登录页","titles":["替换为 TDesign"]},"238":{"title":"卸载","titles":["替换为 TDesign"]},"239":{"title":"完成","titles":["替换为 TDesign"]},"240":{"title":"示例","titles":["替换为 TDesign"]},"241":{"title":"替换为 Vexip UI","titles":[]},"242":{"title":"安装","titles":["替换为 Vexip UI"]},"243":{"title":"代码调整","titles":["替换为 Vexip UI"]},"244":{"title":"修改登录页","titles":["替换为 Vexip UI"]},"245":{"title":"卸载","titles":["替换为 Vexip UI"]},"246":{"title":"完成","titles":["替换为 Vexip UI"]},"247":{"title":"示例","titles":["替换为 Vexip UI"]},"248":{"title":"资源","titles":[]},"249":{"title":"图片","titles":["资源"]},"250":{"title":"全局公共","titles":["资源","图片"]},"251":{"title":"局部私有","titles":["资源","图片"]},"252":{"title":"样式","titles":["资源"]},"253":{"title":"全局公共","titles":["资源","样式"]},"254":{"title":"局部私有","titles":["资源","样式"]},"255":{"title":"UnoCSS","titles":["资源","样式","局部私有"]},"256":{"title":"PostCSS","titles":["资源","样式","局部私有"]},"257":{"title":"SCSS","titles":["资源","样式","局部私有"]},"258":{"title":"组件","titles":["资源"]},"259":{"title":"全局公共","titles":["资源","组件"]},"260":{"title":"局部私有","titles":["资源","组件"]},"261":{"title":"路由","titles":[]},"262":{"title":"免登录页面","titles":["路由"]},"263":{"title":"RTL 模式","titles":[]},"264":{"title":"使用","titles":["RTL 模式"]},"265":{"title":"开始","titles":[]},"266":{"title":"私有 Storage 数据","titles":[]},"267":{"title":"全局状态管理","titles":[]},"268":{"title":"图标","titles":[]},"269":{"title":"自定义图标","titles":["图标"]},"270":{"title":"Iconify 图标","titles":["图标"]},"271":{"title":"Unocss 方案","titles":["图标","Iconify 图标"]},"272":{"title":"Iconify 原生方案","titles":["图标","Iconify 图标"]},"273":{"title":"离线/内网环境使用","titles":["图标","Iconify 图标"]},"274":{"title":"图标选择器","titles":["图标"]},"275":{"title":"主题","titles":[]},"276":{"title":"框架主题","titles":["主题"]},"277":{"title":"基础版","titles":["主题","框架主题"]},"278":{"title":"专业版","titles":["主题","框架主题"]},"279":{"title":"颜色方案","titles":["主题"]},"280":{"title":"哀悼模式","titles":["主题"]},"281":{"title":"色弱模式","titles":["主题"]},"282":{"title":"导航栏风格","titles":["主题"]},"283":{"title":"风格","titles":["主题","导航栏风格"]},"284":{"title":"圆角","titles":["主题","导航栏风格"]},"285":{"title":"开发注意","titles":["主题"]},"286":{"title":"工具栏","titles":[]},"287":{"title":"窗口预览","titles":["工具栏"]},"288":{"title":"收藏夹","titles":["工具栏"]},"289":{"title":"导航搜索","titles":["工具栏"]},"290":{"title":"通知中心","titles":["工具栏"]},"291":{"title":"国际化","titles":["工具栏"]},"292":{"title":"浏览器全屏","titles":["工具栏"]},"293":{"title":"颜色主题","titles":["工具栏"]},"294":{"title":"布局","titles":["工具栏"]},"295":{"title":"框架更新","titles":[]},"296":{"title":"使用 Composition API 开发","titles":[]},"297":{"title":"使用","titles":["使用 Composition API 开发"]},"298":{"title":"组件 name","titles":["使用 Composition API 开发"]},"299":{"title":"页面水印","titles":[]},"300":{"title":"使用","titles":["页面水印"]},"301":{"title":"设置水印内容","titles":["页面水印"]},"302":{"title":"为什么选择我们 ?","titles":[]},"303":{"title":"长期且稳定","titles":["为什么选择我们 ?"]},"304":{"title":"高效的交互方式","titles":["为什么选择我们 ?"]},"305":{"title":"窗口最大化","titles":["为什么选择我们 ?"]},"306":{"title":"快速定位操作窗口","titles":["为什么选择我们 ?"]},"307":{"title":"专注模式","titles":["为什么选择我们 ?"]},"308":{"title":"窗口排序","titles":["为什么选择我们 ?"]},"309":{"title":"继承自 Fantastic-admin","titles":["为什么选择我们 ?"]},"310":{"title":"为什么不是 Fantastic-admin ?","titles":["为什么选择我们 ?"]},"311":{"title":"窗口","titles":[]},"312":{"title":"技术支持","titles":[]},"313":{"title":"基础版","titles":["技术支持"]},"314":{"title":"专业版","titles":["技术支持"]}},"dirtCount":0,"index":[["存放在",{"2":{"311":1}}],["应运而生",{"2":{"310":1}}],["应用商店",{"2":{"204":1}}],["应用配置面板",{"2":{"123":3}}],["应用配置中导航栏填充风格的配置项名称变更",{"2":{"100":1}}],["应用配置新增",{"2":{"98":2}}],["应用配置",{"0":{"124":1},"2":{"98":2}}],["造成空间浪费",{"2":{"310":1}}],["界面上会显示大量的留白",{"2":{"310":1}}],["带鱼屏发展",{"2":{"310":1}}],["代表了市面上几乎所有的传统后台框架",{"2":{"310":1}}],["代码调整",{"0":{"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["代码不会受到影响",{"2":{"199":1}}],["代码文件自动生成",{"0":{"183":1},"1":{"184":1,"185":1,"186":1,"187":1,"188":1},"2":{"180":1,"259":1}}],["代码里可以实时查看对应语言的内容",{"2":{"139":1}}],["代码规范",{"0":{"113":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1},"2":{"100":1}}],["代码很简单",{"2":{"75":1}}],["徽标",{"2":{"309":1}}],["许多优秀的特性",{"2":{"309":1}}],["继承自",{"0":{"309":1}}],["摆脱传统后台框架路由跳转的交互",{"2":{"304":1}}],["高效的交互方式",{"0":{"304":1}}],["高亮显示匹配的标签",{"2":{"204":1}}],["天",{"2":{"303":1}}],["截止到今天为止",{"2":{"303":1}}],["正式对外发布",{"2":{"303":1}}],["正式成为",{"2":{"267":1}}],["长期且稳定",{"0":{"303":1}}],["长期维护",{"2":{"6":1}}],["长期维护更新",{"2":{"4":1}}],["恢复到默认设置",{"2":{"301":1}}],["水印同时支持动态更新",{"2":{"301":1}}],["水印不生效",{"2":{"89":1}}],["语法糖进行开发",{"2":{"297":1}}],["语言包存放在",{"2":{"141":1}}],["语言包",{"0":{"141":1}}],["语言选择器",{"0":{"140":1}}],["稳定是第一诉求",{"2":{"295":1}}],["由作者全权维护",{"2":{"295":1}}],["由于窗口展示的特殊性",{"2":{"311":1}}],["由于框架采用了全新的交互方式",{"2":{"261":1}}],["由于框架默认使用的是",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["由于登录页使用了",{"2":{"209":1,"216":1,"223":1,"230":1,"237":1,"244":1}}],["由于开启错误日志监控后",{"2":{"125":1}}],["由于",{"2":{"117":1,"266":2}}],["虽然有小部分框架选择将部分核心源码封装成",{"2":{"295":1}}],["浏览器全屏",{"0":{"292":1}}],["希望帮助你更好地在暗黑模式下开发出优秀的页面",{"2":{"285":1}}],["希望你可以去",{"2":{"147":1}}],["教你巧用ui设计中的暗黑模式",{"2":{"285":1}}],["等有涉及到颜色的属性",{"2":{"285":1}}],["圆点",{"2":{"283":1}}],["圆角",{"0":{"284":1},"2":{"100":1}}],["线条",{"2":{"283":1}}],["箭头",{"2":{"283":1}}],["风格",{"0":{"283":1}}],["色弱模式",{"0":{"281":1}}],["哀悼模式",{"0":{"280":1}}],["工具栏主要是红框处各类功能图标",{"2":{"286":1}}],["工具栏",{"0":{"286":1},"1":{"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1},"2":{"277":2,"278":3}}],["工具栏部分按钮增加交互动效",{"2":{"93":1}}],["次导航",{"2":{"277":2,"278":3}}],["头部",{"2":{"277":2,"278":3}}],["头部标题",{"2":{"19":1}}],["且相对于",{"2":{"273":1}}],["且内容多",{"2":{"182":1}}],["优先推荐在仓库提交",{"2":{"313":1}}],["优先推荐使用",{"2":{"273":1}}],["优化开发体验",{"2":{"97":2}}],["离线",{"0":{"273":1}}],["假设",{"2":{"271":1}}],["假设你已经在",{"2":{"141":1}}],["+",{"2":{"271":1}}],["++",{"2":{"181":4}}],["集合名",{"2":{"271":1,"272":1}}],["格式为",{"2":{"271":1,"272":1}}],["格式的字体文件不是浏览器支持的字体格式",{"2":{"136":1}}],["格式的字体文件",{"2":{"135":1}}],["复制图标名称",{"2":{"271":1}}],["聊聊纯",{"2":{"271":1}}],["去处理图标的展示",{"2":{"271":1}}],["去登录",{"2":{"143":1}}],["又或者是设计师绘制的",{"2":{"269":1}}],["唯一id",{"2":{"267":1}}],["面向未来的",{"2":{"267":1}}],["探索学习",{"2":{"267":1}}],["状态管理工具",{"2":{"267":1}}],["欧耶",{"2":{"267":1}}],["视频的介绍",{"2":{"267":1}}],["我还收集了一些文字",{"2":{"267":1}}],["我们尽量在提交代码时标明每次提交改动的变更记录说明",{"2":{"295":1}}],["我们的建议是",{"2":{"182":1}}],["我们的一个演示模块也就初步创建好了",{"2":{"181":1}}],["我们就可以将其进行忽略",{"2":{"115":1,"116":1}}],["我们已经将大部分工作做好了",{"2":{"33":1}}],["我们不承担任何责任",{"2":{"3":1}}],["我们有权利收回产品授权及更新权限",{"2":{"3":1}}],["我们希望能有一个独立的技术支持微信群",{"2":{"2":1}}],["我们是给客户开发项目的",{"2":{"2":1}}],["我们是公司",{"2":{"2":1}}],["我们会邀请你加入组织",{"2":{"1":1}}],["已持续维护",{"2":{"303":1}}],["已正式成为",{"2":{"267":1}}],["已经使用",{"2":{"117":1}}],["已经稳定应用在电商",{"2":{"6":1}}],["避免出现",{"2":{"266":1}}],["避免不了手动去频繁创建页面",{"2":{"183":1}}],["容量",{"2":{"266":1}}],["意味着两套系统共享",{"2":{"266":1}}],["意味着你可以使用自定义图标",{"2":{"171":1}}],["意味着你可以直接在代码里使用组件",{"2":{"120":1}}],["解决同源",{"2":{"266":1}}],["解决构建后",{"2":{"105":2}}],["类似于全局组件",{"2":{"311":1}}],["类来解决这个问题",{"2":{"266":1}}],["类型定义",{"2":{"301":1}}],["类型",{"2":{"10":1,"13":1,"16":2,"19":1,"21":1,"23":1,"27":1,"29":1,"31":1,"37":1,"40":1,"43":1,"45":1,"49":1,"51":1,"55":1,"57":2,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1}}],["系统",{"2":{"266":1}}],["私有",{"0":{"266":1}}],["非必要情况下",{"2":{"265":1}}],["源",{"2":{"265":1}}],["源码",{"0":{"201":1},"1":{"202":1,"203":1},"2":{"201":1}}],["报错",{"2":{"265":1}}],["运行时提示",{"2":{"265":1}}],["运行成功后",{"2":{"265":1}}],["运行",{"2":{"265":1}}],["必须使用",{"2":{"265":1}}],["必选参数",{"2":{"21":1,"29":1,"31":1}}],["效果如下",{"2":{"264":1,"300":1}}],["免登录白名单",{"2":{"262":1}}],["免登录页面",{"0":{"262":1},"2":{"262":1}}],["固定路由",{"2":{"262":1}}],["固定底部操作栏",{"0":{"7":1},"1":{"8":1}}],["都需要一次完整的回归测试",{"2":{"295":1}}],["都些都是依赖未安装成功导致的",{"2":{"265":1}}],["都必须登录后才能访问",{"2":{"262":1}}],["都是需要在本地项目中编写或修改代码并运行才能呈现的",{"2":{"201":1}}],["另一个是登录成功后的地址",{"2":{"261":1}}],["另外你也可以将",{"2":{"137":1}}],["另外因为框架没有采用",{"2":{"120":1}}],["使得路由在本框架中并非核心功能",{"2":{"261":1}}],["使用文件比较工具",{"2":{"295":1}}],["使用它",{"2":{"271":1}}],["使用方式也极为简单",{"2":{"271":1}}],["使用方法",{"2":{"267":1}}],["使用方法请查阅官方文档",{"2":{"69":1,"70":1}}],["使用本模板前",{"2":{"204":1}}],["使用上对比鉴权组件更方便",{"2":{"178":1}}],["使用基础版的开发者可直接跳过阅读",{"2":{"147":1}}],["使用第三方",{"2":{"97":1}}],["使用",{"0":{"129":1,"137":1,"264":1,"296":1,"297":1,"300":1},"1":{"297":1,"298":1},"2":{"19":1,"80":1,"297":1}}],["使用说明",{"0":{"3":1}}],["每个窗口的文件夹内至少保留一个文件名为",{"2":{"311":1}}],["每个页面的功能明确",{"2":{"310":1}}],["每个组件的文件夹内至少保留一个文件名为",{"2":{"259":1}}],["每个组件按文件夹进行区分",{"2":{"259":1}}],["每一次大更新",{"2":{"295":1}}],["每一个",{"2":{"159":1}}],["功能请参考这里",{"2":{"254":1}}],["功能部分的介绍主要还是要看代码",{"2":{"182":1}}],["更多设置项请查看",{"2":{"301":1}}],["更多单文件组件",{"2":{"254":1}}],["更灵活且易读",{"2":{"296":1}}],["更新日志",{"0":{"87":1},"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,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1}}],["混合等支持",{"2":{"253":1}}],["样式",{"0":{"252":1},"1":{"253":1,"254":1,"255":1,"256":1,"257":1},"2":{"311":1}}],["专注于所勾选的窗口进行操作",{"2":{"307":1}}],["专注模式",{"0":{"307":1}}],["专门用于存放局部私有组件",{"2":{"260":1}}],["专门用于存放局部私有图片",{"2":{"251":1}}],["专业版默认提供了",{"2":{"278":1}}],["专业版用户也同样",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["专业版用户会邀请加入到私有组织",{"2":{"203":1}}],["专业版侧重于新特性开发",{"2":{"6":1}}],["专业版与基础版区别",{"0":{"4":1}}],["专业版",{"0":{"203":1,"278":1,"314":1},"2":{"2":2,"4":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,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["专业版源码托管在",{"2":{"1":1}}],["专业版客户的唯一凭证",{"2":{"1":1}}],["专业版超值优惠合集③",{"2":{"0":1}}],["专业版超值优惠合集②",{"2":{"0":1}}],["专业版超值优惠合集①",{"2":{"0":1}}],["局部私有组件建议采用就近原则",{"2":{"260":1}}],["局部私有样式建议直接在",{"2":{"254":1}}],["局部私有图片建议采用就近原则",{"2":{"251":1}}],["局部私有",{"0":{"251":1,"254":1,"260":1},"1":{"255":1,"256":1,"257":1}}],["局部组件则在",{"2":{"185":1}}],["资源目录",{"2":{"253":1}}],["资源",{"0":{"248":1},"1":{"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1}}],["示例",{"0":{"212":1,"219":1,"226":1,"233":1,"240":1,"247":1},"2":{"301":1}}],["至此",{"2":{"211":1,"218":1,"225":1,"232":1,"239":1,"246":1}}],["完成",{"0":{"211":1,"218":1,"225":1,"232":1,"239":1,"246":1}}],["完整图标库",{"2":{"100":2}}],["卸载",{"0":{"210":1,"217":1,"224":1,"231":1,"238":1,"245":1},"2":{"210":1,"217":1,"224":1,"231":1,"238":1,"245":1}}],["│",{"2":{"208":1,"215":1,"222":1,"236":1,"243":1}}],["├─",{"2":{"208":10,"215":10,"222":10,"229":4,"236":10,"243":10}}],["二次封装",{"2":{"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["└─",{"2":{"208":7,"215":7,"222":7,"229":3,"236":7,"243":7}}],["删除相关文件",{"2":{"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["及以上",{"2":{"266":1}}],["及之后的版本",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["及部分源码片段",{"2":{"3":1}}],["迁移指南",{"2":{"205":1}}],["了解并熟悉框架使用到的技术栈",{"2":{"205":1}}],["了解本地构建或者下载支持",{"2":{"204":1}}],["技术栈",{"0":{"205":1}}],["技术支持",{"0":{"312":1},"1":{"313":1,"314":1},"2":{"4":1}}],["彩虹缩进提示",{"2":{"204":1}}],["右下角会自动提示需要安装的依赖",{"2":{"204":1}}],["右侧区域的",{"2":{"38":1}}],["拉取演示源码",{"2":{"202":2}}],["拉取框架源码",{"2":{"202":2}}],["拉取",{"2":{"202":1}}],["拉取从",{"2":{"202":1}}],["到",{"2":{"202":1}}],["阅读开发文档前",{"2":{"201":1}}],["阅读并学习请查看",{"2":{"33":1,"120":1}}],["编写代码",{"2":{"199":1}}],["编辑",{"2":{"33":1,"120":1,"188":1}}],["足以证明它是构建一款成熟稳健产品的基石",{"2":{"199":1}}],["库",{"2":{"199":1}}],["从",{"2":{"202":1}}],["从长远考虑我们都建议你学习",{"2":{"199":1}}],["从而无需编写重复代码",{"2":{"182":1}}],["怎么办",{"0":{"199":1}}],["之前的版本不支持替换组件库",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["之前版本为",{"2":{"150":1,"151":1,"152":1,"153":1,"154":1,"283":1}}],["之后你就可以在构建产物目录下直接修改",{"2":{"198":1}}],["仅在生产环境时使用",{"2":{"198":1}}],["表示该主题在明亮或暗黑模式下的配色",{"2":{"278":1}}],["表示该功能仅提供于专业版使用",{"2":{"147":1}}],["表示内存空间大小",{"2":{"197":1}}],["依旧还是会触发外部网络请求",{"2":{"273":1}}],["依旧还是需要手动导入一个",{"2":{"272":1}}],["依旧请求真实接口",{"2":{"80":1}}],["依赖包",{"2":{"295":1}}],["依赖",{"2":{"197":1}}],["服务器也需要做相应的配置调整",{"2":{"196":1}}],["号能不能去掉",{"0":{"196":1}}],["显隐",{"2":{"309":1}}],["显著提升了开发服务器的性能",{"2":{"195":1}}],["显示",{"2":{"146":1}}],["慢",{"2":{"195":1}}],["快速调整窗口的展示顺序",{"2":{"308":1}}],["快速定位操作窗口",{"0":{"306":1}}],["快",{"2":{"195":1}}],["就需要频繁切换路由",{"2":{"310":1}}],["就在使用的开发者",{"2":{"296":1}}],["就不会触发外部网络请求了",{"2":{"273":1}}],["就不会出现该警告了",{"2":{"194":1}}],["就增加了一个",{"2":{"262":1}}],["就是",{"2":{"269":1}}],["就是不同环境需要分别进行构建",{"2":{"198":1}}],["就是在",{"2":{"194":1}}],["就分别是请求和响应的拦截代码了",{"2":{"75":1}}],["常见问题",{"0":{"193":1},"1":{"194":1,"195":1,"196":1,"197":1,"198":1,"199":1}}],["常用的",{"2":{"74":1}}],["常用",{"0":{"58":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1}}],["常用邮箱",{"2":{"1":1}}],["定制偏好设置内容",{"0":{"191":1}}],["定期修复",{"2":{"4":1}}],["公共组件生成目录为",{"2":{"185":1}}],["公司名称",{"0":{"131":1}}],["预设模板文件存放在",{"2":{"183":1}}],["预览",{"0":{"84":1}}],["现在你可以用更简洁的方式来处理这一切",{"2":{"183":1}}],["现在可以移动到",{"2":{"100":1}}],["实现",{"2":{"183":1}}],["实现高度定制化",{"2":{"5":1}}],["毕竟最终目的都是提高开发效率",{"2":{"182":1}}],["跨窗口的组件调用",{"2":{"182":1}}],["跨域处理",{"0":{"77":1}}],["处理起来都很麻烦",{"2":{"182":1}}],["处理请求",{"0":{"127":1,"192":1}}],["反之也可能是从抽屉改成弹窗的形式",{"2":{"182":1}}],["考虑到需求会变",{"2":{"182":1}}],["让使用人员可以做到跨模块的多线操作",{"2":{"304":1}}],["让用户可以自行设置",{"2":{"189":1}}],["让新窗口进行承载",{"2":{"182":1}}],["让框架自行处理",{"2":{"175":1}}],["保存后效果如下",{"2":{"182":1}}],["保持一致",{"2":{"141":1}}],["列表数据",{"2":{"182":1}}],["批量操作",{"2":{"182":1}}],["搜索",{"2":{"182":1}}],["搜索面板",{"0":{"44":1},"1":{"45":1,"46":1,"47":1}}],["抽屉",{"2":{"182":1}}],["详细可查看",{"2":{"259":1}}],["详细可阅读",{"2":{"55":1,"59":1,"60":1,"100":4,"123":1,"166":1,"169":1,"171":1,"172":1,"196":1,"288":1,"291":1}}],["详情页的代码就不多介绍了",{"2":{"182":1}}],["详情",{"2":{"182":1,"188":1}}],["详情展示模式",{"2":{"182":1}}],["最后分享一篇关于暗黑模式的文章",{"2":{"285":1}}],["最后在应用配置中使用该主题",{"2":{"278":1}}],["最后使用",{"2":{"265":1}}],["最先看到的是这句文件导入代码",{"2":{"182":1}}],["最终解释权归",{"2":{"3":1}}],["先从列表页",{"2":{"182":1}}],["特性的代码",{"2":{"253":1}}],["特性介绍",{"0":{"182":1}}],["特点为项目多",{"2":{"5":1}}],["接着在",{"2":{"182":1}}],["接下来需要去配置下导航",{"2":{"181":1}}],["接口文件",{"2":{"81":1}}],["接口的时候",{"2":{"80":1}}],["接口",{"2":{"80":2,"81":1}}],["接口与真实接口共存",{"2":{"80":1}}],["接口请求地址",{"2":{"123":3}}],["接口请求",{"0":{"59":1,"72":1},"1":{"73":1,"74":1,"75":1},"2":{"59":1}}],["√",{"2":{"181":4}}],["yarn",{"2":{"265":2}}],["yaml",{"2":{"123":3,"265":1}}],["yes",{"2":{"181":1}}],["创建标准窗口",{"2":{"181":1}}],["它探索出了一种全新的交互方式",{"2":{"310":1}}],["它们的优势在于理解成本低",{"2":{"310":1}}],["它将提高很多开发上的效率",{"2":{"297":1}}],["它需要展示多套图标集内的所有图标",{"2":{"274":1}}],["它的性能更好",{"2":{"273":1}}],["它不受网络环境限制",{"2":{"273":1}}],["它比",{"2":{"270":1,"296":1}}],["它包含列表页和编辑页",{"2":{"180":1}}],["它能高亮显示",{"2":{"100":1}}],["标签上通过设置",{"2":{"271":1}}],["标准模块模板基于",{"2":{"208":1,"215":1,"222":1,"236":1,"243":1}}],["标准模块提供了",{"2":{"182":1}}],["标准模块",{"0":{"180":1},"2":{"188":1}}],["标题国际化对应的",{"2":{"169":1}}],["标题区的",{"2":{"41":1}}],["标题",{"2":{"37":1,"40":1,"309":1}}],["返回",{"2":{"179":3}}],["才验证通过",{"2":{"177":1,"178":1,"179":1}}],["才允许提交到",{"2":{"117":1}}],["具体可以阅读这篇文章了解",{"2":{"195":2}}],["具体使用如下",{"2":{"177":1}}],["具体配置如下",{"2":{"127":1,"192":1}}],["针对这样的需求",{"2":{"177":1}}],["针对这些问题你需要依次检查以下几点",{"2":{"158":1}}],["第一点里有提到",{"2":{"182":1}}],["第一种是返回全部的导航数据",{"2":{"175":1}}],["第二种是后端直接返回用户具备访问权限的导航数据",{"2":{"175":1}}],["路由",{"0":{"261":1},"1":{"262":1}}],["路由权限",{"2":{"172":1}}],["路径",{"2":{"78":1}}],["根据权限去过滤并动态注册路由",{"2":{"172":1}}],["根据招聘网站统计",{"2":{"5":1}}],["✖️",{"2":{"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1}}],["值",{"2":{"166":1,"169":1}}],["✔️",{"2":{"166":1,"167":1}}],["三个参数",{"2":{"164":1}}],["地址即可",{"2":{"163":1}}],["外链等",{"2":{"309":1}}],["外链",{"0":{"163":1}}],["外链导航",{"2":{"4":1}}],["整体修改",{"2":{"208":4,"215":4,"222":4,"229":4,"236":4,"243":4}}],["整个项目所有导航的",{"2":{"161":1}}],["整站图标改用",{"2":{"97":2}}],["演示源码",{"2":{"202":1}}],["演示页面",{"2":{"162":1}}],["演示",{"2":{"161":1,"162":1,"164":1}}],["演示地址",{"2":{"4":1}}],["一般为",{"2":{"266":1}}],["一键切换源",{"2":{"265":1}}],["一个是登录地址",{"2":{"261":1}}],["一个导航模块包含以下结构",{"2":{"161":1}}],["一起使用",{"2":{"173":1,"298":1}}],["一级导航",{"0":{"161":1}}],["一些全局方法将无法使用",{"2":{"120":1}}],["计算属性",{"2":{"158":1}}],["计数器",{"2":{"33":1,"120":1}}],["按照之前记录的文档可以有个大致的迁移方案",{"2":{"295":1}}],["按照指引选择你需要用到的图标集",{"2":{"273":1}}],["按照特定规则创建文件或者文件夹",{"2":{"183":1}}],["按照实际情况进行调整",{"2":{"158":1}}],["按钮组件",{"2":{"33":1,"120":1}}],["比如",{"2":{"158":1,"191":1}}],["比较大的区别是生产环境里调用",{"2":{"81":1}}],["经常会遇到一些问题",{"2":{"158":1}}],["经历过数十个真实项目的打磨",{"2":{"6":1}}],["涉及到的第一步业务开发就是修改登录功能",{"2":{"158":1}}],["均为",{"2":{"157":1}}],["均提供长期维护",{"2":{"6":1}}],["变成了一个庞大的表单",{"2":{"182":1}}],["变量",{"0":{"157":1},"2":{"157":1}}],["变更为",{"2":{"90":3}}],["顶部面板模式",{"0":{"156":1},"2":{"149":1}}],["顶部精简模式",{"0":{"154":1},"2":{"149":1}}],["顶部模式",{"0":{"150":1},"2":{"149":1}}],["侧边栏面板模式",{"0":{"155":1},"2":{"149":1}}],["侧边栏精简模式",{"0":{"153":1},"2":{"149":1}}],["侧边栏模式",{"0":{"151":1,"152":1},"2":{"149":2}}],["含主导航",{"0":{"151":1},"2":{"149":1}}],["再删除",{"2":{"265":1}}],["再比如",{"2":{"191":1}}],["再往下就是需要你修改或编写业务代码的部分",{"2":{"182":1}}],["再搭配默认提供的",{"2":{"148":1}}],["再加上本框架的加持",{"2":{"5":1}}],["种模式的目录结构进行创建新的模板",{"2":{"183":1}}],["种模式",{"2":{"183":2}}],["种形式共存",{"2":{"182":1}}],["种详情展示模式",{"2":{"182":1}}],["种导航栏模式",{"2":{"149":1}}],["种导航栏模式和",{"2":{"148":1}}],["种布局结构",{"2":{"148":1}}],["种页宽模式的组合搭配",{"2":{"148":1}}],["布局相关的变量存放在",{"2":{"157":1}}],["布局",{"0":{"148":1,"294":1},"1":{"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1}}],["那有没有解决办法么",{"2":{"295":1}}],["那也可以使用下面这种方法",{"2":{"285":1}}],["那没有什么需要注意的",{"2":{"285":1}}],["那么我们建议你在开发的时候",{"2":{"297":1}}],["那么我们建议你阅读",{"2":{"297":1}}],["那么你可以使用",{"2":{"272":1}}],["那么这个配置项就不应该再暴露给用户了",{"2":{"191":1}}],["那么可以使用用户偏好设置功能",{"2":{"189":1}}],["那我们就开始吧~",{"2":{"147":1}}],["那语言包文件就会变得无比庞大且难以维护",{"2":{"144":1}}],["帮我点个",{"2":{"147":1}}],["码云",{"2":{"147":1}}],["相信这篇介绍能帮助你快速了解",{"2":{"302":1}}],["相信你已经准备或正在使用",{"2":{"147":1}}],["相关",{"2":{"297":1}}],["相关文件在",{"2":{"290":1}}],["相关的错误都不会在控制台里显示",{"2":{"125":1}}],["相对独立的页面",{"2":{"262":1}}],["相对比较简单",{"2":{"182":1}}],["发送验证码",{"2":{"143":1}}],["密码",{"2":{"143":1}}],["退出登录",{"2":{"143":1}}],["登录接口请求成功",{"2":{"158":1}}],["登录",{"0":{"158":1},"2":{"143":1}}],["登录页增加扫码登录参考",{"2":{"92":2}}],["确保唯一",{"2":{"167":1,"184":1}}],["确保接口可以请求成功",{"2":{"158":1}}],["确保开发人员尽可能理解整套框架源码的方方面面",{"2":{"5":1}}],["确认",{"2":{"143":1}}],["验证码",{"2":{"143":1}}],["打开",{"2":{"143":1}}],["光设置好中文",{"2":{"142":1}}],["日本語",{"2":{"141":1}}],["日期",{"0":{"70":1}}],["繁體",{"2":{"141":1}}],["key",{"2":{"141":8,"166":1,"169":1,"208":1,"215":1,"222":1,"229":1,"236":1,"243":1,"266":8}}],["kit",{"2":{"34":1}}],["引用",{"2":{"141":1}}],["引入",{"2":{"88":2,"97":2,"105":2}}],["兜底",{"2":{"140":1}}],["简体",{"2":{"140":1,"141":1,"142":1,"143":1,"146":1}}],["简单封装",{"2":{"69":1,"70":1}}],["留空跟随系统",{"2":{"279":1}}],["留空则会根据浏览器语言自动判断",{"2":{"140":1}}],["留空默认",{"2":{"100":1,"283":1}}],["名称在",{"2":{"137":1}}],["随后引入文件夹中的",{"2":{"137":1}}],["将每个模块以窗口的形式展示在同一个界面中",{"2":{"304":1}}],["将准备好的",{"2":{"269":1}}],["将无法与官方环境锁定的依赖包版本保持一致",{"2":{"265":1}}],["将其替换为自己的登录接口",{"2":{"158":1}}],["将上一步下载的压缩包解压并放入",{"2":{"137":1}}],["将错误日志记录在",{"2":{"125":1}}],["找字体",{"0":{"135":1}}],["除了可以在",{"2":{"270":1}}],["除了通过",{"2":{"267":1}}],["除了框架提供的",{"2":{"183":1}}],["除了支持",{"2":{"6":1}}],["除此之外",{"2":{"134":1,"204":1}}],["字体的",{"2":{"137":1}}],["字体为例",{"2":{"137":1}}],["字体文件有大有小",{"2":{"134":1}}],["字符串进行存储",{"2":{"127":1,"192":1}}],["备案号",{"0":{"133":1}}],["网站",{"2":{"270":1}}],["网站地址",{"0":{"132":1}}],["网站运行日期",{"0":{"130":1}}],["网络图片增加载入和失败状态",{"2":{"88":2}}],["版权信息位于页面底部显示",{"2":{"128":1}}],["版权信息",{"0":{"128":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1}}],["版本开始",{"2":{"195":1}}],["版本将不再维护",{"2":{"112":2}}],["版本",{"2":{"112":2,"195":1,"204":1}}],["版本存档",{"2":{"112":2}}],["记录用户账号",{"2":{"125":1}}],["记录的数据",{"2":{"53":1}}],["错误日志",{"0":{"125":1}}],["错误日志上报",{"2":{"4":1}}],["关于表单具体使用哪种展示模式比较好",{"2":{"182":1}}],["关于配置的类型定义",{"2":{"124":1}}],["关闭国际化",{"0":{"146":1}}],["关闭窗口",{"0":{"65":1}}],["关闭按钮事件回调",{"2":{"17":1}}],["目的是方便开发者在开发阶段调试",{"2":{"123":1}}],["目录是",{"2":{"117":1}}],["目录中",{"2":{"100":1}}],["目录中的图片",{"2":{"100":1}}],["目录为",{"2":{"76":1}}],["目录下生成一个标准",{"2":{"187":1}}],["目录下生成一个空模板",{"2":{"186":1}}],["目录下选择指定的文件夹进行生成",{"2":{"184":1,"185":1}}],["目录下新建一个",{"2":{"181":1}}],["目录下新增并配置好了一个日文语言包",{"2":{"141":1}}],["目录下创建好了一个",{"2":{"181":1}}],["目录下文件名",{"2":{"140":1}}],["目录下找到对应组件进行修改",{"2":{"119":1}}],["目录下找到对应组件自行修改",{"2":{"35":1}}],["目录下分别新建",{"2":{"100":1}}],["目录下",{"2":{"34":1,"137":1,"141":1,"159":1,"183":1,"250":1,"253":1,"259":1,"267":1,"269":1,"311":1}}],["该依赖会自动导入",{"2":{"297":1}}],["该功能基于",{"2":{"183":1}}],["该方法用于登录成功后获取用户权限",{"2":{"176":1}}],["该属性通常不在导航里直接配置",{"2":{"174":1}}],["该路由访问权限",{"2":{"172":1}}],["该项配置最终会通过",{"2":{"171":1}}],["该设置表示关闭语言选择器",{"2":{"146":1}}],["该特性由",{"2":{"138":1,"259":1}}],["该变量是开启应用配置面板",{"2":{"123":1}}],["该配置即用于代理",{"2":{"77":1,"78":1}}],["章节",{"2":{"123":1}}],["测试模块",{"2":{"181":1}}],["测试",{"2":{"123":1}}],["测试环境和生产环境用于构建使用",{"2":{"123":1}}],["测试环境",{"2":{"123":1}}],["调试工具",{"2":{"123":3}}],["调整应用配置的配置项",{"2":{"105":2}}],["调整",{"2":{"89":1}}],["分别为",{"2":{"123":1}}],["消息提示组件",{"2":{"120":1}}],["提示内存溢出",{"0":{"197":1}}],["提交时强制进行代码规范校验",{"2":{"118":1}}],["提供支持",{"2":{"259":1}}],["提供了大量示例代码",{"2":{"202":1}}],["提供了全新的配置方式",{"2":{"100":1}}],["提供的预览界面可以帮助使用人员快速定位到需要操作的窗口",{"2":{"306":1}}],["提供的所有图标",{"2":{"271":1}}],["提供的",{"2":{"174":1}}],["提供的图标",{"2":{"171":1}}],["提供技术支持",{"2":{"138":1}}],["提供开发和生产模拟服务",{"2":{"79":1}}],["提供",{"2":{"33":1,"93":1,"120":1,"270":1}}],["提供最佳实践方案",{"2":{"6":1}}],["提供新特性",{"2":{"4":1}}],["提供独立技术支持微信群",{"2":{"2":1}}],["脚本",{"2":{"117":1}}],["此目录下还有一个特殊目录",{"2":{"253":1}}],["此处选择的图标集也是图标选择器里展示的图标集",{"2":{"273":1}}],["此处的对象属性和",{"2":{"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["此处填写接口地址",{"2":{"78":1}}],["此方法不仅适用于接口地址",{"2":{"198":1}}],["此外",{"2":{"117":1}}],["环境变量和模式",{"2":{"123":1}}],["环境配置",{"0":{"123":1}}],["环境",{"2":{"117":1}}],["环境初始化之后再执行一遍",{"2":{"117":1}}],["环境初始化",{"2":{"117":1}}],["检测",{"2":{"117":1}}],["仓库目录和框架目录并非同一个",{"2":{"117":1}}],["仓库里的代码不会有不规范的代码",{"2":{"117":1}}],["仓库",{"2":{"117":2}}],["只需将必要的一些新特性或",{"2":{"295":1}}],["只需要将",{"2":{"163":1}}],["只是不会在工具栏显示切换颜色主题的图标",{"2":{"293":1}}],["只是不会在工具栏显示切换语言的图标",{"2":{"291":1}}],["只是仓库地址不同",{"2":{"203":1}}],["只能在",{"2":{"184":1}}],["只能对代码的书写规范进行格式化",{"2":{"117":1}}],["只要满足一个",{"2":{"172":1}}],["只记录",{"2":{"87":1}}],["官网的操作更直观",{"2":{"270":1}}],["官网上查找搜需要的图标",{"2":{"270":1}}],["官网学习外",{"2":{"267":1}}],["官网",{"2":{"163":1,"204":1,"271":1}}],["官网规则并在",{"2":{"115":1,"116":1}}],["官方提供的使用方式",{"2":{"272":1}}],["官方提供的调试工具在一定程度上可以提升解决",{"2":{"204":1}}],["官方状态库",{"2":{"267":1}}],["官方的图标使用方式",{"2":{"120":1}}],["官方图标的使用方式",{"2":{"33":2}}],["官方文档了解",{"2":{"297":1}}],["官方文档",{"2":{"33":1,"79":1,"100":1,"120":1,"183":1}}],["通知中心页面",{"2":{"290":1}}],["通知中心下拉预览面板",{"2":{"290":1}}],["通知中心不涉及具体业务",{"2":{"290":1}}],["通知中心",{"0":{"290":1}}],["通常情况下无需做任何修改",{"2":{"114":1}}],["通过执行",{"2":{"274":1}}],["通过打开",{"2":{"261":1}}],["通过配置可一键切换",{"2":{"182":1}}],["通过",{"2":{"148":1,"183":1}}],["通过修改",{"2":{"115":1,"116":1}}],["通过预先跟服务器端约定好的接口",{"2":{"79":1}}],["通过项目积累",{"2":{"6":1}}],["通过微信或支付宝扫码支付",{"2":{"1":1}}],["准备工作",{"0":{"200":1},"1":{"201":1,"202":1,"203":1,"204":1,"205":1},"2":{"113":1}}],["建议使用",{"2":{"267":1}}],["建议不需要时候可以将扩展禁用",{"2":{"204":1}}],["建议后端可以在用户表增加相关字段",{"2":{"127":1,"192":1}}],["建议",{"2":{"113":1,"127":1,"192":1,"204":1}}],["建议按照不同模块区分文件夹",{"2":{"80":1}}],["写法",{"2":{"108":2}}],["改为",{"2":{"108":2}}],["统一管理接口请求模块",{"2":{"105":2}}],["修改时请确保提供的所有值都存在",{"2":{"294":1}}],["修改登录页",{"0":{"209":1,"216":1,"223":1,"230":1,"237":1,"244":1}}],["修改为",{"2":{"196":1}}],["修改它会直接影响代码的调整",{"2":{"191":1}}],["修改完成后",{"2":{"141":1}}],["修改后重新执行一下",{"2":{"117":1}}],["修改",{"2":{"100":1,"198":1,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2}}],["修复同步到原有项目中即可",{"2":{"295":1}}],["修复无法打开修改密码窗口的问题",{"2":{"110":1}}],["修复类型报错",{"2":{"110":2}}],["修复类型警告",{"2":{"89":1}}],["修复主导航国际化配置不生效",{"2":{"109":1}}],["修复主题跟随系统且系统为明亮模式时",{"2":{"89":1}}],["修复次导航收起时图标不居中",{"2":{"109":2}}],["修复切换国际化语言时",{"2":{"108":1}}],["修复顶部主导航国际化配置不生效",{"2":{"108":1}}],["修复顶部导航数量过多",{"2":{"92":2}}],["修复顶部导航鼠标滚动回弹",{"2":{"92":2}}],["修复收藏夹默认存储位置错误",{"2":{"100":1}}],["修复登录页",{"2":{"99":2}}],["修复",{"2":{"93":1,"96":1,"105":2,"110":1}}],["修复水印开启报错",{"2":{"92":1}}],["修复有",{"2":{"91":1}}],["修复vscode失效配置",{"2":{"90":2}}],["$width",{"2":{"257":3}}],["$message",{"2":{"120":1}}],["$bg",{"2":{"100":1}}],["$colors",{"2":{"100":1}}],["$t",{"2":{"93":1}}],["重置水印",{"2":{"301":1}}],["重命名为",{"2":{"108":2}}],["重名",{"2":{"100":1}}],["重构标准模块",{"2":{"105":1}}],["重构接口请求",{"2":{"105":2}}],["重构框架核心源码",{"2":{"100":2}}],["重构页面水印",{"2":{"97":1}}],["重构用户偏好模块",{"2":{"97":1}}],["重构登录页面",{"2":{"88":2}}],["启用",{"2":{"100":1}}],["启用新的",{"2":{"100":2}}],["拥抱原子化",{"2":{"100":1}}],["默认支持",{"2":{"297":1}}],["默认地址为",{"2":{"265":1}}],["默认是弹窗的方式",{"2":{"182":1}}],["默认模块",{"2":{"181":1}}],["默认提供了两组权限",{"2":{"176":1}}],["默认提供三套环境配置",{"2":{"123":1}}],["默认尺寸的配置项",{"2":{"100":3}}],["默认值",{"2":{"10":1,"13":1,"16":1,"19":1,"21":1,"23":1,"27":1,"29":1,"31":1,"37":1,"40":1,"43":1,"45":1,"49":1,"51":1,"55":1,"57":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1}}],["属性",{"2":{"98":1}}],["属性将无法使用",{"2":{"33":1,"120":1}}],["zhtwlocale",{"2":{"243":2}}],["zhtw",{"2":{"208":2,"215":2,"229":2,"236":2}}],["zhcnlocale",{"2":{"243":4}}],["zhcn",{"2":{"208":2,"215":4,"222":5,"229":4,"236":4}}],["zh",{"2":{"141":4,"143":1,"146":1,"208":5,"215":5,"222":2,"229":2,"236":5,"243":2}}],["zoomable",{"2":{"97":1}}],["zip",{"2":{"21":1,"123":2}}],["插件都是用",{"2":{"199":1}}],["插件",{"2":{"97":1,"100":1,"105":4,"256":1}}],["插件下正确显示",{"2":{"93":1}}],["指令进行创建",{"2":{"267":1}}],["指令进行组件生成",{"2":{"259":1}}],["指令可以自行选择",{"2":{"183":1}}],["指令",{"2":{"97":1}}],["偏好设置可存放在",{"2":{"97":1}}],["明暗模式设置为跟随系统时",{"2":{"97":2}}],["明亮模式",{"2":{"279":1}}],["明亮和暗黑模式各",{"2":{"278":1}}],["明亮",{"2":{"4":2}}],["方法用来判断对象是否存在",{"2":{"266":1}}],["方法",{"2":{"266":1}}],["方案采用了",{"2":{"271":1}}],["方案",{"0":{"271":1},"2":{"254":1,"273":1}}],["方式使用",{"2":{"97":2}}],["方便后期维护",{"2":{"182":1}}],["方便复用",{"2":{"182":1}}],["方便快速访问",{"2":{"126":1}}],["方便替换成其他第三方",{"2":{"100":1}}],["方便在内网环境使用",{"2":{"97":2}}],["方便业务开发",{"2":{"75":1}}],["方便开发人员直接使用",{"2":{"6":1}}],["方便我们的开发者可以随时咨询框架相关问题",{"2":{"2":1}}],["能让你使用本框架更得心应手",{"2":{"205":1}}],["能做的事比较有限",{"2":{"117":1}}],["能在",{"2":{"93":1}}],["能够让前端开发独立自主",{"2":{"79":1}}],["函数",{"2":{"93":1,"158":1,"253":1}}],["合理使用",{"2":{"182":1}}],["合并到title配置项内",{"2":{"92":1}}],["合集优惠价",{"2":{"0":3}}],["增加明暗切换过渡动效",{"2":{"105":1}}],["增加表格高度自适应功能",{"2":{"105":1}}],["增加收藏夹",{"2":{"104":1}}],["增加",{"2":{"97":1,"100":2,"105":1}}],["增加图片支持",{"2":{"97":2}}],["增加打包后生成存档文件支持",{"2":{"97":2}}],["增加2种导航栏模式",{"2":{"90":1}}],["增加禁用开发者工具环境变量",{"2":{"90":2}}],["9cd44",{"2":{"105":1}}],["9d1d3",{"2":{"105":1}}],["95cf8",{"2":{"97":1}}],["98792",{"2":{"97":1}}],["970ef",{"2":{"98":1}}],["97483",{"2":{"93":1}}],["9783f",{"2":{"89":1}}],["9ebc8",{"2":{"90":1}}],["9091d",{"2":{"90":1}}],["9000",{"2":{"77":3,"265":1}}],["移除精灵图支持",{"2":{"100":1}}],["移除应用配置中",{"2":{"100":3}}],["移除内置",{"2":{"97":1}}],["移除导航i18n配置项",{"2":{"92":1}}],["移除无用逻辑判断",{"2":{"90":1}}],["移除createinjectionkey函数",{"2":{"89":2}}],["移除",{"0":{"118":1},"2":{"88":1,"100":1,"105":6}}],["自",{"2":{"303":1}}],["自定义图标",{"0":{"269":1}}],["自定义块进行语言维护",{"2":{"144":1}}],["自定义字体",{"0":{"134":1},"1":{"135":1,"136":1,"137":1}}],["自定义主题",{"2":{"100":1}}],["自定义主题配置",{"2":{"100":1}}],["自定义",{"2":{"88":2}}],["自带的组件外",{"2":{"6":1}}],["扩展",{"0":{"139":1},"2":{"204":1}}],["扩展组件为框架封装的组件",{"2":{"35":1}}],["扩展组件",{"0":{"35":1,"121":1},"2":{"4":1}}],["扩充",{"2":{"88":2}}],["🐞",{"2":{"89":1,"90":2,"91":1,"92":2,"93":1,"96":1,"97":2,"99":2,"100":1,"105":2,"108":1,"109":2,"110":2}}],["🚀",{"2":{"88":2,"89":2,"90":2,"92":2,"93":1,"97":2,"98":1,"100":2,"104":1,"105":2,"109":1}}],["🚨",{"2":{"88":2,"89":2,"90":2,"92":1,"97":1,"98":2,"100":2,"105":2,"108":2,"111":2}}],["7regular",{"2":{"137":2}}],["7146d",{"2":{"104":1}}],["7cdc8",{"2":{"97":1}}],["7a554",{"2":{"97":1}}],["7",{"0":{"88":1},"2":{"134":1,"137":4,"148":1,"149":1}}],["759bff",{"2":{"19":1}}],["409eff",{"2":{"278":2}}],["404",{"2":{"265":1}}],["400",{"2":{"255":1}}],["490b1",{"2":{"109":1}}],["44045",{"2":{"105":1}}],["4bccd",{"2":{"97":1}}],["43d09",{"2":{"97":1}}],["43851",{"2":{"89":1}}],["4c70b",{"2":{"92":1}}],["4",{"0":{"88":1,"89":1,"90":1,"91":2,"92":2,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1},"2":{"148":1,"195":3,"205":1,"207":1}}],["其次现在的显示器都在往高分屏",{"2":{"310":1}}],["其实也有",{"2":{"295":1}}],["其实大部分管理系统框架都是如此",{"2":{"295":1}}],["其原理就是通过预设模板",{"2":{"183":1}}],["其它语言包文件里也要同步添加",{"2":{"142":1}}],["其它设置",{"0":{"86":1}}],["其中表单部分单独封装成组件存放在",{"2":{"182":1}}],["其中基础组件为",{"2":{"119":1}}],["其中",{"2":{"80":1,"123":1,"141":1,"164":1,"197":1,"294":1}}],["其中包含按钮",{"2":{"33":1,"120":1}}],["其中有很大一部分中小型公司标配只有1",{"2":{"5":1}}],["安装它们将在一定程度上提升开发效率",{"2":{"204":1}}],["安装",{"0":{"207":1,"214":1,"221":1,"228":1,"235":1,"242":1},"2":{"197":1,"204":1,"207":1,"214":1,"221":1,"228":1,"235":1,"242":1}}],["安装该扩展后",{"2":{"139":1}}],["安装命令",{"2":{"117":1}}],["安装指定模块并开启后才会生效",{"2":{"85":1}}],["安装依赖时提示",{"2":{"265":1}}],["安装依赖时有警告",{"0":{"194":1}}],["安装依赖",{"2":{"33":1,"207":1,"214":1,"221":1,"228":1,"235":1,"242":1,"265":3}}],["两者均需要",{"2":{"85":1}}],["两者可以共存",{"2":{"85":1}}],["两个数据源的",{"2":{"78":1}}],["压缩率更高的算法",{"2":{"85":1}}],["压缩",{"0":{"85":1}}],["生成的文件中",{"2":{"184":1}}],["生成其它格式的字体文件",{"2":{"136":1}}],["生成字体",{"0":{"136":1}}],["生成好的",{"2":{"84":1}}],["生产环境下默认关闭",{"2":{"123":1}}],["生产环境一般都是调用真实接口",{"2":{"81":1}}],["生产环境",{"0":{"81":1},"2":{"123":1}}],["生产环境的跨域需要服务端去解决",{"2":{"77":1}}],["否则用户就可以关闭用户偏好设置了",{"2":{"191":1}}],["否则会出现资源引用错误",{"2":{"83":1}}],["否则我们有权利收回产品授权及更新权限",{"2":{"3":1}}],["选择其中一种模式进行业务开发",{"2":{"285":1}}],["选择器尺寸",{"2":{"23":1}}],["选项",{"2":{"141":1}}],["选项为",{"2":{"83":1}}],["对话框",{"2":{"182":1}}],["对于从",{"2":{"296":1}}],["对于单个元素",{"2":{"178":1}}],["对于一些无法自动修复的错误代码",{"2":{"117":1}}],["对应的",{"2":{"166":1}}],["对应会在根目录生成",{"2":{"83":1}}],["对项目进行过",{"2":{"117":1}}],["对本次提交变更的文件进行分别进行",{"2":{"117":1}}],["对象属性一一对应",{"2":{"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["对象里的就是框架部分的语言信息",{"2":{"143":1}}],["对象内属性调整",{"2":{"98":2}}],["对象内参数为",{"2":{"49":1}}],["对象",{"2":{"75":2,"78":1}}],["则",{"2":{"278":1}}],["则直接从缓存中获取并展示",{"2":{"273":1}}],["则验证通过",{"2":{"177":1,"178":1,"179":1}}],["则是存放我们配置的导航模块数据",{"2":{"164":1}}],["则该设置将被忽略",{"2":{"132":1}}],["则在导航栏里看不到",{"2":{"176":1}}],["则在",{"2":{"117":1}}],["则会阻止本次代码提交",{"2":{"117":1}}],["则会将不符合规则的代码自动进行格式化",{"2":{"115":1,"116":1}}],["则需要在",{"2":{"83":1,"117":1}}],["则执行",{"2":{"83":1}}],["则可设置为",{"2":{"73":1}}],["命令预览不同环境构建出的文件夹",{"2":{"84":1}}],["命令",{"2":{"83":1,"274":1}}],["命令进行构建",{"2":{"83":1}}],["命名可随意",{"2":{"78":1}}],["项目就固定在什么版本了",{"2":{"295":1}}],["项目",{"0":{"196":1}}],["项目导航配置存放在",{"2":{"159":1}}],["项目开发完成之后",{"2":{"83":1}}],["项目型公司",{"2":{"5":1}}],["构建时失败并在错误信息里提示",{"2":{"197":1}}],["构建报错",{"0":{"197":1}}],["构建打包成功之后",{"2":{"83":1}}],["构建",{"0":{"83":1}}],["构建与预览",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1}}],["差异不大",{"2":{"81":1}}],["注意事项",{"2":{"161":1}}],["注意看注释",{"2":{"157":1}}],["注意按文件夹区分",{"2":{"137":1}}],["注意",{"2":{"81":1,"117":1,"123":1,"124":1,"204":1,"206":1,"213":1,"220":1,"227":1,"234":1,"241":1,"265":1,"266":1,"311":1}}],["即首次调用会触发一个外部网络请求去获取",{"2":{"273":1}}],["即",{"2":{"253":1}}],["即不管是在开发",{"2":{"123":1}}],["即按需自动导入",{"2":{"120":1}}],["即可进入",{"2":{"172":1}}],["即可实现上百种界面风格",{"2":{"148":1}}],["即可使用",{"2":{"137":1}}],["即可",{"2":{"117":1,"199":1}}],["即可在构建时生成",{"2":{"85":1}}],["即使开启跨域代理也不影响",{"2":{"80":1}}],["即项目开发中",{"2":{"80":1}}],["会各种客观原因存在",{"2":{"199":1}}],["会存在一个弊端",{"2":{"198":1}}],["会发现这里的配置项并不是框架的完整应用配置",{"2":{"191":1}}],["会根据当前文件目录和文件名自动生成",{"2":{"184":1}}],["会按照你输入的中文名称替换",{"2":{"184":1}}],["会获取用户权限",{"2":{"172":1}}],["会在指定目录下生成模块文件夹",{"2":{"188":1}}],["会在语言选择器里显示",{"2":{"141":1}}],["会在顶栏里显示语言选择器",{"2":{"140":1}}],["会在根目录生成",{"2":{"83":1}}],["会自动访问页面",{"2":{"265":1}}],["会自动下载字体文件",{"2":{"134":1}}],["会自动对当前文件进行代码格式化操作",{"2":{"113":1}}],["会有属性的介绍",{"2":{"124":1}}],["会设置到",{"2":{"123":3}}],["会通过",{"2":{"117":1}}],["会请求本地的",{"2":{"80":1}}],["会长期深挖中后台系统框架",{"2":{"6":1}}],["如下图所示",{"2":{"202":1}}],["如下所示",{"2":{"80":1}}],["如",{"2":{"83":1}}],["如果一时半会没办法立马上手",{"2":{"296":1}}],["如果一同域名下部署两套系统",{"2":{"266":1}}],["如果设置为不启用",{"2":{"291":1,"293":1}}],["如果只在明亮或暗黑模式中",{"2":{"285":1}}],["如果只是几个接口需求从其它数据源请求",{"2":{"78":1}}],["如果主题是暗黑模式下使用的",{"2":{"278":1}}],["如果框架提供的主题风格满足不了你的需求",{"2":{"278":1}}],["如果确实有以上需求",{"2":{"271":1}}],["如果依旧无法运行",{"2":{"265":1}}],["如果对上述的步骤还有不清楚的地方",{"2":{"212":1,"219":1,"226":1,"233":1,"240":1,"247":1}}],["如果对这个问题感兴趣",{"2":{"194":1}}],["如果对这块不熟悉",{"2":{"123":1}}],["如果在大陆地区访问",{"2":{"204":1}}],["如果还没有源码",{"2":{"201":1}}],["如果必须要用传统",{"2":{"199":1}}],["如果开启了用户偏好设置",{"2":{"191":1}}],["如果仔细对比",{"2":{"191":1}}],["如果希望增加免登录的页面",{"2":{"262":1}}],["如果希望将框架的部分应用配置项暴露给用户",{"2":{"189":1}}],["如果希望提供用户一些定制化的能力",{"2":{"123":1}}],["如果既不想使用弹窗",{"2":{"182":1}}],["如果标记需要动态更新",{"2":{"173":1}}],["如果每个页面都要做国际化支持",{"2":{"144":1}}],["如果找不到对应的语言则使用",{"2":{"140":1}}],["如果使用的不是",{"2":{"176":1}}],["如果使用",{"2":{"139":1}}],["如果未设置公司名称",{"2":{"132":1}}],["如果需要对框架进行二次开发",{"2":{"143":1}}],["如果需要新增某个导航的国际化支持",{"2":{"142":1}}],["如果需要将数据存储到服务器",{"2":{"127":1,"192":1}}],["如果需要在开发环境下测试",{"2":{"125":1}}],["如果需要使用",{"2":{"81":1}}],["如果文档中提供的配置介绍",{"2":{"124":1}}],["如果不具备该条件",{"2":{"204":1}}],["如果不需要开启则留空",{"2":{"123":3}}],["如果不想开启国际化",{"2":{"146":1}}],["如果不想在",{"2":{"118":1}}],["如果不想让生产环境里的请求走",{"2":{"81":1}}],["如果",{"2":{"117":1}}],["如果有报错",{"2":{"117":1}}],["如果没有改正到就被推送到",{"2":{"117":1}}],["如果规则支持自动修复",{"2":{"115":1,"116":1}}],["如果最终访问地址为域名非根节点",{"2":{"83":1}}],["如果是需要构建测试环境",{"2":{"83":1}}],["如果项目中有涉及到上传功能",{"2":{"81":1}}],["如果项目里需要从多个不同地址的数据源请求数据",{"2":{"78":1}}],["如果项目里的接口很多",{"2":{"76":1}}],["如果第二个数据源也需要开启跨域处理的话",{"2":{"78":1}}],["如果本地开发环境请求接口提示跨域",{"2":{"77":1}}],["如果觉得用着不顺手",{"2":{"35":1,"119":1}}],["如果你正在做后台框架相关的调研或选型",{"2":{"302":1}}],["如果你正在将老版本的业务代码向新版本迁移",{"2":{"100":1}}],["如果你已经熟悉",{"2":{"297":1}}],["如果你还不熟悉",{"2":{"297":1}}],["如果你不习惯使用",{"2":{"285":1}}],["如果你不喜欢",{"2":{"33":1}}],["如果你清楚自己需要使用",{"2":{"273":1}}],["如果你也觉得麻烦的话",{"2":{"272":1}}],["如果你对其中的技术细节感兴趣",{"2":{"271":1}}],["如果你对",{"2":{"267":1}}],["如果你对默认的规则有异议",{"2":{"115":1,"116":1}}],["如果你恰好需要在同一域名下部署两套",{"2":{"266":1}}],["如果你需要使用",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["如果你需要将构建产物部署到多台服务器",{"2":{"198":1}}],["如果你想获取专业版源码",{"2":{"203":1}}],["如果你想使用的组件库不在上述方案中",{"2":{"33":1}}],["如果你准备好了",{"2":{"147":1}}],["如果你在安装依赖后再初始化了",{"2":{"117":1}}],["如果你依旧需要全局配置",{"2":{"100":1}}],["如果你依旧需要自定义",{"2":{"100":1}}],["如果你的业务页面代码中定义的",{"2":{"100":1}}],["如果你习惯",{"2":{"33":1}}],["如果你有以下场景需求",{"2":{"2":1}}],["如果传入为",{"2":{"10":1,"13":1}}],["如果能有一套现成的中后台框架系统",{"2":{"5":1}}],["强制修改此次请求的地址",{"2":{"80":1}}],["给",{"2":{"80":1}}],["部分关键位置会被替换掉",{"2":{"184":1}}],["部分请求真实接口",{"2":{"80":1}}],["部分请求",{"2":{"80":1}}],["部分框架的作者由于缺少后端开发经验",{"2":{"6":1}}],["quot",{"2":{"265":4}}],["query",{"2":{"80":1}}],["qq",{"2":{"1":1}}],["下列扩展组件基于",{"2":{"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["下面的方法可以让你直接修改构建产物的接口地址",{"2":{"198":1}}],["下面我就实际操作一遍",{"2":{"180":1}}],["下载",{"2":{"135":1}}],["下",{"2":{"80":1}}],["下拉面板标题",{"2":{"51":1}}],["模块文件夹",{"2":{"182":1}}],["模块",{"2":{"180":1}}],["模块管理",{"0":{"76":1}}],["模拟获取用户权限",{"2":{"176":1}}],["模拟请求数据甚至逻辑",{"2":{"79":1}}],["模式是一个标准模块模板",{"2":{"188":1}}],["模式则会在",{"2":{"186":1,"187":1}}],["模式可以选择生成的是公共组件还是局部组件",{"2":{"185":1}}],["模式下",{"2":{"184":1}}],["模式",{"0":{"263":1},"1":{"264":1},"2":{"93":1,"196":3}}],["模板请求无响应数据",{"2":{"93":1}}],["模板默认已经配置好生产环境",{"2":{"81":1}}],["模板使用",{"2":{"79":1}}],["是",{"2":{"296":1}}],["是异步请求返回的数据",{"2":{"271":1}}],["是不是觉得很麻烦",{"2":{"183":1}}],["是比",{"2":{"85":1}}],["是分离前后端开发的关键链路",{"2":{"79":1}}],["是否生成",{"2":{"181":1}}],["是否必须",{"2":{"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1}}],["是否在打包后生成存档",{"2":{"123":2}}],["是否在打包时启用",{"2":{"123":2}}],["是否在打包时生成",{"2":{"86":1}}],["是否开启代理",{"2":{"123":1}}],["是否显示窗口标题栏",{"2":{"170":1}}],["是否显示背景",{"2":{"45":1}}],["是否显示切换按钮",{"2":{"45":1}}],["是否显示关闭按钮",{"2":{"16":1}}],["是否禁用开发者工具",{"2":{"123":3}}],["是否禁用",{"2":{"43":1}}],["是否折叠",{"2":{"40":1,"45":1}}],["是否隐藏提示栏",{"2":{"21":1,"29":1,"31":1}}],["是否可以开发票",{"2":{"2":1}}],["是否允许二开后交付源码",{"2":{"2":1}}],["join",{"2":{"277":4,"278":6}}],["javascript",{"2":{"197":1,"199":2}}],["ja",{"2":{"141":3}}],["jswindow",{"2":{"198":1}}],["js",{"2":{"100":1,"112":4,"115":3,"118":2,"120":1,"181":1,"183":1,"198":3,"204":6,"267":1}}],["json",{"2":{"78":1,"117":3,"118":3,"127":1,"141":1,"143":2,"192":1,"194":2,"197":2,"198":1,"199":1,"208":4,"215":4,"222":4,"229":4,"236":4,"243":4,"265":1}}],["jpg",{"2":{"21":2,"29":1,"31":1}}],["里定义组件的",{"2":{"298":1}}],["里定一个新的",{"2":{"78":1}}],["里无需导入相关",{"2":{"297":1}}],["里增加一句路由完整地址",{"2":{"262":1}}],["里增加一段新的",{"2":{"78":1}}],["里安装好",{"2":{"204":1}}],["里安装好以下扩展",{"2":{"204":1}}],["里打开源码的文件夹",{"2":{"204":1}}],["里将",{"2":{"199":1}}],["里的",{"0":{"196":1}}],["里面有给出一个忽略警告的方案",{"2":{"194":1}}],["里面就是构建打包好的文件",{"2":{"83":1}}],["里了",{"2":{"182":1}}],["里存放的是标准模块提供的一些配置项和必要数据参数字段",{"2":{"182":1}}],["里介绍了如何快速生成一个标准模块",{"2":{"180":1}}],["里进行设置",{"2":{"164":1}}],["里修改构建脚本指令",{"2":{"197":1}}],["里修改",{"2":{"158":2}}],["里修改响应拦截器里的代码",{"2":{"158":1}}],["里修改开启的条件判断",{"2":{"125":1}}],["里检查接口请求地址是否正确",{"2":{"158":1}}],["里查看",{"2":{"137":1,"175":1}}],["里",{"2":{"125":1,"127":1,"192":1,"262":1,"310":1}}],["里找到",{"2":{"117":1}}],["里提供",{"2":{"89":1}}],["里代理部分的设置",{"2":{"77":1}}],["也方便后人查阅",{"2":{"313":1}}],["也就不存在切换路由导致页面数据丢失的场景",{"2":{"310":1}}],["也就是局部更新",{"2":{"295":1}}],["也就是脱离框架本身",{"2":{"262":1}}],["也升级到了",{"2":{"195":1}}],["也不是可运行的程序或批处理文件",{"2":{"265":1}}],["也不想使用抽屉",{"2":{"182":1}}],["也不会在侧边栏导航里显示",{"2":{"172":1}}],["也提供了",{"2":{"178":1}}],["也可访问",{"2":{"204":1}}],["也可以通过最大化按钮将窗口最大化展示",{"2":{"305":1}}],["也可以通过这个插件快速识别到并修改",{"2":{"100":1}}],["也可以使用",{"2":{"265":1}}],["也可以根据自己的需求指定一套标准",{"2":{"182":1}}],["也可以直接调用该组件",{"2":{"182":1}}],["也可使用",{"2":{"171":1}}],["也建议关闭",{"2":{"123":1}}],["也只适用于一些简单的示例网站及预览网站",{"2":{"81":1}}],["也替换为",{"2":{"78":1}}],["也有在",{"2":{"35":1}}],["以上面举例的场景",{"2":{"310":1}}],["以上为开发时必备扩展",{"2":{"204":1}}],["以便展示更多信息",{"2":{"305":1}}],["以确保功能正常运行",{"2":{"295":1}}],["以下则是作者推荐安装的扩展",{"2":{"204":1}}],["以下为示例代码",{"2":{"80":1}}],["以中文",{"2":{"143":1}}],["以及与传统后台框架的对比",{"2":{"302":1}}],["以及其他水印相关配置",{"2":{"301":1}}],["以及此链接查看示例网站",{"2":{"212":1,"219":1,"226":1,"233":1,"240":1,"247":1}}],["以及相关局部组件",{"2":{"188":1}}],["以及破坏性更新记录",{"2":{"87":1}}],["以及第三方插件",{"2":{"6":1}}],["以",{"2":{"78":1,"137":1}}],["首先明确一点",{"2":{"295":1}}],["首先需要在应用配置里设置",{"2":{"266":1}}],["首先需要在应用配置里开启权限功能",{"2":{"176":1}}],["首先需要在应用配置里开启错误日志",{"2":{"125":1}}],["首先在",{"2":{"78":1,"181":1,"262":1}}],["首先初始化",{"2":{"75":1}}],["规则要保持一致",{"2":{"78":1}}],["你依旧可以在项目中使用",{"2":{"296":1}}],["你在哪个时间点开始使用",{"2":{"295":1}}],["你只需进入",{"2":{"271":1}}],["你已经将框架中的",{"2":{"211":1,"218":1,"225":1,"232":1,"239":1,"246":1}}],["你需要做的就是将不需要暴露给用户的配置项注释掉即可",{"2":{"191":1}}],["你需要给第二个数据源单独实例化一个",{"2":{"78":1}}],["你还可以自定义新的主题",{"2":{"278":1}}],["你还可以自定义新的模式",{"2":{"183":1}}],["你还可以在",{"2":{"270":1}}],["你还可以使用新窗口的形式进行处理",{"2":{"182":1}}],["你也可以通过以下方法引入你需要的自定义字体",{"2":{"134":1}}],["你可以更详细描述问题产生的操作步骤",{"2":{"313":1}}],["你可以按照以往的开发习惯进行开发",{"2":{"285":1}}],["你可以按照下面的方式处理",{"2":{"262":1}}],["你可以使用",{"2":{"271":1,"298":1}}],["你可以使用覆盖",{"2":{"78":1}}],["你可以去阿里巴巴矢量图标库",{"2":{"269":1}}],["你可以根据自己的使用需求自行选择",{"2":{"268":1}}],["你可以执行",{"2":{"197":1}}],["你可以参考现有",{"2":{"183":1}}],["你可以沿用",{"2":{"182":1}}],["你可以修改",{"2":{"182":1}}],["你可以在该目录下编写变量",{"2":{"253":1}}],["你可以在需要的模块文件夹下建立一个",{"2":{"251":1,"260":1}}],["你可以在文件里进一步定制用户偏好设置里的内容",{"2":{"191":1}}],["你可以在",{"2":{"175":1,"176":1,"196":1,"199":1}}],["你可以打开",{"2":{"124":1}}],["你可以通过运行",{"2":{"115":1,"116":1}}],["你有两种方式可以实现",{"2":{"78":1}}],["配置免登录页面的路由",{"2":{"262":1}}],["配置并修改",{"2":{"117":1}}],["配置可忽略无需做代码规范校验的目录或文件",{"2":{"115":1}}],["配置文件为",{"2":{"114":1,"115":1,"116":1}}],["配置文件格式调整",{"2":{"100":1}}],["配置文件",{"2":{"100":2}}],["配置项来实现",{"2":{"127":1,"192":1}}],["配置项",{"2":{"90":3}}],["配置",{"0":{"114":1,"115":1,"116":1,"122":1},"1":{"123":1,"124":1},"2":{"77":1,"78":2,"100":3,"105":2,"109":1,"118":1}}],["中可修改水印展示内容",{"2":{"301":1}}],["中引入即可",{"2":{"253":1}}],["中引入",{"2":{"198":1}}],["中添加",{"2":{"194":1}}],["中的",{"2":{"184":1,"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["中文语言包",{"2":{"204":1}}],["中文",{"2":{"140":1,"141":2}}],["中找到",{"2":{"127":1,"192":1}}],["中移除",{"2":{"118":1}}],["中修改",{"2":{"117":1}}],["中进行修改",{"2":{"100":1}}],["中设置",{"2":{"83":1}}],["中",{"2":{"77":1,"78":1,"115":1,"265":1,"273":1,"301":1}}],["匹配到了",{"2":{"77":1}}],["匹配到其中一项则鉴权通过",{"2":{"13":1}}],["因为模块都以窗口的形式在同一个界面上展示",{"2":{"310":1}}],["因为更新的成本挺高的",{"2":{"295":1}}],["因为大部分项目是无需全局更新到新版的",{"2":{"295":1}}],["因为本质上这类框架其实是一个初始模板",{"2":{"295":1}}],["因为同一个色值是无法顾及到明亮和暗黑两种模式的",{"2":{"285":1}}],["因为文档中提及的内容",{"2":{"201":1}}],["因为它是未来的趋势",{"2":{"199":1}}],["因为依赖已经安装成功了",{"2":{"194":1}}],["因为几乎每个列表页都需要翻页功能",{"2":{"182":1}}],["因为只是覆盖",{"2":{"78":1}}],["因为",{"2":{"77":1,"136":1,"141":1,"273":1}}],["因使用本产品所产生的损害及风险",{"2":{"3":1}}],["原始数据",{"2":{"273":1}}],["原生方案",{"0":{"272":1},"2":{"273":2}}],["原生提供的方案",{"2":{"271":1}}],["原生提供的组件",{"2":{"119":1}}],["原有的代码可能会因为规则的变动导致编辑器大量提示错误",{"2":{"115":1,"116":1}}],["原有",{"2":{"100":1}}],["原有请求都会被指向到本地",{"2":{"77":1}}],["原价",{"2":{"0":3,"2":2}}],["推荐使用",{"2":{"204":1,"259":1}}],["推荐",{"2":{"175":1}}],["推荐在每个页面组件里使用",{"2":{"144":1}}],["推荐的使用方式进行引入",{"2":{"120":1}}],["推荐安装",{"2":{"100":1,"139":1}}],["推荐根据模块来统一管理接口",{"2":{"76":1}}],["推荐购买企业",{"2":{"2":1}}],["响应的时候会根据错误信息判断是登录失效还是接口报错",{"2":{"75":1}}],["参考如下",{"2":{"295":1}}],["参考代码里只做了简单的拦截处理",{"2":{"75":1}}],["参数上",{"2":{"123":3}}],["参数统一设置",{"2":{"80":1}}],["参数获取",{"2":{"80":1}}],["参数相同",{"2":{"19":1}}],["参数",{"2":{"10":1,"13":1,"16":1,"19":1,"21":1,"23":1,"27":1,"29":1,"31":1,"37":1,"40":1,"43":1,"45":1,"49":1,"51":1,"55":1,"57":1,"142":1}}],["然后基于业务开展业务代码编写",{"2":{"295":1}}],["然后点击需要使用的图标",{"2":{"271":1}}],["然后删除根目录下",{"2":{"265":1}}],["然后打开",{"2":{"191":1}}],["然后在页面中就可以通过",{"2":{"269":1}}],["然后在需要使用到",{"2":{"266":1}}],["然后在",{"2":{"176":1,"204":1,"262":1}}],["然后你需要到",{"2":{"141":1}}],["然后到",{"2":{"127":1,"181":1,"192":1}}],["然后需要到",{"2":{"125":1}}],["然后手动删除",{"2":{"118":1}}],["然后把",{"2":{"78":1}}],["然后",{"2":{"75":1}}],["然后做一些全局的处理",{"2":{"75":1}}],["拦截器还是用的同一套规则",{"2":{"78":1}}],["拦截器的用处就是拦截每一次的请求和响应",{"2":{"75":1}}],["拦截器",{"0":{"75":1}}],["后期需求一点点增加",{"2":{"182":1}}],["后端生成",{"0":{"175":1}}],["后端可根据这一状态信息做动态数据国际化处理",{"2":{"145":1}}],["后续业务代码",{"2":{"74":2,"80":2}}],["后缀",{"2":{"57":1}}],["和",{"0":{"117":1},"1":{"118":1},"2":{"74":1,"75":2,"78":1,"100":2,"117":2,"123":4,"127":1,"164":1,"177":1,"178":1,"192":1,"204":1,"266":1,"273":1,"297":1}}],["lt",{"2":{"144":1,"171":1,"177":2,"184":1,"297":2,"298":3}}],["lighttheme",{"2":{"277":1,"278":1}}],["light",{"2":{"215":2,"236":2,"277":1,"278":4,"279":1}}],["limit",{"2":{"197":1}}],["line",{"2":{"181":1,"283":1}}],["lint",{"0":{"117":1},"1":{"118":1},"2":{"115":1,"116":1,"117":3,"118":2}}],["lib",{"2":{"141":4}}],["list|5",{"2":{"80":1}}],["list",{"2":{"73":1,"74":1,"77":2,"78":3,"80":3}}],["lock",{"2":{"265":1}}],["local",{"2":{"266":5}}],["locale=",{"2":{"208":2,"215":2,"229":4,"243":2}}],["locale",{"2":{"141":4,"208":4,"215":4,"222":2,"236":4}}],["locales",{"2":{"140":1,"141":10,"143":1,"208":5,"215":5,"222":7,"229":6,"236":5,"243":5}}],["localstorage",{"2":{"97":1,"127":1,"192":1,"266":4,"273":1}}],["localhost",{"2":{"77":3,"265":1}}],["lodash",{"2":{"236":2}}],["loading",{"2":{"182":1}}],["loadenv",{"2":{"77":2,"78":4}}],["lonetext",{"2":{"127":1,"192":1}}],["logo",{"2":{"277":4,"278":6}}],["logout",{"2":{"143":1}}],["login",{"2":{"143":1,"158":1,"262":4}}],["log",{"2":{"125":2}}],["labelname",{"2":{"141":5}}],["lang=",{"2":{"208":2,"215":2,"222":2,"229":2,"236":2,"243":2,"257":1,"297":1,"298":3,"301":1}}],["language",{"2":{"145":1,"204":1}}],["lang",{"2":{"140":1,"141":6,"143":1,"208":1,"215":5,"222":3,"229":2,"236":1,"243":1}}],["layout",{"2":{"98":1,"294":1}}],["layouts",{"2":{"34":1}}],["large",{"2":{"23":1}}],["设置水印",{"2":{"301":1}}],["设置水印内容",{"0":{"301":1}}],["设置不同的类型值",{"2":{"173":1}}],["设置为",{"2":{"199":1}}],["设置为数字时单位为",{"2":{"168":1}}],["设置为需要跳转的",{"2":{"163":1}}],["设置了拦截器",{"2":{"75":1}}],["设置",{"0":{"73":1},"2":{"81":1}}],["设置上传的请求头部",{"2":{"21":1,"29":1,"31":1}}],["做开发",{"2":{"296":1}}],["做项目开发时尽量避免框架自带模块或组件的改动",{"2":{"295":1}}],["做好准备工作后",{"2":{"265":1}}],["做成了",{"2":{"182":1}}],["做为一个中后台系统框架",{"2":{"295":1}}],["做为基础规范",{"2":{"115":1}}],["做为开发",{"2":{"113":1}}],["做为异步请求工具",{"2":{"71":1}}],["做到开发人员拿来即可使用",{"2":{"6":1}}],["基本是无法更新的",{"2":{"295":1}}],["基本不太可能",{"2":{"265":1}}],["基本配置",{"0":{"160":1},"1":{"161":1,"162":1,"163":1,"164":1}}],["基于传统后台框架的这些痛点",{"2":{"310":1}}],["基于设置的路由规则",{"2":{"262":1}}],["基于单文件组件规范",{"2":{"254":1}}],["基于",{"2":{"69":1,"70":1}}],["基础组件由",{"2":{"33":1,"120":1}}],["基础组件",{"0":{"33":1,"120":1}}],["基础版和专业版内容略有不同",{"2":{"276":1}}],["基础版专业版",{"2":{"118":1}}],["基础版现在可以使用",{"2":{"100":1}}],["基础版",{"0":{"202":1,"277":1,"313":1},"2":{"4":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,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["事件总线",{"0":{"69":1}}],["事件名称",{"2":{"17":1,"47":1,"53":1}}],["判断窗口是否全屏",{"0":{"67":1}}],["\\tname",{"2":{"64":1}}],["新密码",{"2":{"143":1}}],["新增的任何路由",{"2":{"262":1}}],["新增",{"2":{"105":1,"198":1}}],["新增用户偏好设置",{"2":{"104":1}}],["新增哀悼模式和色弱模式",{"2":{"90":2}}],["新增窗口",{"0":{"64":1}}],["新闻内容",{"2":{"74":1,"80":1}}],["新闻标题",{"2":{"74":1,"80":1}}],["新状态的值",{"2":{"47":1}}],["切换为国内",{"2":{"265":1}}],["切换到",{"2":{"117":1}}],["切换主导航",{"2":{"62":1}}],["切换",{"0":{"62":1}}],["切换展开",{"2":{"47":1}}],["==",{"2":{"77":1,"78":2}}],["===",{"2":{"77":1,"78":3,"198":2,"208":2,"215":2,"222":2,"229":2,"236":2}}],["=>",{"2":{"74":2,"77":1,"78":2,"80":3,"173":1,"215":6,"222":2,"236":6,"262":1,"267":1,"297":1}}],["=",{"2":{"60":1,"73":1,"77":1,"78":2,"80":2,"81":1,"85":3,"86":1,"100":1,"120":1,"123":24,"124":1,"125":1,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"140":2,"141":2,"146":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"161":1,"162":1,"163":1,"164":1,"175":1,"176":1,"179":1,"181":2,"182":2,"190":1,"191":1,"192":1,"198":2,"208":3,"215":5,"222":4,"229":3,"236":5,"243":2,"262":2,"264":1,"266":1,"267":3,"277":2,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"297":2,"300":1,"301":1}}],["权限验证",{"2":{"176":2}}],["权限",{"0":{"176":1},"1":{"177":1,"178":1,"179":1},"2":{"60":1,"172":1}}],["权限数据",{"2":{"10":1,"13":1}}],["g",{"2":{"277":50,"278":75}}],["generate",{"2":{"273":1,"274":1}}],["getitem",{"2":{"266":1}}],["getparams",{"2":{"182":1}}],["getpermissions",{"2":{"176":1}}],["getelementlocales",{"2":{"141":1}}],["getcurrentinstance",{"2":{"120":1}}],["get",{"2":{"59":1,"74":3,"77":1,"78":3,"80":3,"266":2}}],["global",{"2":{"208":2,"215":2,"222":2,"229":2,"236":6,"243":2}}],["globalconfig",{"2":{"198":2}}],["globalstore",{"2":{"173":1}}],["globals",{"2":{"124":1,"157":1}}],["globalsettings",{"2":{"100":1,"124":1,"125":1,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"140":2,"146":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"175":1,"176":1,"190":1,"192":1,"264":1,"266":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"300":1}}],["gologin",{"2":{"143":1}}],["green",{"2":{"100":1,"285":1}}],["gzip",{"2":{"85":4,"123":3}}],["gz",{"2":{"85":1}}],["gt",{"2":{"80":2,"144":1,"171":1,"177":2,"184":1,"294":1,"297":2,"298":3}}],["gitee",{"2":{"147":1,"202":4,"313":1}}],["git",{"0":{"117":1},"1":{"118":1},"2":{"117":14,"118":7,"202":8,"204":1}}],["github",{"2":{"1":3,"2":3,"147":1,"202":5,"206":1,"213":1,"220":1,"227":1,"234":1,"241":1,"313":1}}],["gif",{"2":{"29":1,"31":1}}],["与基础版不同",{"2":{"278":1}}],["与",{"2":{"100":1}}],["与服务端交互",{"0":{"71":1,"145":1},"1":{"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1},"2":{"59":1}}],["与该组件",{"2":{"19":1}}],["前缀",{"2":{"57":1,"80":1}}],["前端开发人员不足的中小型公司",{"2":{"5":1}}],["趋势标记",{"0":{"56":1},"1":{"57":1}}],["尺寸",{"2":{"55":1}}],["颜色方案",{"0":{"279":1}}],["颜色主题",{"0":{"293":1},"2":{"278":3}}],["颜色反转",{"2":{"57":1}}],["颜色",{"2":{"55":1}}],["0f0f0f",{"2":{"277":14,"278":16}}],["0b8ac",{"2":{"111":1}}],["0b078",{"2":{"100":1}}],["0b03a",{"2":{"99":1}}],["0c353",{"2":{"110":1}}],["02548",{"2":{"108":1}}],["040a5",{"2":{"108":1}}],["0311a",{"2":{"108":1}}],["0a0a0a",{"2":{"100":1,"277":6,"278":6}}],["09b21",{"2":{"89":1}}],["09d49",{"2":{"89":1}}],["0",{"0":{"88":1,"89":1,"90":1,"92":1,"93":1,"97":1,"98":1,"99":1,"100":2,"104":1,"105":2,"108":1,"109":1,"110":1,"111":2,"112":2},"2":{"55":2,"150":1,"151":1,"152":1,"153":1,"154":1,"173":1,"195":2,"206":2,"213":2,"220":2,"227":2,"234":2,"241":2,"267":1,"283":1,"297":1}}],["000",{"2":{"285":1}}],["000+",{"2":{"270":1}}],["00",{"2":{"0":13,"2":4}}],["旋转角度",{"2":{"55":1}}],["right",{"2":{"271":2,"272":2}}],["ri",{"2":{"181":1}}],["rollup",{"2":{"194":1}}],["routes",{"2":{"181":1,"262":2}}],["router",{"2":{"181":1,"196":2,"205":1,"261":1,"262":1,"297":1}}],["rotate",{"2":{"55":1}}],["rainbow",{"2":{"204":1}}],["radius",{"2":{"100":1}}],["rar",{"2":{"21":1}}],["rtl",{"0":{"263":1},"1":{"264":1},"2":{"93":1,"264":1}}],["run",{"2":{"83":2,"84":2,"115":1,"116":1,"183":1,"265":1,"273":1,"274":1}}],["red",{"2":{"285":1}}],["registry",{"2":{"265":2}}],["releases",{"2":{"202":1,"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["reload",{"2":{"68":1}}],["reached",{"2":{"197":1}}],["ref",{"2":{"182":1,"191":1,"267":1,"297":2}}],["recordraw",{"2":{"161":1,"162":1,"163":1,"181":1}}],["return",{"2":{"80":1,"141":1,"267":1}}],["replace",{"2":{"77":1,"78":2}}],["rewrite",{"2":{"77":1,"78":2}}],["request",{"2":{"75":2,"78":1}}],["resources",{"2":{"253":1}}],["reset",{"2":{"208":2}}],["responsetype",{"2":{"78":1,"198":1}}],["response",{"2":{"75":2,"78":1,"80":1}}],["res",{"2":{"74":2,"80":2}}],["removeitem",{"2":{"266":1}}],["removeattribute",{"2":{"215":2,"236":2}}],["removeeventlistener",{"2":{"215":2,"236":2}}],["remove",{"2":{"65":1,"210":1,"217":1,"224":1,"231":1,"238":1,"245":1,"266":2}}],["reverse",{"2":{"57":1}}],["垂直以及同时翻转",{"2":{"55":1}}],["翻转方式",{"2":{"55":1}}],["点击下载",{"2":{"136":1}}],["点击下拉面板中某条记录的事件回调",{"2":{"53":1}}],["点击查看详细介绍",{"2":{"33":1}}],["触发下拉面板的",{"2":{"52":1}}],["触发下拉列表的",{"2":{"25":1}}],["储存箱",{"0":{"50":1},"1":{"51":1,"52":1,"53":1},"2":{"51":1}}],["鼠标悬浮到属性上时",{"2":{"124":1}}],["鼠标悬停临时展开",{"2":{"98":1}}],["鼠标",{"2":{"49":3}}],["填充颜色",{"2":{"49":1}}],["折线颜色",{"2":{"49":1}}],["折线宽度",{"2":{"49":1}}],["迷你图数据",{"2":{"49":1}}],["迷你图",{"0":{"48":1},"1":{"49":1}}],["收起状态的事件回调",{"2":{"47":1}}],["收藏夹默认存储在浏览器本地",{"2":{"127":1}}],["收藏夹",{"0":{"126":1,"288":1},"1":{"127":1},"2":{"4":1,"288":1}}],["作用域参数为",{"2":{"46":1}}],["作者认为是得不偿失的",{"2":{"295":1}}],["作者的",{"2":{"271":1}}],["作者拥有10年+的前后端开发经验",{"2":{"6":1}}],["作者还提供一对一的技术支持",{"2":{"5":1}}],["绑定数据的格式化类型",{"2":{"43":1}}],["省市区街道",{"2":{"43":1}}],["省市区街道联动",{"0":{"42":1},"1":{"43":1}}],["省市区",{"2":{"43":1}}],["省市",{"2":{"43":1}}],["联动类型",{"2":{"43":1}}],["联动数据选中项绑定值",{"2":{"43":1}}],["当页面展示内容不多的时候",{"2":{"310":1}}],["当然我们更建议你使用",{"2":{"296":1}}],["当然个人建议是",{"2":{"295":1}}],["当然这么使用并没有很方便",{"2":{"272":1}}],["当然这个扩展开启后",{"2":{"204":1}}],["当然你同样也可以通过",{"2":{"271":1}}],["当然标准模块也只是框架提供的一个标准",{"2":{"182":1}}],["当然它能做的事情也更简单",{"2":{"178":1}}],["当表单与当前列表页关联性较强",{"2":{"182":1}}],["当前用户具备该权限是如何显示",{"2":{"177":1}}],["当值小于等于",{"2":{"173":1}}],["当值为空时隐藏",{"2":{"173":1}}],["当值为",{"2":{"173":1}}],["当都设置好后",{"2":{"142":1}}],["当你对规则进行修改后",{"2":{"115":1,"116":1}}],["当为对象数组时",{"2":{"49":1}}],["当",{"2":{"40":1}}],["页",{"2":{"188":1}}],["页面水印",{"0":{"299":1},"1":{"300":1,"301":1}}],["页面下载框架源码压缩包",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["页面下载最新版本的压缩包",{"2":{"202":1}}],["页面的",{"2":{"184":1}}],["页面模块文件",{"2":{"183":1}}],["页面文件",{"2":{"183":1}}],["页面",{"2":{"181":1}}],["页面中某个模块",{"2":{"177":1}}],["页面标题",{"2":{"123":3}}],["页面布局",{"2":{"4":1}}],["页头",{"0":{"36":1},"1":{"37":1,"38":1}}],["有效提高了使用人员的操作效率",{"2":{"310":1}}],["有",{"2":{"270":1}}],["有容量上限",{"2":{"266":1}}],["有人却说",{"2":{"195":1}}],["有全新开发的组件",{"2":{"35":1}}],["有些小型公司没有前端开发人员",{"2":{"5":1}}],["这款工具可以直接对比文件夹",{"2":{"295":1}}],["这种方案也是作者在公司内部项目经常使用的",{"2":{"295":1}}],["这种方式拉取的是最新的代码",{"2":{"202":1}}],["这种方式的前提是",{"2":{"78":1}}],["这也是框架推荐的方式",{"2":{"285":1}}],["这也意味着部分组件的",{"2":{"120":1}}],["这篇文章",{"2":{"271":1}}],["这句脚本",{"2":{"265":1}}],["这句代码放到全局引入",{"2":{"137":1}}],["这是一个基于",{"2":{"270":1}}],["这是一个可以无视的警告",{"2":{"194":1}}],["这是全局",{"2":{"253":1}}],["这是因为路由默认使用的是",{"2":{"196":1}}],["这是因为有部分配置项并不适合暴露给用户",{"2":{"191":1}}],["这是基础版演示源码里的自定义配置示例",{"2":{"124":1}}],["这块部分详细介绍请阅读",{"2":{"188":1}}],["这部分是有意而为之",{"2":{"182":1}}],["这部分需要根据实际存储的用户信息去判断是否登录",{"2":{"158":1}}],["这里的",{"2":{"310":1}}],["这里需要你设置一个唯一且不重名的前缀",{"2":{"266":1}}],["这里就不继续展开了",{"2":{"182":1}}],["这里我已经通过命令在",{"2":{"181":1}}],["这时候我们建议使用",{"2":{"285":1}}],["这时候开发则需要注意",{"2":{"285":1}}],["这时候如果采用新增环境配置文件的方式",{"2":{"198":1}}],["这时候由于表单部分已抽象成组件",{"2":{"182":1}}],["这时候就要从弹窗改成抽屉的形式",{"2":{"182":1}}],["这时候就可以通过导航栏访问到我们的窗口了",{"2":{"181":1}}],["这时候你就会需要用到它们",{"2":{"34":1}}],["这将是对我极大的鼓励",{"2":{"147":1}}],["这两个函数",{"2":{"127":1,"192":1}}],["这两个依赖来解决这一问题",{"2":{"117":1}}],["这样做可以让更多的人参与讨论",{"2":{"313":1}}],["这样当你需要进行新版本更新时",{"2":{"295":1}}],["这样的处理在一定程度上有解决版本更新的问题",{"2":{"295":1}}],["这样的用意是让表单可以复用",{"2":{"182":1}}],["这样再在框架中使用这些图标",{"2":{"273":1}}],["这样下次再调用的时候",{"2":{"273":1}}],["这样不会生效",{"2":{"271":2}}],["这样操作后",{"2":{"265":1}}],["这样你可以选择性的更新部分新代码到项目中",{"2":{"295":1}}],["这样你下次再安装依赖的时候",{"2":{"194":1}}],["这样你就可以在页面中通过引入不同的文件分别请求两个数据源了",{"2":{"78":1}}],["这样就没有意义了",{"2":{"191":1}}],["这样设计的目的主要有三点",{"2":{"182":1}}],["这样生成出来就是哪种",{"2":{"182":1}}],["这样我们才可以在导航栏里访问到",{"2":{"181":1}}],["这样所有页面就都可以通过设置",{"2":{"137":1}}],["这样可以确保",{"2":{"117":1}}],["这个类封装了",{"2":{"266":1}}],["这个配置项是用来控制导航数据来源的",{"2":{"191":1}}],["这个配置项就是用来控制是否开启用户偏好设置的",{"2":{"191":1}}],["这个标准模块是一个最基础的",{"2":{"180":1}}],["这个函数",{"2":{"175":1}}],["这个扩展",{"2":{"139":1}}],["这个",{"2":{"100":1}}],["这个参数就是配置",{"2":{"73":1}}],["这些组件仅服务于框架自身",{"2":{"34":1}}],["这意味着部分",{"2":{"33":1}}],["内置",{"2":{"277":2,"278":3}}],["内网环境使用",{"0":{"273":1},"2":{"273":1}}],["内建组件存放在",{"2":{"34":1}}],["内建组件",{"0":{"34":1}}],["内容多则使用抽屉",{"2":{"182":1}}],["内容少则使用弹窗",{"2":{"182":1}}],["内容块",{"0":{"39":1},"1":{"40":1,"41":1}}],["内容区域的",{"2":{"38":1,"46":1}}],["内容区的",{"2":{"8":1,"41":1}}],["内容",{"2":{"8":2,"10":1,"11":1,"13":1,"14":1,"25":1,"37":1,"38":2,"41":2,"46":1,"52":1,"57":1}}],["别担心会很复杂",{"2":{"33":1}}],["理解替换的整理思路",{"2":{"33":1}}],["替换真实接口后",{"2":{"158":1}}],["替换",{"2":{"98":2}}],["替换为",{"0":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1},"1":{"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1},"2":{"33":6,"100":6}}],["替换组件库",{"2":{"33":1}}],["但也变相增加了开发人员的开发成本",{"2":{"310":1}}],["但也意味着",{"2":{"120":1}}],["但弊端也很明显",{"2":{"295":1}}],["但如果需要让用户可以自己选择明亮或暗黑模式",{"2":{"285":1}}],["但如果使用选择之外的图标",{"2":{"273":1}}],["但如果你需要对框架进行二次开发",{"2":{"34":1}}],["但需要清楚一点",{"2":{"265":1}}],["但需要注意的是",{"2":{"202":1}}],["但需要注意",{"2":{"196":1}}],["但考虑到实际情况",{"2":{"199":1}}],["但是无法跳转到后台主页",{"2":{"158":1}}],["但在实践过程中",{"2":{"158":1}}],["但为了保证构建出来的文件能正常运行",{"2":{"84":1}}],["但因为每个公司提供的接口标准不同",{"2":{"75":1}}],["但老项目里使用的组件库并不是",{"2":{"33":1}}],["但通常情况下我们不会随意打扰你",{"2":{"1":1}}],["上查找",{"2":{"270":1,"271":1}}],["上拉取源码",{"2":{"202":1}}],["上",{"2":{"33":1}}],["上传",{"2":{"136":1}}],["上传组件增加自定义上传",{"2":{"89":2}}],["上传数量限制",{"2":{"21":1,"31":1}}],["上传文件大小限制",{"2":{"21":1,"29":1,"31":1}}],["上传的文件列表",{"2":{"21":1}}],["上传的文件字段名",{"2":{"21":1,"29":1,"31":1}}],["上传的地址",{"2":{"21":1,"29":1,"31":1}}],["上传时附带的额外参数",{"2":{"21":1,"29":1,"31":1}}],["或其它字体下载网站",{"2":{"135":1}}],["或者提供完整的最小复现",{"2":{"313":1}}],["或者改动地方做一个文档记录",{"2":{"295":1}}],["或者是根据浏览器主题来判断是使用明亮还是暗黑模式",{"2":{"285":1}}],["或者其它支持下载",{"2":{"269":1}}],["或者安装结束后",{"2":{"265":1}}],["或者到",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["或者也可以参考下方示例中已经修改好的登录页",{"2":{"209":1,"216":1,"223":1,"230":1,"237":1,"244":1}}],["或者也可以从",{"2":{"202":1}}],["或者也可以都开启",{"2":{"85":1}}],["或者",{"2":{"147":1}}],["或者参考下面提供的最佳实践",{"2":{"100":1}}],["或者你想要将老项目迁移到",{"2":{"33":1}}],["或",{"2":{"84":1,"85":1,"123":3,"176":1,"179":3,"265":1}}],["或直接删除",{"2":{"81":1}}],["或简单包装成同类产品",{"2":{"3":1}}],["无需手动",{"2":{"297":1}}],["无需手动引入",{"2":{"259":1}}],["无法像",{"2":{"295":1}}],["无法正常登录",{"2":{"158":1}}],["无法使用",{"2":{"33":1,"120":2}}],["无主导航",{"0":{"152":1},"2":{"149":1}}],["无二级的一级导航增加",{"2":{"97":2}}],["无重大变化",{"2":{"91":1,"93":1,"94":2,"95":2,"96":1,"101":2,"102":2,"103":2,"104":1,"106":2,"107":2}}],["无论是免费的基础版",{"2":{"6":1}}],["无论有意或无意",{"2":{"3":1}}],["x",{"2":{"207":1}}],["x26",{"2":{"77":2,"78":6,"117":2,"118":2,"197":2,"198":4,"256":2,"257":2,"285":1}}],["x3c",{"2":{"33":11,"120":11,"177":27,"178":9,"191":1,"198":6,"208":14,"215":14,"222":18,"229":20,"236":14,"243":14,"255":8,"256":2,"257":2,"269":2,"271":8,"272":6,"297":2,"298":6,"301":2}}],["xxx",{"2":{"21":3,"49":1}}],["滑块等",{"2":{"33":1,"120":1}}],["级联选择器",{"2":{"33":1,"120":1}}],["输入框",{"2":{"33":1,"120":1}}],["文档中标记",{"2":{"147":1}}],["文档说明",{"0":{"147":1}}],["文字链接",{"2":{"33":1,"120":1}}],["文件后",{"2":{"265":1}}],["文件后缀名错误",{"2":{"110":1}}],["文件内的接口地址了",{"2":{"198":1}}],["文件会被视为一个导航模块",{"2":{"159":1}}],["文件可以看到框架相关的配置",{"2":{"143":1}}],["文件即可",{"2":{"118":1}}],["文件中编写",{"2":{"254":1}}],["文件中",{"2":{"157":1,"276":1}}],["文件中查阅",{"2":{"124":1}}],["文件中设置自定义配置",{"2":{"124":1}}],["文件中进行修改",{"2":{"116":1}}],["文件中进行覆盖",{"2":{"115":1}}],["文件中实现",{"2":{"100":1}}],["文件",{"2":{"85":1,"136":1,"180":1,"181":1,"183":1,"191":1,"198":1,"208":6,"215":6,"222":6,"229":6,"236":6,"243":6,"269":1}}],["文件夹名即为组件名",{"2":{"311":1}}],["文件夹名称即为组件名",{"2":{"259":1}}],["文件夹与",{"2":{"265":1}}],["文件夹并重新安装依赖",{"2":{"265":1}}],["文件夹下还能看到另外一个",{"2":{"182":1}}],["文件夹一般需要部署至服务器才算部署发布成功",{"2":{"84":1}}],["文件夹",{"2":{"83":2,"181":1,"251":1,"260":1}}],["文件新增或修改后会自动更新",{"2":{"80":1}}],["文件存放在",{"2":{"80":1}}],["文件复制一份",{"2":{"78":1}}],["文件里进行引用",{"2":{"183":1}}],["文件里进行引入并放到主导航下",{"2":{"159":1}}],["文件里加上这个路由配置文件的引用",{"2":{"181":1}}],["文件里找到",{"2":{"175":1,"176":1}}],["文件里做以下调整",{"2":{"141":1}}],["文件里编写业务代码",{"2":{"125":1}}],["文件里配置第二个数据源的",{"2":{"78":1}}],["文件里",{"2":{"77":1}}],["文件里实例化了",{"2":{"75":1}}],["文件里的",{"2":{"73":1}}],["文件名",{"2":{"55":1}}],["文件上传",{"0":{"20":1},"1":{"21":1}}],["文件自动生成",{"2":{"4":1}}],["介绍",{"0":{"32":1,"119":1},"1":{"33":1,"34":1,"35":1,"120":1,"121":1},"2":{"270":1}}],["多权限验证",{"2":{"177":2,"178":2,"179":2}}],["多级导航",{"0":{"162":1}}],["多数据源",{"0":{"78":1}}],["多选框",{"2":{"33":1,"120":1}}],["多图上传",{"0":{"30":1},"1":{"31":1}}],["多彩渐变卡片",{"0":{"18":1},"1":{"19":1}}],["占位图",{"2":{"29":1,"31":1}}],["单权限验证",{"2":{"177":1,"178":1,"179":1}}],["单页组件",{"0":{"144":1}}],["单独开启",{"2":{"85":2}}],["单选框",{"2":{"33":1,"120":1}}],["单图上传",{"0":{"28":1},"1":{"29":1}}],["单位为mb",{"2":{"21":1,"29":1,"31":1}}],["展示形式为文本",{"2":{"173":2}}],["展示形式为点",{"2":{"173":1}}],["展示效果也会不同",{"2":{"173":1}}],["展示",{"2":{"97":2}}],["展示高度",{"2":{"27":1,"29":1,"31":1,"40":1,"49":1}}],["展示宽度",{"2":{"27":1,"29":1,"31":1,"49":1}}],["white",{"2":{"256":1,"257":1,"285":1}}],["web",{"2":{"214":1,"215":8}}],["website",{"2":{"132":1}}],["watermarkstore",{"2":{"301":3}}],["watermark",{"2":{"301":3}}],["watch",{"2":{"215":2,"222":1,"236":2}}],["wave",{"2":{"97":1}}],["waves",{"2":{"97":1}}],["warning",{"2":{"16":1}}],["www",{"2":{"83":1}}],["windows",{"2":{"181":4,"182":1,"290":1,"311":1}}],["window",{"2":{"181":4,"198":1,"215":2,"236":2}}],["windowwidth",{"0":{"168":1}}],["windowexample",{"2":{"164":1}}],["windowname",{"0":{"167":1},"2":{"64":2,"65":1,"66":1,"67":1,"68":1,"161":2,"162":1,"163":2,"181":1}}],["with",{"2":{"100":2}}],["width",{"2":{"27":1,"29":1,"31":1,"49":2,"256":3,"257":3}}],["图片",{"0":{"249":1},"1":{"250":1,"251":1}}],["图片列表",{"2":{"31":1}}],["图片地址",{"2":{"29":1}}],["图片链接",{"2":{"27":1}}],["图片预览指令",{"2":{"97":1}}],["图片预览",{"0":{"26":1},"1":{"27":1},"2":{"204":1}}],["图标默认是提供在线的服务",{"2":{"273":1}}],["图标字符串不支持异步返回",{"2":{"271":1}}],["图标字符串不支持拼接",{"2":{"271":1}}],["图标时",{"2":{"271":1}}],["图标文件放到",{"2":{"269":1}}],["图标文件的网站",{"2":{"269":1}}],["图标名",{"2":{"55":1,"271":1,"272":1}}],["图标名称",{"2":{"23":1}}],["图标选择器就会自动生效了",{"2":{"274":1}}],["图标选择器是一个特殊的组件",{"2":{"274":1}}],["图标选择器",{"0":{"22":1,"274":1},"1":{"23":1}}],["图标",{"0":{"268":1,"270":1},"1":{"269":1,"270":1,"271":2,"272":2,"273":2,"274":1},"2":{"19":1,"55":1,"100":2,"171":1,"271":1,"309":1}}],["dde1e3",{"2":{"277":3,"278":4}}],["duration",{"2":{"255":1}}],["doubled",{"2":{"297":1}}],["dot",{"2":{"283":1}}],["dotenv",{"2":{"204":1}}],["documentelement",{"2":{"236":4}}],["document",{"2":{"215":4,"236":4}}],["down",{"2":{"57":1}}],["drawer",{"2":{"182":2}}],["dropdown",{"2":{"105":1}}],["direction",{"2":{"264":1}}],["div>",{"2":{"255":3}}],["div",{"2":{"255":3,"271":1}}],["dialog",{"2":{"182":2}}],["digital",{"2":{"134":1,"137":6}}],["display",{"2":{"256":1,"257":1}}],["disable",{"2":{"123":4}}],["disabled",{"2":{"43":1}}],["dist",{"2":{"83":2,"84":1,"100":1,"208":2,"215":2}}],["d",{"2":{"124":1,"197":1,"214":1,"228":1,"236":4}}],["d2a2d",{"2":{"100":1}}],["d2dda",{"2":{"90":1}}],["dcbcc",{"2":{"100":1}}],["dc2b33",{"2":{"49":3}}],["dfc51",{"2":{"100":1}}],["d5715",{"2":{"97":1}}],["d8039",{"2":{"93":1}}],["dependencies",{"2":{"222":4}}],["department",{"2":{"177":5,"178":5,"179":5}}],["detailform",{"2":{"181":1,"182":1}}],["debug",{"2":{"123":4}}],["defineoptions",{"2":{"298":2}}],["definestore",{"2":{"267":1}}],["definefakeroute",{"2":{"80":2}}],["defaultlang",{"2":{"140":1,"146":1}}],["default",{"2":{"23":1,"80":1,"124":2,"161":1,"162":1,"163":1,"164":1,"181":1,"208":2,"215":2,"222":4,"229":2,"236":2,"243":2,"267":1,"278":2,"298":1}}],["devtools",{"2":{"204":4}}],["devtool",{"2":{"123":4}}],["dev",{"2":{"78":1,"198":3,"265":1}}],["development",{"2":{"77":1,"123":1,"158":1}}],["design",{"0":{"206":1,"213":1},"1":{"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1},"2":{"33":2,"100":2,"206":1,"207":2,"208":10,"211":2,"213":1,"214":2,"215":8,"218":2}}],["day",{"2":{"303":1}}],["dayjs",{"2":{"70":4}}],["dafont",{"2":{"135":1}}],["datezhtw",{"2":{"229":2}}],["datezhcn",{"2":{"229":4}}],["dateenus",{"2":{"229":2}}],["date",{"2":{"229":6}}],["dates",{"2":{"130":1}}],["datalist",{"2":{"182":1}}],["data",{"2":{"21":1,"29":1,"31":1,"51":1,"80":1,"182":2,"285":1}}],["darktheme",{"2":{"229":4,"277":1,"278":1}}],["darkalgorithm",{"2":{"208":2}}],["dark",{"2":{"100":6,"208":2,"215":6,"222":4,"229":2,"236":6,"243":2,"256":1,"257":1,"277":1,"278":3,"279":1,"285":5}}],["dab41",{"2":{"89":1}}],["danger",{"2":{"16":1}}],["us",{"2":{"208":1,"215":1,"236":1}}],["usewatermarkstore",{"2":{"301":2}}],["usewindow",{"2":{"64":4,"65":3,"66":3,"67":3,"68":3,"174":1}}],["useexamplestore",{"2":{"267":4}}],["useglobalconfig",{"2":{"222":2}}],["useglobalproperties",{"2":{"108":2}}],["usesettingsstore",{"2":{"208":4,"215":4,"222":4,"229":4,"236":4,"243":2}}],["usepagination",{"2":{"182":3}}],["userpreferences",{"2":{"190":1,"191":1,"192":2}}],["user",{"2":{"127":1,"158":2,"176":1,"191":1,"192":1}}],["usecurrentinstance",{"2":{"108":2}}],["use",{"2":{"75":2,"100":3,"208":2,"215":2,"222":5,"229":2,"236":2,"243":2}}],["usemenu",{"2":{"62":3}}],["useauth",{"2":{"60":3,"179":3}}],["util",{"2":{"125":1}}],["utils",{"2":{"60":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"125":1,"179":1,"182":2,"266":1,"277":1,"278":2,"301":1}}],["undefined",{"2":{"229":2}}],["unplugin",{"2":{"97":2,"259":1,"297":1}}],["unocss",{"0":{"255":1,"271":1},"2":{"88":2,"97":2,"100":6,"204":1,"205":1,"254":1,"255":1,"271":3,"273":1,"277":1,"278":2,"285":2}}],["update",{"2":{"301":2}}],["updatetheme",{"2":{"215":8,"236":8}}],["up",{"2":{"57":2}}],["url",{"0":{"196":1},"2":{"21":1,"80":2}}],["ui",{"0":{"227":1,"241":1},"1":{"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1},"2":{"4":1,"33":2,"34":2,"100":3,"208":4,"215":4,"222":4,"227":1,"228":2,"229":14,"232":2,"236":4,"241":1,"242":2,"243":11,"246":2,"277":6,"278":9}}],["例如要在多个模块之间进行操作",{"2":{"310":1}}],["例如同样提供了",{"2":{"309":1}}],["例如新建一个",{"2":{"267":1}}],["例如下面的例子",{"2":{"262":1}}],["例如搭配",{"2":{"173":1}}],["例如什么状态下是请求成功",{"2":{"158":1}}],["例如将增加上报信息",{"2":{"125":1}}],["例如开发环境用于本地开发使用",{"2":{"123":1}}],["例如在项目中导入了一些第三方的插件代码或组件代码",{"2":{"115":1,"116":1}}],["例如就叫",{"2":{"78":1}}],["例如请求的时候会自动带上",{"2":{"75":1}}],["例如接口响应报错",{"2":{"75":1}}],["例如项目的真实接口请求地址为",{"2":{"73":1}}],["例如",{"2":{"21":1,"33":1,"78":1,"117":1,"120":2,"142":1,"184":1,"271":1,"285":2,"295":1}}],["mini",{"2":{"277":1,"278":2}}],["mitt",{"2":{"69":1}}],["ma",{"2":{"255":1}}],["matchmedia",{"2":{"215":2,"236":2}}],["matching",{"2":{"204":1}}],["main",{"2":{"100":1,"198":1,"253":1,"277":14,"278":21}}],["max",{"2":{"21":1,"31":1,"197":1,"256":1,"257":1}}],["media",{"2":{"256":1,"257":1}}],["merge",{"2":{"236":4}}],["memory",{"2":{"197":1}}],["me",{"2":{"132":1,"163":1}}],["messages",{"2":{"141":1,"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["message",{"2":{"120":1}}],["menulist",{"2":{"175":1}}],["menus",{"2":{"161":2,"162":2,"163":2,"181":2}}],["menufillstyle",{"2":{"100":1}}],["menuactivestyle",{"2":{"90":1,"283":1}}],["menumode",{"2":{"90":2,"150":1,"151":1,"152":1,"153":1,"154":1}}],["menu",{"2":{"89":1,"90":6,"98":1,"100":1,"124":1,"142":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"159":2,"161":1,"162":1,"163":1,"164":2,"175":1,"181":3,"191":1,"277":30,"278":45,"283":1,"284":1}}],["method",{"2":{"80":1}}],["meta",{"2":{"78":3,"198":7,"262":1}}],["module",{"0":{"188":1},"2":{"180":1,"181":1,"183":1,"188":1,"198":1,"208":1,"215":1,"222":1,"236":1,"243":1}}],["modules",{"2":{"76":1,"127":1,"158":2,"159":1,"175":1,"176":1,"181":2,"186":1,"191":1,"192":1,"208":2,"215":2,"222":2,"229":2,"236":4,"243":1,"265":2,"267":2,"301":2}}],["mode",{"2":{"77":2,"78":4,"90":2,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"236":4,"285":1}}],["model",{"2":{"23":1,"29":1,"31":1,"43":1}}],["mockjs",{"2":{"79":1,"80":1}}],["mock",{"0":{"79":1,"80":1,"81":1,"187":1},"1":{"80":1,"81":1},"2":{"4":1,"79":2,"80":12,"81":8,"93":1,"97":2,"98":2,"110":1,"123":4,"175":2,"176":1,"180":1,"181":3,"183":2,"187":3}}],["mobile",{"2":{"0":4,"182":1}}],["i",{"2":{"271":7}}],["icônes",{"2":{"270":1}}],["iconify",{"0":{"270":1,"272":1},"1":{"271":1,"272":1,"273":1},"2":{"55":1,"100":3,"171":1,"270":4,"271":3,"272":2,"273":3}}],["icons",{"2":{"33":1,"269":2,"273":1,"274":1}}],["icon>",{"2":{"33":3,"120":3}}],["icon=",{"2":{"33":1,"120":1,"272":1}}],["iconpicker",{"0":{"22":1},"1":{"23":1},"2":{"96":1,"208":1,"215":1,"222":1,"236":1,"243":1}}],["icon",{"0":{"171":1},"2":{"19":1,"33":3,"97":2,"120":3,"164":2,"171":1,"181":1,"222":6,"272":3}}],["ixmessageprovider>",{"2":{"222":4}}],["ixthemeprovider>",{"2":{"222":2}}],["ixthemeprovider",{"2":{"222":2}}],["if",{"2":{"215":2,"236":2}}],["ignoremissing",{"2":{"194":1}}],["ignores",{"2":{"115":1}}],["id",{"2":{"182":1}}],["ide",{"0":{"114":1},"2":{"113":1,"117":1}}],["iduxcomponents",{"2":{"222":4}}],["iduxcdk",{"2":{"222":4}}],["idux",{"0":{"220":1},"1":{"221":1,"222":1,"223":1,"224":1,"225":1,"226":1},"2":{"33":1,"100":1,"220":1,"221":3,"222":16,"225":2}}],["is",{"2":{"195":1,"256":1,"257":1}}],["issue",{"2":{"194":1,"313":3}}],["islogin",{"2":{"158":1}}],["isrounded",{"2":{"100":1,"284":1}}],["ismaximize",{"2":{"67":1}}],["i18n",{"0":{"169":1},"2":{"93":2,"109":1,"138":1,"139":1,"142":1,"144":2,"166":1,"291":1,"294":1}}],["i18nselector",{"0":{"24":1},"1":{"25":1},"2":{"88":1}}],["img",{"2":{"256":1,"257":1}}],["immediate",{"2":{"215":2,"236":2}}],["import",{"2":{"78":4,"80":1,"100":4,"137":2,"141":3,"198":7,"208":13,"215":11,"222":15,"229":7,"236":13,"243":9,"262":1,"272":1,"297":3,"301":1}}],["image",{"2":{"204":1}}],["images",{"2":{"100":1,"250":1,"251":1}}],["imagesupload",{"0":{"30":1},"1":{"31":1},"2":{"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["imageupload",{"0":{"28":1},"1":{"29":1},"2":{"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["imagepreview",{"0":{"26":1},"1":{"27":1},"2":{"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["infinite",{"2":{"255":1}}],["info",{"2":{"16":1,"73":1,"138":1,"183":1}}],["include",{"2":{"236":2}}],["indent",{"2":{"204":1}}],["index2",{"2":{"78":3}}],["index",{"2":{"62":2,"75":1,"78":1,"100":2,"141":1,"158":1,"159":1,"164":1,"181":3,"182":3,"196":1,"198":2,"208":6,"215":6,"222":8,"229":6,"236":8,"243":10,"259":1,"261":1,"262":1,"276":1,"290":2,"311":1}}],["in",{"2":{"141":1}}],["init",{"2":{"117":1}}],["interceptors",{"2":{"75":2}}],["install",{"2":{"33":1,"117":2,"207":1,"208":4,"214":1,"215":4,"221":1,"222":4,"228":1,"229":4,"235":1,"236":4,"242":1,"243":6,"265":1}}],["底行提示文字",{"2":{"19":1}}],["数字标记",{"2":{"19":1}}],["数据冲突的方式就是增加前缀区分",{"2":{"266":1}}],["数据冲突",{"2":{"266":1}}],["数据会共享",{"2":{"266":1}}],["数据会直接以",{"2":{"127":1,"192":1}}],["数据修复",{"2":{"97":2}}],["数据编写规则请阅读",{"2":{"79":1}}],["数据是前端开发过程中必不可少的一环",{"2":{"79":1}}],["数据存放的命名空间",{"2":{"51":1}}],["数据",{"0":{"266":1},"2":{"4":1,"175":1,"181":1,"187":1}}],["npx",{"2":{"265":1}}],["npmmirror",{"2":{"265":2}}],["npm",{"2":{"265":2,"295":2}}],["nrm",{"2":{"265":1}}],["nglobalstyle",{"2":{"229":2}}],["nginx",{"2":{"85":1}}],["nmessageprovider>",{"2":{"229":4}}],["nconfigprovider>",{"2":{"229":2}}],["nconfigprovider",{"2":{"229":2}}],["nologinexample",{"2":{"262":1}}],["nologinwhitelist",{"2":{"262":2}}],["none",{"2":{"255":1}}],["node",{"2":{"197":1,"204":2,"236":2,"265":2}}],["noemit",{"2":{"197":1}}],["no",{"2":{"177":3,"262":4}}],["notification",{"2":{"290":2,"294":1}}],["notitle",{"0":{"170":1}}],["notip",{"2":{"21":1,"29":1,"31":1}}],["next",{"2":{"235":1,"236":10}}],["nexttick",{"2":{"215":2,"236":2}}],["nested",{"2":{"88":2,"256":1}}],["newthemename",{"2":{"278":3}}],["newpassword",{"2":{"143":1}}],["new",{"2":{"78":3,"183":1,"259":1,"267":1}}],["news",{"2":{"73":2,"74":2,"77":4,"80":5}}],["nbsp",{"2":{"88":18,"89":22,"90":22,"91":2,"92":16,"93":8,"96":2,"97":32,"98":12,"99":4,"100":22,"104":4,"105":36,"108":12,"109":8,"110":8,"111":4}}],["navsearch",{"2":{"289":1,"294":1}}],["naive",{"0":{"227":1},"1":{"228":1,"229":1,"230":1,"231":1,"232":1,"233":1},"2":{"33":1,"100":1,"227":1,"228":2,"229":10,"232":2}}],["name=",{"2":{"33":1,"120":1,"269":1,"271":3,"272":1}}],["name",{"0":{"298":1},"2":{"8":1,"11":1,"14":1,"19":1,"21":2,"25":1,"29":1,"31":1,"38":1,"41":1,"43":1,"46":1,"51":1,"52":1,"55":1,"182":1,"184":1,"262":1,"269":1,"271":3,"298":4}}],["number",{"2":{"19":1,"21":2,"29":3,"31":4,"49":3,"55":2,"168":1,"173":3}}],["num",{"2":{"19":1}}],["has",{"2":{"266":3}}],["hash",{"2":{"196":1}}],["highlight",{"2":{"204":2}}],["hurui",{"2":{"132":1,"163":1}}],["hooks",{"0":{"117":1},"1":{"118":1},"2":{"117":4,"118":6}}],["hooray",{"2":{"88":9,"89":11,"90":11,"91":1,"92":8,"93":4,"96":1,"97":16,"98":6,"99":2,"100":11,"104":2,"105":18,"108":6,"109":4,"110":4,"111":2}}],["horizontal",{"2":{"55":1}}],["hover",{"2":{"49":3,"277":12,"278":18}}],["hex2rgba",{"2":{"277":5,"278":8}}],["heap",{"2":{"197":2}}],["head",{"2":{"90":1,"150":1,"154":1,"156":1}}],["headers",{"2":{"21":1,"29":1,"31":1}}],["header",{"2":{"19":1,"184":1,"277":14,"278":21}}],["height",{"2":{"27":1,"29":1,"31":1,"40":1,"49":1,"229":2}}],["https",{"2":{"83":1,"132":1,"163":1,"202":4,"265":1}}],["http",{"2":{"21":1,"73":4,"77":3,"78":1,"163":1,"265":1}}],["html5",{"2":{"196":2}}],["html",{"2":{"8":2,"11":1,"14":1,"25":1,"38":2,"41":2,"46":1,"52":1,"105":2,"198":2,"271":1}}],["终止颜色",{"2":{"19":1}}],["tconfigprovider>",{"2":{"236":2}}],["tconfigprovider",{"2":{"236":2}}],["tw",{"2":{"141":2,"208":2,"215":2,"222":1,"229":1,"236":2,"243":1}}],["ttf",{"2":{"135":1,"136":3}}],["themes",{"2":{"276":1}}],["theme=",{"2":{"208":2,"222":2,"229":2,"285":1}}],["theme",{"2":{"100":5,"191":2,"208":4,"215":4,"236":4}}],["then",{"2":{"74":2,"80":2}}],["turbo",{"2":{"97":2}}],["tag",{"2":{"204":1}}],["tar",{"2":{"123":2}}],["target",{"2":{"77":1,"78":2}}],["take",{"2":{"53":1}}],["tsx",{"2":{"236":2}}],["tsc",{"2":{"197":1}}],["tsconfig",{"2":{"199":1,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2}}],["tsconst",{"2":{"78":1,"100":1,"125":1,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"140":2,"146":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"161":1,"162":1,"163":1,"164":1,"175":1,"176":1,"182":1,"190":1,"192":1,"198":1,"264":1,"266":1,"267":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"300":1}}],["tscosnt",{"2":{"181":1}}],["tsbadge",{"2":{"173":1}}],["tstitle",{"2":{"142":1}}],["tsserver",{"2":{"77":1,"78":1}}],["ts",{"2":{"75":1,"77":2,"78":5,"83":1,"100":2,"112":2,"124":5,"125":2,"127":1,"141":1,"158":3,"159":2,"164":1,"175":2,"176":1,"181":2,"182":1,"191":2,"192":1,"196":1,"198":2,"208":5,"215":5,"222":5,"229":5,"236":11,"243":5,"253":1,"261":1,"262":2,"266":1,"267":1,"276":1,"297":1,"298":3,"301":3}}],["tsimport",{"2":{"59":1,"60":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"74":1,"77":1,"78":2,"80":2,"141":1,"179":1,"181":1,"182":1,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2,"266":1,"267":1,"277":1,"278":2}}],["text",{"2":{"255":2,"277":2,"278":3,"285":2,"301":1}}],["testwindow",{"2":{"181":7}}],["test",{"2":{"73":4,"83":2,"84":1,"123":1,"176":1,"181":4}}],["templates",{"2":{"183":1,"208":1,"215":1,"222":1,"236":1,"243":1}}],["template>",{"2":{"33":1,"120":1,"177":3,"208":4,"215":4,"222":4,"229":4,"236":4,"243":4,"255":2,"272":2}}],["template",{"2":{"33":2,"120":2,"177":4,"178":1}}],["transition",{"2":{"255":1}}],["trend",{"0":{"56":1},"1":{"57":1}}],["true",{"2":{"40":1,"45":2,"67":1,"77":2,"78":3,"86":1,"117":1,"118":2,"123":3,"124":5,"125":1,"129":1,"140":1,"176":1,"179":3,"182":1,"190":1,"198":2,"199":1,"215":2,"236":2,"280":1,"281":1,"284":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"300":1}}],["timeout",{"2":{"78":1,"198":1}}],["title",{"0":{"166":1},"2":{"37":1,"40":1,"41":1,"51":1,"64":1,"74":1,"80":2,"123":4,"142":1,"161":1,"162":2,"163":1,"164":2,"181":2,"184":1,"256":1,"257":1,"262":1}}],["tip",{"2":{"19":1,"79":1,"83":1,"115":1,"116":1,"120":1,"267":1,"296":1}}],["tdesign",{"0":{"234":1},"1":{"235":1,"236":1,"237":1,"238":1,"239":1,"240":1},"2":{"33":1,"100":1,"234":1,"235":2,"236":14,"239":2}}],["tools",{"2":{"290":1}}],["tool",{"2":{"123":4}}],["toolbar",{"2":{"98":3,"124":1,"140":1,"146":1,"277":2,"278":3,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1}}],["tooltip",{"2":{"49":2,"97":2}}],["token等数据",{"2":{"125":1}}],["token",{"2":{"75":1}}],["togglemaximize",{"2":{"66":1}}],["toggle",{"2":{"45":1,"46":1,"47":1}}],["to",{"2":{"19":1}}],["type=",{"2":{"198":1}}],["types",{"2":{"124":1,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2}}],["typescript",{"0":{"199":1},"2":{"111":2,"199":3}}],["type",{"2":{"16":1,"43":1,"57":1,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2}}],["开始",{"0":{"265":1},"2":{"166":1,"182":1,"298":1}}],["开始颜色",{"2":{"19":1}}],["开启",{"0":{"190":1},"2":{"196":1}}],["开启抽屉模式",{"2":{"182":1}}],["开启后端生成后",{"2":{"175":1}}],["开启后在",{"2":{"175":1}}],["开启后用户可将常用的导航菜单添加进收藏夹",{"2":{"126":1}}],["开启代理后",{"2":{"77":1}}],["开启代理",{"2":{"77":1}}],["开头即可",{"2":{"78":1}}],["开关",{"2":{"33":1,"120":1}}],["开发人员只需关注模块内的业务实现即可",{"2":{"310":1}}],["开发人员得通过修改源码自行实现业务",{"2":{"6":1}}],["开发注意",{"0":{"285":1}}],["开发",{"0":{"296":1},"1":{"297":1,"298":1},"2":{"208":1,"215":1,"222":1,"236":1,"243":1}}],["开发的",{"2":{"199":1}}],["开发过程中",{"2":{"183":1}}],["开发者在二次开发上会有明显的局限",{"2":{"295":1}}],["开发者会根据自身需求去修改",{"2":{"295":1}}],["开发者通常在简单熟悉本框架后",{"2":{"158":1}}],["开发者通常希望能在本地先预览一下",{"2":{"84":1}}],["开发者需要根据实际业务情况修改代码",{"2":{"125":1}}],["开发者请在",{"2":{"124":1}}],["开发者可根据实际业务需求进行扩展",{"2":{"123":1}}],["开发环境与生产环境使用",{"2":{"81":1}}],["开发环境",{"0":{"80":1,"204":1},"2":{"113":1,"123":1}}],["开发环境的跨域问题可在本地设置代理解决",{"2":{"77":1}}],["开发与构建工具",{"2":{"4":1}}],["开发完毕后需要将完整源码一起交付给客户",{"2":{"2":1}}],["开发团队有多名开发者",{"2":{"2":1}}],["fff",{"2":{"277":8,"278":20,"285":1}}],["fw100",{"2":{"255":1}}],["flex",{"2":{"255":3}}],["flip",{"2":{"55":1}}],["fullscreen",{"2":{"292":1,"294":1}}],["full",{"2":{"222":2}}],["function",{"2":{"141":1,"208":2,"215":4,"222":2,"229":2,"236":4,"243":2}}],["f0826",{"2":{"105":1}}],["f2f2f2",{"2":{"277":3,"278":5}}],["f20ca",{"2":{"105":1}}],["f2ef8",{"2":{"90":1}}],["f9c4e",{"2":{"105":1}}],["f9498",{"2":{"89":1}}],["f644e",{"2":{"97":1}}],["fd2f6",{"2":{"97":1}}],["fd0ca",{"2":{"89":1}}],["fcfcfc",{"2":{"277":1,"278":2}}],["fc082",{"2":{"92":1}}],["fce08",{"2":{"90":1}}],["f49b6",{"2":{"92":1}}],["f77f3",{"2":{"88":1}}],["firefox",{"2":{"204":1}}],["fixed",{"2":{"311":1}}],["fixes",{"2":{"89":1,"90":2,"91":1,"92":2,"93":1,"96":1,"97":2,"99":2,"100":1,"105":2,"108":1,"109":2,"110":2}}],["fix",{"2":{"87":1}}],["fill",{"2":{"49":1}}],["files",{"2":{"21":1}}],["file",{"2":{"21":1,"29":1,"31":1}}],["fileupload",{"0":{"20":1},"1":{"21":1},"2":{"89":2,"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["feature",{"2":{"144":1}}],["features",{"2":{"88":2,"89":2,"90":2,"92":2,"93":1,"97":2,"98":1,"100":2,"104":1,"105":2,"109":1}}],["feat",{"2":{"87":1}}],["fonts",{"2":{"137":3}}],["font",{"2":{"136":1,"137":3}}],["formmodeprops",{"2":{"182":1}}],["formmode",{"2":{"181":1,"182":3}}],["format",{"2":{"43":1}}],["for",{"2":{"141":1,"204":2}}],["forward",{"2":{"100":2}}],["fold",{"2":{"45":1,"46":1}}],["from",{"2":{"19":1,"59":1,"60":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"74":1,"77":1,"78":3,"80":3,"100":1,"141":4,"179":1,"181":1,"182":1,"208":13,"215":11,"222":15,"229":9,"236":13,"243":7,"266":1,"267":1,"272":1,"277":1,"278":2,"297":1,"301":1,"303":1}}],["failed",{"2":{"197":1}}],["family",{"2":{"137":3}}],["favoritesedit",{"2":{"127":1}}],["favorites",{"2":{"127":3,"288":1,"294":1}}],["fa5c5",{"2":{"89":1}}],["fake",{"2":{"79":1,"80":1,"98":2}}],["false",{"2":{"16":1,"21":1,"29":1,"31":1,"40":1,"43":1,"45":1,"49":1,"57":1,"67":1,"81":1,"100":1,"123":8,"146":1,"170":1,"173":1,"179":3,"182":3}}],["fantastic",{"0":{"309":1,"310":1},"2":{"0":8,"309":1,"310":1}}],["回调参数",{"2":{"17":1,"47":1,"53":1}}],["beyond",{"2":{"295":1}}],["beian",{"2":{"133":1}}],["bg",{"2":{"277":26,"278":39,"285":2}}],["block",{"2":{"256":1,"257":1}}],["b",{"2":{"202":2}}],["b1f8f",{"2":{"105":1}}],["b1cb9",{"2":{"88":1}}],["bdfa4",{"2":{"98":1}}],["by",{"2":{"88":9,"89":11,"90":11,"91":1,"92":8,"93":4,"96":1,"97":16,"98":6,"99":2,"100":11,"104":2,"105":18,"108":6,"109":4,"110":4,"111":2}}],["break",{"2":{"141":4,"215":4,"236":4}}],["breaking",{"2":{"88":2,"89":2,"90":2,"92":1,"97":1,"98":2,"100":2,"105":2,"108":2,"111":2}}],["brotli",{"2":{"85":4,"123":3}}],["br",{"2":{"85":1}}],["basic",{"2":{"202":4}}],["baseon",{"2":{"175":1,"191":1}}],["base",{"2":{"83":1,"100":1}}],["baseurl",{"0":{"73":1},"2":{"73":3,"77":2,"78":12,"80":2,"81":1,"105":4,"123":7,"198":6}}],["batch",{"2":{"182":1}}],["batchactionbar",{"2":{"105":2}}],["backend",{"2":{"175":1}}],["background",{"2":{"45":1,"285":1}}],["ba111",{"2":{"104":1}}],["bafaa",{"2":{"92":1}}],["badge",{"0":{"173":1},"2":{"91":1}}],["baidu",{"2":{"78":1}}],["box",{"2":{"285":1}}],["border",{"2":{"277":2,"278":3,"285":1}}],["bounce",{"2":{"255":1}}],["body>",{"2":{"198":2}}],["body",{"2":{"80":1,"215":4,"256":1,"257":1}}],["both",{"2":{"43":1,"55":1}}],["boolean",{"2":{"16":1,"21":1,"29":1,"31":1,"40":1,"43":1,"45":3,"49":1,"57":1,"170":1,"173":2}}],["build",{"2":{"81":1,"83":2,"85":4,"86":1,"123":8,"197":2}}],["button>",{"2":{"33":3,"120":3,"178":3}}],["button",{"2":{"33":2,"120":2,"178":3}}],["bug",{"2":{"4":1,"6":1,"89":1,"90":2,"91":1,"92":2,"93":1,"96":1,"97":2,"99":2,"100":1,"105":2,"108":1,"109":2,"110":2,"204":1,"295":1}}],["bmp",{"2":{"29":1,"31":1}}],["纸片",{"0":{"15":1},"1":{"16":1,"17":1}}],["currentcolorscheme",{"2":{"208":2,"215":2,"222":2,"229":2,"236":2}}],["curd",{"2":{"180":1,"187":1}}],["cursor",{"2":{"49":1}}],["cn",{"2":{"141":2,"143":1,"146":1,"208":3,"215":3,"222":1,"229":1,"236":3,"243":1}}],["cdk",{"2":{"221":1,"222":2}}],["cd",{"2":{"117":1}}],["cdn",{"2":{"21":1}}],["captcha",{"2":{"143":1}}],["case",{"2":{"141":5,"215":4,"236":4}}],["ca569",{"2":{"105":1}}],["cab92",{"2":{"90":1}}],["center",{"2":{"255":1}}],["ceffd",{"2":{"105":1}}],["cea64",{"2":{"88":1}}],["css",{"2":{"100":5,"137":4,"157":2,"208":2,"215":2,"222":2,"236":2,"243":8,"254":1,"271":2}}],["cbb68",{"2":{"100":1}}],["cc87f",{"2":{"98":1}}],["c2915",{"2":{"98":1}}],["c7bcb",{"2":{"97":1}}],["ctitle",{"2":{"80":1}}],["clear",{"2":{"266":3}}],["clone",{"2":{"202":4}}],["close",{"2":{"17":1}}],["closable",{"2":{"16":1}}],["class=",{"2":{"255":3,"271":2}}],["class",{"2":{"100":2,"271":1}}],["client",{"2":{"80":1}}],["chrome",{"2":{"204":3}}],["chinese",{"2":{"204":1}}],["children",{"2":{"162":1,"164":3,"181":1}}],["chip",{"0":{"15":1},"1":{"16":1,"17":1}}],["check",{"2":{"143":1}}],["chalk",{"2":{"100":5}}],["change",{"2":{"215":4,"236":4}}],["changes",{"2":{"88":2,"89":2,"90":2,"92":1,"97":1,"98":2,"100":2,"105":2,"108":2,"111":2}}],["changeorigin",{"2":{"77":1,"78":2}}],["cwd",{"2":{"77":2,"78":4}}],["cross",{"2":{"197":3}}],["createglobalconfig",{"2":{"222":2}}],["create",{"2":{"73":1,"74":1,"78":1,"80":2,"177":3,"178":3,"179":3,"198":1}}],["crm",{"2":{"6":1}}],["count",{"2":{"255":1,"297":2}}],["copyright",{"2":{"99":2,"129":1,"130":1,"131":1,"132":1,"133":1}}],["console",{"2":{"97":2}}],["const",{"2":{"60":1,"120":1,"124":1,"141":2,"179":1,"181":1,"182":1,"191":1,"208":3,"215":5,"222":4,"229":3,"236":5,"243":2,"262":2,"267":2,"277":2,"297":2,"301":1}}],["config=",{"2":{"236":2}}],["config",{"2":{"77":2,"78":2,"83":1,"100":2,"115":4,"198":3,"222":2,"265":1}}],["content",{"2":{"37":1,"38":1,"74":1,"80":1}}],["code",{"2":{"43":2,"113":1,"124":1,"204":5}}],["col",{"2":{"255":1}}],["collaspe",{"2":{"40":2}}],["colorscheme",{"2":{"191":2,"215":6,"236":6,"279":1,"293":1,"294":1}}],["color",{"2":{"19":2,"49":4,"55":1,"100":1,"204":1,"215":2,"236":2,"256":1,"257":1,"277":26,"278":39,"285":5}}],["colorfulcard",{"0":{"18":1},"1":{"19":1}}],["commit",{"2":{"117":1,"118":3}}],["common",{"2":{"100":1}}],["command",{"2":{"77":1,"78":2}}],["computed",{"2":{"297":2}}],["compare",{"2":{"295":1}}],["company",{"2":{"131":1}}],["compileroptions",{"2":{"208":2,"215":2,"222":2,"229":2,"236":2,"243":2}}],["compress",{"2":{"85":4,"123":2}}],["composition",{"0":{"296":1},"1":{"297":1,"298":1},"2":{"296":3,"297":2}}],["composables",{"2":{"60":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"179":1,"182":2}}],["componentname",{"2":{"298":2}}],["component",{"0":{"185":1},"2":{"183":1,"185":1,"262":1}}],["components",{"2":{"35":1,"119":1,"181":2,"182":2,"185":1,"208":2,"215":2,"221":1,"222":12,"229":1,"236":2,"243":2,"259":2,"260":1,"290":1}}],["com",{"2":{"21":1,"73":4,"78":1,"83":1,"202":4,"265":1}}],["全新提供的一种语法",{"2":{"296":1}}],["全新的",{"2":{"267":1}}],["全新的主题配色方案",{"2":{"100":1}}],["全局状态管理",{"0":{"267":1}}],["全局状态文件存放在",{"2":{"267":1}}],["全局状态文件",{"2":{"183":1}}],["全局公共组件存放在",{"2":{"259":1}}],["全局公共组件在使用时",{"2":{"259":1}}],["全局公共样式存放在",{"2":{"253":1}}],["全局公共图片存放在",{"2":{"250":1}}],["全局公共",{"0":{"250":1,"253":1,"259":1}}],["全局配置",{"2":{"100":1}}],["全局搜索支持拼音",{"2":{"100":1}}],["全局provide的generatei18ntitle函数放到usemenu",{"2":{"89":1}}],["全部匹配则鉴权通过",{"2":{"10":1}}],["全方位权限验证",{"2":{"4":1}}],["时隐藏",{"2":{"173":2}}],["时是否显示文字提示",{"2":{"49":1}}],["时辅助点颜色",{"2":{"49":1}}],["时辅助线颜色",{"2":{"49":1}}],["时生效",{"2":{"40":1}}],["时",{"2":{"10":1,"13":1}}],["position",{"2":{"311":1}}],["postinstall",{"2":{"117":1,"118":3}}],["postcss",{"0":{"256":1},"2":{"88":2,"194":1,"254":1,"256":1}}],["post",{"2":{"59":1,"74":3,"77":1,"80":2}}],["personalnotification",{"2":{"290":1}}],["peerdependencyrules",{"2":{"194":1}}],["phone",{"2":{"256":1,"257":1}}],["public",{"2":{"198":1}}],["p>你没有该权限",{"2":{"177":3}}],["p>你有该权限",{"2":{"177":3}}],["p>",{"2":{"177":6}}],["px",{"2":{"168":1}}],["pinia",{"2":{"108":2,"173":1,"183":1,"205":1,"267":6,"297":1}}],["pack",{"2":{"204":1}}],["package",{"2":{"117":2,"118":1,"194":1,"197":1,"265":1}}],["pagination",{"2":{"182":2}}],["pagesexample",{"2":{"181":1}}],["pages",{"2":{"181":1}}],["page",{"0":{"184":1},"2":{"74":1,"80":1,"100":1,"183":1,"184":2}}],["pagemain",{"0":{"39":1},"1":{"40":1,"41":1}}],["pageheader",{"0":{"36":1},"1":{"37":1,"38":1}}],["password",{"2":{"143":1}}],["panel",{"2":{"90":2,"155":1,"156":1}}],["path",{"2":{"77":2,"78":4,"262":1}}],["params",{"0":{"174":1},"2":{"74":1,"80":1}}],["pcas",{"2":{"43":2}}],["pcascascader",{"0":{"42":1},"1":{"43":1},"2":{"208":2,"215":2,"222":2,"229":1,"236":2,"243":2}}],["pca",{"2":{"43":3}}],["pc",{"2":{"43":2}}],["pnpm",{"2":{"33":1,"83":2,"84":2,"115":1,"116":1,"117":3,"118":2,"183":1,"194":1,"197":1,"204":1,"207":2,"210":1,"214":2,"217":1,"221":2,"224":1,"228":2,"231":1,"235":2,"238":1,"242":2,"245":1,"259":1,"265":6,"267":1,"273":1,"274":1}}],["png",{"2":{"29":1,"31":1}}],["plopfile",{"2":{"183":1}}],["plop",{"2":{"183":3,"208":1,"215":1,"222":1,"236":1,"243":1}}],["plugin",{"2":{"79":1,"80":1,"98":4,"105":2}}],["plus",{"2":{"4":1,"6":1,"33":8,"35":1,"100":21,"119":2,"120":5,"141":8,"206":2,"208":5,"209":1,"210":2,"211":1,"213":2,"215":5,"216":1,"217":2,"218":1,"220":2,"222":5,"223":1,"224":2,"225":1,"227":2,"229":3,"230":1,"231":2,"232":1,"234":2,"236":5,"237":1,"238":2,"239":1,"241":2,"243":5,"244":1,"245":2,"246":1}}],["placeholder",{"2":{"29":1,"31":1}}],["preinstall",{"2":{"265":1}}],["preset",{"2":{"222":2,"277":1,"278":2}}],["preserveunused",{"2":{"117":1,"118":2}}],["previewwindows",{"2":{"287":1,"294":1}}],["preview",{"2":{"204":1}}],["prefers",{"2":{"215":2,"236":2}}],["preferscolorscheme",{"2":{"215":6,"236":6}}],["preferencesedit",{"2":{"192":1}}],["preferences",{"2":{"191":1,"192":1}}],["prefix",{"2":{"57":1,"243":2}}],["prepare",{"2":{"118":2}}],["pre",{"2":{"117":1,"118":3}}],["profile",{"2":{"143":1}}],["production",{"2":{"123":1}}],["project",{"2":{"117":2}}],["provider",{"2":{"100":1,"208":4,"215":4,"222":4,"229":4,"236":4,"243":4}}],["process",{"2":{"77":2,"78":4}}],["proxy2",{"2":{"78":4}}],["proxy",{"2":{"77":10,"78":9,"120":2,"123":1,"198":4}}],["props",{"0":{"10":1,"13":1,"16":1,"19":1,"21":1,"23":1,"27":1,"29":1,"31":1,"37":1,"40":1,"43":1,"45":1,"49":1,"51":1,"55":1,"57":1}}],["primary",{"2":{"16":1,"100":1,"277":2,"278":3}}],["鉴权指令",{"0":{"178":1},"2":{"178":1}}],["鉴权组件和鉴权指令控制的是页面上的元素",{"2":{"179":1}}],["鉴权组件",{"0":{"177":1}}],["鉴权函数",{"0":{"179":1},"2":{"60":1}}],["鉴权",{"0":{"9":1,"12":1,"60":1},"1":{"10":1,"11":1,"13":1,"14":1}}],["操作区域的",{"2":{"8":1}}],["说明你使用的版本不支持或者配置参数有变动",{"2":{"124":1}}],["说明",{"2":{"8":1,"10":1,"11":1,"13":1,"14":1,"16":1,"17":1,"19":1,"21":1,"23":1,"25":1,"27":1,"29":1,"31":1,"33":1,"37":1,"38":1,"40":1,"41":1,"43":1,"45":1,"46":1,"47":1,"49":1,"51":1,"52":1,"53":1,"55":1,"57":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"202":1,"259":1,"271":1,"272":1,"273":1}}],["something",{"2":{"267":3}}],["sourcemap",{"2":{"86":2,"123":4}}],["shadow",{"2":{"285":1}}],["sh",{"2":{"202":2,"207":1,"210":1,"214":1,"217":1,"221":1,"224":1,"228":1,"231":1,"235":1,"238":1,"242":1,"245":1,"265":1}}],["shortcuts",{"2":{"88":2}}],["shop",{"2":{"73":1}}],["show",{"2":{"45":1}}],["switch",{"2":{"141":1,"215":2,"236":2}}],["switchto",{"2":{"62":1}}],["squirrel",{"2":{"136":1}}],["scoped>",{"2":{"256":1,"257":1}}],["scheme",{"2":{"215":2,"236":2,"277":2,"278":3}}],["script>",{"2":{"198":2,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2,"272":1,"297":1,"298":3,"301":1}}],["script",{"2":{"198":2,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2,"272":1,"297":3,"298":6,"301":1}}],["scripts",{"2":{"118":4,"197":1}}],["scssdiv",{"2":{"285":1}}],["scss",{"0":{"257":1},"2":{"100":12,"137":1,"253":2,"254":1,"256":1,"257":1}}],["simplified",{"2":{"204":1}}],["simple",{"0":{"117":1},"1":{"118":1},"2":{"117":4,"118":5}}],["single",{"2":{"152":1}}],["sidebar",{"2":{"164":1,"277":28,"278":42}}],["side",{"2":{"90":1,"151":1,"153":1,"155":1}}],["size=8192",{"2":{"197":1}}],["size",{"2":{"21":1,"23":1,"29":1,"31":1,"55":1,"74":1,"80":1}}],["session",{"2":{"266":5}}],["sessionstorage",{"2":{"125":1,"266":2,"273":1}}],["select",{"2":{"255":1}}],["selectiondatalist",{"2":{"182":1}}],["sex",{"2":{"182":1}}],["searchmore",{"2":{"182":1}}],["search",{"2":{"182":1,"271":3}}],["searchbar",{"0":{"44":1},"1":{"45":1,"46":1,"47":1}}],["sendcaptcha",{"2":{"143":1}}],["setitem",{"2":{"266":1}}],["set",{"2":{"265":1,"266":2}}],["setlocale",{"2":{"222":2}}],["setattribute",{"2":{"215":2,"236":2}}],["setting",{"2":{"123":5}}],["settingstype",{"2":{"301":1}}],["settingsstore",{"2":{"208":5,"215":7,"222":7,"229":6,"236":7,"243":2}}],["settingsdefault",{"2":{"191":2}}],["settings",{"2":{"100":1,"124":4,"125":1,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"140":2,"146":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"175":1,"176":1,"190":1,"191":1,"192":1,"208":2,"215":4,"222":2,"229":2,"236":4,"243":1,"264":1,"266":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"300":1}}],["setup>",{"2":{"272":1}}],["setup",{"2":{"108":2,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2,"297":3,"298":4,"301":1}}],["server",{"2":{"79":1,"80":1,"98":2,"127":1,"192":1}}],["serve",{"2":{"77":1,"78":2,"84":2}}],["sub",{"2":{"277":16,"278":24}}],["submenuautocollapse",{"2":{"98":1}}],["suffix",{"2":{"57":1}}],["success",{"2":{"16":1,"120":2}}],["space",{"2":{"197":1}}],["sparkline",{"0":{"48":1},"1":{"49":1}}],["sprites",{"2":{"100":1}}],["spot",{"2":{"49":1}}],["svg图标",{"0":{"54":1},"1":{"55":1}}],["svg",{"2":{"33":1,"55":1,"120":1,"171":2,"269":5,"273":1}}],["svgicon",{"0":{"54":1},"1":{"55":1},"2":{"19":1,"88":2,"97":1,"259":1,"269":2,"271":4,"272":2}}],["src=",{"2":{"198":2}}],["src",{"2":{"27":1,"34":1,"35":1,"75":1,"76":1,"78":3,"80":1,"100":9,"119":1,"124":4,"125":2,"127":1,"137":1,"140":1,"141":3,"143":1,"144":1,"157":1,"158":3,"159":2,"164":1,"175":2,"176":1,"181":7,"182":2,"184":1,"185":2,"186":1,"187":1,"191":1,"192":1,"196":1,"198":2,"208":7,"215":7,"222":7,"229":6,"236":17,"243":7,"250":1,"253":3,"259":1,"261":1,"262":1,"267":1,"269":2,"290":2,"301":2,"311":1}}],["staged",{"0":{"117":1},"1":{"118":1},"2":{"117":3,"118":2}}],["status",{"2":{"80":1}}],["studio",{"2":{"113":1,"124":1,"204":4}}],["storageprefix",{"2":{"266":1}}],["storage",{"0":{"266":1},"2":{"266":17}}],["storageto",{"2":{"127":2,"192":2}}],["storagebox",{"0":{"50":1},"1":{"51":1,"52":1,"53":1},"2":{"105":1}}],["store",{"0":{"186":1},"2":{"108":2,"158":1,"183":1,"186":2,"191":1,"208":2,"215":2,"222":2,"229":2,"236":2,"243":1,"267":2,"301":2}}],["stylistic",{"2":{"105":2}}],["style>",{"2":{"256":1,"257":1}}],["style=",{"2":{"229":2}}],["stylelintignore",{"2":{"116":1}}],["stylelintrc",{"2":{"116":2}}],["stylelint",{"0":{"116":1},"2":{"105":2,"116":2,"117":1,"204":1}}],["stylesheet",{"2":{"137":4}}],["styles",{"2":{"100":2,"157":1,"253":2}}],["style",{"2":{"90":1,"236":2,"256":1,"257":1,"283":1}}],["stroke",{"2":{"49":2}}],["string",{"2":{"10":1,"13":1,"16":1,"19":5,"21":2,"23":2,"27":3,"29":4,"31":3,"37":2,"40":2,"43":2,"49":4,"51":2,"55":4,"57":4,"141":1,"166":1,"167":1,"168":1,"169":1,"171":1,"172":1,"173":2,"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["step",{"0":{"5":1,"6":1},"2":{"0":6,"2":2,"3":1,"33":1,"117":2,"123":3,"131":1,"132":1,"147":1,"163":1,"201":1,"202":4,"295":2,"302":1,"303":1,"310":2}}],["slots",{"0":{"11":1,"14":1,"25":1,"38":1,"41":1,"46":1,"52":1}}],["slot",{"0":{"8":1},"2":{"10":1,"13":1,"208":2,"215":2,"222":2,"229":2,"236":2,"243":2}}],["持续产出可落地的特性或开发规范",{"2":{"6":1}}],["持续更新的业务应用静态页面",{"2":{"6":1}}],["在窗口打开的时候会动态加载组件",{"2":{"311":1}}],["在基于",{"2":{"295":1}}],["在页面中去自定义一些颜色",{"2":{"285":1}}],["在命令行执行",{"2":{"273":1}}],["在使用框架的过程中难免会遇到问题",{"2":{"313":1}}],["在使用",{"2":{"271":1}}],["在任意原生",{"2":{"271":1}}],["在代码中高亮颜色",{"2":{"204":1}}],["在框架源码基础上",{"2":{"202":1}}],["在扩展新的模式前",{"2":{"183":1}}],["在这基础上可以更方便的进行业务扩展",{"2":{"180":1}}],["在这里增加一个",{"2":{"141":1}}],["在演示源码中",{"2":{"176":1}}],["在实际开发中",{"2":{"176":1}}],["在打开非导航窗口时动态传入窗口所需要的参数",{"2":{"174":1}}],["在此之前",{"2":{"147":1}}],["在应用配置里开启",{"2":{"175":1}}],["在应用配置里进行设置",{"2":{"149":1}}],["在应用配置里设置后",{"2":{"140":1}}],["在应用配置中设置",{"2":{"129":1,"130":1,"131":1,"132":1,"133":1,"190":1,"264":1,"279":1,"280":1,"281":1,"283":1,"284":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"300":1}}],["在你本地的开发环境中报错或者无法生效",{"2":{"124":1}}],["在构建时开启压缩",{"2":{"123":2}}],["在构建时生成",{"2":{"123":2}}],["在提交代码时",{"2":{"117":1}}],["在多人协作开发时",{"2":{"117":1}}],["在保存代码时",{"2":{"113":1}}],["在环境配置文件里除了可以设置压缩选项",{"2":{"86":1}}],["在环境配置文件里设置",{"2":{"85":1}}],["在环境配置里设置",{"2":{"81":1}}],["在控制台内看不到接口请求日志",{"2":{"81":1}}],["在",{"2":{"75":1,"100":1,"143":1,"158":4,"164":1,"180":1,"198":1,"204":1,"297":1,"298":1,"301":1,"310":1}}],["在根目录",{"2":{"73":1}}],["在确保稳定的基础上",{"2":{"6":1}}],["在未经我们许可下",{"2":{"3":1}}],["主体",{"2":{"277":2,"278":3}}],["主要是",{"2":{"195":1}}],["主要在修复",{"2":{"6":1}}],["主题名称",{"2":{"278":1}}],["主题配色存放在",{"2":{"276":1}}],["主题",{"0":{"275":1},"1":{"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1},"2":{"100":1}}],["主题风格",{"2":{"4":1}}],["主导航只需设置",{"2":{"164":1}}],["主导航会将我们配置好的导航模块进行归类",{"2":{"164":1}}],["主导航激活项被复原到第一个",{"2":{"108":1}}],["主导航",{"0":{"61":1,"164":1},"1":{"62":1},"2":{"277":2,"278":3}}],["区别在于基础版侧重于稳定性维护",{"2":{"6":1}}],["还不熟悉",{"2":{"267":1}}],["还需要准备好开发使用的浏览器",{"2":{"204":1}}],["还是生产环境都需要使用到",{"2":{"123":1}}],["还是付费的专业版",{"2":{"6":1}}],["还有一部分是封装了第三方插件",{"2":{"119":1}}],["还有一些则是封装了第三方的插件",{"2":{"35":1}}],["还可设置",{"2":{"86":1}}],["还省去了产品和设计人员的工作",{"2":{"6":1}}],["极大提升开发效率的同时",{"2":{"6":1}}],["沉淀出数十个业务应用的静态页面",{"2":{"6":1}}],["借助以往的项目经验",{"2":{"6":1}}],["框架更新",{"0":{"295":1}}],["框架保留了",{"2":{"272":1}}],["框架已经帮你做好的所有处理",{"2":{"272":1}}],["框架已经做好了所有配置",{"2":{"271":1}}],["框架已将可提供给用户配置的选项提取出来",{"2":{"191":1}}],["框架大部分核心模块里采用的是这种方式",{"2":{"271":1}}],["框架一共定义了两个路由地址",{"2":{"261":1}}],["框架会在你使用时自动引入",{"2":{"259":1}}],["框架内置了",{"2":{"256":1}}],["框架内建了一些组件",{"2":{"34":1}}],["框架集成了",{"2":{"254":1}}],["框架源码",{"2":{"202":1}}],["框架源码里已提供相关配置文件",{"2":{"113":1}}],["框架原有的",{"2":{"199":1}}],["框架默认提供了",{"2":{"183":1}}],["框架默认通过",{"2":{"176":1}}],["框架提供了一份解决方案",{"2":{"273":1}}],["框架提供了一个",{"2":{"266":1}}],["框架提供了三种使用图标的方式",{"2":{"268":1}}],["框架提供了",{"2":{"177":1}}],["框架提供一系列的组件方便快速开发",{"2":{"32":1,"119":1}}],["框架设置",{"0":{"143":1}}],["框架的语言包文件命名需要和",{"2":{"141":1}}],["框架预设了",{"2":{"134":1}}],["框架为方便演示",{"2":{"125":1}}],["框架配置",{"0":{"124":1}}],["框架严格按照",{"2":{"120":1}}],["框架下次更新将切换到",{"2":{"112":2}}],["框架主题",{"0":{"276":1},"1":{"277":1,"278":1},"2":{"100":1}}],["框架使用",{"2":{"71":1,"115":1}}],["框架也提供了组件库替换移方案",{"2":{"33":1}}],["框架没有采用",{"2":{"33":1}}],["框架还扩充了部分业务组件",{"2":{"6":1}}],["框架版权信息",{"2":{"4":1}}],["丰富的组件库",{"2":{"6":1}}],["e5e5e5",{"2":{"277":9,"278":9}}],["e5cfa",{"2":{"90":1}}],["edge",{"2":{"204":1}}],["editorconfig",{"2":{"114":1,"204":1}}],["editor",{"2":{"105":2}}],["edit",{"2":{"33":2,"120":2,"177":2,"178":2,"179":2}}],["es",{"2":{"208":4,"215":4,"236":8}}],["esno",{"2":{"118":2}}],["eslint",{"0":{"115":1},"2":{"100":8,"115":6,"117":1,"204":1}}],["e6846",{"2":{"108":1}}],["e2aaf",{"2":{"98":1}}],["enuslocale",{"2":{"243":2}}],["enus",{"2":{"222":2,"229":2}}],["english",{"2":{"141":1}}],["en",{"2":{"141":2,"208":4,"215":4,"222":1,"229":1,"236":4,"243":1}}],["enablewatermark",{"2":{"300":1}}],["enablecoloramblyopiamode",{"2":{"281":1}}],["enablecolorscheme",{"2":{"124":1}}],["enablemournmode",{"2":{"280":1}}],["enablei18n",{"2":{"140":1,"146":1}}],["enable",{"2":{"129":1,"182":1,"190":1,"191":1}}],["enableerrorlog",{"2":{"125":1}}],["enablefullscreen",{"2":{"124":1}}],["enablehotkeys",{"2":{"124":1}}],["enablepermission",{"2":{"124":1,"176":1}}],["enablesubmenucollapsebutton",{"2":{"89":1,"124":1}}],["env",{"2":{"73":1,"77":1,"78":4,"123":3,"158":1,"197":3,"198":7}}],["ebc63",{"2":{"89":1}}],["eruda",{"2":{"123":3}}],["error",{"2":{"80":1,"125":2}}],["erp等多个不同领域的中后台系统中",{"2":{"6":1}}],["examplestore",{"2":{"267":2}}],["example",{"2":{"83":1,"144":1,"161":1,"162":1,"202":2,"262":4,"267":3,"269":2}}],["export",{"2":{"80":1,"161":1,"162":1,"163":1,"181":1,"208":3,"215":3,"222":2,"229":3,"236":3,"243":3,"267":1,"277":2,"278":2,"298":1}}],["ext",{"2":{"21":1,"29":1,"31":1}}],["emit",{"2":{"69":1}}],["eventbus",{"2":{"69":5}}],["events",{"0":{"17":1,"47":1,"53":1}}],["ep",{"2":{"33":1,"120":1,"271":5,"272":2}}],["else",{"2":{"215":2,"236":2}}],["elmessage",{"2":{"120":1}}],["el",{"2":{"33":7,"120":7}}],["elementlocaleja",{"2":{"141":2}}],["elementlocaleen",{"2":{"141":2}}],["elementlocalezhtw",{"2":{"141":2}}],["elementlocalezhcn",{"2":{"141":2}}],["elementplus",{"2":{"100":1}}],["element",{"2":{"4":1,"6":1,"33":8,"35":1,"100":21,"119":2,"120":5,"141":8,"206":2,"208":5,"209":1,"210":2,"211":1,"213":2,"215":5,"216":1,"217":2,"218":1,"220":2,"222":5,"223":1,"224":2,"225":1,"227":2,"229":3,"230":1,"231":2,"232":1,"234":2,"236":5,"237":1,"238":2,"239":1,"241":2,"243":5,"244":1,"245":2,"246":1}}],["osa",{"2":{"266":1}}],["old",{"2":{"197":1}}],["of",{"2":{"197":1}}],["official",{"2":{"204":1}}],["off",{"2":{"69":1}}],["options=",{"2":{"197":1}}],["options",{"2":{"120":2,"296":2}}],["open",{"2":{"77":2,"78":3,"123":1,"198":2}}],["overlay",{"2":{"100":1}}],["onsortchange",{"2":{"182":1}}],["onsizechange",{"2":{"182":1}}],["oncurrentchange",{"2":{"182":1}}],["only",{"2":{"153":1,"154":1,"265":1}}],["on",{"2":{"69":1}}],["one",{"0":{"5":1,"6":1},"2":{"0":6,"2":2,"3":1,"33":1,"117":2,"123":3,"131":1,"132":1,"147":1,"163":1,"201":1,"202":4,"295":2,"302":1,"303":1,"310":2}}],["out",{"2":{"53":1,"195":1,"197":1}}],["object",{"2":{"21":2,"29":2,"31":2,"51":1,"141":4,"174":1}}],["oa",{"2":{"6":1}}],["直到开发者修改完所有错误代码后",{"2":{"117":1}}],["直接点击安装即可",{"2":{"204":1}}],["直接修改构建产物的接口地址",{"0":{"198":1}}],["直接使用了",{"2":{"137":1}}],["直接覆盖",{"2":{"78":1}}],["直接要求后端开发人员来进行开发工作",{"2":{"5":1}}],["直播",{"2":{"6":1}}],["哪怕它提供的演示功能特别华丽",{"2":{"6":1}}],["没用在真实业务场景中使用过的框架都是纸飞机",{"2":{"6":1}}],["没有前端开发人员的小型公司",{"2":{"5":1}}],["业务页面里使用到的颜色将不能写成固定值",{"2":{"285":1}}],["业务场景无法落地",{"2":{"6":1}}],["业务应用静态页面",{"2":{"4":1}}],["导航也提供了各种展示形态的设置",{"2":{"309":1}}],["导航搜索",{"0":{"289":1}}],["导航入口",{"2":{"176":1}}],["导航里切换帐号查看不同权限下的效果",{"2":{"176":1}}],["导航权限有两种做法",{"2":{"175":1}}],["导航标记",{"2":{"173":1}}],["导航中显示的图标",{"2":{"171":1}}],["导航展示的标题",{"2":{"166":1}}],["导航配置",{"0":{"165":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1}}],["导航",{"0":{"159":1},"1":{"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1}}],["导航栏风格",{"0":{"282":1},"1":{"283":1,"284":1}}],["导航栏模式",{"0":{"149":1},"1":{"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1}}],["导航栏是否圆角",{"2":{"100":1,"284":1}}],["导航设置",{"0":{"142":1}}],["导航菜单收起时",{"2":{"97":2}}],["导航路由配置项",{"2":{"4":1}}],["导致工具栏被遮挡",{"2":{"92":2}}],["导致框架在实际使用中",{"2":{"6":1}}],["很少或者没有考虑后端的实现逻辑",{"2":{"6":1}}],["为分隔符",{"2":{"294":1}}],["为什么不是",{"0":{"310":1}}],["为什么不在生成文件的时候直接让我选择用哪种形式",{"2":{"182":1}}],["为什么有人说",{"2":{"195":1}}],["为什么本地开发环境首次载入很慢",{"0":{"195":1}}],["为什么选择我们",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1}}],["为什么选择",{"0":{"6":1}}],["为例",{"2":{"143":1}}],["为减轻后端处理",{"2":{"127":1,"192":1}}],["为框架的默认配置",{"2":{"124":1}}],["为必要配置",{"2":{"123":1}}],["为保证代码风格统一",{"2":{"113":1}}],["为主导航序列数",{"2":{"62":1}}],["为",{"2":{"40":1,"271":1}}],["为了让",{"2":{"80":1}}],["为了实现",{"2":{"34":1}}],["为了统一图标的使用",{"2":{"33":1}}],["为产品保驾护航",{"2":{"5":1}}],["什么状态下是请求异常",{"2":{"158":1}}],["什么项目都不用担心啦~",{"2":{"5":1}}],["什么场景需要",{"0":{"5":1}}],["手里有一套可高度定制化的中后台框架",{"2":{"5":1}}],["产品或者项目",{"2":{"199":1}}],["产品型公司最担心的就是产品开发中代码不可控的因素",{"2":{"5":1}}],["产品型公司",{"2":{"5":1}}],["产品生命周期内提供长期更新维护",{"2":{"2":1}}],["并不代表不支持颜色主题切换",{"2":{"293":1}}],["并不代表不支持国际化切换",{"2":{"291":1}}],["并选择使用方式为离线",{"2":{"273":1}}],["并缓存在",{"2":{"273":1}}],["并介绍一下这个标准模块有哪些特性",{"2":{"180":1}}],["并修改这个函数的请求地址",{"2":{"175":1}}],["并修改代码中的使用方式",{"2":{"100":1}}],["并返回外部变量",{"2":{"173":1}}],["并进行错误提示",{"2":{"158":1}}],["并进行了简单的封装",{"2":{"71":1}}],["并以中文",{"2":{"146":1}}],["并按照指引完成操作后",{"2":{"274":1}}],["并按照下面设置后",{"2":{"136":1}}],["并按照官方的使用方式引入图标",{"2":{"33":1}}],["并将字段类型设为",{"2":{"127":1,"192":1}}],["并将应用配置按钮从工具栏删除",{"2":{"105":2}}],["并分别修改这两个函数的请求地址",{"2":{"127":1,"192":1}}],["并写入下面的代码",{"2":{"100":1}}],["并在里面复制以下代码",{"2":{"181":1}}],["并在",{"2":{"100":1,"183":1,"197":1,"253":1}}],["并在调用接口的时候",{"2":{"80":1}}],["并在备注里留下手机",{"2":{"1":1}}],["并且主题在运行时共存",{"2":{"278":1}}],["并且想要在离线",{"2":{"273":1}}],["并且可以开始使用",{"2":{"211":1,"218":1,"225":1,"232":1,"239":1,"246":1}}],["并且可自定义扩展主题风格的样式",{"2":{"5":1}}],["并且删除会导致框架无法正常使用",{"2":{"209":1,"216":1,"223":1,"230":1,"237":1,"244":1}}],["并且演示源码中大量示例也使用了",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["并且在",{"2":{"204":1}}],["并且你也可以在项目中使用",{"2":{"199":1}}],["并且根据不同服务器配置不同的接口地址",{"2":{"198":1}}],["并且包含列表页",{"2":{"188":1}}],["并且还要在文件里写一些必要的代码",{"2":{"183":1}}],["并且也生成了",{"2":{"181":1}}],["并且同时也可以生成对应的",{"2":{"180":1}}],["并且将错误日志进行上报",{"2":{"125":1}}],["并且将代码中使用到",{"2":{"78":1}}],["并且如果你使用的是",{"2":{"124":1}}],["并且按照文档说明安装好相关软件及扩展",{"2":{"113":1}}],["并做相应动作",{"2":{"75":1}}],["并对框架部分组件样式进行了重构",{"2":{"100":1}}],["并对",{"2":{"75":1}}],["并配置了使用时自动引入",{"2":{"34":1}}],["并保证视觉上的一致性",{"2":{"34":1}}],["并自行替换",{"2":{"33":1}}],["并显示",{"2":{"10":1,"13":1}}],["而切换路由会导致之前页面上的数据丢失",{"2":{"310":1}}],["而劣势也是因为这种优势导致的",{"2":{"310":1}}],["而业务代码则可以直接拷贝过去",{"2":{"295":1}}],["而不是稳定版本",{"2":{"202":1}}],["而且大部分框架",{"2":{"199":1}}],["而当表单与当前列表页关联性较弱",{"2":{"182":1}}],["而是在生成好的代码文件里再进行配置",{"2":{"182":1}}],["而是通过调用全局",{"2":{"174":1}}],["而鉴权函数则更多是使用在业务流程代码里的权限判断",{"2":{"179":1}}],["而其余配置则在不同环境下有不同用途",{"2":{"123":1}}],["而无需手动注册",{"2":{"120":1}}],["而扩展组件有一部分是在",{"2":{"119":1}}],["而框架目录是",{"2":{"117":1}}],["而",{"2":{"80":1,"124":1}}],["而本框架在作者就职的公司",{"2":{"6":1}}],["而通过专业版提供的布局和主题风格",{"2":{"5":1}}],["而这些公司在开发中后台系统的时候",{"2":{"5":2}}],["甲方对页面布局和主题风格有绝对话语权",{"2":{"5":1}}],["周期短",{"2":{"5":1}}],["222b45",{"2":{"278":3}}],["28",{"2":{"148":1}}],["2fc11",{"2":{"109":1}}],["2655c",{"2":{"109":1}}],["2b5ca",{"2":{"109":1}}],["2bb50",{"2":{"97":1}}],["2ea5f",{"2":{"105":1}}],["215ef",{"2":{"100":1}}],["216ac",{"2":{"92":1}}],["2d642",{"2":{"100":1}}],["2ce2b",{"2":{"88":1}}],["2",{"0":{"94":1,"95":2,"96":1,"97":1,"102":1,"106":2,"107":1,"108":1,"109":2,"110":1,"111":1},"2":{"21":1,"29":1,"31":1,"78":5,"182":2,"297":1}}],["2名前端开发人员",{"2":{"5":1}}],["20+",{"2":{"204":1}}],["2022",{"2":{"130":1}}],["2021",{"2":{"130":1}}],["20",{"2":{"4":1}}],["几乎所有公司都缺前端",{"2":{"5":1}}],["的入口文件",{"2":{"311":1}}],["的特点",{"2":{"302":1}}],["的特性",{"2":{"297":1}}],["的插件一样更新",{"2":{"295":1}}],["的在线图标搜索网站",{"2":{"270":1}}],["的文件名",{"2":{"269":1}}],["的文件",{"2":{"267":1}}],["的文件夹",{"2":{"182":1}}],["的一员",{"2":{"267":1}}],["的一级导航在收起时展示和其他导航不一样的问题",{"2":{"91":1}}],["的同源策略",{"2":{"266":1}}],["的免登录页面地址",{"2":{"262":1}}],["的组件入口",{"2":{"259":1}}],["的写法和特性",{"2":{"256":1}}],["的效率",{"2":{"204":1}}],["的原因",{"2":{"195":1}}],["的方法",{"2":{"176":1}}],["的方式",{"2":{"78":1}}],["的地方引入",{"2":{"266":1}}],["的地方",{"2":{"147":1}}],["的还不行",{"2":{"142":1}}],["的日文语言包",{"2":{"141":1}}],["的语言包文件",{"2":{"141":1}}],["的两套字体",{"2":{"134":1}}],["的默认尺寸",{"2":{"100":1}}],["的主题",{"2":{"100":1}}],["的代码",{"2":{"100":1}}],["的展示逻辑",{"2":{"89":1}}],["的",{"2":{"73":1,"100":1,"123":3,"187":1,"204":1}}],["的易学习易上手特性",{"2":{"5":1}}],["的应用平台",{"2":{"3":1}}],["所在目录",{"2":{"117":1}}],["所设置的地址",{"2":{"77":1}}],["所以就不存在切换路由",{"2":{"310":1}}],["所以可以这样定义组件",{"2":{"298":1}}],["所以一旦下载开始使用",{"2":{"295":1}}],["所以此处需要开发者自行修改或者重新制作登录页",{"2":{"209":1,"216":1,"223":1,"230":1,"237":1,"244":1}}],["所以请谨慎使用",{"2":{"202":1}}],["所以请勿新增这里的配置项",{"2":{"191":1}}],["所以也是不能暴露给用户的",{"2":{"191":1}}],["所以即便是在新窗口里",{"2":{"182":1}}],["所以方便后期维护",{"2":{"182":1}}],["所以把翻页相关的东西都存放在",{"2":{"182":1}}],["所以没有权限的路由不会被注册",{"2":{"172":1}}],["所以在做国际化支持的时候",{"2":{"141":1}}],["所以在开发环境下即使开启错误日志也不会被启用",{"2":{"125":1}}],["所以需要通过",{"2":{"136":1}}],["所以不建议在同一域名部署太多套系统",{"2":{"266":1}}],["所以不建议在非英文环境中使用",{"2":{"134":1}}],["所以不建议在业务页面内使用",{"2":{"34":1}}],["所以框架集成了",{"2":{"117":1}}],["所以如果两个数据源的请求和响应是完全不同的标准",{"2":{"78":1}}],["所以实际是请求依旧是",{"2":{"77":1}}],["所以该文件拦截器部分的代码",{"2":{"75":1}}],["所以借助",{"2":{"5":1}}],["所有配置的导航模块均需要在",{"2":{"159":1}}],["所有配置项将都在一个",{"2":{"100":1}}],["所有的请求均会在请求头里带上",{"2":{"145":1}}],["所有",{"2":{"3":1}}],["据了解",{"2":{"5":1}}],["访问",{"2":{"4":2,"135":1,"136":1}}],["查看示例",{"2":{"144":1}}],["查看当前版本的完整配置作为参考",{"2":{"124":1}}],["查看",{"2":{"4":1}}],["可勾选多个窗口平均分布在页面中",{"2":{"307":1}}],["可自定义摆放位置和顺序",{"2":{"294":1}}],["可自行新建文件",{"2":{"253":1}}],["可自行新建文件夹分类管理",{"2":{"250":1}}],["可自行阅读理解",{"2":{"182":1}}],["可尝试删除根目录下",{"2":{"265":1}}],["可参考",{"2":{"259":1}}],["可参考以下设置",{"2":{"146":1}}],["可直接用于实际开发",{"2":{"202":1}}],["可直接测试效果",{"2":{"113":1}}],["可能在开发环境操作会有些许卡顿",{"2":{"204":1}}],["可能一开始是一个很简单的表单",{"2":{"182":1}}],["可能有人会有疑问",{"2":{"182":1}}],["可能会出现无法预知的问题",{"2":{"265":1}}],["可能会存在一些问题",{"2":{"202":1}}],["可能会影响到别人的开发体验",{"2":{"117":1}}],["可能会在设计框架的时候",{"2":{"6":1}}],["可实现动态切换",{"2":{"278":1}}],["可实现接近于",{"2":{"256":1}}],["可实现",{"2":{"148":1,"149":1}}],["可访问",{"2":{"144":1}}],["可点击这里查看",{"2":{"141":1}}],["可选择自己适合的方案",{"2":{"254":1}}],["可选设置的值参考",{"2":{"140":1}}],["可选值",{"2":{"10":1,"13":1,"16":1,"19":1,"21":1,"23":1,"27":1,"29":1,"31":1,"37":1,"40":1,"43":1,"45":1,"49":1,"51":1,"55":1,"57":1,"278":1}}],["可在该导航里设置",{"2":{"142":1}}],["可在",{"2":{"125":1}}],["可在接口调用处删除",{"2":{"81":1}}],["可防止被调试",{"2":{"123":3}}],["可设置",{"2":{"123":3}}],["可忽略无需做代码规范校验的文件",{"2":{"116":1}}],["可执行",{"2":{"84":1}}],["可应对绝大部分甲方需求",{"2":{"5":1}}],["可以和普通的",{"2":{"298":1}}],["可以协助升级工作开展",{"2":{"295":1}}],["可以清晰的列出文件夹内所有文件的差异",{"2":{"295":1}}],["可以清楚知道改动了哪些",{"2":{"295":1}}],["可以帮助你快速上手",{"2":{"267":1}}],["可以尝试执行",{"2":{"265":1}}],["可以看到",{"2":{"261":1}}],["可以访问此仓库查看示例源码",{"2":{"212":1,"219":1,"226":1,"233":1,"240":1,"247":1}}],["可以点这里去购买",{"2":{"203":1}}],["可以自行扩展",{"2":{"198":1}}],["可以浏览下这个",{"2":{"194":1}}],["可以通过下面两种方式获取",{"2":{"201":1}}],["可以通过弹窗或抽屉的形式打开详情页",{"2":{"182":1}}],["可以通过",{"2":{"127":1,"192":1}}],["可以通过参考任何一份方案",{"2":{"33":1}}],["可以开启偏好设置",{"2":{"123":1}}],["可以使用新建窗口的形式",{"2":{"182":1}}],["可以使用",{"2":{"120":1}}],["可以使用插槽代替",{"2":{"33":1,"120":1}}],["可以查阅",{"2":{"115":1,"116":1}}],["可以参考",{"2":{"100":1}}],["可以阅读这篇",{"2":{"271":1}}],["可以阅读",{"2":{"100":1}}],["可以执行",{"2":{"83":1}}],["可以在项目中进行调整",{"2":{"305":1}}],["可以在",{"2":{"118":1,"124":1}}],["可以在代码控制台查看日志信息",{"2":{"80":1}}],["可以在拦截器里用统一的报错提示来展示",{"2":{"75":1}}],["可以设置",{"2":{"77":1}}],["可以到",{"2":{"35":1,"119":1}}],["可以让后端开发人员能在短时间内转型成为全栈开发",{"2":{"5":1}}],["可以先扫下面这个二维码领取红包",{"2":{"2":1}}],["可删除",{"2":{"4":1}}],["国际化选择器",{"0":{"24":1},"1":{"25":1}}],["国际化",{"0":{"138":1,"291":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1},"2":{"4":1,"166":1,"169":1,"291":1}}],["a8a29e",{"2":{"277":3,"278":3}}],["a808f",{"2":{"99":1}}],["auto",{"2":{"256":1,"257":1,"297":1}}],["auth=",{"2":{"178":2}}],["auth>",{"2":{"177":5}}],["auth",{"0":{"12":1,"172":1},"1":{"13":1,"14":1},"2":{"60":2,"177":3,"178":3,"179":3}}],["authall>",{"2":{"177":1}}],["authall",{"0":{"9":1},"1":{"10":1,"11":1},"2":{"60":2,"177":2,"179":2}}],["alt",{"2":{"255":1}}],["algorithm",{"2":{"208":2}}],["allow",{"2":{"265":1}}],["allowjs",{"2":{"199":1}}],["allocation",{"2":{"197":1}}],["all>",{"2":{"191":1}}],["all=",{"2":{"178":1}}],["all",{"2":{"100":1,"124":1,"125":1,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"140":2,"146":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"175":1,"176":1,"178":1,"190":1,"192":1,"255":1,"264":1,"266":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"300":1}}],["ally",{"2":{"93":1,"139":1}}],["active",{"2":{"277":12,"278":18}}],["action",{"2":{"8":1,"21":1,"29":1,"31":1}}],["actioncontainer",{"0":{"7":1},"1":{"8":1}}],["aconfigprovider>",{"2":{"208":2,"215":2}}],["aconfigprovider",{"2":{"208":2,"215":2}}],["accept",{"2":{"145":1}}],["account",{"2":{"143":1,"182":1}}],["animate",{"2":{"255":3}}],["any",{"2":{"141":1,"198":1,"208":1,"215":1,"222":1,"229":1,"236":1,"243":1}}],["antdesignvuelocalezhcn",{"2":{"208":2}}],["antd",{"2":{"208":4}}],["antfu",{"2":{"115":1}}],["ant",{"0":{"206":1},"1":{"207":1,"208":1,"209":1,"210":1,"211":1,"212":1},"2":{"33":1,"100":1,"206":1,"207":2,"208":10,"211":2}}],["abea5",{"2":{"105":1}}],["assign",{"2":{"141":4}}],["assets",{"2":{"100":4,"137":3,"157":1,"250":1,"253":2,"269":2}}],["as",{"2":{"100":3,"198":1,"243":2}}],["a7505",{"2":{"97":1}}],["a1a81",{"2":{"88":1}}],["app",{"2":{"73":2,"77":2,"78":7,"83":2,"100":1,"123":21,"124":1,"125":1,"140":1,"143":2,"146":1,"175":2,"176":1,"191":3,"198":2,"208":8,"215":10,"222":8,"229":8,"236":10,"243":8,"264":1,"266":1,"277":2,"278":4,"279":1,"280":1,"281":1,"300":1}}],["api2",{"2":{"78":2}}],["api",{"0":{"58":1,"296":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"297":1,"298":1},"2":{"4":1,"59":4,"73":6,"74":4,"75":1,"76":1,"77":7,"78":18,"80":4,"123":4,"127":1,"158":2,"174":1,"175":1,"176":1,"192":1,"198":6,"296":5,"297":4}}],["axios",{"2":{"71":1,"73":1,"75":4,"78":2,"105":2,"123":3,"198":1}}],["addicondefinitions",{"2":{"222":4}}],["addeventlistener",{"2":{"215":2,"236":2}}],["add",{"2":{"64":2,"77":2,"197":1,"207":1,"214":1,"221":1,"228":1,"235":1,"242":1}}],["admin",{"0":{"5":1,"6":1,"309":1,"310":1},"2":{"0":10,"2":2,"3":1,"33":1,"117":2,"123":3,"131":1,"132":1,"147":1,"163":1,"176":1,"201":1,"202":4,"295":2,"302":1,"303":1,"309":1,"310":3}}],["arrow",{"2":{"271":2,"272":2,"283":1}}],["array",{"2":{"10":2,"13":2,"21":2,"29":1,"31":2,"43":1,"49":1,"51":1,"172":1}}],["archive",{"2":{"123":2}}],["arcovue",{"2":{"215":4}}],["arco",{"0":{"213":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1,"219":1},"2":{"33":1,"100":1,"213":1,"214":2,"215":14,"218":2}}],["窗口即组件",{"2":{"311":1}}],["窗口排序",{"0":{"308":1}}],["窗口默认宽度为",{"2":{"305":1}}],["窗口最大化",{"0":{"305":1}}],["窗口预览",{"0":{"287":1}}],["窗口预览模式",{"2":{"4":1}}],["窗口外部传入参数",{"2":{"174":1}}],["窗口宽度",{"2":{"168":1}}],["窗口宽度改为在配置文件全局设置",{"2":{"89":1}}],["窗口宽度改为配置文件全局设置",{"2":{"89":1}}],["窗口组件名",{"2":{"167":1}}],["窗口刷新",{"0":{"68":1}}],["窗口全屏切换",{"0":{"66":1}}],["窗口标题",{"2":{"64":1}}],["窗口拖拽排序",{"2":{"4":1}}],["窗口专注模式",{"2":{"4":1}}],["窗口右键功能",{"2":{"4":1}}],["窗口",{"0":{"63":1,"311":1},"1":{"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"4":1}}],["800px",{"2":{"305":1}}],["8192",{"2":{"197":1}}],["8bc65",{"2":{"110":1}}],["8aba7",{"2":{"110":1}}],["831ab",{"2":{"105":1}}],["83dd8",{"2":{"88":1}}],["87963",{"2":{"105":1}}],["874e3",{"2":{"100":1}}],["8f597",{"2":{"93":1}}],["843cf6",{"2":{"19":1}}],["8",{"2":{"4":1}}],["个图标可以免费使用",{"2":{"270":1}}],["个数据源",{"2":{"78":1}}],["个组件",{"2":{"33":1,"120":1}}],["个",{"2":{"4":4}}],["个人设置",{"2":{"143":1}}],["个人设置窗口补充",{"2":{"109":1}}],["个人开发者",{"2":{"5":1}}],["个人",{"2":{"2":1}}],["60",{"2":{"198":1}}],["6fff3",{"2":{"105":1}}],["6720a",{"2":{"100":1}}],["66160",{"2":{"100":1}}],["66d9e",{"2":{"97":1}}],["6c92d",{"2":{"93":1}}],["6258e",{"2":{"88":1}}],["6",{"0":{"89":1},"2":{"4":2,"148":1,"278":1,"309":1}}],["暗黑模式",{"2":{"279":1}}],["暗黑",{"2":{"4":2}}],["款导航栏风格以及",{"2":{"309":1}}],["款导航栏模式",{"2":{"309":1}}],["款主题配色",{"2":{"309":1}}],["款主题",{"2":{"148":1,"278":1}}],["款",{"2":{"4":4,"278":1}}],["套图标集",{"2":{"270":1}}],["套",{"2":{"4":2}}],["组件来展示",{"2":{"272":1}}],["组件使用了",{"2":{"269":1}}],["组件文件",{"2":{"183":1}}],["组件文件列表增加下载功能",{"2":{"89":2}}],["组件等文件",{"2":{"183":1}}],["组件进行展示",{"2":{"171":1}}],["组件上进行了二次开发",{"2":{"119":1}}],["组件上二次封装的组件",{"2":{"35":1}}],["组件外边框的临时解决方案",{"2":{"105":1}}],["组件未展示",{"2":{"99":2}}],["组件样式错乱",{"2":{"96":1}}],["组件支持传入本地图片",{"2":{"88":2}}],["组件源码完全开放",{"2":{"35":1,"119":1}}],["组件的",{"2":{"33":1}}],["组件",{"0":{"258":1,"298":1},"1":{"259":1,"260":1},"2":{"19":1,"88":1,"105":5,"177":1,"209":1,"216":1,"223":1,"230":1,"237":1,"244":1,"259":1,"272":1}}],["组件库替换为",{"2":{"211":1,"218":1,"225":1,"232":1,"239":1,"246":1}}],["组件库解耦",{"2":{"100":1}}],["组件库可替换",{"2":{"34":1}}],["组件库",{"2":{"4":1,"100":1,"206":1,"211":1,"213":1,"218":1,"220":1,"225":1,"227":1,"232":1,"234":1,"239":1,"241":1,"246":1}}],["组织账号数",{"2":{"2":1}}],["组织的开发者账号",{"2":{"2":1}}],["组织",{"2":{"2":1}}],["vxpconfigprovider>",{"2":{"243":2}}],["vxpconfigprovider",{"2":{"243":2}}],["vxp",{"2":{"243":2}}],["volar",{"2":{"229":2}}],["vs",{"2":{"204":1}}],["vscode",{"0":{"139":1},"2":{"93":1,"100":1,"139":1}}],["v3",{"2":{"195":1,"205":1}}],["v4",{"2":{"150":1,"151":1,"152":1,"153":1,"154":1,"206":2,"213":2,"220":2,"227":2,"234":2,"241":2,"283":1}}],["vconsole",{"2":{"123":3}}],["visible",{"2":{"182":1}}],["visual",{"2":{"113":1,"124":1,"204":4}}],["views",{"2":{"144":1,"181":4,"182":1,"184":1,"185":1,"262":1,"290":2,"311":1}}],["vite",{"2":{"4":1,"73":2,"77":6,"78":12,"79":1,"80":1,"81":1,"83":1,"85":4,"86":1,"98":4,"105":2,"123":31,"195":6,"197":1,"198":4,"205":1,"265":1}}],["v1",{"0":{"112":1}}],["val",{"2":{"222":1}}],["value=",{"2":{"177":3}}],["value",{"2":{"10":1,"13":1,"49":2,"57":1,"266":2,"297":1}}],["vars",{"2":{"100":2}}],["var",{"2":{"100":2}}],["vertical",{"2":{"55":1}}],["vexipinstall",{"2":{"243":4}}],["vexip",{"0":{"241":1},"1":{"242":1,"243":1,"244":1,"245":1,"246":1,"247":1},"2":{"33":1,"100":1,"241":1,"242":2,"243":7,"246":2}}],["v",{"2":{"23":1,"29":1,"31":1,"43":1,"97":3,"178":5}}],["vue2",{"2":{"296":1}}],["vuex",{"2":{"267":1}}],["vue3",{"2":{"267":1,"296":1,"297":1}}],["vuejs",{"2":{"267":1}}],["vue",{"0":{"206":1,"213":1},"1":{"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1},"2":{"4":1,"5":1,"33":3,"100":3,"125":1,"138":1,"144":1,"181":3,"182":2,"196":1,"197":1,"204":6,"205":2,"206":1,"207":2,"208":16,"211":2,"213":1,"214":2,"215":14,"218":2,"222":6,"229":6,"235":1,"236":20,"243":6,"254":1,"255":1,"256":1,"257":1,"259":2,"262":1,"267":1,"269":1,"271":4,"272":3,"290":2,"297":4,"298":3,"301":1,"311":1}}],["334067",{"2":{"278":4}}],["33add",{"2":{"92":1}}],["39d56",{"2":{"108":1}}],["3fa26",{"2":{"105":1}}],["38efb",{"2":{"105":1}}],["38e3f",{"2":{"105":1}}],["38039",{"2":{"98":1}}],["3837a",{"2":{"89":1}}],["3d58e",{"2":{"97":1}}],["3bd3b",{"2":{"96":1}}],["3c299",{"2":{"90":1}}],["3a6d7",{"2":{"89":1}}],["360",{"2":{"55":1}}],["301d7",{"2":{"105":1}}],["306f3",{"2":{"90":1}}],["30",{"2":{"49":1}}],["3",{"0":{"93":1,"94":1,"101":2,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"4":2,"21":1,"31":1,"49":1,"195":3,"205":1,"298":2,"309":1}}],["⭐",{"2":{"147":1}}],["⭐⭐⭐⭐⭐",{"2":{"147":1}}],["⭐功能与服务⭐",{"2":{"4":1}}],["⭐服务⭐",{"2":{"2":1}}],["虚拟物品不支持退货退款",{"2":{"3":1}}],["商业信息丢失或任何其它经济损失",{"2":{"3":1}}],["商业赢利丧失",{"2":{"3":1}}],["贸易中断",{"2":{"3":1}}],["包括但不限于个人损害",{"2":{"3":1}}],["包含全部源码",{"2":{"3":1}}],["进而扩展了页面缓存和标签栏的特性",{"2":{"310":1}}],["进行样式编写",{"2":{"285":1}}],["进行安装依赖",{"2":{"265":1}}],["进行业务开发了",{"2":{"211":1,"218":1,"225":1,"232":1,"239":1,"246":1}}],["进行开发工作了",{"2":{"147":1}}],["进行开发",{"2":{"139":1,"199":1,"296":1}}],["进行一次格式校验",{"2":{"115":1,"116":1}}],["进行二次转售或发布",{"2":{"3":1}}],["进入专业版开发者私有组织",{"2":{"1":1}}],["不到万不得已不建议频繁更新",{"2":{"295":1}}],["不仅我们的框架如此",{"2":{"295":1}}],["不仅能提高项目开发效率",{"2":{"5":1}}],["不够用的情况",{"2":{"266":1}}],["不可删减",{"2":{"294":1}}],["不可避免会出现",{"2":{"266":1}}],["不可以用于任何形式的开源项目",{"2":{"3":1}}],["不是内部或外部命令",{"2":{"265":1}}],["不过由于安装",{"2":{"204":1}}],["不含示例代码",{"2":{"202":1}}],["不管个人还是团队",{"2":{"199":1}}],["不同的历史模式",{"2":{"196":1}}],["不需要的选项可以在这里注释掉",{"2":{"191":1}}],["不需要手动重启",{"2":{"80":1}}],["不会",{"0":{"199":1}}],["不会出现每个人做出来的模块风格都不一样",{"2":{"182":1}}],["不会被服务端的开发所阻塞",{"2":{"79":1}}],["不具备该权限又是如何显示",{"2":{"177":1}}],["不能重复",{"2":{"161":1}}],["不生效的问题",{"2":{"105":2}}],["不然线上环境将会报错",{"2":{"81":1}}],["不定期增加新特性",{"2":{"6":1}}],["不得直接对本产品",{"2":{"3":1}}],["不限制域名和项目数量",{"2":{"3":1}}],["本框架继承了",{"2":{"309":1}}],["本框架除了提供完善的开发文档和代码注释外",{"2":{"5":1}}],["本文适用于",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["本身也有自己的语言包",{"2":{"141":1}}],["本产品的源码",{"2":{"3":1}}],["本产品购买后可用于开发商业项目",{"2":{"3":1}}],["本价格不参与任何限时优惠活动",{"2":{"0":3}}],["禁止用于黄赌毒等危害国家安全与稳定的网站",{"2":{"3":1}}],["符合国家法律法规",{"2":{"3":1}}],["价格已含税",{"2":{"2":1}}],["支持多个权限叠加",{"2":{"172":1}}],["支持设置",{"2":{"166":1}}],["支持使用",{"2":{"100":1}}],["支持工具栏自定义布局",{"2":{"98":1}}],["支持次导航收起时",{"2":{"98":1}}],["支持动态更新",{"2":{"97":1}}],["支持动态切换",{"2":{"97":2}}],["支持",{"2":{"93":1,"111":2,"123":4}}],["支持单独设置窗口宽度",{"2":{"89":1}}],["支持水平",{"2":{"55":1}}],["支持一维数组和对象数组",{"2":{"49":1}}],["支持的文件类型",{"2":{"21":1,"29":1,"31":1}}],["支持部分",{"2":{"4":2}}],["支持开普票",{"2":{"2":1}}],["支付方式",{"0":{"2":1}}],["支付成功后需提供",{"2":{"1":1}}],["✅",{"2":{"2":2,"4":22}}],["5m",{"2":{"266":2}}],["500px",{"2":{"256":2,"257":1}}],["50+",{"2":{"33":1,"120":1}}],["5xl",{"2":{"255":1}}],["56855",{"2":{"110":1}}],["5f9f1",{"2":{"100":1}}],["5f4d6",{"2":{"88":1}}],["5c9ba",{"2":{"97":1}}],["5e61c",{"2":{"97":1}}],["51e90",{"2":{"90":1}}],["5",{"0":{"90":1},"2":{"2":1,"4":2,"150":1,"151":1,"152":1,"153":1,"154":1,"183":3,"283":1,"309":1}}],["1s",{"2":{"255":1}}],["18+",{"2":{"204":1}}],["13b2c",{"2":{"111":1}}],["1cd93",{"2":{"108":1}}],["1d1e1f",{"2":{"100":1}}],["1d900",{"2":{"92":1}}],["141414",{"2":{"100":1,"277":6,"278":6}}],["1441c",{"2":{"91":1}}],["1921b",{"2":{"92":1}}],["15191e",{"2":{"277":1,"278":1}}],["15a3f",{"2":{"88":1}}],["150",{"2":{"29":2,"31":2}}],["10415",{"2":{"90":1}}],["10",{"2":{"74":1,"80":2}}],["100+",{"2":{"270":1}}],["1000",{"2":{"198":1}}],["10000",{"2":{"78":1}}],["100",{"2":{"49":1,"229":2,"270":1}}],["12",{"2":{"4":1,"278":1}}],["1",{"0":{"91":1,"96":1,"98":1,"99":1,"101":1,"102":1,"103":2,"104":1,"107":1,"110":1},"2":{"2":1,"4":2,"49":1,"74":1,"80":2,"255":1}}],["允许加入",{"2":{"2":1}}],[">新增部门",{"2":{"178":3}}],[">编辑",{"2":{"33":1,"120":1}}],[">",{"2":{"2":1,"33":3,"120":3,"177":6,"178":3,"198":2,"208":6,"215":6,"222":6,"229":8,"236":6,"243":6,"255":3,"269":2,"271":8,"272":2,"294":1,"297":1,"298":3,"301":1}}],["同一域名下的",{"2":{"266":1}}],["同演示站",{"2":{"202":1}}],["同样你在",{"2":{"182":1}}],["同时也减轻了开发人员的开发成本",{"2":{"310":1}}],["同时也确保多人协作开发的时候有个统一标准",{"2":{"182":1}}],["同时得益于",{"2":{"297":1}}],["同时请保证文件名和文件内唯一id保持一致",{"2":{"267":1}}],["同时框架",{"2":{"195":1}}],["同时提供了搜索和删除的功能",{"2":{"180":1}}],["同时还增加了一个",{"2":{"266":1}}],["同时还可在应用配置里设置默认语言",{"2":{"140":1}}],["同时还大大减轻前端开发人员工作压力",{"2":{"5":1}}],["同时在",{"2":{"78":1}}],["同时考虑到人员流动",{"2":{"2":1}}],["同意邀请后",{"2":{"1":1}}],["需开发者自行实现",{"2":{"290":1}}],["需在工具栏开启",{"2":{"126":1}}],["需注意",{"2":{"78":1}}],["需执行",{"2":{"33":1}}],["需保留",{"2":{"4":1}}],["需由购买者自行承担",{"2":{"3":1}}],["需要做什么操作就进入不同的页面",{"2":{"310":1}}],["需要做一些额外的配置",{"2":{"273":1}}],["需要注意以下两点",{"2":{"271":1}}],["需要注意一点",{"2":{"81":1}}],["需要删除",{"2":{"208":3,"215":3,"222":3,"229":1,"236":3,"243":3}}],["需要自行准备相关可访问外网的工具",{"2":{"204":1}}],["需要访问",{"2":{"204":1}}],["需要使用",{"2":{"204":1}}],["需要手动进行修改",{"2":{"176":1}}],["需要重新启动项目才会生效",{"2":{"141":1}}],["需要在本地依次安装好",{"2":{"204":1}}],["需要在配置",{"2":{"80":1}}],["需要在",{"2":{"78":1}}],["需要开发者根据实际情况去修改调整",{"2":{"75":1}}],["需要储存的数据",{"2":{"51":1}}],["需要鉴权的",{"2":{"11":1,"14":1}}],["需要可以更换加入到",{"2":{"2":1}}],["需要都能加入到",{"2":{"2":1}}],["需提供你的",{"2":{"1":1}}],["团队代码规范",{"2":{"4":1}}],["团队",{"2":{"2":1}}],["团队版",{"2":{"2":2}}],["团队购买",{"2":{"2":1}}],["企业",{"2":{"2":3}}],["限时优惠",{"2":{"2":2}}],["若你打算使用支付宝进行付款",{"2":{"2":1}}],["领红包",{"2":{"2":1}}],["获取源码的方式和基础版一致",{"2":{"203":1}}],["获取源码",{"2":{"1":1}}],["平台",{"2":{"1":1}}],["用法说明",{"0":{"181":1},"1":{"182":1}}],["用于分隔左右两侧的工具栏",{"2":{"294":1}}],["用于菜单",{"2":{"93":1}}],["用于接收框架相关通知公告的唯一方式",{"2":{"1":1}}],["用户必须具备全部权限",{"2":{"177":1,"178":1,"179":1}}],["用户只要具备其中任何一个权限",{"2":{"177":1,"178":1,"179":1}}],["用户在登录时",{"2":{"172":1}}],["用户访问使用了自定义字体的页面时",{"2":{"134":1}}],["用户偏好设置默认存储在浏览器本地",{"2":{"192":1}}],["用户偏好设置",{"0":{"189":1},"1":{"190":1,"191":1,"192":1},"2":{"4":1,"123":1}}],["用户名登录",{"2":{"176":1}}],["用户名",{"2":{"1":2,"143":1}}],["授权邮箱号",{"2":{"1":1}}],["付款截图凭证",{"2":{"1":1}}],["邮箱等任意一种联系方式",{"2":{"1":1}}],["微信",{"2":{"1":1}}],["请按模块进行区分",{"2":{"267":1}}],["请到专业版仓库下载框架源码",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["请拉取框架源码分支",{"2":{"206":1,"213":1,"220":1,"227":1,"234":1,"241":1}}],["请勿在窗口组件内使用",{"2":{"311":1}}],["请勿在该文件内修改",{"2":{"124":1}}],["请勿使用该方案",{"2":{"265":1}}],["请勿使用",{"2":{"265":1}}],["请勿新增其他选项",{"2":{"191":1}}],["请先详细阅读",{"2":{"183":1}}],["请先加作者微信进行在线咨询",{"2":{"1":1}}],["请输入模块中文名称",{"2":{"181":1}}],["请输入窗口组件名称",{"2":{"181":1}}],["请选择需要创建的模式",{"2":{"181":1}}],["请设置为箭头函数形式",{"2":{"173":1}}],["请阅读",{"2":{"123":1}}],["请在项目根目录下依次执行以下命令",{"2":{"265":1}}],["请在这里扩展",{"2":{"143":1}}],["请在",{"2":{"117":1}}],["请确保手上已经有",{"2":{"201":1}}],["请确保在安装依赖前",{"2":{"117":1}}],["请确保已阅读",{"2":{"113":1}}],["请使用",{"2":{"113":1}}],["请彻底关闭线上环境",{"2":{"81":1}}],["请求返回的数据就是导航数据",{"2":{"175":1}}],["请求第",{"2":{"78":1}}],["请求默认数据源",{"2":{"78":1}}],["请求",{"2":{"74":2,"77":1,"78":1}}],["请求可使用以下的方法",{"2":{"74":1}}],["请求调用",{"0":{"74":1}}],["请加作者微信进行购买",{"2":{"0":3}}],["购买者需保证不传播产品源码",{"2":{"3":1}}],["购买者可将本产品用于任意",{"2":{"3":1}}],["购买流程",{"0":{"1":1}}],["购买专业版的用户可以加我微信直接和我一对一沟通使用问题",{"2":{"314":1}}],["购买专业版",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1}}],["=",{"2":{"0":3}}],["¥3599",{"2":{"2":1}}],["¥699",{"2":{"2":1}}],["¥2799",{"2":{"2":1}}],["¥2797",{"2":{"0":1}}],["¥2198",{"2":{"0":1}}],["¥899",{"2":{"0":1}}],["¥599",{"2":{"0":2}}],["¥1499",{"2":{"0":1}}],["¥1598",{"2":{"0":1}}],["¥1299",{"2":{"0":1}}],["¥1199",{"2":{"0":2}}],["¥999",{"2":{"0":3,"2":1}}],["+",{"2":{"0":8}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.C8JYv8Jy.js b/assets/chunks/VPLocalSearchBox.C8JYv8Jy.js new file mode 100644 index 00000000..582ae359 --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.C8JYv8Jy.js @@ -0,0 +1,7 @@ +var Ft=Object.defineProperty;var Ot=(a,e,t)=>e in a?Ft(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Ce=(a,e,t)=>Ot(a,typeof e!="symbol"?e+"":e,t);import{X as Rt,s as ne,h as ve,al as et,am as Ct,an as Mt,v as je,ao as At,d as Lt,G as ye,ap as tt,aq as Dt,ar as zt,x as Pt,as as Vt,y as Me,R as de,Q as we,at as jt,au as $t,Y as Bt,U as Wt,a1 as Kt,o as Q,b as Jt,j as x,a2 as Ut,k as D,av as qt,aw as Gt,ax as Qt,c as Z,n as st,e as _e,E as nt,F as it,a as he,t as fe,ay as Ht,p as Yt,l as Zt,az as rt,a4 as Xt,ab as es,ah as ts,aA as ss,_ as ns}from"./framework.Bhh1y9_T.js";import{u as is,c as rs}from"./theme.CuJNMu0w.js";const as={root:()=>Rt(()=>import("./@localSearchIndexroot.DVgFrklj.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var mt=["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])"],Ie=mt.join(","),gt=typeof Element>"u",re=gt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!gt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},ke=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},os=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},bt=function(e,t,s){if(ke(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ie));return t&&re.call(e,Ie)&&n.unshift(e),n=n.filter(s),n},yt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!ke(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),c=o.length?o:i.children,l=a(c,!0,s);s.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=re.call(i,Ie);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var v=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),f=!ke(v,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(v&&f){var b=a(v===!0?i.children:v.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||os(e))&&!wt(e)?0:e.tabIndex},cs=function(e,t){var s=ie(e);return s<0&&t&&!wt(e)?0:s},ls=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},_t=function(e){return e.tagName==="INPUT"},us=function(e){return _t(e)&&e.type==="hidden"},ds=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},hs=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(re.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var c=e.parentElement,l=Ne(e);if(c&&!c.shadowRoot&&n(c)===!0)return at(e);e.assignedSlot?e=e.assignedSlot:!c&&l!==e.ownerDocument?e=l.host:e=c}e=o}if(ms(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return at(e);return!1},bs=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},ws=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,c=cs(o,i),l=i?a(n.candidates):o;c===0?i?t.push.apply(t,l):t.push(o):s.push({documentOrder:r,tabIndex:c,item:n,isScope:i,content:l})}),s.sort(ls).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},_s=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:$e.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:ys}):s=bt(e,t.includeContainer,$e.bind(null,t)),ws(s)},xs=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:Fe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=bt(e,t.includeContainer,Fe.bind(null,t)),s},ae=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return re.call(e,Ie)===!1?!1:$e(t,e)},Ss=mt.concat("iframe").join(","),Ae=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return re.call(e,Ss)===!1?!1:Fe(t,e)};/*! +* focus-trap 7.5.4 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function ot(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(a);e&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(a,n).enumerable})),t.push.apply(t,s)}return t}function ct(a){for(var e=1;e0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Ns=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},ks=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},me=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Fs=function(e){return me(e)&&!e.shiftKey},Os=function(e){return me(e)&&e.shiftKey},ut=function(e){return setTimeout(e,0)},dt=function(e,t){var s=-1;return e.every(function(n,r){return t(n)?(s=r,!1):!0}),s},pe=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1?m-1:0),E=1;E=0)u=s.activeElement;else{var d=i.tabbableGroups[0],m=d&&d.firstTabbableNode;u=m||h("fallbackFocus")}if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},f=function(){if(i.containerGroups=i.containers.map(function(u){var d=_s(u,r.tabbableOptions),m=xs(u,r.tabbableOptions),S=d.length>0?d[0]:void 0,E=d.length>0?d[d.length-1]:void 0,k=m.find(function(p){return ae(p)}),F=m.slice().reverse().find(function(p){return ae(p)}),M=!!d.find(function(p){return ie(p)>0});return{container:u,tabbableNodes:d,focusableNodes:m,posTabIndexesFound:M,firstTabbableNode:S,lastTabbableNode:E,firstDomTabbableNode:k,lastDomTabbableNode:F,nextTabbableNode:function(g){var N=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,O=d.indexOf(g);return O<0?N?m.slice(m.indexOf(g)+1).find(function(P){return ae(P)}):m.slice(0,m.indexOf(g)).reverse().find(function(P){return ae(P)}):d[O+(N?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(u){return u.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(u){return u.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.")},b=function T(u){var d=u.activeElement;if(d)return d.shadowRoot&&d.shadowRoot.activeElement!==null?T(d.shadowRoot):d},y=function T(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){T(v());return}u.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=u,Ns(u)&&u.select()}},_=function(u){var d=h("setReturnFocus",u);return d||(d===!1?!1:u)},w=function(u){var d=u.target,m=u.event,S=u.isBackward,E=S===void 0?!1:S;d=d||xe(m),f();var k=null;if(i.tabbableGroups.length>0){var F=l(d,m),M=F>=0?i.containerGroups[F]:void 0;if(F<0)E?k=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:k=i.tabbableGroups[0].firstTabbableNode;else if(E){var p=dt(i.tabbableGroups,function(I){var L=I.firstTabbableNode;return d===L});if(p<0&&(M.container===d||Ae(d,r.tabbableOptions)&&!ae(d,r.tabbableOptions)&&!M.nextTabbableNode(d,!1))&&(p=F),p>=0){var g=p===0?i.tabbableGroups.length-1:p-1,N=i.tabbableGroups[g];k=ie(d)>=0?N.lastTabbableNode:N.lastDomTabbableNode}else me(m)||(k=M.nextTabbableNode(d,!1))}else{var O=dt(i.tabbableGroups,function(I){var L=I.lastTabbableNode;return d===L});if(O<0&&(M.container===d||Ae(d,r.tabbableOptions)&&!ae(d,r.tabbableOptions)&&!M.nextTabbableNode(d))&&(O=F),O>=0){var P=O===i.tabbableGroups.length-1?0:O+1,V=i.tabbableGroups[P];k=ie(d)>=0?V.firstTabbableNode:V.firstDomTabbableNode}else me(m)||(k=M.nextTabbableNode(d))}}else k=h("fallbackFocus");return k},R=function(u){var d=xe(u);if(!(l(d,u)>=0)){if(pe(r.clickOutsideDeactivates,u)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}pe(r.allowOutsideClick,u)||u.preventDefault()}},C=function(u){var d=xe(u),m=l(d,u)>=0;if(m||d instanceof Document)m&&(i.mostRecentlyFocusedNode=d);else{u.stopImmediatePropagation();var S,E=!0;if(i.mostRecentlyFocusedNode)if(ie(i.mostRecentlyFocusedNode)>0){var k=l(i.mostRecentlyFocusedNode),F=i.containerGroups[k].tabbableNodes;if(F.length>0){var M=F.findIndex(function(p){return p===i.mostRecentlyFocusedNode});M>=0&&(r.isKeyForward(i.recentNavEvent)?M+1=0&&(S=F[M-1],E=!1))}}else i.containerGroups.some(function(p){return p.tabbableNodes.some(function(g){return ie(g)>0})})||(E=!1);else E=!1;E&&(S=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(S||i.mostRecentlyFocusedNode||v())}i.recentNavEvent=void 0},J=function(u){var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=u;var m=w({event:u,isBackward:d});m&&(me(u)&&u.preventDefault(),y(m))},H=function(u){if(ks(u)&&pe(r.escapeDeactivates,u)!==!1){u.preventDefault(),o.deactivate();return}(r.isKeyForward(u)||r.isKeyBackward(u))&&J(u,r.isKeyBackward(u))},W=function(u){var d=xe(u);l(d,u)>=0||pe(r.clickOutsideDeactivates,u)||pe(r.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},j=function(){if(i.active)return lt.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?ut(function(){y(v())}):y(v()),s.addEventListener("focusin",C,!0),s.addEventListener("mousedown",R,{capture:!0,passive:!1}),s.addEventListener("touchstart",R,{capture:!0,passive:!1}),s.addEventListener("click",W,{capture:!0,passive:!1}),s.addEventListener("keydown",H,{capture:!0,passive:!1}),o},$=function(){if(i.active)return s.removeEventListener("focusin",C,!0),s.removeEventListener("mousedown",R,!0),s.removeEventListener("touchstart",R,!0),s.removeEventListener("click",W,!0),s.removeEventListener("keydown",H,!0),o},Re=function(u){var d=u.some(function(m){var S=Array.from(m.removedNodes);return S.some(function(E){return E===i.mostRecentlyFocusedNode})});d&&y(v())},A=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(Re):void 0,U=function(){A&&(A.disconnect(),i.active&&!i.paused&&i.containers.map(function(u){A.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(u){if(i.active)return this;var d=c(u,"onActivate"),m=c(u,"onPostActivate"),S=c(u,"checkCanFocusTrap");S||f(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,d==null||d();var E=function(){S&&f(),j(),U(),m==null||m()};return S?(S(i.containers.concat()).then(E,E),this):(E(),this)},deactivate:function(u){if(!i.active)return this;var d=ct({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},u);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,$(),i.active=!1,i.paused=!1,U(),lt.deactivateTrap(n,o);var m=c(d,"onDeactivate"),S=c(d,"onPostDeactivate"),E=c(d,"checkCanReturnFocus"),k=c(d,"returnFocus","returnFocusOnDeactivate");m==null||m();var F=function(){ut(function(){k&&y(_(i.nodeFocusedBeforeActivation)),S==null||S()})};return k&&E?(E(_(i.nodeFocusedBeforeActivation)).then(F,F),this):(F(),this)},pause:function(u){if(i.paused||!i.active)return this;var d=c(u,"onPause"),m=c(u,"onPostPause");return i.paused=!0,d==null||d(),$(),U(),m==null||m(),this},unpause:function(u){if(!i.paused||!i.active)return this;var d=c(u,"onUnpause"),m=c(u,"onPostUnpause");return i.paused=!1,d==null||d(),f(),j(),U(),m==null||m(),this},updateContainerElements:function(u){var d=[].concat(u).filter(Boolean);return i.containers=d.map(function(m){return typeof m=="string"?s.querySelector(m):m}),i.active&&f(),U(),this}},o.updateContainerElements(e),o};function Ms(a,e={}){let t;const{immediate:s,...n}=e,r=ne(!1),i=ne(!1),o=f=>t&&t.activate(f),c=f=>t&&t.deactivate(f),l=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},v=ve(()=>{const f=et(a);return(Array.isArray(f)?f:[f]).map(b=>{const y=et(b);return typeof y=="string"?y:Ct(y)}).filter(Mt)});return je(v,f=>{f.length&&(t=Cs(f,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),At(()=>c()),{hasFocus:r,isPaused:i,activate:o,deactivate:c,pause:l,unpause:h}}class ce{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}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(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const c=()=>{--i<=0&&n(o)};i||c(),r.forEach(l=>{ce.matches(l,this.exclude)?c():this.onIframeReady(l,h=>{t(l)&&(o++,s(h)),c()},c)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,c)=>{o.val===s&&(r=c,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],c=[],l,h,v=()=>({prevNode:h,node:l}=this.getIteratorNode(i),l);for(;v();)this.iframes&&this.forEachIframe(t,f=>this.checkIframeFilter(l,h,f,o),f=>{this.createInstanceOnIframe(f).forEachNode(e,b=>c.push(b),n)}),c.push(l);c.forEach(f=>{s(f)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const c=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,c):c()})}}let As=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 ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[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,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),c=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&c!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(c)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(c)})`+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,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.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",s=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(r=>{s.every(i=>{if(i.indexOf(r)!==-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 s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),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(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.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 s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!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:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,c=parseInt(e.start,10)-o;return c=c>i?i:c,n=c+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),c<0||n-c<0||c>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(c,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:c,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.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:s})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const c=e.nodes[o+1];if(typeof c>"u"||c.start>t){if(!n(i.node))return!1;const l=t-i.start,h=(s>i.end?i.end:s)-i.start,v=e.value.substr(0,i.start),f=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,h),e.value=v+f,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(c=>{c=c.node;let l;for(;(l=e.exec(c.textContent))!==null&&l[i]!=="";){if(!s(l[i],c))continue;let h=l.index;if(i!==0)for(let v=1;v{let c;for(;(c=e.exec(o.value))!==null&&c[i]!=="";){let l=c.index;if(i!==0)for(let v=1;vs(c[i],v),(v,f)=>{e.lastIndex=f,n(v)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,c)=>{let{start:l,end:h,valid:v}=this.checkWhitespaceRanges(o,i,r.value);v&&this.wrapRangeInMappedTextNode(r,l,h,f=>t(f,o,r.value.substring(l,h),c),f=>{s(f,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,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 s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",c=l=>{let h=new RegExp(this.createRegExp(l),`gm${o}`),v=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(f,b)=>this.opt.filter(b,l,s,v),f=>{v++,s++,this.opt.each(f)},()=>{v===0&&this.opt.noMatch(l),r[i-1]===l?this.opt.done(s):c(r[r.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):c(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,c)=>this.opt.filter(r,i,o,c),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}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,s=>{this.unwrapMatches(s)},s=>{const n=ce.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ls(a){const e=new As(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function Te(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{l(s.next(h))}catch(v){i(v)}}function c(h){try{l(s.throw(h))}catch(v){i(v)}}function l(h){h.done?r(h.value):n(h.value).then(o,c)}l((s=s.apply(a,[])).next())})}const Ds="ENTRIES",xt="KEYS",St="VALUES",z="";class Le{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=oe(this._path);if(oe(t)===z)return{done:!1,value:this.result()};const s=e.get(oe(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=oe(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>oe(e)).filter(e=>e!==z).join("")}value(){return oe(this._path).node.get(z)}result(){switch(this._type){case St:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const oe=a=>a[a.length-1],zs=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const c=r*i;e:for(const l of a.keys())if(l===z){const h=n[c-1];h<=t&&s.set(o,[a.get(l),h])}else{let h=r;for(let v=0;vt)continue e}Et(a.get(l),e,t,s,n,h,i,o+l)}};class X{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Oe(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=Je(s);for(const i of n.keys())if(i!==z&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new X(o,e)}}return new X(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Ps(this._tree,e)}entries(){return new Le(this,Ds)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return zs(this._tree,e,t)}get(e){const t=Be(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=Be(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Le(this,xt)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,De(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);return s.set(z,t(s.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);let n=s.get(z);return n===void 0&&s.set(z,n=t()),n}values(){return new Le(this,St)}[Symbol.iterator](){return this.entries()}static from(e){const t=new X;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return X.from(Object.entries(e))}}const Oe=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==z&&e.startsWith(s))return t.push([a,s]),Oe(a.get(s),e.slice(s.length),t);return t.push([a,e]),Oe(void 0,"",t)},Be=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return Be(a.get(t),e.slice(t.length))},De=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Oe(a,e);if(t!==void 0){if(t.delete(z),t.size===0)Tt(s);else if(t.size===1){const[n,r]=t.entries().next().value;It(s,n,r)}}},Tt=a=>{if(a.length===0)return;const[e,t]=Je(a);if(e.delete(t),e.size===0)Tt(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==z&&It(a.slice(0,-1),s,n)}},It=(a,e,t)=>{if(a.length===0)return;const[s,n]=Je(a);s.set(n+e,t),s.delete(n)},Je=a=>a[a.length-1],Ue="or",Nt="and",Vs="and_not";class le{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?Ve:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},Pe),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},ht),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},Ks),e.autoSuggestOptions||{})}),this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ke,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const c=this.addDocumentId(o);this.saveStoredFields(c,e);for(const l of r){const h=t(e,l);if(h==null)continue;const v=s(h.toString(),l),f=this._fieldIds[l],b=new Set(v).size;this.addFieldLength(c,f,this._documentCount-1,b);for(const y of v){const _=n(y,l);if(Array.isArray(_))for(const w of _)this.addTerm(f,c,w);else _&&this.addTerm(f,c,_)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:c},l,h)=>(o.push(l),(h+1)%s===0?{chunk:[],promise:c.then(()=>new Promise(v=>setTimeout(v,0))).then(()=>this.addAll(o))}:{chunk:o,promise:c}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const c=this._idToShortId.get(o);if(c==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const l of r){const h=n(e,l);if(h==null)continue;const v=t(h.toString(),l),f=this._fieldIds[l],b=new Set(v).size;this.removeFieldLength(c,f,this._documentCount,b);for(const y of v){const _=s(y,l);if(Array.isArray(_))for(const w of _)this.removeTerm(f,c,w);else _&&this.removeTerm(f,c,_)}}this._storedFields.delete(c),this._documentIds.delete(c),this._idToShortId.delete(o),this._fieldLength.delete(c),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ke,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return Te(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||We.batchSize,r=e.batchWait||We.batchWait;let i=1;for(const[o,c]of this._index){for(const[l,h]of c)for(const[v]of h)this._documentIds.has(v)||(h.size<=1?c.delete(l):h.delete(v));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(l=>setTimeout(l,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||Ve.minDirtCount,s=s||Ve.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const s=this.executeQuery(e,t),n=[];for(const[r,{score:i,terms:o,match:c}]of s){const l=o.length||1,h={id:this._documentIds.get(r),score:i*l,terms:Object.keys(c),queryTerms:o,match:c};Object.assign(h,this._storedFields.get(r)),(t.filter==null||t.filter(h))&&n.push(h)}return e===le.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||n.sort(pt),n}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),c=s.get(o);c!=null?(c.score+=r,c.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:c}]of s)n.push({suggestion:r,terms:o,score:i/c});return n.sort(pt),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(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)}static loadJSONAsync(e,t){return Te(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(Pe.hasOwnProperty(e))return ze(Pe,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,c=this.instantiateMiniSearch(e,t);c._documentIds=Se(n),c._fieldLength=Se(r),c._storedFields=Se(i);for(const[l,h]of c._documentIds)c._idToShortId.set(h,l);for(const[l,h]of s){const v=new Map;for(const f of Object.keys(h)){let b=h[f];o===1&&(b=b.ds),v.set(parseInt(f,10),Se(b))}c._index.set(l,v)}return c}static loadJSAsync(e,t){return Te(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,c=this.instantiateMiniSearch(e,t);c._documentIds=yield Ee(n),c._fieldLength=yield Ee(r),c._storedFields=yield Ee(i);for(const[h,v]of c._documentIds)c._idToShortId.set(v,h);let l=0;for(const[h,v]of s){const f=new Map;for(const b of Object.keys(v)){let y=v[b];o===1&&(y=y.ds),f.set(parseInt(b,10),yield Ee(y))}++l%1e3===0&&(yield kt(0)),c._index.set(h,f)}return c})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:c}=e;if(c!==1&&c!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const l=new le(t);return l._documentCount=s,l._nextId=n,l._idToShortId=new Map,l._fieldIds=r,l._avgFieldLength=i,l._dirtCount=o||0,l._index=new X,l}executeQuery(e,t={}){if(e===le.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const f=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,f));return this.combineResults(b,f.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:c}=i,v=o(e).flatMap(f=>c(f)).filter(f=>!!f).map(Ws(i)).map(f=>this.executeQuerySpec(f,i));return this.combineResults(v,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((_,w)=>Object.assign(Object.assign({},_),{[w]:ze(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:c}=s,{fuzzy:l,prefix:h}=Object.assign(Object.assign({},ht.weights),i),v=this._index.get(e.term),f=this.termResults(e.term,e.term,1,e.termBoost,v,n,r,c);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const _=e.fuzzy===!0?.2:e.fuzzy,w=_<1?Math.min(o,Math.round(e.term.length*_)):_;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[_,w]of b){const R=_.length-e.term.length;if(!R)continue;y==null||y.delete(_);const C=h*_.length/(_.length+.3*R);this.termResults(e.term,_,C,e.termBoost,w,n,r,c,f)}if(y)for(const _ of y.keys()){const[w,R]=y.get(_);if(!R)continue;const C=l*_.length/(_.length+R);this.termResults(e.term,_,C,e.termBoost,w,n,r,c,f)}return f}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ue){if(e.length===0)return new Map;const s=t.toLowerCase(),n=js[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}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:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,c,l=new Map){if(r==null)return l;for(const h of Object.keys(i)){const v=i[h],f=this._fieldIds[h],b=r.get(f);if(b==null)continue;let y=b.size;const _=this._avgFieldLength[f];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(f,w,t),y-=1;continue}const R=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!R)continue;const C=b.get(w),J=this._fieldLength.get(w)[f],H=Bs(C,y,this._documentCount,J,_,c),W=s*n*v*R*H,j=l.get(w);if(j){j.score+=W,Js(j.terms,e);const $=ze(j.match,t);$?$.push(h):j.match[t]=[h]}else l.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return l}addTerm(e,t,s){const n=this._index.fetch(s,vt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,vt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,js={[Ue]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),ft(s.terms,r)}}return a},[Nt]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);ft(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Vs]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},$s={k:1.2,b:.7,d:.5},Bs=(a,e,t,s,n,r)=>{const{k:i,b:o,d:c}=r;return Math.log(1+(t-e+.5)/(e+.5))*(c+a*(i+1)/(a+i*(1-o+o*s/n)))},Ws=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},Pe={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Us),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ht={combineWith:Ue,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:$s},Ks={combineWith:Nt,prefix:(a,e,t)=>e===t.length-1},We={batchSize:1e3,batchWait:10},Ke={minDirtFactor:.1,minDirtCount:20},Ve=Object.assign(Object.assign({},We),Ke),Js=(a,e)=>{a.includes(e)||a.push(e)},ft=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},pt=({score:a},{score:e})=>e-a,vt=()=>new Map,Se=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ee=a=>Te(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield kt(0));return e}),kt=a=>new Promise(e=>setTimeout(e,a)),Us=/[\n\r\p{Z}\p{P}]+/u;class qs{constructor(e=10){Ce(this,"max");Ce(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const K=a=>(Yt("data-v-ea4c1b97"),a=a(),Zt(),a),Gs=["aria-owns"],Qs={class:"shell"},Hs=["title"],Ys=K(()=>x("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)),Zs=[Ys],Xs={class:"search-actions before"},en=["title"],tn=K(()=>x("span",{class:"vpi-arrow-left local-search-icon"},null,-1)),sn=[tn],nn=["placeholder"],rn={class:"search-actions"},an=["title"],on=K(()=>x("span",{class:"vpi-layout-list local-search-icon"},null,-1)),cn=[on],ln=["disabled","title"],un=K(()=>x("span",{class:"vpi-delete local-search-icon"},null,-1)),dn=[un],hn=["id","role","aria-labelledby"],fn=["aria-selected"],pn=["href","aria-label","onMouseenter","onFocusin"],vn={class:"titles"},mn=K(()=>x("span",{class:"title-icon"},"#",-1)),gn=["innerHTML"],bn=K(()=>x("span",{class:"vpi-chevron-right local-search-icon"},null,-1)),yn={class:"title main"},wn=["innerHTML"],_n={key:0,class:"excerpt-wrapper"},xn={key:0,class:"excerpt",inert:""},Sn=["innerHTML"],En=K(()=>x("div",{class:"excerpt-gradient-bottom"},null,-1)),Tn=K(()=>x("div",{class:"excerpt-gradient-top"},null,-1)),In={key:0,class:"no-results"},Nn={class:"search-keyboard-shortcuts"},kn=["aria-label"],Fn=K(()=>x("span",{class:"vpi-arrow-up navigate-icon"},null,-1)),On=[Fn],Rn=["aria-label"],Cn=K(()=>x("span",{class:"vpi-arrow-down navigate-icon"},null,-1)),Mn=[Cn],An=["aria-label"],Ln=K(()=>x("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)),Dn=[Ln],zn=["aria-label"],Pn=Lt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var F,M;const t=e,s=ye(),n=ye(),r=ye(as),i=is(),{activate:o}=Ms(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:c,theme:l}=i,h=tt(async()=>{var p,g,N,O,P,V,I,L,q;return rt(le.loadJSON((N=await((g=(p=r.value)[c.value])==null?void 0:g.call(p)))==null?void 0:N.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((O=l.value.search)==null?void 0:O.provider)==="local"&&((V=(P=l.value.search.options)==null?void 0:P.miniSearch)==null?void 0:V.searchOptions)},...((I=l.value.search)==null?void 0:I.provider)==="local"&&((q=(L=l.value.search.options)==null?void 0:L.miniSearch)==null?void 0:q.options)}))}),f=ve(()=>{var p,g;return((p=l.value.search)==null?void 0:p.provider)==="local"&&((g=l.value.search.options)==null?void 0:g.disableQueryPersistence)===!0}).value?ne(""):Dt("vitepress:local-search-filter",""),b=zt("vitepress:local-search-detailed-list",((F=l.value.search)==null?void 0:F.provider)==="local"&&((M=l.value.search.options)==null?void 0:M.detailedView)===!0),y=ve(()=>{var p,g,N;return((p=l.value.search)==null?void 0:p.provider)==="local"&&(((g=l.value.search.options)==null?void 0:g.disableDetailedView)===!0||((N=l.value.search.options)==null?void 0:N.detailedView)===!1)}),_=ve(()=>{var g,N,O,P,V,I,L;const p=((g=l.value.search)==null?void 0:g.options)??l.value.algolia;return((V=(P=(O=(N=p==null?void 0:p.locales)==null?void 0:N[c.value])==null?void 0:O.translations)==null?void 0:P.button)==null?void 0:V.buttonText)||((L=(I=p==null?void 0:p.translations)==null?void 0:I.button)==null?void 0:L.buttonText)||"Search"});Pt(()=>{y.value&&(b.value=!1)});const w=ye([]),R=ne(!1);je(f,()=>{R.value=!1});const C=tt(async()=>{if(n.value)return rt(new Ls(n.value))},null),J=new qs(16);Vt(()=>[h.value,f.value,b.value],async([p,g,N],O,P)=>{var ge,qe,Ge,Qe;(O==null?void 0:O[0])!==p&&J.clear();let V=!1;if(P(()=>{V=!0}),!p)return;w.value=p.search(g).slice(0,16),R.value=!0;const I=N?await Promise.all(w.value.map(B=>H(B.id))):[];if(V)return;for(const{id:B,mod:ee}of I){const te=B.slice(0,B.indexOf("#"));let Y=J.get(te);if(Y)continue;Y=new Map,J.set(te,Y);const G=ee.default??ee;if(G!=null&&G.render||G!=null&&G.setup){const se=Xt(G);se.config.warnHandler=()=>{},se.provide(es,i),Object.defineProperties(se.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const He=document.createElement("div");se.mount(He),He.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ue=>{var Xe;const be=(Xe=ue.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(be==null?void 0:be.startsWith("#"))&&be.slice(1);if(!Ye)return;let Ze="";for(;(ue=ue.nextElementSibling)&&!/^h[1-6]$/i.test(ue.tagName);)Ze+=ue.outerHTML;Y.set(Ye,Ze)}),se.unmount()}if(V)return}const L=new Set;if(w.value=w.value.map(B=>{const[ee,te]=B.id.split("#"),Y=J.get(ee),G=(Y==null?void 0:Y.get(te))??"";for(const se in B.match)L.add(se);return{...B,text:G}}),await de(),V)return;await new Promise(B=>{var ee;(ee=C.value)==null||ee.unmark({done:()=>{var te;(te=C.value)==null||te.markRegExp(k(L),{done:B})}})});const q=((ge=s.value)==null?void 0:ge.querySelectorAll(".result .excerpt"))??[];for(const B of q)(qe=B.querySelector('mark[data-markjs="true"]'))==null||qe.scrollIntoView({block:"center"});(Qe=(Ge=n.value)==null?void 0:Ge.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function H(p){const g=ts(p.slice(0,p.indexOf("#")));try{if(!g)throw new Error(`Cannot find file for id: ${p}`);return{id:p,mod:await import(g)}}catch(N){return console.error(N),{id:p,mod:{}}}}const W=ne(),j=ve(()=>{var p;return((p=f.value)==null?void 0:p.length)<=0});function $(p=!0){var g,N;(g=W.value)==null||g.focus(),p&&((N=W.value)==null||N.select())}Me(()=>{$()});function Re(p){p.pointerType==="mouse"&&$()}const A=ne(-1),U=ne(!1);je(w,p=>{A.value=p.length?0:-1,T()});function T(){de(()=>{const p=document.querySelector(".result.selected");p==null||p.scrollIntoView({block:"nearest"})})}we("ArrowUp",p=>{p.preventDefault(),A.value--,A.value<0&&(A.value=w.value.length-1),U.value=!0,T()}),we("ArrowDown",p=>{p.preventDefault(),A.value++,A.value>=w.value.length&&(A.value=0),U.value=!0,T()});const u=jt();we("Enter",p=>{if(p.isComposing||p.target instanceof HTMLButtonElement&&p.target.type!=="submit")return;const g=w.value[A.value];if(p.target instanceof HTMLInputElement&&!g){p.preventDefault();return}g&&(u.go(g.id),t("close"))}),we("Escape",()=>{t("close")});const m=rs({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"}}});Me(()=>{window.history.pushState(null,"",null)}),$t("popstate",p=>{p.preventDefault(),t("close")});const S=Bt(Wt?document.body:null);Me(()=>{de(()=>{S.value=!0,de().then(()=>o())})}),Kt(()=>{S.value=!1});function E(){f.value="",de().then(()=>$(!1))}function k(p){return new RegExp([...p].sort((g,N)=>N.length-g.length).map(g=>`(${ss(g)})`).join("|"),"gi")}return(p,g)=>{var N,O,P,V;return Q(),Jt(Ht,{to:"body"},[x("div",{ref_key:"el",ref:s,role:"button","aria-owns":(N=w.value)!=null&&N.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[x("div",{class:"backdrop",onClick:g[0]||(g[0]=I=>p.$emit("close"))}),x("div",Qs,[x("form",{class:"search-bar",onPointerup:g[4]||(g[4]=I=>Re(I)),onSubmit:g[5]||(g[5]=Ut(()=>{},["prevent"]))},[x("label",{title:_.value,id:"localsearch-label",for:"localsearch-input"},Zs,8,Hs),x("div",Xs,[x("button",{class:"back-button",title:D(m)("modal.backButtonTitle"),onClick:g[1]||(g[1]=I=>p.$emit("close"))},sn,8,en)]),qt(x("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":g[2]||(g[2]=I=>Qt(f)?f.value=I:null),placeholder:_.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,nn),[[Gt,D(f)]]),x("div",rn,[y.value?_e("",!0):(Q(),Z("button",{key:0,class:st(["toggle-layout-button",{"detailed-list":D(b)}]),type:"button",title:D(m)("modal.displayDetails"),onClick:g[3]||(g[3]=I=>A.value>-1&&(b.value=!D(b)))},cn,10,an)),x("button",{class:"clear-button",type:"reset",disabled:j.value,title:D(m)("modal.resetButtonTitle"),onClick:E},dn,8,ln)])],32),x("ul",{ref_key:"resultsEl",ref:n,id:(O=w.value)!=null&&O.length?"localsearch-list":void 0,role:(P=w.value)!=null&&P.length?"listbox":void 0,"aria-labelledby":(V=w.value)!=null&&V.length?"localsearch-label":void 0,class:"results",onMousemove:g[7]||(g[7]=I=>U.value=!1)},[(Q(!0),Z(it,null,nt(w.value,(I,L)=>(Q(),Z("li",{key:I.id,role:"option","aria-selected":A.value===L?"true":"false"},[x("a",{href:I.id,class:st(["result",{selected:A.value===L}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:q=>!U.value&&(A.value=L),onFocusin:q=>A.value=L,onClick:g[6]||(g[6]=q=>p.$emit("close"))},[x("div",null,[x("div",vn,[mn,(Q(!0),Z(it,null,nt(I.titles,(q,ge)=>(Q(),Z("span",{key:ge,class:"title"},[x("span",{class:"text",innerHTML:q},null,8,gn),bn]))),128)),x("span",yn,[x("span",{class:"text",innerHTML:I.title},null,8,wn)])]),D(b)?(Q(),Z("div",_n,[I.text?(Q(),Z("div",xn,[x("div",{class:"vp-doc",innerHTML:I.text},null,8,Sn)])):_e("",!0),En,Tn])):_e("",!0)])],42,pn)],8,fn))),128)),D(f)&&!w.value.length&&R.value?(Q(),Z("li",In,[he(fe(D(m)("modal.noResultsText"))+' "',1),x("strong",null,fe(D(f)),1),he('" ')])):_e("",!0)],40,hn),x("div",Nn,[x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.navigateUpKeyAriaLabel")},On,8,kn),x("kbd",{"aria-label":D(m)("modal.footer.navigateDownKeyAriaLabel")},Mn,8,Rn),he(" "+fe(D(m)("modal.footer.navigateText")),1)]),x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.selectKeyAriaLabel")},Dn,8,An),he(" "+fe(D(m)("modal.footer.selectText")),1)]),x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.closeKeyAriaLabel")},"esc",8,zn),he(" "+fe(D(m)("modal.footer.closeText")),1)])])])],8,Gs)])}}}),Kn=ns(Pn,[["__scopeId","data-v-ea4c1b97"]]);export{Kn as default}; diff --git a/assets/chunks/framework.Bhh1y9_T.js b/assets/chunks/framework.Bhh1y9_T.js new file mode 100644 index 00000000..d21d8ace --- /dev/null +++ b/assets/chunks/framework.Bhh1y9_T.js @@ -0,0 +1,17 @@ +/** +* @vue/shared v3.4.38 +* (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 ne={},yt=[],Ae=()=>{},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:"),fe=Object.assign,Cr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Pi=Object.prototype.hasOwnProperty,z=(e,t)=>Pi.call(e,t),B=Array.isArray,_t=e=>Tn(e)==="[object Map]",Xs=e=>Tn(e)==="[object Set]",q=e=>typeof e=="function",ie=e=>typeof e=="string",Qe=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",Ys=e=>(Z(e)||q(e))&&q(e.then)&&q(e.catch),zs=Object.prototype.toString,Tn=e=>zs.call(e),Ni=e=>Tn(e).slice(8,-1),Js=e=>Tn(e)==="[object Object]",Sr=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,vt=wr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),xn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Fi=/-(\w)/g,Le=xn(e=>e.replace(Fi,(t,n)=>n?n.toUpperCase():"")),$i=/\B([A-Z])/g,Ze=xn(e=>e.replace($i,"-$1").toLowerCase()),An=xn(e=>e.charAt(0).toUpperCase()+e.slice(1)),fn=xn(e=>e?`on${An(e)}`:""),ze=(e,t)=>!Object.is(e,t),dn=(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},Hi=e=>{const t=ie(e)?Number(e):NaN;return isNaN(t)?e:t};let Qr;const Zs=()=>Qr||(Qr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Tr(e){if(B(e)){const t={};for(let n=0;n{if(n){const r=n.split(Vi);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function xr(e){let t="";if(ie(e))t=e;else if(B(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Ki=e=>ie(e)?e:e==null?"":B(e)||Z(e)&&(e.toString===zs||!q(e.toString))?to(e)?Ki(e.value):JSON.stringify(e,no,2):String(e),no=(e,t)=>to(t)?no(e,t.value):_t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],o)=>(n[kn(r,o)+" =>"]=s,n),{})}:Xs(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>kn(n))}:Qe(t)?kn(t):Z(t)&&!B(t)&&!Js(t)?String(t):t,kn=(e,t="")=>{var n;return Qe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.38 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ee;class Wi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ee,!t&&Ee&&(this.index=(Ee.scopes||(Ee.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ee;try{return Ee=this,t()}finally{Ee=n}}}on(){Ee=this}off(){Ee=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),tt()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Xe,n=ct;try{return Xe=!0,ct=this,this._runnings++,Zr(this),this.fn()}finally{es(this),this._runnings--,ct=n,Xe=t}}stop(){this.active&&(Zr(this),es(this),this.onStop&&this.onStop(),this.active=!1)}}function Xi(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;t{const n=new Map;return n.cleanup=e,n.computed=t,n},yn=new WeakMap,at=Symbol(""),fr=Symbol("");function be(e,t,n){if(Xe&&ct){let r=yn.get(e);r||yn.set(e,r=new Map);let s=r.get(n);s||r.set(n,s=co(()=>r.delete(n))),io(ct,s)}}function Ve(e,t,n,r,s,o){const i=yn.get(e);if(!i)return;let l=[];if(t==="clear")l=[...i.values()];else if(n==="length"&&B(e)){const c=Number(r);i.forEach((u,f)=>{(f==="length"||!Qe(f)&&f>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":B(e)?Sr(n)&&l.push(i.get("length")):(l.push(i.get(at)),_t(e)&&l.push(i.get(fr)));break;case"delete":B(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&&lo(c,4);Or()}function Yi(e,t){const n=yn.get(e);return n&&n.get(t)}const zi=wr("__proto__,__v_isRef,__isVue"),ao=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Qe)),ts=Ji();function Ji(){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){et(),Rr();const r=J(this)[t].apply(this,n);return Or(),tt(),r}}),e}function Qi(e){Qe(e)||(e=String(e));const t=J(this);return be(t,"has",e),t.hasOwnProperty(e)}class uo{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?fl:go:o?po:ho).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=B(t);if(!s){if(i&&z(ts,n))return Reflect.get(ts,n,r);if(n==="hasOwnProperty")return Qi}const l=Reflect.get(t,n,r);return(Qe(n)?ao.has(n):zi(n))||(s||be(t,"get",n),o)?l:he(l)?i&&Sr(n)?l:l.value:Z(l)?s?Ln(l):On(l):l}}class fo extends uo{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(!this._isShallow){const c=dt(o);if(!Tt(r)&&!dt(r)&&(o=J(o),r=J(r)),!B(t)&&he(o)&&!he(r))return c?!1:(o.value=r,!0)}const i=B(t)&&Sr(n)?Number(n)e,Rn=e=>Reflect.getPrototypeOf(e);function Jt(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),o=J(t);n||(ze(t,o)&&be(s,"get",t),be(s,"get",o));const{has:i}=Rn(s),l=r?Lr:n?Pr:jt;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 Qt(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(ze(e,s)&&be(r,"has",e),be(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Zt(e,t=!1){return e=e.__v_raw,!t&&be(J(e),"iterate",at),Reflect.get(e,"size",e)}function ns(e,t=!1){!t&&!Tt(e)&&!dt(e)&&(e=J(e));const n=J(this);return Rn(n).has.call(n,e)||(n.add(e),Ve(n,"add",e,e)),this}function rs(e,t,n=!1){!n&&!Tt(t)&&!dt(t)&&(t=J(t));const r=J(this),{has:s,get:o}=Rn(r);let i=s.call(r,e);i||(e=J(e),i=s.call(r,e));const l=o.call(r,e);return r.set(e,t),i?ze(t,l)&&Ve(r,"set",e,t):Ve(r,"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&&Ve(t,"delete",e,void 0),o}function os(){const e=J(this),t=e.size!==0,n=e.clear();return t&&Ve(e,"clear",void 0,void 0),n}function en(e,t){return function(r,s){const o=this,i=o.__v_raw,l=J(i),c=t?Lr:e?Pr:jt;return!e&&be(l,"iterate",at),i.forEach((u,f)=>r.call(s,c(u),c(f),o))}}function tn(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,u=s[e](...r),f=n?Lr:t?Pr:jt;return!t&&be(o,"iterate",c?fr:at),{next(){const{value:h,done:m}=u.next();return m?{value:h,done:m}:{value:l?[f(h[0]),f(h[1])]:f(h),done:m}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function rl(){const e={get(o){return Jt(this,o)},get size(){return Zt(this)},has:Qt,add:ns,set:rs,delete:ss,clear:os,forEach:en(!1,!1)},t={get(o){return Jt(this,o,!1,!0)},get size(){return Zt(this)},has:Qt,add(o){return ns.call(this,o,!0)},set(o,i){return rs.call(this,o,i,!0)},delete:ss,clear:os,forEach:en(!1,!0)},n={get(o){return Jt(this,o,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!1)},r={get(o){return Jt(this,o,!0,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=tn(o,!1,!1),n[o]=tn(o,!0,!1),t[o]=tn(o,!1,!0),r[o]=tn(o,!0,!0)}),[e,n,t,r]}const[sl,ol,il,ll]=rl();function Mr(e,t){const n=t?e?ll:il:e?ol:sl;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(z(n,s)&&s in r?n:r,s,o)}const cl={get:Mr(!1,!1)},al={get:Mr(!1,!0)},ul={get:Mr(!0,!1)};const ho=new WeakMap,po=new WeakMap,go=new WeakMap,fl=new WeakMap;function dl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function hl(e){return e.__v_skip||!Object.isExtensible(e)?0:dl(Ni(e))}function On(e){return dt(e)?e:Ir(e,!1,el,cl,ho)}function pl(e){return Ir(e,!1,nl,al,po)}function Ln(e){return Ir(e,!0,tl,ul,go)}function Ir(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=hl(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function bt(e){return dt(e)?bt(e.__v_raw):!!(e&&e.__v_isReactive)}function dt(e){return!!(e&&e.__v_isReadonly)}function Tt(e){return!!(e&&e.__v_isShallow)}function mo(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function hn(e){return Object.isExtensible(e)&&Qs(e,"__v_skip",!0),e}const jt=e=>Z(e)?On(e):e,Pr=e=>Z(e)?Ln(e):e;class yo{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),()=>It(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=J(this);return(!t._cacheable||t.effect.dirty)&&ze(t._value,t._value=t.effect.run())&&It(t,4),Nr(t),t.effect._dirtyLevel>=2&&It(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function gl(e,t,n=!1){let r,s;const o=q(e);return o?(r=e,s=Ae):(r=e.get,s=e.set),new yo(r,s,o||!s,n)}function Nr(e){var t;Xe&&ct&&(e=J(e),io(ct,(t=e.dep)!=null?t:e.dep=co(()=>e.dep=void 0,e instanceof yo?e:void 0)))}function It(e,t=4,n,r){e=J(e);const s=e.dep;s&&lo(s,t)}function he(e){return!!(e&&e.__v_isRef===!0)}function oe(e){return _o(e,!1)}function Fr(e){return _o(e,!0)}function _o(e,t){return he(e)?e:new ml(e,t)}class ml{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:jt(t)}get value(){return Nr(this),this._value}set value(t){const n=this.__v_isShallow||Tt(t)||dt(t);t=n?t:J(t),ze(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:jt(t),It(this,4))}}function vo(e){return he(e)?e.value:e}const yl={get:(e,t,n)=>vo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return he(s)&&!he(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function bo(e){return bt(e)?e:new Proxy(e,yl)}class _l{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Nr(this),()=>It(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function vl(e){return new _l(e)}function lu(e){const t=B(e)?new Array(e.length):{};for(const n in e)t[n]=wo(e,n);return t}class bl{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 Yi(J(this._object),this._key)}}class wl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function El(e,t,n){return he(e)?e:q(e)?new wl(e):Z(e)&&arguments.length>1?wo(e,t,n):oe(e)}function wo(e,t,n){const r=e[t];return he(r)?r:new bl(e,t,n)}/** +* @vue/runtime-core v3.4.38 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Ye(e,t,n,r){try{return r?e(...r):e()}catch(s){Wt(s,t,n)}}function Re(e,t,n,r){if(q(e)){const s=Ye(e,t,n,r);return s&&Ys(s)&&s.catch(o=>{Wt(o,t,n)}),s}if(B(e)){const s=[];for(let o=0;o>>1,s=ge[r],o=Dt(s);oFe&&ge.splice(t,1)}function xl(e){B(e)?wt.push(...e):(!Ke||!Ke.includes(e,e.allowRecurse?it+1:it))&&wt.push(e),Co()}function is(e,t,n=Vt?Fe+1:0){for(;nDt(n)-Dt(r));if(wt.length=0,Ke){Ke.push(...t);return}for(Ke=t,it=0;ite.id==null?1/0:e.id,Al=(e,t)=>{const n=Dt(e)-Dt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function So(e){dr=!1,Vt=!0,ge.sort(Al);try{for(Fe=0;Fe{r._d&&vs(-1);const o=vn(t);let i;try{i=e(...s)}finally{vn(o),r._d&&vs(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function uu(e,t){if(ue===null)return e;const n=Vn(ue),r=e.dirs||(e.dirs=[]);for(let s=0;s{e.isMounted=!0}),Lo(()=>{e.isUnmounting=!0}),e}const Se=[Function,Array],To={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Se,onEnter:Se,onAfterEnter:Se,onEnterCancelled:Se,onBeforeLeave:Se,onLeave:Se,onAfterLeave:Se,onLeaveCancelled:Se,onBeforeAppear:Se,onAppear:Se,onAfterAppear:Se,onAppearCancelled:Se},xo=e=>{const t=e.subTree;return t.component?xo(t.component):t},Ll={name:"BaseTransition",props:To,setup(e,{slots:t}){const n=jn(),r=Ol();return()=>{const s=t.default&&Ro(t.default(),!0);if(!s||!s.length)return;let o=s[0];if(s.length>1){for(const m of s)if(m.type!==ye){o=m;break}}const i=J(e),{mode:l}=i;if(r.isLeaving)return Kn(o);const c=ls(o);if(!c)return Kn(o);let u=hr(c,i,r,n,m=>u=m);bn(c,u);const f=n.subTree,h=f&&ls(f);if(h&&h.type!==ye&&!lt(c,h)&&xo(n).type!==ye){const m=hr(h,i,r,n);if(bn(h,m),l==="out-in"&&c.type!==ye)return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Kn(o);l==="in-out"&&c.type!==ye&&(m.delayLeave=(_,w,O)=>{const U=Ao(r,h);U[String(h.key)]=h,_[We]=()=>{w(),_[We]=void 0,delete u.delayedLeave},u.delayedLeave=O})}return o}}},Ml=Ll;function Ao(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 hr(e,t,n,r,s){const{appear:o,mode:i,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:f,onEnterCancelled:h,onBeforeLeave:m,onLeave:_,onAfterLeave:w,onLeaveCancelled:O,onBeforeAppear:U,onAppear:W,onAfterAppear:H,onAppearCancelled:p}=t,y=String(e.key),I=Ao(n,e),x=(M,v)=>{M&&Re(M,r,9,v)},F=(M,v)=>{const P=v[1];x(M,v),B(M)?M.every(S=>S.length<=1)&&P():M.length<=1&&P()},V={mode:i,persisted:l,beforeEnter(M){let v=c;if(!n.isMounted)if(o)v=U||c;else return;M[We]&&M[We](!0);const P=I[y];P&<(e,P)&&P.el[We]&&P.el[We](),x(v,[M])},enter(M){let v=u,P=f,S=h;if(!n.isMounted)if(o)v=W||u,P=H||f,S=p||h;else return;let K=!1;const ee=M[nn]=re=>{K||(K=!0,re?x(S,[M]):x(P,[M]),V.delayedLeave&&V.delayedLeave(),M[nn]=void 0)};v?F(v,[M,ee]):ee()},leave(M,v){const P=String(e.key);if(M[nn]&&M[nn](!0),n.isUnmounting)return v();x(m,[M]);let S=!1;const K=M[We]=ee=>{S||(S=!0,v(),ee?x(O,[M]):x(w,[M]),M[We]=void 0,I[P]===e&&delete I[P])};I[P]=e,_?F(_,[M,K]):K()},clone(M){const v=hr(M,t,n,r,s);return s&&s(v),v}};return V}function Kn(e){if(qt(e))return e=Je(e),e.children=null,e}function ls(e){if(!qt(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function bn(e,t){e.shapeFlag&6&&e.component?bn(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 Ro(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;o!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function fu(e){q(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,u,f=0;const h=()=>(f++,c=null,m()),m=()=>{let _;return c||(_=c=t().catch(w=>{if(w=w instanceof Error?w:new Error(String(w)),l)return new Promise((O,U)=>{l(w,()=>O(h()),()=>U(w),f+1)});throw w}).then(w=>_!==c&&c?c:(w&&(w.__esModule||w[Symbol.toStringTag]==="Module")&&(w=w.default),u=w,w)))};return Hr({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return u},setup(){const _=ae;if(u)return()=>Wn(u,_);const w=H=>{c=null,Wt(H,_,13,!r)};if(i&&_.suspense||Xt)return m().then(H=>()=>Wn(H,_)).catch(H=>(w(H),()=>r?le(r,{error:H}):null));const O=oe(!1),U=oe(),W=oe(!!s);return s&&setTimeout(()=>{W.value=!1},s),o!=null&&setTimeout(()=>{if(!O.value&&!U.value){const H=new Error(`Async component timed out after ${o}ms.`);w(H),U.value=H}},o),m().then(()=>{O.value=!0,_.parent&&qt(_.parent.vnode)&&(_.parent.effect.dirty=!0,In(_.parent.update))}).catch(H=>{w(H),U.value=H}),()=>{if(O.value&&u)return Wn(u,_);if(U.value&&r)return le(r,{error:U.value});if(n&&!W.value)return le(n)}}})}function Wn(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=le(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const qt=e=>e.type.__isKeepAlive;function Il(e,t){Oo(e,"a",t)}function Pl(e,t){Oo(e,"da",t)}function Oo(e,t,n=ae){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Nn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)qt(s.parent.vnode)&&Nl(r,t,n,s),s=s.parent}}function Nl(e,t,n,r){const s=Nn(t,e,r,!0);Fn(()=>{Cr(r[t],s)},n)}function Nn(e,t,n=ae,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{et();const l=Gt(n),c=Re(t,n,e,i);return l(),tt(),c});return r?s.unshift(o):s.push(o),o}}const De=e=>(t,n=ae)=>{(!Xt||e==="sp")&&Nn(e,(...r)=>t(...r),n)},Fl=De("bm"),At=De("m"),$l=De("bu"),Hl=De("u"),Lo=De("bum"),Fn=De("um"),jl=De("sp"),Vl=De("rtg"),Dl=De("rtc");function Ul(e,t=ae){Nn("ec",e,t)}const jr="components";function du(e,t){return Io(jr,e,!0,t)||e}const Mo=Symbol.for("v-ndc");function hu(e){return ie(e)?Io(jr,e,!1)||e:e||Mo}function Io(e,t,n=!0,r=!1){const s=ue||ae;if(s){const o=s.type;if(e===jr){const l=Pc(o,!1);if(l&&(l===t||l===Le(t)||l===An(Le(t))))return o}const i=cs(s[e]||o[e],t)||cs(s.appContext[e],t);return!i&&r?o:i}}function cs(e,t){return e&&(e[t]||e[Le(t)]||e[An(Le(t))])}function pu(e,t,n,r){let s;const o=n;if(B(e)||ie(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lCn(t)?!(t.type===ye||t.type===ve&&!Po(t.children)):!0)?e:null}function mu(e,t){const n={};for(const r in e)n[/[A-Z]/.test(r)?`on:${r}`:fn(r)]=e[r];return n}const pr=e=>e?ii(e)?Vn(e):pr(e.parent):null,Pt=fe(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=>pr(e.parent),$root:e=>pr(e.root),$emit:e=>e.emit,$options:e=>Vr(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,In(e.update)}),$nextTick:e=>e.n||(e.n=Mn.bind(e.proxy)),$watch:e=>gc.bind(e)}),qn=(e,t)=>e!==ne&&!e.__isScriptSetup&&z(e,t),Bl={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 u;if(t[0]!=="$"){const _=i[t];if(_!==void 0)switch(_){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!==ne&&z(s,t))return i[t]=2,s[t];if((u=e.propsOptions[0])&&z(u,t))return i[t]=3,o[t];if(n!==ne&&z(n,t))return i[t]=4,n[t];gr&&(i[t]=0)}}const f=Pt[t];let h,m;if(f)return t==="$attrs"&&be(e.attrs,"get",""),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ne&&z(n,t))return i[t]=4,n[t];if(m=c.config.globalProperties,z(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!==ne&&z(r,t)?(r[t]=n,!0):z(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!==ne&&z(e,i)||qn(t,i)||(l=o[0])&&z(l,i)||z(r,i)||z(Pt,i)||z(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function yu(){return kl().slots}function kl(){const e=jn();return e.setupContext||(e.setupContext=ci(e))}function as(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let gr=!0;function Kl(e){const t=Vr(e),n=e.proxy,r=e.ctx;gr=!1,t.beforeCreate&&us(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:u,created:f,beforeMount:h,mounted:m,beforeUpdate:_,updated:w,activated:O,deactivated:U,beforeDestroy:W,beforeUnmount:H,destroyed:p,unmounted:y,render:I,renderTracked:x,renderTriggered:F,errorCaptured:V,serverPrefetch:M,expose:v,inheritAttrs:P,components:S,directives:K,filters:ee}=t;if(u&&Wl(u,r,null),i)for(const Y in i){const k=i[Y];q(k)&&(r[Y]=k.bind(n))}if(s){const Y=s.call(n,n);Z(Y)&&(e.data=On(Y))}if(gr=!0,o)for(const Y in o){const k=o[Y],de=q(k)?k.bind(n,n):q(k.get)?k.get.bind(n,n):Ae,Yt=!q(k)&&q(k.set)?k.set.bind(n):Ae,nt=se({get:de,set:Yt});Object.defineProperty(r,Y,{enumerable:!0,configurable:!0,get:()=>nt.value,set:Ie=>nt.value=Ie})}if(l)for(const Y in l)No(l[Y],r,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(k=>{Jl(k,Y[k])})}f&&us(f,e,"c");function D(Y,k){B(k)?k.forEach(de=>Y(de.bind(n))):k&&Y(k.bind(n))}if(D(Fl,h),D(At,m),D($l,_),D(Hl,w),D(Il,O),D(Pl,U),D(Ul,V),D(Dl,x),D(Vl,F),D(Lo,H),D(Fn,y),D(jl,M),B(v))if(v.length){const Y=e.exposed||(e.exposed={});v.forEach(k=>{Object.defineProperty(Y,k,{get:()=>n[k],set:de=>n[k]=de})})}else e.exposed||(e.exposed={});I&&e.render===Ae&&(e.render=I),P!=null&&(e.inheritAttrs=P),S&&(e.components=S),K&&(e.directives=K)}function Wl(e,t,n=Ae){B(e)&&(e=mr(e));for(const r in e){const s=e[r];let o;Z(s)?"default"in s?o=St(s.from||r,s.default,!0):o=St(s.from||r):o=St(s),he(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){Re(B(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function No(e,t,n,r){const s=r.includes(".")?Jo(n,r):()=>n[r];if(ie(e)){const o=t[e];q(o)&&$e(s,o)}else if(q(e))$e(s,e.bind(n));else if(Z(e))if(B(e))e.forEach(o=>No(o,t,n,r));else{const o=q(e.handler)?e.handler.bind(n):t[e.handler];q(o)&&$e(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(u=>wn(c,u,i,!0)),wn(c,t,i)),Z(t)&&o.set(t,c),c}function wn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&wn(e,o,n,!0),s&&s.forEach(i=>wn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=ql[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const ql={data:fs,props:ds,emits:ds,methods:Mt,computed:Mt,beforeCreate:me,created:me,beforeMount:me,mounted:me,beforeUpdate:me,updated:me,beforeDestroy:me,beforeUnmount:me,destroyed:me,unmounted:me,activated:me,deactivated:me,errorCaptured:me,serverPrefetch:me,components:Mt,directives:Mt,watch:Xl,provide:fs,inject:Gl};function fs(e,t){return t?e?function(){return fe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Gl(e,t){return Mt(mr(e),mr(t))}function mr(e){if(B(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(r&&r.proxy):t}}const $o={},Ho=()=>Object.create($o),jo=e=>Object.getPrototypeOf(e)===$o;function Ql(e,t,n,r=!1){const s={},o=Ho();e.propsDefaults=Object.create(null),Vo(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:pl(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function Zl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=J(s),[c]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[m,_]=Do(h,t,!0);fe(i,m),_&&l.push(..._)};!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,yt),yt;if(B(o))for(let f=0;fe[0]==="_"||e==="$stable",Dr=e=>B(e)?e.map(xe):[xe(e)],tc=(e,t,n)=>{if(t._n)return t;const r=Rl((...s)=>Dr(t(...s)),n);return r._c=!1,r},Bo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Uo(s))continue;const o=e[s];if(q(o))t[s]=tc(s,o,r);else if(o!=null){const i=Dr(o);t[s]=()=>i}}},ko=(e,t)=>{const n=Dr(t);e.slots.default=()=>n},Ko=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},nc=(e,t,n)=>{const r=e.slots=Ho();if(e.vnode.shapeFlag&32){const s=t._;s?(Ko(r,t,n),n&&Qs(r,"_",s,!0)):Bo(t,r)}else t&&ko(e,t)},rc=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=ne;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:Ko(s,t,n):(o=!t.$stable,Bo(t,s)),i=t}else t&&(ko(e,t),i={default:1});if(o)for(const l in s)!Uo(l)&&i[l]==null&&delete s[l]};function En(e,t,n,r,s=!1){if(B(e)){e.forEach((m,_)=>En(m,t&&(B(t)?t[_]:t),n,r,s));return}if(Et(r)&&!s)return;const o=r.shapeFlag&4?Vn(r.component):r.el,i=s?null:o,{i:l,r:c}=e,u=t&&t.r,f=l.refs===ne?l.refs={}:l.refs,h=l.setupState;if(u!=null&&u!==c&&(ie(u)?(f[u]=null,z(h,u)&&(h[u]=null)):he(u)&&(u.value=null)),q(c))Ye(c,l,12,[i,f]);else{const m=ie(c),_=he(c);if(m||_){const w=()=>{if(e.f){const O=m?z(h,c)?h[c]:f[c]:c.value;s?B(O)&&Cr(O,o):B(O)?O.includes(o)||O.push(o):m?(f[c]=[o],z(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else m?(f[c]=i,z(h,c)&&(h[c]=i)):_&&(c.value=i,e.k&&(f[e.k]=i))};i?(w.id=-1,_e(w,n)):w()}}}const Wo=Symbol("_vte"),sc=e=>e.__isTeleport,Nt=e=>e&&(e.disabled||e.disabled===""),ps=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gs=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,_r=(e,t)=>{const n=e&&e.to;return ie(n)?t?t(n):null:n},oc={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,u){const{mc:f,pc:h,pbc:m,o:{insert:_,querySelector:w,createText:O,createComment:U}}=u,W=Nt(t.props);let{shapeFlag:H,children:p,dynamicChildren:y}=t;if(e==null){const I=t.el=O(""),x=t.anchor=O("");_(I,n,r),_(x,n,r);const F=t.target=_r(t.props,w),V=Go(F,t,O,_);F&&(i==="svg"||ps(F)?i="svg":(i==="mathml"||gs(F))&&(i="mathml"));const M=(v,P)=>{H&16&&f(p,v,P,s,o,i,l,c)};W?M(n,x):F&&M(F,V)}else{t.el=e.el,t.targetStart=e.targetStart;const I=t.anchor=e.anchor,x=t.target=e.target,F=t.targetAnchor=e.targetAnchor,V=Nt(e.props),M=V?n:x,v=V?I:F;if(i==="svg"||ps(x)?i="svg":(i==="mathml"||gs(x))&&(i="mathml"),y?(m(e.dynamicChildren,y,M,s,o,i,l),Ur(e,t,!0)):c||h(e,t,M,v,s,o,i,l,!1),W)V?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):rn(t,n,I,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const P=t.target=_r(t.props,w);P&&rn(t,P,null,u,0)}else V&&rn(t,x,F,u,1)}qo(t)},remove(e,t,n,{um:r,o:{remove:s}},o){const{shapeFlag:i,children:l,anchor:c,targetStart:u,targetAnchor:f,target:h,props:m}=e;if(h&&(s(u),s(f)),o&&s(c),i&16){const _=o||!Nt(m);for(let w=0;w{ms||(console.error("Hydration completed but contains mismatches."),ms=!0)},lc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",cc=e=>e.namespaceURI.includes("MathML"),sn=e=>{if(lc(e))return"svg";if(cc(e))return"mathml"},on=e=>e.nodeType===8;function ac(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:u}}=e,f=(p,y)=>{if(!y.hasChildNodes()){n(null,p,y),_n(),y._vnode=p;return}h(y.firstChild,p,null,null,null),_n(),y._vnode=p},h=(p,y,I,x,F,V=!1)=>{V=V||!!y.dynamicChildren;const M=on(p)&&p.data==="[",v=()=>O(p,y,I,x,F,M),{type:P,ref:S,shapeFlag:K,patchFlag:ee}=y;let re=p.nodeType;y.el=p,ee===-2&&(V=!1,y.dynamicChildren=null);let D=null;switch(P){case ut:re!==3?y.children===""?(c(y.el=s(""),i(p),p),D=p):D=v():(p.data!==y.children&&(gt(),p.data=y.children),D=o(p));break;case ye:H(p)?(D=o(p),W(y.el=p.content.firstChild,p,I)):re!==8||M?D=v():D=o(p);break;case Ft:if(M&&(p=o(p),re=p.nodeType),re===1||re===3){D=p;const Y=!y.children.length;for(let k=0;k{V=V||!!y.dynamicChildren;const{type:M,props:v,patchFlag:P,shapeFlag:S,dirs:K,transition:ee}=y,re=M==="input"||M==="option";if(re||P!==-1){K&&Ne(y,null,I,"created");let D=!1;if(H(p)){D=Yo(x,ee)&&I&&I.vnode.props&&I.vnode.props.appear;const k=p.content.firstChild;D&&ee.beforeEnter(k),W(k,p,I),y.el=p=k}if(S&16&&!(v&&(v.innerHTML||v.textContent))){let k=_(p.firstChild,y,p,I,x,F,V);for(;k;){gt();const de=k;k=k.nextSibling,l(de)}}else S&8&&p.textContent!==y.children&&(gt(),p.textContent=y.children);if(v){if(re||!V||P&48){const k=p.tagName.includes("-");for(const de in v)(re&&(de.endsWith("value")||de==="indeterminate")||Kt(de)&&!vt(de)||de[0]==="."||k)&&r(p,de,null,v[de],void 0,I)}else if(v.onClick)r(p,"onClick",null,v.onClick,void 0,I);else if(P&4&&bt(v.style))for(const k in v.style)v.style[k]}let Y;(Y=v&&v.onVnodeBeforeMount)&&Te(Y,I,y),K&&Ne(y,null,I,"beforeMount"),((Y=v&&v.onVnodeMounted)||K||D)&&Zo(()=>{Y&&Te(Y,I,y),D&&ee.enter(p),K&&Ne(y,null,I,"mounted")},x)}return p.nextSibling},_=(p,y,I,x,F,V,M)=>{M=M||!!y.dynamicChildren;const v=y.children,P=v.length;for(let S=0;S{const{slotScopeIds:M}=y;M&&(F=F?F.concat(M):M);const v=i(p),P=_(o(p),y,v,I,x,F,V);return P&&on(P)&&P.data==="]"?o(y.anchor=P):(gt(),c(y.anchor=u("]"),v,P),P)},O=(p,y,I,x,F,V)=>{if(gt(),y.el=null,V){const P=U(p);for(;;){const S=o(p);if(S&&S!==P)l(S);else break}}const M=o(p),v=i(p);return l(p),n(null,y,v,M,I,x,sn(v),F),M},U=(p,y="[",I="]")=>{let x=0;for(;p;)if(p=o(p),p&&on(p)&&(p.data===y&&x++,p.data===I)){if(x===0)return o(p);x--}return p},W=(p,y,I)=>{const x=y.parentNode;x&&x.replaceChild(p,y);let F=I;for(;F;)F.vnode.el===y&&(F.vnode.el=F.subTree.el=p),F=F.parent},H=p=>p.nodeType===1&&p.tagName.toLowerCase()==="template";return[f,h]}const _e=Zo;function uc(e){return Xo(e)}function fc(e){return Xo(e,ac)}function Xo(e,t){const n=Zs();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:u,setElementText:f,parentNode:h,nextSibling:m,setScopeId:_=Ae,insertStaticContent:w}=e,O=(a,d,g,C=null,b=null,T=null,L=void 0,A=null,R=!!d.dynamicChildren)=>{if(a===d)return;a&&!lt(a,d)&&(C=zt(a),Ie(a,b,T,!0),a=null),d.patchFlag===-2&&(R=!1,d.dynamicChildren=null);const{type:E,ref:N,shapeFlag:j}=d;switch(E){case ut:U(a,d,g,C);break;case ye:W(a,d,g,C);break;case Ft:a==null&&H(d,g,C,L);break;case ve:S(a,d,g,C,b,T,L,A,R);break;default:j&1?I(a,d,g,C,b,T,L,A,R):j&6?K(a,d,g,C,b,T,L,A,R):(j&64||j&128)&&E.process(a,d,g,C,b,T,L,A,R,ht)}N!=null&&b&&En(N,a&&a.ref,T,d||a,!d)},U=(a,d,g,C)=>{if(a==null)r(d.el=l(d.children),g,C);else{const b=d.el=a.el;d.children!==a.children&&u(b,d.children)}},W=(a,d,g,C)=>{a==null?r(d.el=c(d.children||""),g,C):d.el=a.el},H=(a,d,g,C)=>{[a.el,a.anchor]=w(a.children,d,g,C,a.el,a.anchor)},p=({el:a,anchor:d},g,C)=>{let b;for(;a&&a!==d;)b=m(a),r(a,g,C),a=b;r(d,g,C)},y=({el:a,anchor:d})=>{let g;for(;a&&a!==d;)g=m(a),s(a),a=g;s(d)},I=(a,d,g,C,b,T,L,A,R)=>{d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),a==null?x(d,g,C,b,T,L,A,R):M(a,d,b,T,L,A,R)},x=(a,d,g,C,b,T,L,A)=>{let R,E;const{props:N,shapeFlag:j,transition:$,dirs:G}=a;if(R=a.el=i(a.type,T,N&&N.is,N),j&8?f(R,a.children):j&16&&V(a.children,R,null,C,b,Gn(a,T),L,A),G&&Ne(a,null,C,"created"),F(R,a,a.scopeId,L,C),N){for(const te in N)te!=="value"&&!vt(te)&&o(R,te,null,N[te],T,C);"value"in N&&o(R,"value",null,N.value,T),(E=N.onVnodeBeforeMount)&&Te(E,C,a)}G&&Ne(a,null,C,"beforeMount");const X=Yo(b,$);X&&$.beforeEnter(R),r(R,d,g),((E=N&&N.onVnodeMounted)||X||G)&&_e(()=>{E&&Te(E,C,a),X&&$.enter(R),G&&Ne(a,null,C,"mounted")},b)},F=(a,d,g,C,b)=>{if(g&&_(a,g),C)for(let T=0;T{for(let E=R;E{const A=d.el=a.el;let{patchFlag:R,dynamicChildren:E,dirs:N}=d;R|=a.patchFlag&16;const j=a.props||ne,$=d.props||ne;let G;if(g&&rt(g,!1),(G=$.onVnodeBeforeUpdate)&&Te(G,g,d,a),N&&Ne(d,a,g,"beforeUpdate"),g&&rt(g,!0),(j.innerHTML&&$.innerHTML==null||j.textContent&&$.textContent==null)&&f(A,""),E?v(a.dynamicChildren,E,A,g,C,Gn(d,b),T):L||k(a,d,A,null,g,C,Gn(d,b),T,!1),R>0){if(R&16)P(A,j,$,g,b);else if(R&2&&j.class!==$.class&&o(A,"class",null,$.class,b),R&4&&o(A,"style",j.style,$.style,b),R&8){const X=d.dynamicProps;for(let te=0;te{G&&Te(G,g,d,a),N&&Ne(d,a,g,"updated")},C)},v=(a,d,g,C,b,T,L)=>{for(let A=0;A{if(d!==g){if(d!==ne)for(const T in d)!vt(T)&&!(T in g)&&o(a,T,d[T],null,b,C);for(const T in g){if(vt(T))continue;const L=g[T],A=d[T];L!==A&&T!=="value"&&o(a,T,A,L,b,C)}"value"in g&&o(a,"value",d.value,g.value,b)}},S=(a,d,g,C,b,T,L,A,R)=>{const E=d.el=a?a.el:l(""),N=d.anchor=a?a.anchor:l("");let{patchFlag:j,dynamicChildren:$,slotScopeIds:G}=d;G&&(A=A?A.concat(G):G),a==null?(r(E,g,C),r(N,g,C),V(d.children||[],g,N,b,T,L,A,R)):j>0&&j&64&&$&&a.dynamicChildren?(v(a.dynamicChildren,$,g,b,T,L,A),(d.key!=null||b&&d===b.subTree)&&Ur(a,d,!0)):k(a,d,g,N,b,T,L,A,R)},K=(a,d,g,C,b,T,L,A,R)=>{d.slotScopeIds=A,a==null?d.shapeFlag&512?b.ctx.activate(d,g,C,L,R):ee(d,g,C,b,T,L,R):re(a,d,R)},ee=(a,d,g,C,b,T,L)=>{const A=a.component=Oc(a,C,b);if(qt(a)&&(A.ctx.renderer=ht),Lc(A,!1,L),A.asyncDep){if(b&&b.registerDep(A,D,L),!a.el){const R=A.subTree=le(ye);W(null,R,d,g)}}else D(A,a,d,g,b,T,L)},re=(a,d,g)=>{const C=d.component=a.component;if(bc(a,d,g))if(C.asyncDep&&!C.asyncResolved){Y(C,d,g);return}else C.next=d,Tl(C.update),C.effect.dirty=!0,C.update();else d.el=a.el,C.vnode=d},D=(a,d,g,C,b,T,L)=>{const A=()=>{if(a.isMounted){let{next:N,bu:j,u:$,parent:G,vnode:X}=a;{const pt=zo(a);if(pt){N&&(N.el=X.el,Y(a,N,L)),pt.asyncDep.then(()=>{a.isUnmounted||A()});return}}let te=N,Q;rt(a,!1),N?(N.el=X.el,Y(a,N,L)):N=X,j&&dn(j),(Q=N.props&&N.props.onVnodeBeforeUpdate)&&Te(Q,G,N,X),rt(a,!0);const ce=Xn(a),Oe=a.subTree;a.subTree=ce,O(Oe,ce,h(Oe.el),zt(Oe),a,b,T),N.el=ce.el,te===null&&wc(a,ce.el),$&&_e($,b),(Q=N.props&&N.props.onVnodeUpdated)&&_e(()=>Te(Q,G,N,X),b)}else{let N;const{el:j,props:$}=d,{bm:G,m:X,parent:te}=a,Q=Et(d);if(rt(a,!1),G&&dn(G),!Q&&(N=$&&$.onVnodeBeforeMount)&&Te(N,te,d),rt(a,!0),j&&Bn){const ce=()=>{a.subTree=Xn(a),Bn(j,a.subTree,a,b,null)};Q?d.type.__asyncLoader().then(()=>!a.isUnmounted&&ce()):ce()}else{const ce=a.subTree=Xn(a);O(null,ce,g,C,a,b,T),d.el=ce.el}if(X&&_e(X,b),!Q&&(N=$&&$.onVnodeMounted)){const ce=d;_e(()=>Te(N,te,ce),b)}(d.shapeFlag&256||te&&Et(te.vnode)&&te.vnode.shapeFlag&256)&&a.a&&_e(a.a,b),a.isMounted=!0,d=g=C=null}},R=a.effect=new Ar(A,Ae,()=>In(E),a.scope),E=a.update=()=>{R.dirty&&R.run()};E.i=a,E.id=a.uid,rt(a,!0),E()},Y=(a,d,g)=>{d.component=a;const C=a.vnode.props;a.vnode=d,a.next=null,Zl(a,d.props,C,g),rc(a,d.children,g),et(),is(a),tt()},k=(a,d,g,C,b,T,L,A,R=!1)=>{const E=a&&a.children,N=a?a.shapeFlag:0,j=d.children,{patchFlag:$,shapeFlag:G}=d;if($>0){if($&128){Yt(E,j,g,C,b,T,L,A,R);return}else if($&256){de(E,j,g,C,b,T,L,A,R);return}}G&8?(N&16&&Rt(E,b,T),j!==E&&f(g,j)):N&16?G&16?Yt(E,j,g,C,b,T,L,A,R):Rt(E,b,T,!0):(N&8&&f(g,""),G&16&&V(j,g,C,b,T,L,A,R))},de=(a,d,g,C,b,T,L,A,R)=>{a=a||yt,d=d||yt;const E=a.length,N=d.length,j=Math.min(E,N);let $;for($=0;$N?Rt(a,b,T,!0,!1,j):V(d,g,C,b,T,L,A,R,j)},Yt=(a,d,g,C,b,T,L,A,R)=>{let E=0;const N=d.length;let j=a.length-1,$=N-1;for(;E<=j&&E<=$;){const G=a[E],X=d[E]=R?qe(d[E]):xe(d[E]);if(lt(G,X))O(G,X,g,null,b,T,L,A,R);else break;E++}for(;E<=j&&E<=$;){const G=a[j],X=d[$]=R?qe(d[$]):xe(d[$]);if(lt(G,X))O(G,X,g,null,b,T,L,A,R);else break;j--,$--}if(E>j){if(E<=$){const G=$+1,X=G$)for(;E<=j;)Ie(a[E],b,T,!0),E++;else{const G=E,X=E,te=new Map;for(E=X;E<=$;E++){const we=d[E]=R?qe(d[E]):xe(d[E]);we.key!=null&&te.set(we.key,E)}let Q,ce=0;const Oe=$-X+1;let pt=!1,Yr=0;const Ot=new Array(Oe);for(E=0;E=Oe){Ie(we,b,T,!0);continue}let Pe;if(we.key!=null)Pe=te.get(we.key);else for(Q=X;Q<=$;Q++)if(Ot[Q-X]===0&<(we,d[Q])){Pe=Q;break}Pe===void 0?Ie(we,b,T,!0):(Ot[Pe-X]=E+1,Pe>=Yr?Yr=Pe:pt=!0,O(we,d[Pe],g,null,b,T,L,A,R),ce++)}const zr=pt?dc(Ot):yt;for(Q=zr.length-1,E=Oe-1;E>=0;E--){const we=X+E,Pe=d[we],Jr=we+1{const{el:T,type:L,transition:A,children:R,shapeFlag:E}=a;if(E&6){nt(a.component.subTree,d,g,C);return}if(E&128){a.suspense.move(d,g,C);return}if(E&64){L.move(a,d,g,ht);return}if(L===ve){r(T,d,g);for(let j=0;jA.enter(T),b);else{const{leave:j,delayLeave:$,afterLeave:G}=A,X=()=>r(T,d,g),te=()=>{j(T,()=>{X(),G&&G()})};$?$(T,X,te):te()}else r(T,d,g)},Ie=(a,d,g,C=!1,b=!1)=>{const{type:T,props:L,ref:A,children:R,dynamicChildren:E,shapeFlag:N,patchFlag:j,dirs:$,cacheIndex:G}=a;if(j===-2&&(b=!1),A!=null&&En(A,null,g,a,!0),G!=null&&(d.renderCache[G]=void 0),N&256){d.ctx.deactivate(a);return}const X=N&1&&$,te=!Et(a);let Q;if(te&&(Q=L&&L.onVnodeBeforeUnmount)&&Te(Q,d,a),N&6)Mi(a.component,g,C);else{if(N&128){a.suspense.unmount(g,C);return}X&&Ne(a,null,d,"beforeUnmount"),N&64?a.type.remove(a,d,g,ht,C):E&&!E.hasOnce&&(T!==ve||j>0&&j&64)?Rt(E,d,g,!1,!0):(T===ve&&j&384||!b&&N&16)&&Rt(R,d,g),C&&Gr(a)}(te&&(Q=L&&L.onVnodeUnmounted)||X)&&_e(()=>{Q&&Te(Q,d,a),X&&Ne(a,null,d,"unmounted")},g)},Gr=a=>{const{type:d,el:g,anchor:C,transition:b}=a;if(d===ve){Li(g,C);return}if(d===Ft){y(a);return}const T=()=>{s(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(a.shapeFlag&1&&b&&!b.persisted){const{leave:L,delayLeave:A}=b,R=()=>L(g,T);A?A(a.el,T,R):R()}else T()},Li=(a,d)=>{let g;for(;a!==d;)g=m(a),s(a),a=g;s(d)},Mi=(a,d,g)=>{const{bum:C,scope:b,update:T,subTree:L,um:A,m:R,a:E}=a;ys(R),ys(E),C&&dn(C),b.stop(),T&&(T.active=!1,Ie(L,a,d,g)),A&&_e(A,d),_e(()=>{a.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Rt=(a,d,g,C=!1,b=!1,T=0)=>{for(let L=T;L{if(a.shapeFlag&6)return zt(a.component.subTree);if(a.shapeFlag&128)return a.suspense.next();const d=m(a.anchor||a.el),g=d&&d[Wo];return g?m(g):d};let Dn=!1;const Xr=(a,d,g)=>{a==null?d._vnode&&Ie(d._vnode,null,null,!0):O(d._vnode||null,a,d,null,null,null,g),d._vnode=a,Dn||(Dn=!0,is(),_n(),Dn=!1)},ht={p:O,um:Ie,m:nt,r:Gr,mt:ee,mc:V,pc:k,pbc:v,n:zt,o:e};let Un,Bn;return t&&([Un,Bn]=t(ht)),{render:Xr,hydrate:Un,createApp:zl(Xr,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 Yo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ur(e,t,n=!1){const r=e.children,s=t.children;if(B(r)&&B(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 zo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:zo(t)}function ys(e){if(e)for(let t=0;tSt(hc);function Br(e,t){return $n(e,null,t)}function vu(e,t){return $n(e,null,{flush:"post"})}const ln={};function $e(e,t,n){return $n(e,t,n)}function $n(e,t,{immediate:n,deep:r,flush:s,once:o,onTrack:i,onTrigger:l}=ne){if(t&&o){const x=t;t=(...F)=>{x(...F),I()}}const c=ae,u=x=>r===!0?x:Ge(x,r===!1?1:void 0);let f,h=!1,m=!1;if(he(e)?(f=()=>e.value,h=Tt(e)):bt(e)?(f=()=>u(e),h=!0):B(e)?(m=!0,h=e.some(x=>bt(x)||Tt(x)),f=()=>e.map(x=>{if(he(x))return x.value;if(bt(x))return u(x);if(q(x))return Ye(x,c,2)})):q(e)?t?f=()=>Ye(e,c,2):f=()=>(_&&_(),Re(e,c,3,[w])):f=Ae,t&&r){const x=f;f=()=>Ge(x())}let _,w=x=>{_=p.onStop=()=>{Ye(x,c,4),_=p.onStop=void 0}},O;if(Xt)if(w=Ae,t?n&&Re(t,c,3,[f(),m?[]:void 0,w]):f(),s==="sync"){const x=pc();O=x.__watcherHandles||(x.__watcherHandles=[])}else return Ae;let U=m?new Array(e.length).fill(ln):ln;const W=()=>{if(!(!p.active||!p.dirty))if(t){const x=p.run();(r||h||(m?x.some((F,V)=>ze(F,U[V])):ze(x,U)))&&(_&&_(),Re(t,c,3,[x,U===ln?void 0:m&&U[0]===ln?[]:U,w]),U=x)}else p.run()};W.allowRecurse=!!t;let H;s==="sync"?H=W:s==="post"?H=()=>_e(W,c&&c.suspense):(W.pre=!0,c&&(W.id=c.uid),H=()=>In(W));const p=new Ar(f,Ae,H),y=ro(),I=()=>{p.stop(),y&&Cr(y.effects,p)};return t?n?W():U=p.run():s==="post"?_e(p.run.bind(p),c&&c.suspense):p.run(),O&&O.push(I),I}function gc(e,t,n){const r=this.proxy,s=ie(e)?e.includes(".")?Jo(r,e):()=>r[e]:e.bind(r,r);let o;q(t)?o=t:(o=t.handler,n=t);const i=Gt(this),l=$n(s,o.bind(r),n);return i(),l}function Jo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{Ge(r,t,n)});else if(Js(e)){for(const r in e)Ge(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Ge(e[r],t,n)}return e}const mc=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Le(t)}Modifiers`]||e[`${Ze(t)}Modifiers`];function yc(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||ne;let s=n;const o=t.startsWith("update:"),i=o&&mc(r,t.slice(7));i&&(i.trim&&(s=n.map(f=>ie(f)?f.trim():f)),i.number&&(s=n.map(cr)));let l,c=r[l=fn(t)]||r[l=fn(Le(t))];!c&&o&&(c=r[l=fn(Ze(t))]),c&&Re(c,e,6,s);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Re(u,e,6,s)}}function Qo(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(!q(e)){const c=u=>{const f=Qo(u,t,!0);f&&(l=!0,fe(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):(B(o)?o.forEach(c=>i[c]=null):fe(i,o),Z(e)&&r.set(e,i),i)}function Hn(e,t){return!e||!Kt(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,Ze(t))||z(e,t))}function Xn(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[o],slots:i,attrs:l,emit:c,render:u,renderCache:f,props:h,data:m,setupState:_,ctx:w,inheritAttrs:O}=e,U=vn(e);let W,H;try{if(n.shapeFlag&4){const y=s||r,I=y;W=xe(u.call(I,y,f,h,_,m,w)),H=l}else{const y=t;W=xe(y.length>1?y(h,{attrs:l,slots:i,emit:c}):y(h,null)),H=t.props?l:_c(l)}}catch(y){$t.length=0,Wt(y,e,1),W=le(ye)}let p=W;if(H&&O!==!1){const y=Object.keys(H),{shapeFlag:I}=p;y.length&&I&7&&(o&&y.some(Er)&&(H=vc(H,o)),p=Je(p,H,!1,!0))}return n.dirs&&(p=Je(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&(p.transition=n.transition),W=p,vn(U),W}const _c=e=>{let t;for(const n in e)(n==="class"||n==="style"||Kt(n))&&((t||(t={}))[n]=e[n]);return t},vc=(e,t)=>{const n={};for(const r in e)(!Er(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function bc(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?_s(r,i,u):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function Zo(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):xl(e)}const ve=Symbol.for("v-fgt"),ut=Symbol.for("v-txt"),ye=Symbol.for("v-cmt"),Ft=Symbol.for("v-stc"),$t=[];let Ce=null;function ei(e=!1){$t.push(Ce=e?null:[])}function Cc(){$t.pop(),Ce=$t[$t.length-1]||null}let Ut=1;function vs(e){Ut+=e,e<0&&Ce&&(Ce.hasOnce=!0)}function ti(e){return e.dynamicChildren=Ut>0?Ce||yt:null,Cc(),Ut>0&&Ce&&Ce.push(e),e}function bu(e,t,n,r,s,o){return ti(si(e,t,n,r,s,o,!0))}function ni(e,t,n,r,s){return ti(le(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 ri=({key:e})=>e??null,pn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ie(e)||he(e)||q(e)?{i:ue,r:e,k:t,f:!!n}:e:null);function si(e,t=null,n=null,r=0,s=null,o=e===ve?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ri(t),ref:t&&pn(t),scopeId:Pn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:ue};return l?(kr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),Ut>0&&!i&&Ce&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Ce.push(c),c}const le=Sc;function Sc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Mo)&&(e=ye),Cn(e)){const l=Je(e,t,!0);return n&&kr(l,n),Ut>0&&!o&&Ce&&(l.shapeFlag&6?Ce[Ce.indexOf(e)]=l:Ce.push(l)),l.patchFlag=-2,l}if(Nc(e)&&(e=e.__vccOpts),t){t=Tc(t);let{class:l,style:c}=t;l&&!ie(l)&&(t.class=xr(l)),Z(c)&&(mo(c)&&!B(c)&&(c=fe({},c)),t.style=Tr(c))}const i=ie(e)?1:Ec(e)?128:sc(e)?64:Z(e)?4:q(e)?2:0;return si(e,t,n,r,s,i,o,!0)}function Tc(e){return e?mo(e)||jo(e)?fe({},e):e:null}function Je(e,t,n=!1,r=!1){const{props:s,ref:o,patchFlag:i,children:l,transition:c}=e,u=t?xc(s||{},t):s,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&ri(u),ref:t&&t.ref?n&&o?B(o)?o.concat(pn(t)):[o,pn(t)]:pn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ve?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&&Je(e.ssContent),ssFallback:e.ssFallback&&Je(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&bn(f,c.clone(f)),f}function oi(e=" ",t=0){return le(ut,null,e,t)}function wu(e,t){const n=le(Ft,null,e);return n.staticCount=t,n}function Eu(e="",t=!1){return t?(ei(),ni(ye,null,e)):le(ye,null,e)}function xe(e){return e==null||typeof e=="boolean"?le(ye):B(e)?le(ve,null,e.slice()):typeof e=="object"?qe(e):le(ut,null,String(e))}function qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Je(e)}function kr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(B(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&&!jo(t)?t._ctx=ue:s===3&&ue&&(ue.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:ue},n=32):(t=String(t),r&64?(n=16,t=[oi(t)]):n=8);e.children=t,e.shapeFlag|=n}function xc(...e){const t={};for(let n=0;nae||ue;let Sn,vr;{const e=Zs(),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)}};Sn=t("__VUE_INSTANCE_SETTERS__",n=>ae=n),vr=t("__VUE_SSR_SETTERS__",n=>Xt=n)}const Gt=e=>{const t=ae;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},bs=()=>{ae&&ae.scope.off(),Sn(null)};function ii(e){return e.vnode.shapeFlag&4}let Xt=!1;function Lc(e,t=!1,n=!1){t&&vr(t);const{props:r,children:s}=e.vnode,o=ii(e);Ql(e,r,o,t),nc(e,s,n);const i=o?Mc(e,t):void 0;return t&&vr(!1),i}function Mc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Bl);const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?ci(e):null,o=Gt(e);et();const i=Ye(r,e,0,[e.props,s]);if(tt(),o(),Ys(i)){if(i.then(bs,bs),t)return i.then(l=>{ws(e,l,t)}).catch(l=>{Wt(l,e,0)});e.asyncDep=i}else ws(e,i,t)}else li(e,t)}function ws(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=bo(t)),li(e,n)}let Es;function li(e,t,n){const r=e.type;if(!e.render){if(!t&&Es&&!r.render){const s=r.template||Vr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,u=fe(fe({isCustomElement:o,delimiters:l},i),c);r.render=Es(s,u)}}e.render=r.render||Ae}{const s=Gt(e);et();try{Kl(e)}finally{tt(),s()}}}const Ic={get(e,t){return be(e,"get",""),e[t]}};function ci(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Ic),slots:e.slots,emit:e.emit,expose:t}}function Vn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(bo(hn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Pt)return Pt[n](e)},has(t,n){return n in t||n in Pt}})):e.proxy}function Pc(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Nc(e){return q(e)&&"__vccOpts"in e}const se=(e,t)=>gl(e,t,Xt);function br(e,t,n){const r=arguments.length;return r===2?Z(t)&&!B(t)?Cn(t)?le(e,null,[t]):le(e,t):le(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Cn(n)&&(n=[n]),le(e,t,n))}const Fc="3.4.38";/** +* @vue/runtime-dom v3.4.38 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const $c="http://www.w3.org/2000/svg",Hc="http://www.w3.org/1998/Math/MathML",je=typeof document<"u"?document:null,Cs=je&&je.createElement("template"),jc={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"?je.createElementNS($c,e):t==="mathml"?je.createElementNS(Hc,e):n?je.createElement(e,{is:n}):je.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>je.createTextNode(e),createComment:e=>je.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>je.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{Cs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Cs.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]}},Be="transition",Lt="animation",Bt=Symbol("_vtc"),ai=(e,{slots:t})=>br(Ml,Vc(e),t);ai.displayName="Transition";const ui={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ai.props=fe({},To,ui);const st=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ss=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function Vc(e){const t={};for(const S in e)S in ui||(t[S]=e[S]);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:u=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,w=Dc(s),O=w&&w[0],U=w&&w[1],{onBeforeEnter:W,onEnter:H,onEnterCancelled:p,onLeave:y,onLeaveCancelled:I,onBeforeAppear:x=W,onAppear:F=H,onAppearCancelled:V=p}=t,M=(S,K,ee)=>{ot(S,K?f:l),ot(S,K?u:i),ee&&ee()},v=(S,K)=>{S._isLeaving=!1,ot(S,h),ot(S,_),ot(S,m),K&&K()},P=S=>(K,ee)=>{const re=S?F:H,D=()=>M(K,S,ee);st(re,[K,D]),Ts(()=>{ot(K,S?c:o),ke(K,S?f:l),Ss(re)||xs(K,r,O,D)})};return fe(t,{onBeforeEnter(S){st(W,[S]),ke(S,o),ke(S,i)},onBeforeAppear(S){st(x,[S]),ke(S,c),ke(S,u)},onEnter:P(!1),onAppear:P(!0),onLeave(S,K){S._isLeaving=!0;const ee=()=>v(S,K);ke(S,h),ke(S,m),kc(),Ts(()=>{S._isLeaving&&(ot(S,h),ke(S,_),Ss(y)||xs(S,r,U,ee))}),st(y,[S,ee])},onEnterCancelled(S){M(S,!1),st(p,[S])},onAppearCancelled(S){M(S,!0),st(V,[S])},onLeaveCancelled(S){v(S),st(I,[S])}})}function Dc(e){if(e==null)return null;if(Z(e))return[Yn(e.enter),Yn(e.leave)];{const t=Yn(e);return[t,t]}}function Yn(e){return Hi(e)}function ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Bt]||(e[Bt]=new Set)).add(t)}function ot(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Bt];n&&(n.delete(t),n.size||(e[Bt]=void 0))}function Ts(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Uc=0;function xs(e,t,n,r){const s=e._endId=++Uc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Bc(e,t);if(!i)return r();const u=i+"end";let f=0;const h=()=>{e.removeEventListener(u,m),o()},m=_=>{_.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[w]||"").split(", "),s=r(`${Be}Delay`),o=r(`${Be}Duration`),i=As(s,o),l=r(`${Lt}Delay`),c=r(`${Lt}Duration`),u=As(l,c);let f=null,h=0,m=0;t===Be?i>0&&(f=Be,h=i,m=o.length):t===Lt?u>0&&(f=Lt,h=u,m=c.length):(h=Math.max(i,u),f=h>0?i>u?Be:Lt:null,m=f?f===Be?o.length:c.length:0);const _=f===Be&&/\b(transform|all)(,|$)/.test(r(`${Be}Property`).toString());return{type:f,timeout:h,propCount:m,hasTransform:_}}function As(e,t){for(;e.lengthRs(n)+Rs(e[r])))}function Rs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function kc(){return document.body.offsetHeight}function Kc(e,t,n){const r=e[Bt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Os=Symbol("_vod"),Wc=Symbol("_vsh"),qc=Symbol(""),Gc=/(^|;)\s*display\s*:/;function Xc(e,t,n){const r=e.style,s=ie(n);let o=!1;if(n&&!s){if(t)if(ie(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&gn(r,l,"")}else for(const i in t)n[i]==null&&gn(r,i,"");for(const i in n)i==="display"&&(o=!0),gn(r,i,n[i])}else if(s){if(t!==n){const i=r[qc];i&&(n+=";"+i),r.cssText=n,o=Gc.test(n)}}else t&&e.removeAttribute("style");Os in e&&(e[Os]=o?r.display:"",e[Wc]&&(r.display="none"))}const Ls=/\s*!important$/;function gn(e,t,n){if(B(n))n.forEach(r=>gn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Yc(e,t);Ls.test(n)?e.setProperty(Ze(r),n.replace(Ls,""),"important"):e[r]=n}}const Ms=["Webkit","Moz","ms"],zn={};function Yc(e,t){const n=zn[t];if(n)return n;let r=Le(t);if(r!=="filter"&&r in e)return zn[t]=r;r=An(r);for(let s=0;sJn||(ea.then(()=>Jn=0),Jn=Date.now());function na(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Re(ra(r,n.value),t,5,[r])};return n.value=e,n.attached=ta(),n}function ra(e,t){if(B(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 $s=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,sa=(e,t,n,r,s,o)=>{const i=s==="svg";t==="class"?Kc(e,r,i):t==="style"?Xc(e,n,r):Kt(t)?Er(t)||Qc(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):oa(e,t,r,i))?(zc(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ps(e,t,r,i,o,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ps(e,t,r,i))};function oa(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&$s(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return $s(t)&&ie(n)?!1:t in e}const Hs=e=>{const t=e.props["onUpdate:modelValue"]||!1;return B(t)?n=>dn(t,n):t};function ia(e){e.target.composing=!0}function js(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qn=Symbol("_assign"),Cu={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Qn]=Hs(s);const o=r||s.props&&s.props.type==="number";mt(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&&mt(e,"change",()=>{e.value=e.value.trim()}),t||(mt(e,"compositionstart",ia),mt(e,"compositionend",js),mt(e,"change",js))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[Qn]=Hs(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))}},la=["ctrl","shift","alt","meta"],ca={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)=>la.some(n=>e[`${n}Key`]&&!t.includes(n))},Su=(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=Ze(s.key);if(t.some(i=>i===o||aa[i]===o))return e(s)})},fi=fe({patchProp:sa},jc);let Ht,Vs=!1;function ua(){return Ht||(Ht=uc(fi))}function fa(){return Ht=Vs?Ht:fc(fi),Vs=!0,Ht}const xu=(...e)=>{const t=ua().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=hi(r);if(!s)return;const o=t._component;!q(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,di(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},Au=(...e)=>{const t=fa().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=hi(r);if(s)return n(s,!0,di(s))},t};function di(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function hi(e){return ie(e)?document.querySelector(e):e}const da=window.__VP_SITE_DATA__;function Kr(e){return ro()?(Gi(e),!0):!1}function He(e){return typeof e=="function"?e():vo(e)}const pi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ru=e=>e!=null,ha=Object.prototype.toString,pa=e=>ha.call(e)==="[object Object]",kt=()=>{},Ds=ga();function ga(){var e,t;return pi&&((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 ma(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 gi=e=>e();function ya(e,t={}){let n,r,s=kt;const o=l=>{clearTimeout(l),s(),s=kt};return l=>{const c=He(e),u=He(t.maxWait);return n&&o(n),c<=0||u!==void 0&&u<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,u&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},u)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function _a(e=gi){const t=oe(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Ln(t),pause:n,resume:r,eventFilter:s}}function va(e){return jn()}function mi(...e){if(e.length!==1)return El(...e);const t=e[0];return typeof t=="function"?Ln(vl(()=>({get:t,set:kt}))):oe(t)}function yi(e,t,n={}){const{eventFilter:r=gi,...s}=n;return $e(e,ma(r,t),s)}function ba(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=_a(r);return{stop:yi(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Wr(e,t=!0,n){va()?At(e,n):t?e():Mn(e)}function Ou(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return yi(e,t,{...o,eventFilter:ya(r,{maxWait:s})})}function Lu(e,t,n){let r;he(n)?r={evaluating:n}:r={};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=kt}=r,c=oe(!s),u=i?Fr(t):oe(t);let f=0;return Br(async h=>{if(!c.value)return;f++;const m=f;let _=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const w=await e(O=>{h(()=>{o&&(o.value=!1),_||O()})});m===f&&(u.value=w)}catch(w){l(w)}finally{o&&m===f&&(o.value=!1),_=!0}}),s?se(()=>(c.value=!0,u.value)):u}function _i(e){var t;const n=He(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Me=pi?window:void 0;function xt(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Me):[t,n,r,s]=e,!t)return kt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,m,_)=>(f.addEventListener(h,m,_),()=>f.removeEventListener(h,m,_)),c=$e(()=>[_i(t),He(s)],([f,h])=>{if(i(),!f)return;const m=pa(h)?{...h}:h;o.push(...n.flatMap(_=>r.map(w=>l(f,_,w,m))))},{immediate:!0,flush:"post"}),u=()=>{c(),i()};return Kr(u),u}function wa(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Mu(...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=Me,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=wa(t);return xt(s,o,f=>{f.repeat&&He(l)||c(f)&&n(f)},i)}function Ea(){const e=oe(!1),t=jn();return t&&At(()=>{e.value=!0},t),e}function Ca(e){const t=Ea();return se(()=>(t.value,!!e()))}function vi(e,t={}){const{window:n=Me}=t,r=Ca(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=oe(!1),i=u=>{o.value=u.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Br(()=>{r.value&&(l(),s=n.matchMedia(He(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Kr(()=>{c(),l(),s=void 0}),o}const cn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},an="__vueuse_ssr_handlers__",Sa=Ta();function Ta(){return an in cn||(cn[an]=cn[an]||{}),cn[an]}function bi(e,t){return Sa[e]||t}function xa(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 Aa={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()}},Us="vueuse-storage";function qr(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:f,window:h=Me,eventFilter:m,onError:_=v=>{console.error(v)},initOnMounted:w}=r,O=(f?Fr:oe)(typeof t=="function"?t():t);if(!n)try{n=bi("getDefaultStorage",()=>{var v;return(v=Me)==null?void 0:v.localStorage})()}catch(v){_(v)}if(!n)return O;const U=He(t),W=xa(U),H=(s=r.serializer)!=null?s:Aa[W],{pause:p,resume:y}=ba(O,()=>x(O.value),{flush:o,deep:i,eventFilter:m});h&&l&&Wr(()=>{n instanceof Storage?xt(h,"storage",V):xt(h,Us,M),w&&V()}),w||V();function I(v,P){if(h){const S={key:e,oldValue:v,newValue:P,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",S):new CustomEvent(Us,{detail:S}))}}function x(v){try{const P=n.getItem(e);if(v==null)I(P,null),n.removeItem(e);else{const S=H.write(v);P!==S&&(n.setItem(e,S),I(P,S))}}catch(P){_(P)}}function F(v){const P=v?v.newValue:n.getItem(e);if(P==null)return c&&U!=null&&n.setItem(e,H.write(U)),U;if(!v&&u){const S=H.read(P);return typeof u=="function"?u(S,U):W==="object"&&!Array.isArray(S)?{...U,...S}:S}else return typeof P!="string"?P:H.read(P)}function V(v){if(!(v&&v.storageArea!==n)){if(v&&v.key==null){O.value=U;return}if(!(v&&v.key!==e)){p();try{(v==null?void 0:v.newValue)!==H.write(O.value)&&(O.value=F(v))}catch(P){_(P)}finally{v?Mn(y):y()}}}}function M(v){V(v.detail)}return O}function wi(e){return vi("(prefers-color-scheme: dark)",e)}const Ra="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Oa(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Me,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},m=wi({window:s}),_=se(()=>m.value?"dark":"light"),w=c||(i==null?mi(r):qr(i,r,o,{window:s,listenToStorageChanges:l})),O=se(()=>w.value==="auto"?_.value:w.value),U=bi("updateHTMLAttrs",(y,I,x)=>{const F=typeof y=="string"?s==null?void 0:s.document.querySelector(y):_i(y);if(!F)return;const V=new Set,M=new Set;let v=null;if(I==="class"){const S=x.split(/\s/g);Object.values(h).flatMap(K=>(K||"").split(/\s/g)).filter(Boolean).forEach(K=>{S.includes(K)?V.add(K):M.add(K)})}else v={key:I,value:x};if(V.size===0&&M.size===0&&v===null)return;let P;f&&(P=s.document.createElement("style"),P.appendChild(document.createTextNode(Ra)),s.document.head.appendChild(P));for(const S of V)F.classList.add(S);for(const S of M)F.classList.remove(S);v&&F.setAttribute(v.key,v.value),f&&(s.getComputedStyle(P).opacity,document.head.removeChild(P))});function W(y){var I;U(t,n,(I=h[y])!=null?I:y)}function H(y){e.onChanged?e.onChanged(y,W):W(y)}$e(O,H,{flush:"post",immediate:!0}),Wr(()=>H(O.value));const p=se({get(){return u?w.value:O.value},set(y){w.value=y}});try{return Object.assign(p,{store:w,system:_,state:O})}catch{return p}}function La(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Me}=e,s=Oa({...e,onChanged:(l,c)=>{var u;e.onChanged?(u=e.onChanged)==null||u.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=se(()=>s.system?s.system.value:wi({window:r}).value?"dark":"light");return se({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 Iu(e,t,n={}){const{window:r=Me}=n;return qr(e,t,r==null?void 0:r.localStorage,n)}function Ei(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 Pu(e,t=!1){const n=oe(t);let r=null,s="";$e(mi(e),l=>{const c=Zn(He(l));if(c){const u=c;if(er.get(u)||er.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(s=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const o=()=>{const l=Zn(He(e));!l||n.value||(Ds&&(r=xt(l,"touchmove",c=>{Ma(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=Zn(He(e));!l||!n.value||(Ds&&(r==null||r()),l.style.overflow=s,er.delete(l),n.value=!1)};return Kr(i),se({get(){return n.value},set(l){l?o():i()}})}function Nu(e,t,n={}){const{window:r=Me}=n;return qr(e,t,r==null?void 0:r.sessionStorage,n)}function Fu(e={}){const{window:t=Me,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const r=oe(t.scrollX),s=oe(t.scrollY),o=se({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=se({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return xt(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}function $u(e={}){const{window:t=Me,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:s=!0,includeScrollbar:o=!0,type:i="inner"}=e,l=oe(n),c=oe(r),u=()=>{t&&(i==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):o?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(u(),Wr(u),xt("resize",u,{passive:!0}),s){const f=vi("(orientation: portrait)");$e(f,()=>u())}return{width:l,height:c}}const tr={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var nr={};const Ci=/^(?:[a-z]+:|\/\/)/i,Ia="vitepress-theme-appearance",Pa=/#.*$/,Na=/[?#].*$/,Fa=/(?:(^|\/)index)?\.(?:md|html)$/,pe=typeof document<"u",Si={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function $a(e,t,n=!1){if(t===void 0)return!1;if(e=Bs(`/${e}`),n)return new RegExp(t).test(e);if(Bs(t)!==e)return!1;const r=t.match(Pa);return r?(pe?location.hash:"")===r[0]:!0}function Bs(e){return decodeURI(e).replace(Na,"").replace(Fa,"$1")}function Ha(e){return Ci.test(e)}function ja(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Ha(n)&&$a(t,`/${n}/`,!0))||"root"}function Va(e,t){var r,s,o,i,l,c,u;const n=ja(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:xi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function Ti(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=Da(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function Da(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Ua(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 xi(e,t){return[...e.filter(n=>!Ua(t,n)),...t]}const Ba=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ka=/^[a-z]:/i;function ks(e){const t=ka.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ba,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const rr=new Set;function Ka(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 Hu(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Wa=Symbol(),ft=Fr(da);function ju(e){const t=se(()=>Va(ft.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?oe(!0):n?La({storageKey:Ia,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),s=oe(pe?location.hash:"");return pe&&window.addEventListener("hashchange",()=>{s.value=location.hash}),$e(()=>e.data,()=>{s.value=pe?location.hash:""}),{site:t,theme:se(()=>t.value.themeConfig),page:se(()=>e.data),frontmatter:se(()=>e.data.frontmatter),params:se(()=>e.data.params),lang:se(()=>t.value.lang),dir:se(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:se(()=>t.value.localeIndex||"root"),title:se(()=>Ti(t.value,e.data)),description:se(()=>e.data.description||t.value.description),isDark:r,hash:se(()=>s.value)}}function qa(){const e=St(Wa);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ga(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ks(e){return Ci.test(e)||!e.startsWith("/")?e:Ga(ft.value.base,e)}function Xa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),pe){const n="/";t=ks(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=`./${ks(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let mn=[];function Vu(e){mn.push(e),Fn(()=>{mn=mn.filter(t=>t!==e)})}function Ya(){let e=ft.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=Ws(e,n);else if(Array.isArray(e))for(const r of e){const s=Ws(r,n);if(s){t=s;break}}return t}function Ws(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}const za=Symbol(),Ai="http://a.com",Ja=()=>({path:"/",component:null,data:Si});function Du(e,t){const n=On(Ja()),r={route:n,go:s};async function s(l=pe?location.href:"/"){var c,u;l=sr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(pe&&l!==sr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await i(l),await((u=r.onAfterRouteChanged)==null?void 0:u.call(r,l)))}let o=null;async function i(l,c=0,u=!1){var m;if(await((m=r.onBeforePageLoad)==null?void 0:m.call(r,l))===!1)return;const f=new URL(l,Ai),h=o=f.pathname;try{let _=await e(h);if(!_)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:w,__pageData:O}=_;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=pe?h:Ks(h),n.component=hn(w),n.data=hn(O),pe&&Mn(()=>{let U=ft.value.base+O.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ft.value.cleanUrls&&!U.endsWith("/")&&(U+=".html"),U!==f.pathname&&(f.pathname=U,l=U+f.search+f.hash,history.replaceState({},"",l)),f.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(H){console.warn(H)}if(W){qs(W,f.hash);return}}window.scrollTo(0,c)})}}catch(_){if(!/fetch|Page not found/.test(_.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(_),!u)try{const w=await fetch(ft.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await i(l,c,!0);return}catch{}if(o===h){o=null,n.path=pe?h:Ks(h),n.component=t?hn(t):null;const w=pe?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Si,relativePath:w}}}}return pe&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:f,origin:h,pathname:m,hash:_,search:w}=new URL(u,c.baseURI),O=new URL(location.href);h===O.origin&&Ka(m)&&(l.preventDefault(),m===O.pathname&&w===O.search?(_!==O.hash&&(history.pushState({},"",f),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:O.href,newURL:f}))),_?qs(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):s(f))},{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 Qa(){const e=St(za);if(!e)throw new Error("useRouter() is called without provider.");return e}function Ri(){return Qa().route}function qs(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-Ya()+o;requestAnimationFrame(s)}}function sr(e){const t=new URL(e,Ai);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ft.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=()=>mn.forEach(e=>e()),Uu=Hr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Ri(),{site:n}=qa();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"])}}),Bu=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Za="modulepreload",eu=function(e){return"/"+e},Gs={},ku=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=eu(l),l in Gs)return;Gs[l]=!0;const c=l.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))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})},Ku=Hr({setup(e,{slots:t}){const n=oe(!1);return At(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Wu(){pe&&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(u=>u.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 qu(){if(pe){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 u=c.textContent||"";i&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),tu(u).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 tu(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 Gu(e,t){let n=!0,r=[];const s=o=>{if(n){n=!1,o.forEach(l=>{const c=ir(l);for(const u of document.head.children)if(u.isEqualNode(c)){r.push(u);return}});return}const i=o.map(ir);r.forEach((l,c)=>{const u=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));u!==-1?delete i[u]:(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||[],u=Ti(i,o);u!==document.title&&(document.title=u);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(xi(i.head,ru(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 nu(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function ru(e){return e.filter(t=>!nu(t))}const lr=new Set,Oi=()=>document.createElement("link"),su=e=>{const t=Oi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},ou=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let un;const iu=pe&&(un=Oi())&&un.relList&&un.relList.supports&&un.relList.supports("prefetch")?su:ou;function Xu(){if(!pe||!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 u=Xa(c);u&&iu(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):lr.add(l))})})};At(r);const s=Ri();$e(()=>s.path,r),Fn(()=>{n&&n.disconnect()})}export{Tu as $,vu as A,Hl as B,Ya as C,du as D,pu as E,ve as F,Fr as G,Vu as H,le as I,hu as J,Ci as K,Ri as L,xc as M,St as N,$u as O,Tr as P,Mu as Q,Mn as R,Fu as S,ai as T,pe as U,Ln as V,fu as W,ku as X,Pu as Y,Jl as Z,Bu as _,oi as a,mu as a0,Lo as a1,Su as a2,yu as a3,xu as a4,br as a5,wu as a6,lu as a7,Gu as a8,za as a9,Hu as aA,ju as aa,Wa as ab,Uu as ac,Ku as ad,ft as ae,Au as af,Du as ag,Xa as ah,Xu as ai,qu as aj,Wu as ak,He as al,_i as am,Ru as an,Kr as ao,Lu as ap,Nu as aq,Iu as ar,Ou as as,Qa as at,xt as au,uu as av,Cu as aw,he as ax,_u as ay,hn as az,ni as b,bu as c,Hr as d,Eu as e,Ka as f,Ks as g,se as h,Ha as i,si as j,vo as k,au as l,$a as m,xr as n,ei as o,cu as p,vi as q,gu as r,oe as s,Ki as t,qa as u,$e as v,Rl as w,Br as x,At as y,Fn as z}; diff --git a/assets/chunks/giscus-aTimukGI.CKTvSCx2.js b/assets/chunks/giscus-aTimukGI.CKTvSCx2.js new file mode 100644 index 00000000..901e31ab --- /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.CuJNMu0w.js b/assets/chunks/theme.CuJNMu0w.js new file mode 100644 index 00000000..79c4bb6f --- /dev/null +++ b/assets/chunks/theme.CuJNMu0w.js @@ -0,0 +1,4 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.C8JYv8Jy.js","assets/chunks/framework.Bhh1y9_T.js"])))=>i.map(i=>d[i]); +import{d as _,o as s,c,r as u,n as H,a as oe,t as A,b as $,w as p,e as h,T as Oe,_ as y,u as ot,i as Mt,f as Bt,g as ye,h as L,j as d,k as i,p as G,l as j,m as ce,q as ze,s as z,v as Z,x as Le,y as J,z as Fe,A as De,B as Ot,C as Ft,D as ie,F as B,E as W,G as nt,H as Pe,I as g,J as ee,K as at,L as pe,M as re,N as Se,O as Dt,P as st,Q as Ae,R as Ue,S as rt,U as Ve,V as Ut,W as Gt,X as it,Y as lt,Z as ct,$ as jt,a0 as qt,a1 as Rt,a2 as ut,a3 as Kt,a4 as Wt,a5 as ve,a6 as Jt,a7 as Yt}from"./framework.Bhh1y9_T.js";const dt=_({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(s(),c("span",{class:H(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[oe(A(e.text),1)])],2))}}),Zt={key:0,class:"VPBackdrop"},Xt=_({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(s(),$(Oe,{name:"fade"},{default:p(()=>[e.show?(s(),c("div",Zt)):h("",!0)]),_:1}))}}),Qt=y(Xt,[["__scopeId","data-v-4a25c188"]]),w=ot;function xt(o,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(o,e):(o(),(n=!0)&&setTimeout(()=>n=!1,e))}}function He(o){return/^\//.test(o)?o:`/${o}`}function Ge(o){const{pathname:e,search:t,hash:n,protocol:a}=new URL(o,"http://a.com");if(Mt(o)||o.startsWith("#")||!a.startsWith("http")||!Bt(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 ye(l)}function fe({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:n,theme:a,hash:r}=w(),l=L(()=>{var v,b;return{label:(v=e.value.locales[t.value])==null?void 0:v.label,link:((b=e.value.locales[t.value])==null?void 0:b.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:L(()=>Object.entries(e.value.locales).flatMap(([v,b])=>l.value.label===b.label?[]:{text:b.label,link:eo(b.link||(v==="root"?"/":`/${v}/`),a.value.i18nRouting!==!1&&o,n.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+r.value})),currentLang:l}}function eo(o,e,t,n){return e?o.replace(/\/$/,"")+He(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):o}const to=o=>(G("data-v-d3e33f7f"),o=o(),j(),o),oo={class:"NotFound"},no={class:"code"},ao={class:"title"},so=to(()=>d("div",{class:"divider"},null,-1)),ro={class:"quote"},io={class:"action"},lo=["href","aria-label"],co=_({__name:"NotFound",setup(o){const{theme:e}=w(),{currentLang:t}=fe();return(n,a)=>{var r,l,m,v,b;return s(),c("div",oo,[d("p",no,A(((r=i(e).notFound)==null?void 0:r.code)??"404"),1),d("h1",ao,A(((l=i(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),so,d("blockquote",ro,A(((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),d("div",io,[d("a",{class:"link",href:i(ye)(i(t).link),"aria-label":((v=i(e).notFound)==null?void 0:v.linkLabel)??"go to home"},A(((b=i(e).notFound)==null?void 0:b.linkText)??"Take me home"),9,lo)])])}}}),uo=y(co,[["__scopeId","data-v-d3e33f7f"]]);function mt(o,e){if(Array.isArray(o))return be(o);if(o==null)return[];e=He(e);const t=Object.keys(o).sort((a,r)=>r.split("/").length-a.split("/").length).find(a=>e.startsWith(He(a))),n=t?o[t]:[];return Array.isArray(n)?be(n):be(n.items,n.base)}function mo(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 vo(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 Me(o,e){return Array.isArray(e)?e.some(t=>Me(o,t)):ce(o,e.link)?!0:e.items?Me(o,e.items):!1}function be(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=be(n.items,a)),n})}function ne(){const{frontmatter:o,page:e,theme:t}=w(),n=ze("(min-width: 960px)"),a=z(!1),r=L(()=>{const F=t.value.sidebar,C=e.value.relativePath;return F?mt(F,C):[]}),l=z(r.value);Z(r,(F,C)=>{JSON.stringify(F)!==JSON.stringify(C)&&(l.value=r.value)});const m=L(()=>o.value.sidebar!==!1&&l.value.length>0&&o.value.layout!=="home"),v=L(()=>b?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),b=L(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),P=L(()=>m.value&&n.value),k=L(()=>m.value?mo(l.value):[]);function V(){a.value=!0}function E(){a.value=!1}function N(){a.value?E():V()}return{isOpen:a,sidebar:l,sidebarGroups:k,hasSidebar:m,hasAside:b,leftAside:v,isSidebarEnabled:P,open:V,close:E,toggle:N}}function po(o,e){let t;Le(()=>{t=o.value?document.activeElement:void 0}),J(()=>{window.addEventListener("keyup",n)}),Fe(()=>{window.removeEventListener("keyup",n)});function n(a){a.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function fo(o){const{page:e,hash:t}=w(),n=z(!1),a=L(()=>o.value.collapsed!=null),r=L(()=>!!o.value.link),l=z(!1),m=()=>{l.value=ce(e.value.relativePath,o.value.link)};Z([e,o,t],m),J(m);const v=L(()=>l.value?!0:o.value.items?Me(e.value.relativePath,o.value.items):!1),b=L(()=>!!(o.value.items&&o.value.items.length));Le(()=>{n.value=!!(a.value&&o.value.collapsed)}),De(()=>{(l.value||v.value)&&(n.value=!1)});function P(){a.value&&(n.value=!n.value)}return{collapsed:n,collapsible:a,isLink:r,isActiveLink:l,hasActiveLink:v,hasChildren:b,toggle:P}}function ho(){const{hasSidebar:o}=ne(),e=ze("(min-width: 960px)"),t=ze("(min-width: 1280px)");return{isAsideEnabled:L(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const Be=[];function vt(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function je(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:_o(t),link:"#"+t.id,level:n}});return go(e,o)}function _o(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 go(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;v--){const b=o[v];if(b.level{requestAnimationFrame(r),window.addEventListener("scroll",n)}),Ot(()=>{l(location.hash)}),Fe(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const m=window.scrollY,v=window.innerHeight,b=document.body.offsetHeight,P=Math.abs(m+v-b)<1,k=Be.map(({element:E,link:N})=>({link:N,top:ko(E)})).filter(({top:E})=>!Number.isNaN(E)).sort((E,N)=>E.top-N.top);if(!k.length){l(null);return}if(m<1){l(null);return}if(P){l(k[k.length-1].link);return}let V=null;for(const{link:E,top:N}of k){if(N>m+Ft()+4)break;V=E}l(V)}function l(m){a&&a.classList.remove("active"),m==null?a=null:a=o.value.querySelector(`a[href="${decodeURIComponent(m)}"]`);const v=a;v?(v.classList.add("active"),e.value.style.top=v.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ko(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"],yo=_({__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(),c("ul",{class:H(["VPDocOutlineItem",t.root?"root":"nested"])},[(s(!0),c(B,null,W(t.headers,({children:r,link:l,title:m})=>(s(),c("li",null,[d("a",{class:"outline-link",href:l,onClick:e,title:m},A(m),9,$o),r!=null&&r.length?(s(),$(a,{key:0,headers:r},null,8,["headers"])):h("",!0)]))),256))],2)}}}),pt=y(yo,[["__scopeId","data-v-00020b51"]]),Lo={class:"content"},Po={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},So=_({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=w(),n=nt([]);Pe(()=>{n.value=je(e.value.outline??t.value.outline)});const a=z(),r=z();return bo(a,r),(l,m)=>(s(),c("nav",{"aria-labelledby":"doc-outline-aria-label",class:H(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:a},[d("div",Lo,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",Po,A(i(vt)(i(t))),1),g(pt,{headers:n.value,root:!0},null,8,["headers"])])],2))}}),Vo=y(So,[["__scopeId","data-v-4c69a99b"]]),wo={class:"VPDocAsideCarbonAds"},To=_({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,n)=>(s(),c("div",wo,[g(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Io=o=>(G("data-v-957a5c78"),o=o(),j(),o),No={class:"VPDocAside"},Eo=Io(()=>d("div",{class:"spacer"},null,-1)),Co=_({__name:"VPDocAside",setup(o){const{theme:e}=w();return(t,n)=>(s(),c("div",No,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),g(Vo),u(t.$slots,"aside-outline-after",{},void 0,!0),Eo,u(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(s(),$(To,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):h("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}}),zo=y(Co,[["__scopeId","data-v-957a5c78"]]);function Ao(){const{theme:o,page:e}=w();return L(()=>{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 Ho(){const{page:o,theme:e,frontmatter:t}=w();return L(()=>{var b,P,k,V,E,N,F,C;const n=mt(e.value.sidebar,o.value.relativePath),a=vo(n),r=Mo(a,X=>X.link.replace(/[?#].*$/,"")),l=r.findIndex(X=>ce(o.value.relativePath,X.link)),m=((b=e.value.docFooter)==null?void 0:b.prev)===!1&&!t.value.prev||t.value.prev===!1,v=((P=e.value.docFooter)==null?void 0:P.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)??((k=r[l-1])==null?void 0:k.docFooterText)??((V=r[l-1])==null?void 0:V.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((E=r[l-1])==null?void 0:E.link)},next:v?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((N=r[l+1])==null?void 0:N.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 Mo(o,e){const t=new Set;return o.filter(n=>{const a=e(n);return t.has(a)?!1:t.add(a)})}const te=_({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=L(()=>e.tag??(e.href?"a":"span")),n=L(()=>e.href&&at.test(e.href)||e.target==="_blank");return(a,r)=>(s(),$(ee(t.value),{class:H(["VPLink",{link:a.href,"vp-external-link-icon":n.value,"no-icon":a.noIcon}]),href:a.href?i(Ge)(a.href):void 0,target:a.target??(n.value?"_blank":void 0),rel:a.rel??(n.value?"noreferrer":void 0)},{default:p(()=>[u(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Bo={class:"VPLastUpdated"},Oo=["datetime"],Fo=_({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:n}=w(),a=L(()=>new Date(t.value.lastUpdated)),r=L(()=>a.value.toISOString()),l=z("");return J(()=>{Le(()=>{var m,v,b;l.value=new Intl.DateTimeFormat((v=(m=e.value.lastUpdated)==null?void 0:m.formatOptions)!=null&&v.forceLocale?n.value:void 0,((b=e.value.lastUpdated)==null?void 0:b.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(m,v)=>{var b;return s(),c("p",Bo,[oe(A(((b=i(e).lastUpdated)==null?void 0:b.text)||i(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},A(l.value),9,Oo)])}}}),Do=y(Fo,[["__scopeId","data-v-c8439711"]]),ft=o=>(G("data-v-6fb16c48"),o=o(),j(),o),Uo={key:0,class:"VPDocFooter"},Go={key:0,class:"edit-info"},jo={key:0,class:"edit-link"},qo=ft(()=>d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),Ro={key:1,class:"last-updated"},Ko={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Wo=ft(()=>d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),Jo={class:"pager"},Yo=["innerHTML"],Zo=["innerHTML"],Xo={class:"pager"},Qo=["innerHTML"],xo=["innerHTML"],en=_({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:n}=w(),a=Ao(),r=Ho(),l=L(()=>e.value.editLink&&n.value.editLink!==!1),m=L(()=>t.value.lastUpdated),v=L(()=>l.value||m.value||r.value.prev||r.value.next);return(b,P)=>{var k,V,E,N;return v.value?(s(),c("footer",Uo,[u(b.$slots,"doc-footer-before",{},void 0,!0),l.value||m.value?(s(),c("div",Go,[l.value?(s(),c("div",jo,[g(te,{class:"edit-link-button",href:i(a).url,"no-icon":!0},{default:p(()=>[qo,oe(" "+A(i(a).text),1)]),_:1},8,["href"])])):h("",!0),m.value?(s(),c("div",Ro,[g(Do)])):h("",!0)])):h("",!0),(k=i(r).prev)!=null&&k.link||(V=i(r).next)!=null&&V.link?(s(),c("nav",Ko,[Wo,d("div",Jo,[(E=i(r).prev)!=null&&E.link?(s(),$(te,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:p(()=>{var F;return[d("span",{class:"desc",innerHTML:((F=i(e).docFooter)==null?void 0:F.prev)||"Previous page"},null,8,Yo),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,Zo)]}),_:1},8,["href"])):h("",!0)]),d("div",Xo,[(N=i(r).next)!=null&&N.link?(s(),$(te,{key:0,class:"pager-link next",href:i(r).next.link},{default:p(()=>{var F;return[d("span",{class:"desc",innerHTML:((F=i(e).docFooter)==null?void 0:F.next)||"Next page"},null,8,Qo),d("span",{class:"title",innerHTML:i(r).next.text},null,8,xo)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),tn=y(en,[["__scopeId","data-v-6fb16c48"]]),on=o=>(G("data-v-715d218f"),o=o(),j(),o),nn={class:"container"},an=on(()=>d("div",{class:"aside-curtain"},null,-1)),sn={class:"aside-container"},rn={class:"aside-content"},ln={class:"content"},cn={class:"content-container"},un={class:"main"},dn=_({__name:"VPDoc",setup(o){const{theme:e}=w(),t=pe(),{hasSidebar:n,hasAside:a,leftAside:r}=ne(),l=L(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(m,v)=>{const b=ie("Content");return s(),c("div",{class:H(["VPDoc",{"has-sidebar":i(n),"has-aside":i(a)}])},[u(m.$slots,"doc-top",{},void 0,!0),d("div",nn,[i(a)?(s(),c("div",{key:0,class:H(["aside",{"left-aside":i(r)}])},[an,d("div",sn,[d("div",rn,[g(zo,null,{"aside-top":p(()=>[u(m.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[u(m.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[u(m.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(m.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(m.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(m.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),d("div",ln,[d("div",cn,[u(m.$slots,"doc-before",{},void 0,!0),d("main",un,[g(b,{class:H(["vp-doc",[l.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),g(tn,null,{"doc-footer-before":p(()=>[u(m.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(m.$slots,"doc-after",{},void 0,!0)])])]),u(m.$slots,"doc-bottom",{},void 0,!0)],2)}}}),mn=y(dn,[["__scopeId","data-v-715d218f"]]),vn=_({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=L(()=>e.href&&at.test(e.href)),n=L(()=>e.tag||e.href?"a":"button");return(a,r)=>(s(),$(ee(n.value),{class:H(["VPButton",[a.size,a.theme]]),href:a.href?i(Ge)(a.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:p(()=>[oe(A(a.text),1)]),_:1},8,["class","href","target","rel"]))}}),pn=y(vn,[["__scopeId","data-v-19112015"]]),fn=["src","alt"],hn=_({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const n=ie("VPImage",!0);return e.image?(s(),c(B,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),c("img",re({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(ye)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,fn)):(s(),c(B,{key:1},[g(n,re({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),g(n,re({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),$e=y(hn,[["__scopeId","data-v-c6276651"]]),_n=o=>(G("data-v-415d0179"),o=o(),j(),o),gn={class:"container"},bn={class:"main"},kn={key:0,class:"name"},$n=["innerHTML"],yn=["innerHTML"],Ln=["innerHTML"],Pn={key:0,class:"actions"},Sn={key:0,class:"image"},Vn={class:"image-container"},wn=_n(()=>d("div",{class:"image-bg"},null,-1)),Tn=_({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=Se("hero-image-slot-exists");return(t,n)=>(s(),c("div",{class:H(["VPHero",{"has-image":t.image||i(e)}])},[d("div",gn,[d("div",bn,[u(t.$slots,"home-hero-info-before",{},void 0,!0),u(t.$slots,"home-hero-info",{},()=>[t.name?(s(),c("h1",kn,[d("span",{innerHTML:t.name,class:"clip"},null,8,$n)])):h("",!0),t.text?(s(),c("p",{key:1,innerHTML:t.text,class:"text"},null,8,yn)):h("",!0),t.tagline?(s(),c("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Ln)):h("",!0)],!0),u(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(s(),c("div",Pn,[(s(!0),c(B,null,W(t.actions,a=>(s(),c("div",{key:a.link,class:"action"},[g(pn,{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),u(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||i(e)?(s(),c("div",Sn,[d("div",Vn,[wn,u(t.$slots,"home-hero-image",{},()=>[t.image?(s(),$($e,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),In=y(Tn,[["__scopeId","data-v-415d0179"]]),Nn=_({__name:"VPHomeHero",setup(o){const{frontmatter:e}=w();return(t,n)=>i(e).hero?(s(),$(In,{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(()=>[u(t.$slots,"home-hero-info-before")]),"home-hero-info":p(()=>[u(t.$slots,"home-hero-info")]),"home-hero-info-after":p(()=>[u(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":p(()=>[u(t.$slots,"home-hero-actions-after")]),"home-hero-image":p(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),En=o=>(G("data-v-0c8a99e7"),o=o(),j(),o),Cn={class:"box"},zn={key:0,class:"icon"},An=["innerHTML"],Hn=["innerHTML"],Mn=["innerHTML"],Bn={key:4,class:"link-text"},On={class:"link-text-value"},Fn=En(()=>d("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),Dn=_({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(s(),$(te,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[d("article",Cn,[typeof e.icon=="object"&&e.icon.wrap?(s(),c("div",zn,[g($e,{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(),$($e,{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(),c("div",{key:2,class:"icon",innerHTML:e.icon},null,8,An)):h("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Hn),e.details?(s(),c("p",{key:3,class:"details",innerHTML:e.details},null,8,Mn)):h("",!0),e.linkText?(s(),c("div",Bn,[d("p",On,[oe(A(e.linkText)+" ",1),Fn])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Un=y(Dn,[["__scopeId","data-v-0c8a99e7"]]),Gn={key:0,class:"VPFeatures"},jn={class:"container"},qn={class:"items"},Rn=_({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=L(()=>{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(),c("div",Gn,[d("div",jn,[d("div",qn,[(s(!0),c(B,null,W(n.features,r=>(s(),c("div",{key:r.title,class:H(["item",[t.value]])},[g(Un,{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)}}),Kn=y(Rn,[["__scopeId","data-v-fdd7fd61"]]),Wn=_({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=w();return(t,n)=>i(e).features?(s(),$(Kn,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):h("",!0)}}),Jn=_({__name:"VPHomeContent",setup(o){const{width:e}=Dt({initialWidth:0,includeScrollbar:!1});return(t,n)=>(s(),c("div",{class:"vp-doc container",style:st(i(e)?{"--vp-offset":`calc(50% - ${i(e)/2}px)`}:{})},[u(t.$slots,"default",{},void 0,!0)],4))}}),Yn=y(Jn,[["__scopeId","data-v-38b3e09e"]]),Zn={class:"VPHome"},Xn=_({__name:"VPHome",setup(o){const{frontmatter:e}=w();return(t,n)=>{const a=ie("Content");return s(),c("div",Zn,[u(t.$slots,"home-hero-before",{},void 0,!0),g(Nn,null,{"home-hero-info-before":p(()=>[u(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[u(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[u(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[u(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[u(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(t.$slots,"home-hero-after",{},void 0,!0),u(t.$slots,"home-features-before",{},void 0,!0),g(Wn),u(t.$slots,"home-features-after",{},void 0,!0),i(e).markdownStyles!==!1?(s(),$(Yn,{key:0},{default:p(()=>[g(a)]),_:1})):(s(),$(a,{key:1}))])}}}),Qn=y(Xn,[["__scopeId","data-v-f3abe0bf"]]),xn={},ea={class:"VPPage"};function ta(o,e){const t=ie("Content");return s(),c("div",ea,[u(o.$slots,"page-top"),g(t),u(o.$slots,"page-bottom")])}const oa=y(xn,[["render",ta]]),na=_({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=w(),{hasSidebar:n}=ne();return(a,r)=>(s(),c("div",{class:H(["VPContent",{"has-sidebar":i(n),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?u(a.$slots,"not-found",{key:0},()=>[g(uo)],!0):i(t).layout==="page"?(s(),$(oa,{key:1},{"page-top":p(()=>[u(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[u(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(s(),$(Qn,{key:2},{"home-hero-before":p(()=>[u(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[u(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[u(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[u(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[u(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[u(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[u(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[u(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[u(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(s(),$(ee(i(t).layout),{key:3})):(s(),$(mn,{key:4},{"doc-top":p(()=>[u(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[u(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[u(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[u(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[u(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[u(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[u(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[u(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),aa=y(na,[["__scopeId","data-v-a399269d"]]),sa={class:"container"},ra=["innerHTML"],ia=["innerHTML"],la=_({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=w(),{hasSidebar:n}=ne();return(a,r)=>i(e).footer&&i(t).footer!==!1?(s(),c("footer",{key:0,class:H(["VPFooter",{"has-sidebar":i(n)}])},[d("div",sa,[i(e).footer.message?(s(),c("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,ra)):h("",!0),i(e).footer.copyright?(s(),c("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,ia)):h("",!0)])],2)):h("",!0)}}),ca=y(la,[["__scopeId","data-v-51d2e0a7"]]);function ua(){const{theme:o,frontmatter:e}=w(),t=nt([]),n=L(()=>t.value.length>0);return Pe(()=>{t.value=je(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:n}}const da=o=>(G("data-v-55fc9c08"),o=o(),j(),o),ma={class:"menu-text"},va=da(()=>d("span",{class:"vpi-chevron-right icon"},null,-1)),pa={class:"header"},fa={class:"outline"},ha=_({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=w(),n=z(!1),a=z(0),r=z(),l=z();function m(k){var V;(V=r.value)!=null&&V.contains(k.target)||(n.value=!1)}Z(n,k=>{if(k){document.addEventListener("click",m);return}document.removeEventListener("click",m)}),Ae("Escape",()=>{n.value=!1}),Pe(()=>{n.value=!1});function v(){n.value=!n.value,a.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function b(k){k.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ue(()=>{n.value=!1}))}function P(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(k,V)=>(s(),c("div",{class:"VPLocalNavOutlineDropdown",style:st({"--vp-vh":a.value+"px"}),ref_key:"main",ref:r},[k.headers.length>0?(s(),c("button",{key:0,onClick:v,class:H({open:n.value})},[d("span",ma,A(i(vt)(i(t))),1),va],2)):(s(),c("button",{key:1,onClick:P},A(i(t).returnToTopLabel||"Return to top"),1)),g(Oe,{name:"flyout"},{default:p(()=>[n.value?(s(),c("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:b},[d("div",pa,[d("a",{class:"top-link",href:"#",onClick:P},A(i(t).returnToTopLabel||"Return to top"),1)]),d("div",fa,[g(pt,{headers:k.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),_a=y(ha,[["__scopeId","data-v-55fc9c08"]]),ga=o=>(G("data-v-30188ab8"),o=o(),j(),o),ba={class:"container"},ka=["aria-expanded"],$a=ga(()=>d("span",{class:"vpi-align-left menu-icon"},null,-1)),ya={class:"menu-text"},La=_({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=w(),{hasSidebar:n}=ne(),{headers:a}=ua(),{y:r}=rt(),l=z(0);J(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Pe(()=>{a.value=je(t.value.outline??e.value.outline)});const m=L(()=>a.value.length===0),v=L(()=>m.value&&!n.value),b=L(()=>({VPLocalNav:!0,"has-sidebar":n.value,empty:m.value,fixed:v.value}));return(P,k)=>i(t).layout!=="home"&&(!v.value||i(r)>=l.value)?(s(),c("div",{key:0,class:H(b.value)},[d("div",ba,[i(n)?(s(),c("button",{key:0,class:"menu","aria-expanded":P.open,"aria-controls":"VPSidebarNav",onClick:k[0]||(k[0]=V=>P.$emit("open-menu"))},[$a,d("span",ya,A(i(e).sidebarMenuLabel||"Menu"),1)],8,ka)):h("",!0),g(_a,{headers:i(a),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),Pa=y(La,[["__scopeId","data-v-30188ab8"]]);function Sa(){const o=z(!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=pe();return Z(()=>r.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:n}}const Va={},wa={class:"VPSwitch",type:"button",role:"switch"},Ta={class:"check"},Ia={key:0,class:"icon"};function Na(o,e){return s(),c("button",wa,[d("span",Ta,[o.$slots.default?(s(),c("span",Ia,[u(o.$slots,"default",{},void 0,!0)])):h("",!0)])])}const Ea=y(Va,[["render",Na],["__scopeId","data-v-3ee2f654"]]),ht=o=>(G("data-v-9abaff51"),o=o(),j(),o),Ca=ht(()=>d("span",{class:"vpi-sun sun"},null,-1)),za=ht(()=>d("span",{class:"vpi-moon moon"},null,-1)),Aa=_({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=w(),n=Se("toggle-appearance",()=>{e.value=!e.value}),a=z("");return De(()=>{a.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),$(Ea,{title:a.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(n)},{default:p(()=>[Ca,za]),_:1},8,["title","aria-checked","onClick"]))}}),qe=y(Aa,[["__scopeId","data-v-9abaff51"]]),Ha={key:0,class:"VPNavBarAppearance"},Ma=_({__name:"VPNavBarAppearance",setup(o){const{site:e}=w();return(t,n)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(s(),c("div",Ha,[g(qe)])):h("",!0)}}),Ba=y(Ma,[["__scopeId","data-v-87c5e7d2"]]),Re=z();let _t=!1,Ce=0;function Oa(o){const e=z(!1);if(Ve){!_t&&Fa(),Ce++;const t=Z(Re,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(),Ce--,Ce||Da()})}return Ut(e)}function Fa(){document.addEventListener("focusin",gt),_t=!0,Re.value=document.activeElement}function Da(){document.removeEventListener("focusin",gt)}function gt(){Re.value=document.activeElement}const Ua={class:"VPMenuLink"},Ga=_({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=w();return(t,n)=>(s(),c("div",Ua,[g(te,{class:H({active:i(ce)(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(()=>[oe(A(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),we=y(Ga,[["__scopeId","data-v-a33e9249"]]),ja={class:"VPMenuGroup"},qa={key:0,class:"title"},Ra=_({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(s(),c("div",ja,[e.text?(s(),c("p",qa,A(e.text),1)):h("",!0),(s(!0),c(B,null,W(e.items,n=>(s(),c(B,null,["link"in n?(s(),$(we,{key:0,item:n},null,8,["item"])):h("",!0)],64))),256))]))}}),Ka=y(Ra,[["__scopeId","data-v-becbdab9"]]),Wa={class:"VPMenu"},Ja={key:0,class:"items"},Ya=_({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(s(),c("div",Wa,[e.items?(s(),c("div",Ja,[(s(!0),c(B,null,W(e.items,n=>(s(),c(B,{key:JSON.stringify(n)},["link"in n?(s(),$(we,{key:0,item:n},null,8,["item"])):"component"in n?(s(),$(ee(n.component),re({key:1,ref_for:!0},n.props),null,16)):(s(),$(Ka,{key:2,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0),u(e.$slots,"default",{},void 0,!0)]))}}),Za=y(Ya,[["__scopeId","data-v-26e1b36f"]]),Xa=o=>(G("data-v-779d1d76"),o=o(),j(),o),Qa=["aria-expanded","aria-label"],xa={key:0,class:"text"},es=["innerHTML"],ts=Xa(()=>d("span",{class:"vpi-chevron-down text-icon"},null,-1)),os={key:1,class:"vpi-more-horizontal icon"},ns={class:"menu"},as=_({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=z(!1),t=z();Oa({el:t,onBlur:n});function n(){e.value=!1}return(a,r)=>(s(),c("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)},[d("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(),c("span",xa,[a.icon?(s(),c("span",{key:0,class:H([a.icon,"option-icon"])},null,2)):h("",!0),a.button?(s(),c("span",{key:1,innerHTML:a.button},null,8,es)):h("",!0),ts])):(s(),c("span",os))],8,Qa),d("div",ns,[g(Za,{items:a.items},{default:p(()=>[u(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Ke=y(as,[["__scopeId","data-v-779d1d76"]]),ss=["href","aria-label","innerHTML"],rs=_({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=L(()=>typeof e.icon=="object"?e.icon.svg:``);return(n,a)=>(s(),c("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,ss))}}),is=y(rs,[["__scopeId","data-v-d5c0951d"]]),ls={class:"VPSocialLinks"},cs=_({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(s(),c("div",ls,[(s(!0),c(B,null,W(e.links,({link:n,icon:a,ariaLabel:r})=>(s(),$(is,{key:n,icon:a,link:n,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),We=y(cs,[["__scopeId","data-v-0c074974"]]),us={key:0,class:"group translations"},ds={class:"trans-title"},ms={key:1,class:"group"},vs={class:"item appearance"},ps={class:"label"},fs={class:"appearance-action"},hs={key:2,class:"group"},_s={class:"item social-links"},gs=_({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=w(),{localeLinks:n,currentLang:a}=fe({correspondingLink:!0}),r=L(()=>n.value.length&&a.value.label||e.value.appearance||t.value.socialLinks);return(l,m)=>r.value?(s(),$(Ke,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(n).length&&i(a).label?(s(),c("div",us,[d("p",ds,A(i(a).label),1),(s(!0),c(B,null,W(i(n),v=>(s(),$(we,{key:v.link,item:v},null,8,["item"]))),128))])):h("",!0),i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(s(),c("div",ms,[d("div",vs,[d("p",ps,A(i(t).darkModeSwitchLabel||"Appearance"),1),d("div",fs,[g(qe)])])])):h("",!0),i(t).socialLinks?(s(),c("div",hs,[d("div",_s,[g(We,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),bs=y(gs,[["__scopeId","data-v-3a857657"]]),ks=o=>(G("data-v-c2a24129"),o=o(),j(),o),$s=["aria-expanded"],ys=ks(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),Ls=[ys],Ps=_({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(s(),c("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"))},Ls,10,$s))}}),Ss=y(Ps,[["__scopeId","data-v-c2a24129"]]),Vs=["innerHTML"],ws=_({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=w();return(t,n)=>(s(),$(te,{class:H({VPNavBarMenuLink:!0,active:i(ce)(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(()=>[d("span",{innerHTML:t.item.text},null,8,Vs)]),_:1},8,["class","href","noIcon","target","rel"]))}}),Ts=y(ws,[["__scopeId","data-v-86a4e124"]]),Is=_({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=w(),n=r=>"component"in r?!1:"link"in r?ce(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),a=L(()=>n(e.item));return(r,l)=>(s(),$(Ke,{class:H({VPNavBarMenuGroup:!0,active:i(ce)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||a.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Ns=o=>(G("data-v-af86387c"),o=o(),j(),o),Es={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Cs=Ns(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),zs=_({__name:"VPNavBarMenu",setup(o){const{theme:e}=w();return(t,n)=>i(e).nav?(s(),c("nav",Es,[Cs,(s(!0),c(B,null,W(i(e).nav,a=>(s(),c(B,{key:JSON.stringify(a)},["link"in a?(s(),$(Ts,{key:0,item:a},null,8,["item"])):"component"in a?(s(),$(ee(a.component),re({key:1,ref_for:!0},a.props),null,16)):(s(),$(Is,{key:2,item:a},null,8,["item"]))],64))),128))])):h("",!0)}}),As=y(zs,[["__scopeId","data-v-af86387c"]]);function Hs(o){const{localeIndex:e,theme:t}=w();function n(a){var N,F,C;const r=a.split("."),l=(N=t.value.search)==null?void 0:N.options,m=l&&typeof l=="object",v=m&&((C=(F=l.locales)==null?void 0:F[e.value])==null?void 0:C.translations)||null,b=m&&l.translations||null;let P=v,k=b,V=o;const E=r.pop();for(const X of r){let Q=null;const D=V==null?void 0:V[X];D&&(Q=V=D);const ae=k==null?void 0:k[X];ae&&(Q=k=ae);const x=P==null?void 0:P[X];x&&(Q=P=x),D||(V=Q),ae||(k=Q),x||(P=Q)}return(P==null?void 0:P[E])??(k==null?void 0:k[E])??(V==null?void 0:V[E])??""}return n}const Ms=["aria-label"],Bs={class:"DocSearch-Button-Container"},Os=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),Fs={class:"DocSearch-Button-Placeholder"},Ds=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ze=_({__name:"VPNavBarSearchButton",setup(o){const t=Hs({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(n,a)=>(s(),c("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[d("span",Bs,[Os,d("span",Fs,A(i(t)("button.buttonText")),1)]),Ds],8,Ms))}}),Us={class:"VPNavBarSearch"},Gs={id:"local-search"},js={key:1,id:"docsearch"},qs=_({__name:"VPNavBarSearch",setup(o){const e=Gt(()=>it(()=>import("./VPLocalSearchBox.C8JYv8Jy.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:n}=w(),a=z(!1),r=z(!1);J(()=>{});function l(){a.value||(a.value=!0,setTimeout(m,16))}function m(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||m()},16)}function v(k){const V=k.target,E=V.tagName;return V.isContentEditable||E==="INPUT"||E==="SELECT"||E==="TEXTAREA"}const b=z(!1);Ae("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),b.value=!0)}),Ae("/",k=>{v(k)||(k.preventDefault(),b.value=!0)});const P="local";return(k,V)=>{var E;return s(),c("div",Us,[i(P)==="local"?(s(),c(B,{key:0},[b.value?(s(),$(i(e),{key:0,onClose:V[0]||(V[0]=N=>b.value=!1)})):h("",!0),d("div",Gs,[g(Ze,{onClick:V[1]||(V[1]=N=>b.value=!0)})])],64)):i(P)==="algolia"?(s(),c(B,{key:1},[a.value?(s(),$(i(t),{key:0,algolia:((E=i(n).search)==null?void 0:E.options)??i(n).algolia,onVnodeBeforeMount:V[2]||(V[2]=N=>r.value=!0)},null,8,["algolia"])):h("",!0),r.value?h("",!0):(s(),c("div",js,[g(Ze,{onClick:l})]))],64)):h("",!0)])}}}),Rs=_({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=w();return(t,n)=>i(e).socialLinks?(s(),$(We,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),Ks=y(Rs,[["__scopeId","data-v-9686c645"]]),Ws=["href","rel","target"],Js={key:1},Ys={key:2},Zs=_({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=w(),{hasSidebar:n}=ne(),{currentLang:a}=fe(),r=L(()=>{var v;return typeof t.value.logoLink=="string"?t.value.logoLink:(v=t.value.logoLink)==null?void 0:v.link}),l=L(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.rel}),m=L(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.target});return(v,b)=>(s(),c("div",{class:H(["VPNavBarTitle",{"has-sidebar":i(n)}])},[d("a",{class:"title",href:r.value??i(Ge)(i(a).link),rel:l.value,target:m.value},[u(v.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(s(),$($e,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):h("",!0),i(t).siteTitle?(s(),c("span",Js,A(i(t).siteTitle),1)):i(t).siteTitle===void 0?(s(),c("span",Ys,A(i(e).title),1)):h("",!0),u(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ws)],2))}}),Xs=y(Zs,[["__scopeId","data-v-b3258250"]]),Qs={class:"items"},xs={class:"title"},er=_({__name:"VPNavBarTranslations",setup(o){const{theme:e}=w(),{localeLinks:t,currentLang:n}=fe({correspondingLink:!0});return(a,r)=>i(t).length&&i(n).label?(s(),$(Ke,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(e).langMenuLabel||"Change language"},{default:p(()=>[d("div",Qs,[d("p",xs,A(i(n).label),1),(s(!0),c(B,null,W(i(t),l=>(s(),$(we,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),tr=y(er,[["__scopeId","data-v-d11f4714"]]),or=o=>(G("data-v-4706692b"),o=o(),j(),o),nr={class:"wrapper"},ar={class:"container"},sr={class:"title"},rr={class:"content"},ir={class:"content-body"},lr=or(()=>d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1)),cr=_({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=rt(),{hasSidebar:n}=ne(),{frontmatter:a}=w(),r=z({});return De(()=>{r.value={"has-sidebar":n.value,home:a.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,m)=>(s(),c("div",{class:H(["VPNavBar",r.value])},[d("div",nr,[d("div",ar,[d("div",sr,[g(Xs,null,{"nav-bar-title-before":p(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",rr,[d("div",ir,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),g(qs,{class:"search"}),g(As,{class:"menu"}),g(tr,{class:"translations"}),g(Ba,{class:"appearance"}),g(Ks,{class:"social-links"}),g(bs,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),g(Ss,{class:"hamburger",active:l.isScreenOpen,onClick:m[0]||(m[0]=v=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),lr],2))}}),ur=y(cr,[["__scopeId","data-v-4706692b"]]),dr={key:0,class:"VPNavScreenAppearance"},mr={class:"text"},vr=_({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=w();return(n,a)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(s(),c("div",dr,[d("p",mr,A(i(t).darkModeSwitchLabel||"Appearance"),1),g(qe)])):h("",!0)}}),pr=y(vr,[["__scopeId","data-v-e3518e41"]]),fr=_({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=Se("close-screen");return(t,n)=>(s(),$(te,{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"]))}}),hr=y(fr,[["__scopeId","data-v-33292676"]]),_r=_({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=Se("close-screen");return(t,n)=>(s(),$(te,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[oe(A(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),bt=y(_r,[["__scopeId","data-v-2d8e3881"]]),gr={class:"VPNavScreenMenuGroupSection"},br={key:0,class:"title"},kr=_({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(s(),c("div",gr,[e.text?(s(),c("p",br,A(e.text),1)):h("",!0),(s(!0),c(B,null,W(e.items,n=>(s(),$(bt,{key:n.text,item:n},null,8,["item"]))),128))]))}}),$r=y(kr,[["__scopeId","data-v-7ef2022d"]]),yr=o=>(G("data-v-4671a8b5"),o=o(),j(),o),Lr=["aria-controls","aria-expanded"],Pr=["innerHTML"],Sr=yr(()=>d("span",{class:"vpi-plus button-icon"},null,-1)),Vr=["id"],wr={key:0,class:"item"},Tr={key:1,class:"item"},Ir={key:2,class:"group"},Nr=_({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=z(!1),n=L(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function a(){t.value=!t.value}return(r,l)=>(s(),c("div",{class:H(["VPNavScreenMenuGroup",{open:t.value}])},[d("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:a},[d("span",{class:"button-text",innerHTML:r.text},null,8,Pr),Sr],8,Lr),d("div",{id:n.value,class:"items"},[(s(!0),c(B,null,W(r.items,m=>(s(),c(B,{key:JSON.stringify(m)},["link"in m?(s(),c("div",wr,[g(bt,{item:m},null,8,["item"])])):"component"in m?(s(),c("div",Tr,[(s(),$(ee(m.component),re({ref_for:!0},m.props,{"screen-menu":""}),null,16))])):(s(),c("div",Ir,[g($r,{text:m.text,items:m.items},null,8,["text","items"])]))],64))),128))],8,Vr)],2))}}),Er=y(Nr,[["__scopeId","data-v-4671a8b5"]]),Cr={key:0,class:"VPNavScreenMenu"},zr=_({__name:"VPNavScreenMenu",setup(o){const{theme:e}=w();return(t,n)=>i(e).nav?(s(),c("nav",Cr,[(s(!0),c(B,null,W(i(e).nav,a=>(s(),c(B,{key:JSON.stringify(a)},["link"in a?(s(),$(hr,{key:0,item:a},null,8,["item"])):"component"in a?(s(),$(ee(a.component),re({key:1,ref_for:!0},a.props,{"screen-menu":""}),null,16)):(s(),$(Er,{key:2,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Ar=_({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=w();return(t,n)=>i(e).socialLinks?(s(),$(We,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),kt=o=>(G("data-v-4cc74b28"),o=o(),j(),o),Hr=kt(()=>d("span",{class:"vpi-languages icon lang"},null,-1)),Mr=kt(()=>d("span",{class:"vpi-chevron-down icon chevron"},null,-1)),Br={class:"list"},Or=_({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=fe({correspondingLink:!0}),n=z(!1);function a(){n.value=!n.value}return(r,l)=>i(e).length&&i(t).label?(s(),c("div",{key:0,class:H(["VPNavScreenTranslations",{open:n.value}])},[d("button",{class:"title",onClick:a},[Hr,oe(" "+A(i(t).label)+" ",1),Mr]),d("ul",Br,[(s(!0),c(B,null,W(i(e),m=>(s(),c("li",{key:m.link,class:"item"},[g(te,{class:"link",href:m.link},{default:p(()=>[oe(A(m.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),Fr=y(Or,[["__scopeId","data-v-4cc74b28"]]),Dr={class:"container"},Ur=_({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=z(null),t=lt(Ve?document.body:null);return(n,a)=>(s(),$(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(),c("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[d("div",Dr,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),g(zr,{class:"menu"}),g(Fr,{class:"translations"}),g(pr,{class:"appearance"}),g(Ar,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),Gr=y(Ur,[["__scopeId","data-v-27670706"]]),jr={key:0,class:"VPNav"},qr=_({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Sa(),{frontmatter:a}=w(),r=L(()=>a.value.navbar!==!1);return ct("close-screen",t),Le(()=>{Ve&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,m)=>r.value?(s(),c("header",jr,[g(ur,{"is-screen-open":i(e),onToggleScreen:i(n)},{"nav-bar-title-before":p(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[u(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[u(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),g(Gr,{open:i(e)},{"nav-screen-content-before":p(()=>[u(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[u(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Rr=y(qr,[["__scopeId","data-v-7697d12e"]]),$t=o=>(G("data-v-4e965525"),o=o(),j(),o),Kr=["role","tabindex"],Wr=$t(()=>d("div",{class:"indicator"},null,-1)),Jr=$t(()=>d("span",{class:"vpi-chevron-right caret-icon"},null,-1)),Yr=[Jr],Zr={key:1,class:"items"},Xr=_({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:n,isLink:a,isActiveLink:r,hasActiveLink:l,hasChildren:m,toggle:v}=fo(L(()=>e.item)),b=L(()=>m.value?"section":"div"),P=L(()=>a.value?"a":"div"),k=L(()=>m.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),V=L(()=>a.value?void 0:"button"),E=L(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":a.value},{"is-active":r.value},{"has-active":l.value}]);function N(C){"key"in C&&C.key!=="Enter"||!e.item.link&&v()}function F(){e.item.link&&v()}return(C,X)=>{const Q=ie("VPSidebarItem",!0);return s(),$(ee(b.value),{class:H(["VPSidebarItem",E.value])},{default:p(()=>[C.item.text?(s(),c("div",re({key:0,class:"item",role:V.value},qt(C.item.items?{click:N,keydown:N}:{},!0),{tabindex:C.item.items&&0}),[Wr,C.item.link?(s(),$(te,{key:0,tag:P.value,class:"link",href:C.item.link,rel:C.item.rel,target:C.item.target},{default:p(()=>[(s(),$(ee(k.value),{class:"text",innerHTML:C.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),$(ee(k.value),{key:1,class:"text",innerHTML:C.item.text},null,8,["innerHTML"])),C.item.collapsed!=null&&C.item.items&&C.item.items.length?(s(),c("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:F,onKeydown:jt(F,["enter"]),tabindex:"0"},Yr,32)):h("",!0)],16,Kr)):h("",!0),C.item.items&&C.item.items.length?(s(),c("div",Zr,[C.depth<5?(s(!0),c(B,{key:0},W(C.item.items,D=>(s(),$(Q,{key:D.text,item:D,depth:C.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Qr=y(Xr,[["__scopeId","data-v-4e965525"]]),xr=_({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=z(!0);let t=null;return J(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Rt(()=>{t!=null&&(clearTimeout(t),t=null)}),(n,a)=>(s(!0),c(B,null,W(n.items,r=>(s(),c("div",{key:r.text,class:H(["group",{"no-transition":e.value}])},[g(Qr,{item:r,depth:0},null,8,["item"])],2))),128))}}),ei=y(xr,[["__scopeId","data-v-091a4ebd"]]),yt=o=>(G("data-v-4cb49b8f"),o=o(),j(),o),ti=yt(()=>d("div",{class:"curtain"},null,-1)),oi={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},ni=yt(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),ai=_({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=ne(),n=o,a=z(null),r=lt(Ve?document.body:null);Z([n,a],()=>{var m;n.open?(r.value=!0,(m=a.value)==null||m.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=z(0);return Z(e,()=>{l.value+=1},{deep:!0}),(m,v)=>i(t)?(s(),c("aside",{key:0,class:H(["VPSidebar",{open:m.open}]),ref_key:"navEl",ref:a,onClick:v[0]||(v[0]=ut(()=>{},["stop"]))},[ti,d("nav",oi,[ni,u(m.$slots,"sidebar-nav-before",{},void 0,!0),(s(),$(ei,{items:i(e),key:l.value},null,8,["items"])),u(m.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),si=y(ai,[["__scopeId","data-v-4cb49b8f"]]),ri=_({__name:"VPSkipLink",setup(o){const e=pe(),t=z();Z(()=>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(),c(B,null,[d("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}}),ii=y(ri,[["__scopeId","data-v-bbad7db3"]]),li=_({__name:"Layout",setup(o){const{isOpen:e,open:t,close:n}=ne(),a=pe();Z(()=>a.path,n),po(e,n);const{frontmatter:r}=w(),l=Kt(),m=L(()=>!!l["home-hero-image"]);return ct("hero-image-slot-exists",m),(v,b)=>{const P=ie("Content");return i(r).layout!==!1?(s(),c("div",{key:0,class:H(["Layout",i(r).pageClass])},[u(v.$slots,"layout-top",{},void 0,!0),g(ii),g(Qt,{class:"backdrop",show:i(e),onClick:i(n)},null,8,["show","onClick"]),g(Rr,null,{"nav-bar-title-before":p(()=>[u(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[u(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[u(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[u(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[u(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),g(Pa,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),g(si,{open:i(e)},{"sidebar-nav-before":p(()=>[u(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[u(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),g(aa,null,{"page-top":p(()=>[u(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[u(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[u(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[u(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[u(v.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[u(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[u(v.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[u(v.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[u(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[u(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[u(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[u(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[u(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[u(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[u(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[u(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[u(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[u(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[u(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[u(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),g(ca),u(v.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),$(P,{key:1}))}}}),ci=y(li,[["__scopeId","data-v-7fa59262"]]),Xe={Layout:ci,enhanceApp:({app:o})=>{o.component("Badge",dt)}},ui=["id","host","repo","repoid","category","categoryid","mapping","term","strict","reactionsenabled","emitmetadata","inputposition","theme","lang","loading"],di=_({__name:"Giscus",props:{id:{},host:{},repo:{},repoId:{},category:{},categoryId:{},mapping:{},term:{},theme:{},strict:{},reactionsEnabled:{},emitMetadata:{},inputPosition:{},lang:{},loading:{}},setup(o){const e=z(!1);return J(()=>{e.value=!0,it(()=>import("./giscus-aTimukGI.CKTvSCx2.js"),[])}),(t,n)=>e.value?(s(),c("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,ui)):h("",!0)}}),Qe=(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 k=document.querySelector("html").getAttribute("lang");k&&o.locales[k]&&(o.lang=o.locales[k])}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,v=document.getElementsByClassName("content-container")[0];if(v){const P=document.createElement("div");P.setAttribute("id","giscus"),P.style.height="auto",P.style.marginTop="40px",P.style.borderTop="1px solid var(--vp-c-divider)",P.style.paddingTop="20px",v.append(P),Wt({render:()=>ve(di,{...n,theme:m?r:a,...o})}).mount("#giscus")}},mi=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"]})},vi=(o,e,t=!0)=>{J(()=>{Qe(o,e.frontmatter,t),mi(o)}),Z(()=>e.route.path,()=>Ue(()=>{Qe(o,e.frontmatter,t)}))};/*! medium-zoom 1.1.0 | MIT License | https://github.com/francoischalifour/medium-zoom */var le=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===he){N();return}D.indexOf(T)!==-1&&F({target:T})},r=function(){if(!(x||!f.original)){var S=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(Je-S)>M.scrollOffset&&setTimeout(N,150)}},l=function(S){var T=S.key||S.keyCode;(T==="Escape"||T==="Esc"||T===27)&&N()},m=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},T=S;if(S.background&&(he.style.background=S.background),S.container&&S.container instanceof Object&&(T.container=le({},M.container,S.container)),S.template){var O=ke(S.template)?S.template:document.querySelector(S.template);T.template=O}return M=le({},M,T),D.forEach(function(U){U.dispatchEvent(de("medium-zoom:update",{detail:{zoom:q}}))}),q},v=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return o(le({},M,S))},b=function(){for(var S=arguments.length,T=Array(S),O=0;O0?T.reduce(function(I,K){return[].concat(I,et(K))},[]):D;return U.forEach(function(I){I.classList.remove("medium-zoom-image"),I.dispatchEvent(de("medium-zoom:detach",{detail:{zoom:q}}))}),D=D.filter(function(I){return U.indexOf(I)===-1}),q},k=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)}),ae.push({type:"medium-zoom:"+S,listener:T,options:O}),q},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)}),ae=ae.filter(function(U){return!(U.type==="medium-zoom:"+S&&U.listener.toString()===T.toString())}),q},E=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},K=void 0,Y=void 0;if(M.container)if(M.container instanceof Object)I=le({},I,M.container),K=I.width-I.left-I.right-M.margin*2,Y=I.height-I.top-I.bottom-M.margin*2;else{var ue=ke(M.container)?M.container:document.querySelector(M.container),se=ue.getBoundingClientRect(),Te=se.width,St=se.height,Vt=se.left,wt=se.top;I=le({},I,{width:Te,height:St,left:Vt,top:wt})}K=K||I.width-M.margin*2,Y=Y||I.height-M.margin*2;var me=f.zoomedHd||f.original,Tt=xe(me)?K:me.naturalWidth||K,It=xe(me)?Y:me.naturalHeight||Y,_e=me.getBoundingClientRect(),Nt=_e.top,Et=_e.left,Ie=_e.width,Ne=_e.height,Ct=Math.min(Math.max(Ie,Tt),K)/Ie,zt=Math.min(Math.max(Ne,It),Y)/Ne,Ee=Math.min(Ct,zt),At=(-Et+(K-Ie)/2+M.margin+I.left)/Ee,Ht=(-Nt+(Y-Ne)/2+M.margin+I.top)/Ee,Ye="scale("+Ee+") translate3d("+At+"px, "+Ht+"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(q);return}var I=function Te(){x=!1,f.zoomed.removeEventListener("transitionend",Te),f.original.dispatchEvent(de("medium-zoom:opened",{detail:{zoom:q}})),U(q)};if(f.zoomed){U(q);return}if(T)f.original=T;else if(D.length>0){var K=D;f.original=K[0]}else{U(q);return}if(f.original.dispatchEvent(de("medium-zoom:open",{detail:{zoom:q}})),Je=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,x=!0,f.zoomed=hi(f.original),document.body.appendChild(he),M.template){var Y=ke(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",N),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(ue),console.warn("Unable to reach the zoom image target "+f.zoomedHd.src),f.zoomedHd=null,O()};var ue=setInterval(function(){f.zoomedHd.complete&&(clearInterval(ue),f.zoomedHd.classList.add("medium-zoom-image--opened"),f.zoomedHd.addEventListener("click",N),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 se=f.zoomedHd.addEventListener("load",function(){f.zoomedHd.removeEventListener("load",se),f.zoomedHd.classList.add("medium-zoom-image--opened"),f.zoomedHd.addEventListener("click",N),document.body.appendChild(f.zoomedHd),O()})}else O()})},N=function(){return new n(function(S){if(x||!f.original){S(q);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(he),f.zoomed.classList.remove("medium-zoom-image--opened"),f.template&&document.body.removeChild(f.template),x=!1,f.zoomed.removeEventListener("transitionend",O),f.original.dispatchEvent(de("medium-zoom:closed",{detail:{zoom:q}})),f.original=null,f.zoomed=null,f.zoomedHd=null,f.template=null,S(q)};x=!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(de("medium-zoom:close",{detail:{zoom:q}})),f.zoomed.addEventListener("transitionend",T)})},F=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},T=S.target;return f.original?N():E({target:T})},C=function(){return M},X=function(){return D},Q=function(){return f.original},D=[],ae=[],x=!1,Je=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=le({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},M);var he=fi(M.background);document.addEventListener("click",a),document.addEventListener("keyup",l),document.addEventListener("scroll",r),window.addEventListener("resize",N);var q={open:E,close:N,toggle:F,update:m,clone:v,attach:b,detach:P,on:k,off:V,getOptions:C,getImages:X,getZoomedImage:Q};return q};function _i(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 gi=".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}";_i(gi);const Pt=o=>(G("data-v-3cd5c07b"),o=o(),j(),o),bi={key:0,class:"banner-wrapper",role:"banner"},ki=Pt(()=>d("div",{class:"content"}," 全新移动端 H5 框架 Fantastic-mobile 正式发布,点击查看详情 ",-1)),$i=Pt(()=>d("span",{class:"close"},"×",-1)),yi=[$i],tt="ACTIVITY-FANTASTIC-MOBILE-1",Li=_({__name:"Activity",setup(o){const e=z(!1);function t(){window.location.href="https://fantastic-mobile.hurui.me/"}function n(){e.value=!1,localStorage.setItem(tt,String(!0)),document.documentElement.classList.remove("mirror-site-menu-fixed")}return J(()=>{e.value=!localStorage.getItem(tt),e.value&&document.documentElement.classList.add("mirror-site-menu-fixed")}),(a,r)=>e.value?(s(),c("div",bi,[d("div",{id:"banner",onClick:t},[ki,d("button",{id:"banner-close",onClick:ut(n,["stop"])},yi)])])):h("",!0)}}),Pi=y(Li,[["__scopeId","data-v-3cd5c07b"]]),Si={},Vi=Jt('
作者其他作品
',2),wi=[Vi];function Ti(o,e){return s(),c("div",null,wi)}const Ii=y(Si,[["render",Ti],["__scopeId","data-v-d8aff6a3"]]),Ni={},Ei=o=>(G("data-v-f619d5b7"),o=o(),j(),o),Ci={class:"home-preview-block"},zi={class:"home-preview"},Ai=Ei(()=>d("h2",null,"截图预览",-1)),Hi={class:"items"},Mi={class:"item"},Bi={class:"item"},Oi={class:"item"},Fi={class:"item"},Di={class:"item"},Ui={class:"item"};function Gi(o,e){const t=ie("zoom-img");return s(),c("div",Ci,[d("div",zi,[Ai,d("div",Hi,[d("div",Mi,[g(t,{src:"/preview1.png"})]),d("div",Bi,[g(t,{src:"/preview2.png"})]),d("div",Oi,[g(t,{src:"/preview3.png"})]),d("div",Fi,[g(t,{src:"/preview4.png"})]),d("div",Di,[g(t,{src:"/preview5.png"})]),d("div",Ui,[g(t,{src:"/preview6.png"})])])])])}const ji=y(Ni,[["render",Gi],["__scopeId","data-v-f619d5b7"]]),qi={key:0},Ri=["src"],Ki=_({__name:"ZoomImg",props:{src:String},setup(o){const e=z(null);return J(()=>{e.value&&Lt(e.value,{background:"var(--vp-c-bg)"})}),(t,n)=>o.src?(s(),c("p",qi,[d("img",{ref_key:"imgRef",ref:e,src:i(ye)(o.src),loading:"lazy"},null,8,Ri)])):h("",!0)}}),Ji={...Xe,Layout(){return ve(Xe.Layout,null,{"layout-top":()=>ve(Pi),"home-features-after":()=>ve(ji),"aside-bottom":()=>ve(Ii)})},setup(){const o=pe(),e=()=>{Lt("[data-zoomable]",{background:"var(--vp-c-bg)"})};J(()=>e()),Z(()=>o.path,()=>Ue(()=>e()));const{frontmatter:t}=Yt(ot());vi({repo:"one-step-admin/one-step-admin.github.io",repoId:"R_kgDOJpKIUg",category:"Announcements",categoryId:"DIC_kwDOJpKIUs4CeSdr",mapping:"pathname",inputPosition:"top",lang:"zh-CN",lightTheme:"light",darkTheme:"transparent_dark",loading:!0},{frontmatter:t,route:o},!0)},enhanceApp({app:o}){o.component("Badge",dt),o.component("ZoomImg",Ki)}};export{Ji as R,Hs as c,w as u}; diff --git a/assets/components_action-container.md.C6ADMMHn.js b/assets/components_action-container.md.C6ADMMHn.js new file mode 100644 index 00000000..94e435ae --- /dev/null +++ b/assets/components_action-container.md.C6ADMMHn.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const p=JSON.parse('{"title":"ActionContainer 固定底部操作栏","description":"","frontmatter":{},"headers":[],"relativePath":"components/action-container.md","filePath":"components/action-container.md"}'),o={name:"components/action-container.md"},i=n('

ActionContainer 固定底部操作栏

Slot

name说明
-内容区的 HTML 内容
action操作区域的 HTML 内容
',3),r=[i];function c(l,s,d,_,h,f){return a(),e("div",null,r)}const x=t(o,[["render",c]]);export{p as __pageData,x as default}; diff --git a/assets/components_action-container.md.C6ADMMHn.lean.js b/assets/components_action-container.md.C6ADMMHn.lean.js new file mode 100644 index 00000000..c6ea5a20 --- /dev/null +++ b/assets/components_action-container.md.C6ADMMHn.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const p=JSON.parse('{"title":"ActionContainer 固定底部操作栏","description":"","frontmatter":{},"headers":[],"relativePath":"components/action-container.md","filePath":"components/action-container.md"}'),o={name:"components/action-container.md"},i=n("",3),r=[i];function c(l,s,d,_,h,f){return a(),e("div",null,r)}const x=t(o,[["render",c]]);export{p as __pageData,x as default}; diff --git a/assets/components_auth-all.md.CC4RPLIO.js b/assets/components_auth-all.md.CC4RPLIO.js new file mode 100644 index 00000000..167a99d3 --- /dev/null +++ b/assets/components_auth-all.md.CC4RPLIO.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.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.CC4RPLIO.lean.js b/assets/components_auth-all.md.CC4RPLIO.lean.js new file mode 100644 index 00000000..f34c23e2 --- /dev/null +++ b/assets/components_auth-all.md.CC4RPLIO.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.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.DJiNZXkN.js b/assets/components_auth.md.DJiNZXkN.js new file mode 100644 index 00000000..d0c8e5d6 --- /dev/null +++ b/assets/components_auth.md.DJiNZXkN.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.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.DJiNZXkN.lean.js b/assets/components_auth.md.DJiNZXkN.lean.js new file mode 100644 index 00000000..de93255d --- /dev/null +++ b/assets/components_auth.md.DJiNZXkN.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.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_chip.md.DS5QQKp9.js b/assets/components_chip.md.DS5QQKp9.js new file mode 100644 index 00000000..770e42cd --- /dev/null +++ b/assets/components_chip.md.DS5QQKp9.js @@ -0,0 +1 @@ +import{_ as l,D as s,c as n,j as e,a as t,I as d,a6 as o,o as i}from"./chunks/framework.Bhh1y9_T.js";const P=JSON.parse('{"title":"Chip 纸片","description":"","frontmatter":{},"headers":[],"relativePath":"components/chip.md","filePath":"components/chip.md"}'),r={name:"components/chip.md"},h={id:"chip-纸片",tabindex:"-1"},c=e("a",{class:"header-anchor",href:"#chip-纸片","aria-label":'Permalink to "Chip 纸片 "'},"​",-1),p=o('

Props

参数说明类型可选值默认值
type类型stringprimary / success / warning / danger / info-
closable是否显示关闭按钮boolean-false

Events

事件名称说明回调参数
close关闭按钮事件回调-
',4);function f(x,_,y,g,b,m){const a=s("Badge");return i(),n("div",null,[e("h1",h,[t("Chip 纸片 "),d(a,{type:"pro",text:"专业版"}),t(),c]),p])}const v=l(r,[["render",f]]);export{P as __pageData,v as default}; diff --git a/assets/components_chip.md.DS5QQKp9.lean.js b/assets/components_chip.md.DS5QQKp9.lean.js new file mode 100644 index 00000000..8bf7a2d5 --- /dev/null +++ b/assets/components_chip.md.DS5QQKp9.lean.js @@ -0,0 +1 @@ +import{_ as l,D as s,c as n,j as e,a as t,I as d,a6 as o,o as i}from"./chunks/framework.Bhh1y9_T.js";const P=JSON.parse('{"title":"Chip 纸片","description":"","frontmatter":{},"headers":[],"relativePath":"components/chip.md","filePath":"components/chip.md"}'),r={name:"components/chip.md"},h={id:"chip-纸片",tabindex:"-1"},c=e("a",{class:"header-anchor",href:"#chip-纸片","aria-label":'Permalink to "Chip 纸片 "'},"​",-1),p=o("",4);function f(x,_,y,g,b,m){const a=s("Badge");return i(),n("div",null,[e("h1",h,[t("Chip 纸片 "),d(a,{type:"pro",text:"专业版"}),t(),c]),p])}const v=l(r,[["render",f]]);export{P as __pageData,v as default}; diff --git a/assets/components_colorful-card.md.C17Jec7Q.js b/assets/components_colorful-card.md.C17Jec7Q.js new file mode 100644 index 00000000..882a28ae --- /dev/null +++ b/assets/components_colorful-card.md.C17Jec7Q.js @@ -0,0 +1 @@ +import{_ as a,D as d,c as n,j as e,a as t,I as r,a6 as s,o}from"./chunks/framework.Bhh1y9_T.js";const C=JSON.parse('{"title":"ColorfulCard 多彩渐变卡片","description":"","frontmatter":{},"headers":[],"relativePath":"components/colorful-card.md","filePath":"components/colorful-card.md"}'),i={name:"components/colorful-card.md"},f={id:"colorfulcard-多彩渐变卡片",tabindex:"-1"},c=e("a",{class:"header-anchor",href:"#colorfulcard-多彩渐变卡片","aria-label":'Permalink to "ColorfulCard 多彩渐变卡片 "'},"​",-1),g=s('

Props

参数说明类型可选值默认值
color-from开始颜色string-'#843cf6'
color-to终止颜色string-'#759bff'
header头部标题string--
num数字标记number--
tip底行提示文字string--
icon图标,使用 SvgIcon 组件,与该组件 name 参数相同string--
',2);function x(y,_,h,p,m,u){const l=d("Badge");return o(),n("div",null,[e("h1",f,[t("ColorfulCard 多彩渐变卡片 "),r(l,{type:"pro",text:"专业版"}),t(),c]),g])}const P=a(i,[["render",x]]);export{C as __pageData,P as default}; diff --git a/assets/components_colorful-card.md.C17Jec7Q.lean.js b/assets/components_colorful-card.md.C17Jec7Q.lean.js new file mode 100644 index 00000000..8bdb8ad7 --- /dev/null +++ b/assets/components_colorful-card.md.C17Jec7Q.lean.js @@ -0,0 +1 @@ +import{_ as a,D as d,c as n,j as e,a as t,I as r,a6 as s,o}from"./chunks/framework.Bhh1y9_T.js";const C=JSON.parse('{"title":"ColorfulCard 多彩渐变卡片","description":"","frontmatter":{},"headers":[],"relativePath":"components/colorful-card.md","filePath":"components/colorful-card.md"}'),i={name:"components/colorful-card.md"},f={id:"colorfulcard-多彩渐变卡片",tabindex:"-1"},c=e("a",{class:"header-anchor",href:"#colorfulcard-多彩渐变卡片","aria-label":'Permalink to "ColorfulCard 多彩渐变卡片 "'},"​",-1),g=s("",2);function x(y,_,h,p,m,u){const l=d("Badge");return o(),n("div",null,[e("h1",f,[t("ColorfulCard 多彩渐变卡片 "),r(l,{type:"pro",text:"专业版"}),t(),c]),g])}const P=a(i,[["render",x]]);export{C as __pageData,P as default}; diff --git a/assets/components_file-upload.md.D7PBngz1.js b/assets/components_file-upload.md.D7PBngz1.js new file mode 100644 index 00000000..19312c57 --- /dev/null +++ b/assets/components_file-upload.md.D7PBngz1.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"FileUpload 文件上传","description":"","frontmatter":{},"headers":[],"relativePath":"components/file-upload.md","filePath":"components/file-upload.md"}'),a={name:"components/file-upload.md"},n=d('

FileUpload 文件上传

Props

参数说明类型可选值默认值
action必选参数,上传的地址string--
headers设置上传的请求头部object--
data上传时附带的额外参数object--
name上传的文件字段名string-file
size上传文件大小限制,单位为MBnumber-2
max上传数量限制number-3
files上传的文件列表,例如:[{name: 'xxx.jpg', url: 'http://xxx.cdn.com/xxx.jpg'}]array-[]
notip是否隐藏提示栏boolean-false
ext支持的文件类型array-['zip', 'rar']
',3),i=[n];function s(f,x,r,o,g,y){return l(),e("div",null,i)}const h=t(a,[["render",s]]);export{c as __pageData,h as default}; diff --git a/assets/components_file-upload.md.D7PBngz1.lean.js b/assets/components_file-upload.md.D7PBngz1.lean.js new file mode 100644 index 00000000..d3679ca4 --- /dev/null +++ b/assets/components_file-upload.md.D7PBngz1.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"FileUpload 文件上传","description":"","frontmatter":{},"headers":[],"relativePath":"components/file-upload.md","filePath":"components/file-upload.md"}'),a={name:"components/file-upload.md"},n=d("",3),i=[n];function s(f,x,r,o,g,y){return l(),e("div",null,i)}const h=t(a,[["render",s]]);export{c as __pageData,h as default}; diff --git a/assets/components_i18n-selector.md.hlvQr2K-.js b/assets/components_i18n-selector.md.hlvQr2K-.js new file mode 100644 index 00000000..43db4a7e --- /dev/null +++ b/assets/components_i18n-selector.md.hlvQr2K-.js @@ -0,0 +1 @@ +import{_ as o,D as s,c as n,j as t,a as e,I as r,a6 as l,o as c}from"./chunks/framework.Bhh1y9_T.js";const T=JSON.parse('{"title":"I18nSelector 国际化选择器","description":"","frontmatter":{},"headers":[],"relativePath":"components/i18n-selector.md","filePath":"components/i18n-selector.md"}'),d={name:"components/i18n-selector.md"},i={id:"i18nselector-国际化选择器",tabindex:"-1"},_=t("a",{class:"header-anchor",href:"#i18nselector-国际化选择器","aria-label":'Permalink to "I18nSelector 国际化选择器 "'},"​",-1),h=l('

Slots

name说明
-触发下拉列表的 HTML 内容
',2);function p(m,f,x,S,b,g){const a=s("Badge");return c(),n("div",null,[t("h1",i,[e("I18nSelector 国际化选择器 "),r(a,{type:"pro",text:"专业版"}),e(),_]),h])}const u=o(d,[["render",p]]);export{T as __pageData,u as default}; diff --git a/assets/components_i18n-selector.md.hlvQr2K-.lean.js b/assets/components_i18n-selector.md.hlvQr2K-.lean.js new file mode 100644 index 00000000..1abd9374 --- /dev/null +++ b/assets/components_i18n-selector.md.hlvQr2K-.lean.js @@ -0,0 +1 @@ +import{_ as o,D as s,c as n,j as t,a as e,I as r,a6 as l,o as c}from"./chunks/framework.Bhh1y9_T.js";const T=JSON.parse('{"title":"I18nSelector 国际化选择器","description":"","frontmatter":{},"headers":[],"relativePath":"components/i18n-selector.md","filePath":"components/i18n-selector.md"}'),d={name:"components/i18n-selector.md"},i={id:"i18nselector-国际化选择器",tabindex:"-1"},_=t("a",{class:"header-anchor",href:"#i18nselector-国际化选择器","aria-label":'Permalink to "I18nSelector 国际化选择器 "'},"​",-1),h=l("",2);function p(m,f,x,S,b,g){const a=s("Badge");return c(),n("div",null,[t("h1",i,[e("I18nSelector 国际化选择器 "),r(a,{type:"pro",text:"专业版"}),e(),_]),h])}const u=o(d,[["render",p]]);export{T as __pageData,u as default}; diff --git a/assets/components_icon-picker.md.CDiXSf0R.js b/assets/components_icon-picker.md.CDiXSf0R.js new file mode 100644 index 00000000..54f17b8f --- /dev/null +++ b/assets/components_icon-picker.md.CDiXSf0R.js @@ -0,0 +1 @@ +import{_ as l,D as n,c as o,j as e,a as t,I as s,a6 as r,o as i}from"./chunks/framework.Bhh1y9_T.js";const b=JSON.parse('{"title":"IconPicker 图标选择器","description":"","frontmatter":{},"headers":[],"relativePath":"components/icon-picker.md","filePath":"components/icon-picker.md"}'),d={name:"components/icon-picker.md"},c={id:"iconpicker-图标选择器",tabindex:"-1"},p=e("a",{class:"header-anchor",href:"#iconpicker-图标选择器","aria-label":'Permalink to "IconPicker 图标选择器 "'},"​",-1),_=r('

Props

参数说明类型可选值默认值
v-model图标名称string--
size选择器尺寸string'large''default'
',2);function h(f,x,g,y,m,k){const a=n("Badge");return i(),o("div",null,[e("h1",c,[t("IconPicker 图标选择器 "),s(a,{type:"pro",text:"专业版"}),t(),p]),_])}const u=l(d,[["render",h]]);export{b as __pageData,u as default}; diff --git a/assets/components_icon-picker.md.CDiXSf0R.lean.js b/assets/components_icon-picker.md.CDiXSf0R.lean.js new file mode 100644 index 00000000..e1af6612 --- /dev/null +++ b/assets/components_icon-picker.md.CDiXSf0R.lean.js @@ -0,0 +1 @@ +import{_ as l,D as n,c as o,j as e,a as t,I as s,a6 as r,o as i}from"./chunks/framework.Bhh1y9_T.js";const b=JSON.parse('{"title":"IconPicker 图标选择器","description":"","frontmatter":{},"headers":[],"relativePath":"components/icon-picker.md","filePath":"components/icon-picker.md"}'),d={name:"components/icon-picker.md"},c={id:"iconpicker-图标选择器",tabindex:"-1"},p=e("a",{class:"header-anchor",href:"#iconpicker-图标选择器","aria-label":'Permalink to "IconPicker 图标选择器 "'},"​",-1),_=r("",2);function h(f,x,g,y,m,k){const a=n("Badge");return i(),o("div",null,[e("h1",c,[t("IconPicker 图标选择器 "),s(a,{type:"pro",text:"专业版"}),t(),p]),_])}const u=l(d,[["render",h]]);export{b as __pageData,u as default}; diff --git a/assets/components_image-preview.md.O75IkQyb.js b/assets/components_image-preview.md.O75IkQyb.js new file mode 100644 index 00000000..4bed0d43 --- /dev/null +++ b/assets/components_image-preview.md.O75IkQyb.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.js";const x=JSON.parse('{"title":"ImagePreview 图片预览","description":"","frontmatter":{},"headers":[],"relativePath":"components/image-preview.md","filePath":"components/image-preview.md"}'),i={name:"components/image-preview.md"},s=a('

ImagePreview 图片预览

Props

参数说明类型可选值默认值
src图片链接string--
width展示宽度string--
height展示高度string--
',3),d=[s];function n(r,o,g,h,f,c){return l(),e("div",null,d)}const p=t(i,[["render",n]]);export{x as __pageData,p as default}; diff --git a/assets/components_image-preview.md.O75IkQyb.lean.js b/assets/components_image-preview.md.O75IkQyb.lean.js new file mode 100644 index 00000000..553d2775 --- /dev/null +++ b/assets/components_image-preview.md.O75IkQyb.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.js";const x=JSON.parse('{"title":"ImagePreview 图片预览","description":"","frontmatter":{},"headers":[],"relativePath":"components/image-preview.md","filePath":"components/image-preview.md"}'),i={name:"components/image-preview.md"},s=a("",3),d=[s];function n(r,o,g,h,f,c){return l(),e("div",null,d)}const p=t(i,[["render",n]]);export{x as __pageData,p as default}; diff --git a/assets/components_image-upload.md.D7rbM4Gb.js b/assets/components_image-upload.md.D7rbM4Gb.js new file mode 100644 index 00000000..2e84af5a --- /dev/null +++ b/assets/components_image-upload.md.D7rbM4Gb.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.js";const h=JSON.parse('{"title":"ImageUpload 单图上传","description":"","frontmatter":{},"headers":[],"relativePath":"components/image-upload.md","filePath":"components/image-upload.md"}'),a={name:"components/image-upload.md"},n=d('

ImageUpload 单图上传

Props

参数说明类型可选值默认值
v-model图片地址string--
action必选参数,上传的地址string--
headers设置上传的请求头部object--
data上传时附带的额外参数object--
name上传的文件字段名string-file
size上传文件大小限制,单位为MBnumber-2
width展示宽度number-150
height展示高度number-150
placeholder占位图string--
notip是否隐藏提示栏boolean-false
ext支持的文件类型array-['jpg', 'png', 'gif', 'bmp']
',3),i=[n];function s(g,f,r,x,y,o){return l(),e("div",null,i)}const c=t(a,[["render",s]]);export{h as __pageData,c as default}; diff --git a/assets/components_image-upload.md.D7rbM4Gb.lean.js b/assets/components_image-upload.md.D7rbM4Gb.lean.js new file mode 100644 index 00000000..ca8f3d2a --- /dev/null +++ b/assets/components_image-upload.md.D7rbM4Gb.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.js";const h=JSON.parse('{"title":"ImageUpload 单图上传","description":"","frontmatter":{},"headers":[],"relativePath":"components/image-upload.md","filePath":"components/image-upload.md"}'),a={name:"components/image-upload.md"},n=d("",3),i=[n];function s(g,f,r,x,y,o){return l(),e("div",null,i)}const c=t(a,[["render",s]]);export{h as __pageData,c as default}; diff --git a/assets/components_images-upload.md.RSnuNose.js b/assets/components_images-upload.md.RSnuNose.js new file mode 100644 index 00000000..7b7db853 --- /dev/null +++ b/assets/components_images-upload.md.RSnuNose.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.js";const h=JSON.parse('{"title":"ImagesUpload 多图上传","description":"","frontmatter":{},"headers":[],"relativePath":"components/images-upload.md","filePath":"components/images-upload.md"}'),a={name:"components/images-upload.md"},s=d('

ImagesUpload 多图上传

Props

参数说明类型可选值默认值
v-model图片列表array-[]
action必选参数,上传的地址string--
headers设置上传的请求头部object--
data上传时附带的额外参数object--
name上传的文件字段名string-file
max上传数量限制number-3
size上传文件大小限制,单位为MBnumber-2
width展示宽度number-150
height展示高度number-150
placeholder占位图string--
notip是否隐藏提示栏boolean-false
ext支持的文件类型array-['jpg', 'png', 'gif', 'bmp']
',3),n=[s];function i(g,f,x,r,y,o){return l(),e("div",null,n)}const m=t(a,[["render",i]]);export{h as __pageData,m as default}; diff --git a/assets/components_images-upload.md.RSnuNose.lean.js b/assets/components_images-upload.md.RSnuNose.lean.js new file mode 100644 index 00000000..30d99f91 --- /dev/null +++ b/assets/components_images-upload.md.RSnuNose.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.js";const h=JSON.parse('{"title":"ImagesUpload 多图上传","description":"","frontmatter":{},"headers":[],"relativePath":"components/images-upload.md","filePath":"components/images-upload.md"}'),a={name:"components/images-upload.md"},s=d("",3),n=[s];function i(g,f,x,r,y,o){return l(),e("div",null,n)}const m=t(a,[["render",i]]);export{h as __pageData,m as default}; diff --git a/assets/components_index.md.IDIJOnXK.js b/assets/components_index.md.IDIJOnXK.js new file mode 100644 index 00000000..8b1570e9 --- /dev/null +++ b/assets/components_index.md.IDIJOnXK.js @@ -0,0 +1,12 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"components/index.md","filePath":"components/index.md"}'),n={name:"components/index.md"},e=t(`

介绍

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

基础组件

基础组件由 Element Plus 提供,其中包含按钮文字链接单选框多选框输入框计数器级联选择器开关滑块50+ 个组件。

阅读并学习请查看 Element Plus 官方文档

说明

为了统一图标的使用,框架没有采用 Element Plus 官方图标的使用方式,这意味着部分 Element Plus 组件的 icon 属性将无法使用,例如 Button 按钮组件。

template
<!-- 无法使用 -->
+<el-button icon="el-icon-edit">编辑</el-button>
+
+<!-- 可以使用插槽代替 -->
+<el-button>
+  <template #icon>
+    <el-icon>
+      <svg-icon name="ep:edit" />
+    </el-icon>
+  </template>
+  编辑
+</el-button>

如果你习惯 Element Plus 官方图标的使用方式,需执行 pnpm install @element-plus/icons-vue 安装依赖,并按照官方的使用方式引入图标,点击查看详细介绍。

替换组件库

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

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

内建组件

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

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

扩展组件

扩展组件为框架封装的组件,有全新开发的组件,也有在 Element Plus 组件上二次封装的组件,还有一些则是封装了第三方的插件。

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

`,13),l=[e];function p(h,r,k,o,E,d){return a(),i("div",null,l)}const u=s(n,[["render",p]]);export{c as __pageData,u as default}; diff --git a/assets/components_index.md.IDIJOnXK.lean.js b/assets/components_index.md.IDIJOnXK.lean.js new file mode 100644 index 00000000..a642a612 --- /dev/null +++ b/assets/components_index.md.IDIJOnXK.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"components/index.md","filePath":"components/index.md"}'),n={name:"components/index.md"},e=t("",13),l=[e];function p(h,r,k,o,E,d){return a(),i("div",null,l)}const u=s(n,[["render",p]]);export{c as __pageData,u as default}; diff --git a/assets/components_page-header.md.DN9_VgJv.js b/assets/components_page-header.md.DN9_VgJv.js new file mode 100644 index 00000000..8e6fe599 --- /dev/null +++ b/assets/components_page-header.md.DN9_VgJv.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.js";const _=JSON.parse('{"title":"PageHeader 页头","description":"","frontmatter":{},"headers":[],"relativePath":"components/page-header.md","filePath":"components/page-header.md"}'),d={name:"components/page-header.md"},n=l('

PageHeader 页头

Props

参数说明类型可选值默认值
title标题string--
content内容string--

Slots

name说明
-右侧区域的 HTML 内容
content内容区域的 HTML 内容
',5),s=[n];function r(o,i,h,g,f,c){return a(),e("div",null,s)}const p=t(d,[["render",r]]);export{_ as __pageData,p as default}; diff --git a/assets/components_page-header.md.DN9_VgJv.lean.js b/assets/components_page-header.md.DN9_VgJv.lean.js new file mode 100644 index 00000000..eae7bf94 --- /dev/null +++ b/assets/components_page-header.md.DN9_VgJv.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.js";const _=JSON.parse('{"title":"PageHeader 页头","description":"","frontmatter":{},"headers":[],"relativePath":"components/page-header.md","filePath":"components/page-header.md"}'),d={name:"components/page-header.md"},n=l("",5),s=[n];function r(o,i,h,g,f,c){return a(),e("div",null,s)}const p=t(d,[["render",r]]);export{_ as __pageData,p as default}; diff --git a/assets/components_page-main.md.t28_56LQ.js b/assets/components_page-main.md.t28_56LQ.js new file mode 100644 index 00000000..8991ecc9 --- /dev/null +++ b/assets/components_page-main.md.t28_56LQ.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.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.t28_56LQ.lean.js b/assets/components_page-main.md.t28_56LQ.lean.js new file mode 100644 index 00000000..9b6e577e --- /dev/null +++ b/assets/components_page-main.md.t28_56LQ.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.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_pcas-cascader.md.BEb_Ujl_.js b/assets/components_pcas-cascader.md.BEb_Ujl_.js new file mode 100644 index 00000000..1c02e87a --- /dev/null +++ b/assets/components_pcas-cascader.md.BEb_Ujl_.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.js";const y=JSON.parse('{"title":"PcasCascader 省市区街道联动","description":"","frontmatter":{},"headers":[],"relativePath":"components/pcas-cascader.md","filePath":"components/pcas-cascader.md"}'),d={name:"components/pcas-cascader.md"},s=l('

PcasCascader 省市区街道联动

Props

参数说明类型可选值默认值
v-model联动数据选中项绑定值array-[]
type联动类型,pc 省市、pca 省市区、pcas 省市区街道stringpc / pca / pcaspca
format绑定数据的格式化类型stringcode / name / bothcode
disabled是否禁用boolean-false
',3),c=[s];function n(r,o,i,f,p,x){return a(),e("div",null,c)}const g=t(d,[["render",n]]);export{y as __pageData,g as default}; diff --git a/assets/components_pcas-cascader.md.BEb_Ujl_.lean.js b/assets/components_pcas-cascader.md.BEb_Ujl_.lean.js new file mode 100644 index 00000000..20490567 --- /dev/null +++ b/assets/components_pcas-cascader.md.BEb_Ujl_.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a6 as l}from"./chunks/framework.Bhh1y9_T.js";const y=JSON.parse('{"title":"PcasCascader 省市区街道联动","description":"","frontmatter":{},"headers":[],"relativePath":"components/pcas-cascader.md","filePath":"components/pcas-cascader.md"}'),d={name:"components/pcas-cascader.md"},s=l("",3),c=[s];function n(r,o,i,f,p,x){return a(),e("div",null,c)}const g=t(d,[["render",n]]);export{y as __pageData,g as default}; diff --git a/assets/components_search-bar.md.DyxwWVs4.js b/assets/components_search-bar.md.DyxwWVs4.js new file mode 100644 index 00000000..d987abdc --- /dev/null +++ b/assets/components_search-bar.md.DyxwWVs4.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.js";const y=JSON.parse('{"title":"SearchBar 搜索面板","description":"","frontmatter":{},"headers":[],"relativePath":"components/search-bar.md","filePath":"components/search-bar.md"}'),d={name:"components/search-bar.md"},s=a('

SearchBar 搜索面板

Props

参数说明类型可选值默认值
fold是否折叠boolean-true
show-toggle是否显示切换按钮boolean-true
background是否显示背景boolean-false

Slots

name说明
-内容区域的 HTML 内容,作用域参数为 { fold, toggle }

Events

事件名称说明回调参数
toggle切换展开/收起状态的事件回调新状态的值
',7),r=[s];function n(o,h,i,f,c,x){return l(),e("div",null,r)}const b=t(d,[["render",n]]);export{y as __pageData,b as default}; diff --git a/assets/components_search-bar.md.DyxwWVs4.lean.js b/assets/components_search-bar.md.DyxwWVs4.lean.js new file mode 100644 index 00000000..2c573afa --- /dev/null +++ b/assets/components_search-bar.md.DyxwWVs4.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.js";const y=JSON.parse('{"title":"SearchBar 搜索面板","description":"","frontmatter":{},"headers":[],"relativePath":"components/search-bar.md","filePath":"components/search-bar.md"}'),d={name:"components/search-bar.md"},s=a("",7),r=[s];function n(o,h,i,f,c,x){return l(),e("div",null,r)}const b=t(d,[["render",n]]);export{y as __pageData,b as default}; diff --git a/assets/components_sparkline.md.B0Y5wjqT.js b/assets/components_sparkline.md.B0Y5wjqT.js new file mode 100644 index 00000000..54fd1a60 --- /dev/null +++ b/assets/components_sparkline.md.B0Y5wjqT.js @@ -0,0 +1 @@ +import{_ as d,D as a,c as s,j as e,a as t,I as n,a6 as i,o as r}from"./chunks/framework.Bhh1y9_T.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.B0Y5wjqT.lean.js b/assets/components_sparkline.md.B0Y5wjqT.lean.js new file mode 100644 index 00000000..bf75a020 --- /dev/null +++ b/assets/components_sparkline.md.B0Y5wjqT.lean.js @@ -0,0 +1 @@ +import{_ as d,D as a,c as s,j as e,a as t,I as n,a6 as i,o as r}from"./chunks/framework.Bhh1y9_T.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_storage-box.md.DkmDy-9N.js b/assets/components_storage-box.md.DkmDy-9N.js new file mode 100644 index 00000000..0d84e90a --- /dev/null +++ b/assets/components_storage-box.md.DkmDy-9N.js @@ -0,0 +1 @@ +import{_ as l,D as s,c as o,j as e,a as t,I as d,a6 as n,o as r}from"./chunks/framework.Bhh1y9_T.js";const B=JSON.parse('{"title":"StorageBox 储存箱","description":"","frontmatter":{},"headers":[],"relativePath":"components/storage-box.md","filePath":"components/storage-box.md"}'),i={name:"components/storage-box.md"},h={id:"storagebox-储存箱",tabindex:"-1"},x=e("a",{class:"header-anchor",href:"#storagebox-储存箱","aria-label":'Permalink to "StorageBox 储存箱 "'},"​",-1),g=n('

Props

参数说明类型可选值默认值
data需要储存的数据object / array--
name数据存放的命名空间string--
title下拉面板标题string-'储存箱'

Slots

name说明
-触发下拉面板的 HTML 内容

Events

事件名称说明回调参数
take-out点击下拉面板中某条记录的事件回调记录的数据
',6);function f(y,c,_,b,p,m){const a=s("Badge");return r(),o("div",null,[e("h1",h,[t("StorageBox 储存箱 "),d(a,{type:"pro",text:"专业版"}),t(),x]),g])}const P=l(i,[["render",f]]);export{B as __pageData,P as default}; diff --git a/assets/components_storage-box.md.DkmDy-9N.lean.js b/assets/components_storage-box.md.DkmDy-9N.lean.js new file mode 100644 index 00000000..49b57c57 --- /dev/null +++ b/assets/components_storage-box.md.DkmDy-9N.lean.js @@ -0,0 +1 @@ +import{_ as l,D as s,c as o,j as e,a as t,I as d,a6 as n,o as r}from"./chunks/framework.Bhh1y9_T.js";const B=JSON.parse('{"title":"StorageBox 储存箱","description":"","frontmatter":{},"headers":[],"relativePath":"components/storage-box.md","filePath":"components/storage-box.md"}'),i={name:"components/storage-box.md"},h={id:"storagebox-储存箱",tabindex:"-1"},x=e("a",{class:"header-anchor",href:"#storagebox-储存箱","aria-label":'Permalink to "StorageBox 储存箱 "'},"​",-1),g=n("",6);function f(y,c,_,b,p,m){const a=s("Badge");return r(),o("div",null,[e("h1",h,[t("StorageBox 储存箱 "),d(a,{type:"pro",text:"专业版"}),t(),x]),g])}const P=l(i,[["render",f]]);export{B as __pageData,P as default}; diff --git a/assets/components_svg-icon.md.BXB-K3yu.js b/assets/components_svg-icon.md.BXB-K3yu.js new file mode 100644 index 00000000..f1650d04 --- /dev/null +++ b/assets/components_svg-icon.md.BXB-K3yu.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.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.BXB-K3yu.lean.js b/assets/components_svg-icon.md.BXB-K3yu.lean.js new file mode 100644 index 00000000..0e284857 --- /dev/null +++ b/assets/components_svg-icon.md.BXB-K3yu.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as a}from"./chunks/framework.Bhh1y9_T.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.DxxgyeHY.js b/assets/components_trend.md.DxxgyeHY.js new file mode 100644 index 00000000..8355af45 --- /dev/null +++ b/assets/components_trend.md.DxxgyeHY.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.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.DxxgyeHY.lean.js b/assets/components_trend.md.DxxgyeHY.lean.js new file mode 100644 index 00000000..58187b9b --- /dev/null +++ b/assets/components_trend.md.DxxgyeHY.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as l,a6 as d}from"./chunks/framework.Bhh1y9_T.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.UJgy_6go.js b/assets/guide_api.md.UJgy_6go.js new file mode 100644 index 00000000..53f41375 --- /dev/null +++ b/assets/guide_api.md.UJgy_6go.js @@ -0,0 +1,32 @@ +import{_ as e,D as h,c as l,j as i,a as s,I as t,a6 as a,o as p}from"./chunks/framework.Bhh1y9_T.js";const D=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
import useAuth from '@/utils/composables/useAuth'
+
+const { auth, authAll } = useAuth()
+
+auth()
+authAll()

主导航

切换

切换主导航,index 为主导航序列数。

ts
import useMenu from '@/utils/composables/useMenu'
+
+useMenu().switchTo(index)

窗口

新增窗口

ts
import useWindow from '@/utils/composables/useWindow'
+
+useWindow.add('windowName')
+
+useWindow.add({
+  title: '窗口标题',
+	name: 'windowName'
+})

关闭窗口

ts
import useWindow from '@/utils/composables/useWindow'
+
+useWindow().remove('windowName')
`,16),r={id:"窗口全屏切换",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#窗口全屏切换","aria-label":'Permalink to "窗口全屏切换 "'},"​",-1),E=a(`
ts
import useWindow from '@/utils/composables/useWindow'
+
+useWindow().toggleMaximize('windowName')
`,1),c={id:"判断窗口是否全屏",tabindex:"-1"},g=i("a",{class:"header-anchor",href:"#判断窗口是否全屏","aria-label":'Permalink to "判断窗口是否全屏 "'},"​",-1),y=a(`
ts
import useWindow from '@/utils/composables/useWindow'
+
+useWindow().isMaximize('windowName')  // true / false

窗口刷新

ts
import useWindow from '@/utils/composables/useWindow'
+
+useWindow().reload('windowName')

事件总线

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

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

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

ts
import dayjs from '@/utils/dayjs'
+
+dayjs()
`,2);function b(_,C,v,B,A,f){const n=h("Badge");return p(),l("div",null,[d,i("h3",r,[s("窗口全屏切换 "),t(n,{type:"pro",text:"专业版"}),s(),o]),E,i("h3",c,[s("判断窗口是否全屏 "),t(n,{type:"pro",text:"专业版"}),s(),g]),y,i("h2",u,[s("日期 "),t(n,{type:"pro",text:"专业版"}),s(),F]),m])}const w=e(k,[["render",b]]);export{D as __pageData,w as default}; diff --git a/assets/guide_api.md.UJgy_6go.lean.js b/assets/guide_api.md.UJgy_6go.lean.js new file mode 100644 index 00000000..98fa8510 --- /dev/null +++ b/assets/guide_api.md.UJgy_6go.lean.js @@ -0,0 +1 @@ +import{_ as e,D as h,c as l,j as i,a as s,I as t,a6 as a,o as p}from"./chunks/framework.Bhh1y9_T.js";const D=JSON.parse('{"title":"常用 API","description":"","frontmatter":{},"headers":[],"relativePath":"guide/api.md","filePath":"guide/api.md"}'),k={name:"guide/api.md"},d=a("",16),r={id:"窗口全屏切换",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#窗口全屏切换","aria-label":'Permalink to "窗口全屏切换 "'},"​",-1),E=a("",1),c={id:"判断窗口是否全屏",tabindex:"-1"},g=i("a",{class:"header-anchor",href:"#判断窗口是否全屏","aria-label":'Permalink to "判断窗口是否全屏 "'},"​",-1),y=a("",6),u={id:"日期",tabindex:"-1"},F=i("a",{class:"header-anchor",href:"#日期","aria-label":'Permalink to "日期 "'},"​",-1),m=a("",2);function b(_,C,v,B,A,f){const n=h("Badge");return p(),l("div",null,[d,i("h3",r,[s("窗口全屏切换 "),t(n,{type:"pro",text:"专业版"}),s(),o]),E,i("h3",c,[s("判断窗口是否全屏 "),t(n,{type:"pro",text:"专业版"}),s(),g]),y,i("h2",u,[s("日期 "),t(n,{type:"pro",text:"专业版"}),s(),F]),m])}const w=e(k,[["render",b]]);export{D as __pageData,w as default}; diff --git a/assets/guide_axios.md.BhXyFrum.js b/assets/guide_axios.md.BhXyFrum.js new file mode 100644 index 00000000..17460bb4 --- /dev/null +++ b/assets/guide_axios.md.BhXyFrum.js @@ -0,0 +1,98 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.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.BhXyFrum.lean.js b/assets/guide_axios.md.BhXyFrum.lean.js new file mode 100644 index 00000000..19e0a2b0 --- /dev/null +++ b/assets/guide_axios.md.BhXyFrum.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.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.-GzyVqA3.js b/assets/guide_build.md.-GzyVqA3.js new file mode 100644 index 00000000..6439d0b2 --- /dev/null +++ b/assets/guide_build.md.-GzyVqA3.js @@ -0,0 +1,9 @@ +import{_ as a,c as e,o as s,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const b=JSON.parse('{"title":"构建与预览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/build.md","filePath":"guide/build.md"}'),p={name:"guide/build.md"},t=n(`

构建与预览

构建

项目开发完成之后,可以执行 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 安装指定模块并开启后才会生效。

其它设置

在环境配置文件里除了可以设置压缩选项,还可设置:

# 是否在打包时生成 sourcemap
+VITE_BUILD_SOURCEMAP = true
`,14),i=[t];function o(c,d,l,r,h,u){return s(),e("div",null,i)}const m=a(p,[["render",o]]);export{b as __pageData,m as default}; diff --git a/assets/guide_build.md.-GzyVqA3.lean.js b/assets/guide_build.md.-GzyVqA3.lean.js new file mode 100644 index 00000000..db49e55c --- /dev/null +++ b/assets/guide_build.md.-GzyVqA3.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as s,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const b=JSON.parse('{"title":"构建与预览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/build.md","filePath":"guide/build.md"}'),p={name:"guide/build.md"},t=n("",14),i=[t];function o(c,d,l,r,h,u){return s(),e("div",null,i)}const m=a(p,[["render",o]]);export{b as __pageData,m as default}; diff --git a/assets/guide_changelog.md.DCflyckv.js b/assets/guide_changelog.md.DCflyckv.js new file mode 100644 index 00000000..51f6f504 --- /dev/null +++ b/assets/guide_changelog.md.DCflyckv.js @@ -0,0 +1,33 @@ +import{_ as t,D as r,c as i,j as a,a as o,I as l,a6 as e,o as p}from"./chunks/framework.Bhh1y9_T.js";const E=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"guide/changelog.md","filePath":"guide/changelog.md"}'),n={name:"guide/changelog.md"},h=e('

更新日志

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

4.7.0

基础版

🚨 Breaking Changes

  • 重构登录页面  -  by @hooray (b1cb9)

🚀 Features

  • 扩充 unocss 自定义 shortcuts  -  by @hooray (6258e)
  • SvgIcon 组件支持传入本地图片,网络图片增加载入和失败状态  -  by @hooray (cea64)
  • 引入 postcss-nested  -  by @hooray (2ce2b)

专业版

🚨 Breaking Changes

  • 重构登录页面  -  by @hooray (f77f3)
  • 移除 I18nSelector 组件  -  by @hooray (83dd8)

🚀 Features

  • 扩充 unocss 自定义 shortcuts  -  by @hooray (15a3f)
  • SvgIcon 组件支持传入本地图片,网络图片增加载入和失败状态  -  by @hooray (a1a81)
  • 引入 postcss-nested  -  by @hooray (5f4d6)

4.6.0

基础版

🚨 Breaking Changes

  • 移除createInjectionKey函数  -  by @hooray (09d49)
  • 窗口宽度改为配置文件全局设置  -  by @hooray (fa5c5)

🚀 Features

  • 上传组件增加自定义上传  -  by @hooray (43851)
  • FileUpload 组件文件列表增加下载功能  -  by @hooray (09b21)

专业版

🚨 Breaking Changes

  • 移除createInjectionKey函数,全局provide的generateI18nTitle函数放到useMenu()里提供  -  by @hooray (ebc63)
  • 调整 menu.enableSubMenuCollapseButton 的展示逻辑  -  by @hooray (3a6d7)

🚀 Features

  • 上传组件增加自定义上传  -  by @hooray (dab41)
  • 窗口宽度改为在配置文件全局设置,支持单独设置窗口宽度  -  by @hooray (3837a)
  • FileUpload 组件文件列表增加下载功能  -  by @hooray (fd0ca)

🐞 Bug Fixes

  • 修复类型警告  -  by @hooray (9783f)
  • 修复主题跟随系统且系统为明亮模式时,水印不生效  -  by @hooray (f9498)

4.5.0

基础版

🚨 Breaking Changes

  • 配置项 menu.menuMode 变更为 menu.mode  -  by @hooray (10415)

🚀 Features

  • 增加禁用开发者工具环境变量  -  by @hooray (306f3)
  • 新增哀悼模式和色弱模式  -  by @hooray (3c299)

🐞 Bug Fixes

  • 修复vscode失效配置  -  by @hooray (e5cfa)

专业版

🚨 Breaking Changes

  • 配置项 menu.menuActiveStyle 变更为 menu.style  -  by @hooray (fce08)
  • 配置项 menu.menuMode 变更为 menu.mode  -  by @hooray (9091d)

🚀 Features

  • 增加2种导航栏模式 side-panel / head-panel  -  by @hooray (cab92)
  • 增加禁用开发者工具环境变量  -  by @hooray (f2ef8)
  • 新增哀悼模式和色弱模式  -  by @hooray (9ebc8)

🐞 Bug Fixes

  • 移除无用逻辑判断  -  by @hooray (51e90)
  • 修复vscode失效配置  -  by @hooray (d2dda):::

4.4.1

基础版

无重大变化

专业版

🐞 Bug Fixes

  • 修复有 badge 的一级导航在收起时展示和其他导航不一样的问题  -  by @hooray (1441c)

4.4.0

基础版

🚀 Features

  • 登录页增加扫码登录参考  -  by @hooray (bafaa)

🐞 Bug Fixes

  • 修复顶部导航鼠标滚动回弹  -  by @hooray (216ac)
  • 修复顶部导航数量过多,导致工具栏被遮挡  -  by @hooray (f49b6)

专业版

🚨 Breaking Changes

  • 移除导航i18n配置项,合并到title配置项内  -  by @hooray (1921b)

🚀 Features

  • 登录页增加扫码登录参考  -  by @hooray (fc082)

🐞 Bug Fixes

  • 修复顶部导航鼠标滚动回弹  -  by @hooray (1d900)
  • 修复顶部导航数量过多,导致工具栏被遮挡  -  by @hooray (4c70b)
  • 修复水印开启报错  -  by @hooray (33add)

4.3.0

基础版

无重大变化

专业版

🚀 Features

  • 提供 $t 函数,用于菜单 i18n 能在 VSCode I18n Ally 插件下正确显示  -  by @hooray (d8039)
  • 工具栏部分按钮增加交互动效  -  by @hooray (8f597)
  • 支持 RTL 模式  -  by @hooray (97483)

🐞 Bug Fixes

  • 修复 mock 模板请求无响应数据  -  by @hooray (6c92d)

4.2.3

基础版

无重大变化

专业版

无重大变化

4.2.2

基础版

无重大变化

专业版

无重大变化

4.2.1

基础版

无重大变化

专业版

🐞 Bug Fixes

  • 修复 IconPicker 组件样式错乱  -  by @hooray (3bd3b)

4.2.0

基础版

🚀 Features

  • 引入 unplugin-turbo-console 优化开发体验  -  by @hooray (43d09)
  • 增加打包后生成存档文件支持  -  by @hooray (66d9e)
  • 增加图片支持,整站图标改用 unocss icon 方式使用,方便在内网环境使用  -  by @hooray (4bccd)
  • 导航菜单收起时,无二级的一级导航增加 tooltip 展示  -  by @hooray (5e61c)
  • 明暗模式设置为跟随系统时,支持动态切换  -  by @hooray (98792)

🐞 Bug Fixes

  • Mock 数据修复  -  by @hooray (fd2f6)

专业版

🚨 Breaking Changes

  • 重构用户偏好模块,偏好设置可存放在 localStorage  -  by @hooray (7a554)
  • 重构页面水印,支持动态更新  -  by @hooray (7cdc8)
  • 移除内置 v-waves 指令,使用第三方 v-wave 插件  -  by @hooray (a7505)

🚀 Features

  • 引入 unplugin-turbo-console 优化开发体验  -  by @hooray (f644e)
  • 增加打包后生成存档文件支持  -  by @hooray (2bb50)
  • SvgIcon 增加图片支持,整站图标改用 unocss icon 方式使用,方便在内网环境使用  -  by @hooray (d5715)
  • 导航菜单收起时,无二级的一级导航增加 tooltip 展示  -  by @hooray (95cf8)
  • 明暗模式设置为跟随系统时,支持动态切换  -  by @hooray (c7bcb)
  • 增加 v-zoomable 图片预览指令  -  by @hooray (3d58e)

🐞 Bug Fixes

  • Mock 数据修复  -  by @hooray (5c9ba)

4.1.0

基础版

🚨 Breaking Changes

  • Vite-plugin-fake-server 替换 vite-plugin-mock  -  by @hooray (38039)
  • 应用配置 toolbar 对象内属性调整  -  by @hooray (e2aaf)

专业版

🚨 Breaking Changes

  • Vite-plugin-fake-server 替换 vite-plugin-mock  -  by @hooray (bdfa4)
  • 应用配置 toolbar 对象内属性调整  -  by @hooray (c2915)

🚀 Features

  • 应用配置新增 menu.subMenuAutoCollapse ,支持次导航收起时,鼠标悬停临时展开  -  by @hooray (970ef)
  • 应用配置新增 toolbar.layout 属性,支持工具栏自定义布局  -  by @hooray (cc87f)

4.0.1

基础版

🐞 Bug Fixes

  • 修复登录页 Copyright 组件未展示  -  by @hooray (0b03a)

专业版

🐞 Bug Fixes

  • 修复登录页 Copyright 组件未展示  -  by @hooray (a808f)

4.0.0

基础版

🚨 Breaking Changes

  • 启用新的 eslint 配置文件  -  by @hooray (5f9f1)
  • 移除应用配置中 Element Plus 默认尺寸的配置项  -  by @hooray (dfc51)

🚀 Features

  • 支持使用 Iconify 完整图标库  -  by @hooray (2d642)
  • 重构框架核心源码  -  by @hooray (874e3)
  • Eslint 增加 unocss 配置  -  by @hooray (dcbcc)

专业版

🚨 Breaking Changes

  • 启用新的 eslint 配置文件  -  by @hooray (66160)
  • 移除应用配置中 Element Plus 默认尺寸的配置项  -  by @hooray (6720a)

🚀 Features

  • 重构框架核心源码  -  by @hooray (215ef)
  • 全局搜索支持拼音  -  by @hooray (cbb68)
  • Eslint 增加 unocss 配置  -  by @hooray (0b078)

🐞 Bug Fixes

  • 修复收藏夹默认存储位置错误  -  by @hooray (d2a2d)
',39),c=e(`
  • 拥抱原子化 CSS ,启用 UnoCSS ,并对框架部分组件样式进行了重构

    如果你正在将老版本的业务代码向新版本迁移,推荐安装 UnoCSS 这个 VSCode 插件,它能高亮显示 UnoCSS 的代码。如果你的业务页面代码中定义的 class 和 UnoCSS 的 class 重名,也可以通过这个插件快速识别到并修改。

  • 与 Element Plus 组件库解耦,方便替换成其他第三方 UI 组件库,详细可阅读:

  • ESLint 配置文件格式调整,详细可阅读《代码规范 - ESLint 配置

    ESLint 提供了全新的配置方式,所有配置项将都在一个 eslint.config.js 文件中实现。

  • 基础版现在可以使用 Iconify 完整图标库,详细可阅读《图标 - Iconify 图标

  • 全新的主题配色方案,详细可阅读《主题 - 框架主题

  • 移除 Element Plus 自定义主题配置

    如果你依旧需要自定义 Element Plus 的主题,可以阅读 Element Plus 官方文档《自定义主题》,或者参考下面提供的最佳实践。

    /src/assets/styles/ 目录下分别新建 element-plus.scsselement-plus.dark.scss 并写入下面的代码:

    scss
    // element-plus.scss
    +@forward "element-plus/theme-chalk/src/common/var.scss" with (
    +  $colors: (
    +    "primary": (
    +      "base": green
    +    )
    +  )
    +);
    +@use "element-plus/theme-chalk/src/index.scss" as *;
    +@use "./element-plus.dark.scss" as *;
    scss
    // element-plus.dark.scss
    +@forward "element-plus/theme-chalk/src/dark/var.scss" with (
    +  $bg-color: (
    +    "page": #0a0a0a,
    +    "": #141414,
    +    "overlay": #1d1e1f,
    +  )
    +);
    +@use "element-plus/theme-chalk/src/dark/css-vars.scss" as *;

    修改 /src/main.ts

    ts
    ...
    +import ElementPlus from 'element-plus'
    +import 'element-plus/dist/index.css'
    +import 'element-plus/theme-chalk/dark/css-vars.css'
    +import '@/assets/styles/element-plus.scss'
    +...
  • 移除应用配置中 Element Plus 默认尺寸的配置项

    如果你依旧需要全局配置 Element Plus 的默认尺寸,可以参考《Config Provider 全局配置》并在 /src/App.vue 中进行修改。

  • 移除精灵图支持

    原有 /src/assets/sprites/ 目录中的图片,现在可以移动到 /src/assets/images/ 目录中,并修改代码中的使用方式。

  • `,8),m=e(`
    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    /**
    +    * 留空默认
    +    * radius 圆角
    +    */
    +    menuFillStyle: '', 
    +    // 导航栏是否圆角
    +    isRounded: false, 
    +  },
    +}
    `,1),b=e('

    3.1.3

    基础版

    无重大变化

    专业版

    无重大变化

    3.1.2

    基础版

    无重大变化

    专业版

    无重大变化

    3.1.1

    基础版

    无重大变化

    专业版

    无重大变化

    3.1.0

    基础版

    无重大变化

    专业版

    🚀 Features

    • 增加收藏夹  -  by @hooray (7146d)
    • 新增用户偏好设置  -  by @hooray (ba111)

    3.0.0

    基础版

    🚨 Breaking Changes

    • 移除 BatchActionBar 组件  -  by @hooray (b1f8f)
    • 移除 Editor 组件  -  by @hooray (2ea5f)
    • 移除 vite-plugin-html 插件  -  by @hooray (9d1d3)
    • 调整应用配置的配置项,并将应用配置按钮从工具栏删除  -  by @hooray (ceffd)
    • 重构接口请求,统一管理接口请求模块  -  by @hooray (301d7)

    🚀 Features

    • 引入 stylelint-stylistic 插件  -  by @hooray (38e3f)

    🐞 Bug Fixes

    • 修复 axios baseURL 配置,解决构建后 baseURL 不生效的问题  -  by @hooray (87963)

    专业版

    🚨 Breaking Changes

    • 移除 BatchActionBar 组件  -  by @hooray (ca569)
    • 移除 Editor 组件  -  by @hooray (6fff3)
    • 移除 vite-plugin-html 插件  -  by @hooray (f9c4e)
    • 调整应用配置的配置项,并将应用配置按钮从工具栏删除  -  by @hooray (abea5)
    • 重构标准模块,增加表格高度自适应功能  -  by @hooray (f20ca)
    • 重构接口请求,统一管理接口请求模块  -  by @hooray (831ab)

    🚀 Features

    • 引入 stylelint-stylistic 插件  -  by @hooray (f0826)
    • 新增 StorageBox 组件  -  by @hooray (38efb)
    • 增加明暗切换过渡动效  -  by @hooray (44045)

    🐞 Bug Fixes

    • 修复 axios baseURL 配置,解决构建后 baseURL 不生效的问题  -  by @hooray (3fa26)
    • 增加 dropdown 组件外边框的临时解决方案  -  by @hooray (9cd44)

    2.3.2

    基础版

    无重大变化

    专业版

    无重大变化

    2.3.1

    基础版

    无重大变化

    专业版

    无重大变化

    2.3.0

    基础版

    🚨 Breaking Changes

    • Pinia store 改为 setup 写法  -  by @hooray (1cd93)
    • UseCurrentInstance() 重命名为 useGlobalProperties()  -  by @hooray (0311a)

    专业版

    🚨 Breaking Changes

    • Pinia store 改为 setup 写法  -  by @hooray (040a5)
    • UseCurrentInstance() 重命名为 useGlobalProperties()  -  by @hooray (39d56)

    🐞 Bug Fixes

    • 修复顶部主导航国际化配置不生效  -  by @hooray (02548)
    • 修复切换国际化语言时,主导航激活项被复原到第一个  -  by @hooray (e6846)

    2.2.0

    基础版

    🐞 Bug Fixes

    • 修复次导航收起时图标不居中  -  by @hooray (2b5ca)

    专业版

    🚀 Features

    • 个人设置窗口补充 i18n 配置  -  by @hooray (2655c)

    🐞 Bug Fixes

    • 修复次导航收起时图标不居中  -  by @hooray (2fc11)
    • 修复主导航国际化配置不生效  -  by @hooray (490b1)

    2.1.0

    基础版

    🐞 Bug Fixes

    • 修复类型报错  -  by @hooray (8aba7)

    专业版

    🐞 Bug Fixes

    • 修复 mock 文件后缀名错误  -  by @hooray (8bc65)
    • 修复无法打开修改密码窗口的问题  -  by @hooray (0c353)
    • 修复类型报错  -  by @hooray (56855)

    2.0.0

    基础版

    🚨 Breaking Changes

    • TypeScript 支持  -  by @hooray (0b8ac)

    专业版

    🚨 Breaking Changes

    • TypeScript 支持  -  by @hooray (13b2c)

    v1.0.0

    基础版

    JS 版本存档,框架下次更新将切换到 TS 版本,JS 版本将不再维护。

    专业版

    JS 版本存档,框架下次更新将切换到 TS 版本,JS 版本将不再维护。

    ',36);function d(u,k,g,f,y,_){const s=r("Badge");return p(),i("div",null,[h,a("ul",null,[c,a("li",null,[a("p",null,[o("应用配置中导航栏填充风格的配置项名称变更 "),l(s,{type:"pro",text:"专业版"})]),m])]),b])}const F=t(n,[["render",d]]);export{E as __pageData,F as default}; diff --git a/assets/guide_changelog.md.DCflyckv.lean.js b/assets/guide_changelog.md.DCflyckv.lean.js new file mode 100644 index 00000000..d041fff6 --- /dev/null +++ b/assets/guide_changelog.md.DCflyckv.lean.js @@ -0,0 +1 @@ +import{_ as t,D as r,c as i,j as a,a as o,I as l,a6 as e,o as p}from"./chunks/framework.Bhh1y9_T.js";const E=JSON.parse('{"title":"更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"guide/changelog.md","filePath":"guide/changelog.md"}'),n={name:"guide/changelog.md"},h=e("",39),c=e("",8),m=e("",1),b=e("",36);function d(u,k,g,f,y,_){const s=r("Badge");return p(),i("div",null,[h,a("ul",null,[c,a("li",null,[a("p",null,[o("应用配置中导航栏填充风格的配置项名称变更 "),l(s,{type:"pro",text:"专业版"})]),m])]),b])}const F=t(n,[["render",d]]);export{E as __pageData,F as default}; diff --git a/assets/guide_coding-standard.md.BOxNKpOC.js b/assets/guide_coding-standard.md.BOxNKpOC.js new file mode 100644 index 00000000..d5fc3976 --- /dev/null +++ b/assets/guide_coding-standard.md.BOxNKpOC.js @@ -0,0 +1,21 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const E=JSON.parse('{"title":"代码规范","description":"","frontmatter":{},"headers":[],"relativePath":"guide/coding-standard.md","filePath":"guide/coding-standard.md"}'),e={name:"guide/coding-standard.md"},n=t(`

    代码规范

    建议

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

    为保证代码风格统一,请使用 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 配置

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

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

    TIP

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

    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/one-step-admin/ ,则在 package.json 里找到 simple-git-hooks 配置并修改:

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

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

    移除

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

    json
    {
    +  "scripts": {
    +    "postinstall": "simple-git-hooks && esno scripts/prepare.js", 
    +    "postinstall": "esno scripts/prepare.js", 
    +  },
    +  "simple-git-hooks": { 
    +    "pre-commit": "pnpm lint-staged", 
    +    "preserveUnused": true
    +  }, 
    +}
    json
    {
    +  "scripts": {
    +    "postinstall": "simple-git-hooks", 
    +  },
    +  "simple-git-hooks": { 
    +    "pre-commit": "pnpm lint-staged", 
    +    "preserveUnused": true
    +  }, 
    +}

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

    `,21),l=[n];function p(o,h,d,k,r,c){return a(),i("div",null,l)}const u=s(e,[["render",p]]);export{E as __pageData,u as default}; diff --git a/assets/guide_coding-standard.md.BOxNKpOC.lean.js b/assets/guide_coding-standard.md.BOxNKpOC.lean.js new file mode 100644 index 00000000..05f995ac --- /dev/null +++ b/assets/guide_coding-standard.md.BOxNKpOC.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const E=JSON.parse('{"title":"代码规范","description":"","frontmatter":{},"headers":[],"relativePath":"guide/coding-standard.md","filePath":"guide/coding-standard.md"}'),e={name:"guide/coding-standard.md"},n=t("",21),l=[n];function p(o,h,d,k,r,c){return a(),i("div",null,l)}const u=s(e,[["render",p]]);export{E as __pageData,u as default}; diff --git a/assets/guide_components.md.DKFLed6e.js b/assets/guide_components.md.DKFLed6e.js new file mode 100644 index 00000000..12bf2ac9 --- /dev/null +++ b/assets/guide_components.md.DKFLed6e.js @@ -0,0 +1,17 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components.md","filePath":"guide/components.md"}'),t={name:"guide/components.md"},l=n(`

    介绍

    框架提供一系列的组件方便快速开发,其中基础组件Element Plus 原生提供的组件;而扩展组件有一部分是在 Element Plus 组件上进行了二次开发,还有一部分是封装了第三方插件。

    组件源码完全开放,如果觉得用着不顺手,可以到 /src/components/ 目录下找到对应组件进行修改。

    基础组件

    基础组件由 Element Plus 提供,其中包含按钮文字链接单选框多选框输入框计数器级联选择器开关滑块50+ 个组件。

    阅读并学习请查看 Element Plus 官方文档

    TIP

    框架严格按照 Element Plus 推荐的使用方式进行引入,即按需自动导入,意味着你可以直接在代码里使用组件,而无需手动注册。

    但也意味着 Element Plus 一些全局方法将无法使用,例如 Message 消息提示组件。

    js
    // 无法使用
    +const { proxy } = getCurrentInstance()
    +proxy.$message.success(options)
    +
    +// 可以使用
    +ElMessage.success(options)

    另外因为框架没有采用 Element Plus 官方的图标使用方式,这也意味着部分组件的 icon 属性将无法使用,例如 Button 按钮组件。

    template
    <!-- 无法使用 -->
    +<el-button icon="el-icon-edit">编辑</el-button>
    +
    +<!-- 可以使用插槽代替 -->
    +<el-button>
    +    <template #icon>
    +        <el-icon>
    +            <svg-icon name="ep:edit" />
    +        </el-icon>
    +    </template>
    +    编辑
    +</el-button>

    扩展组件

    `,8),e=[l];function p(h,k,r,E,o,g){return a(),i("div",null,e)}const y=s(t,[["render",p]]);export{c as __pageData,y as default}; diff --git a/assets/guide_components.md.DKFLed6e.lean.js b/assets/guide_components.md.DKFLed6e.lean.js new file mode 100644 index 00000000..76b5f912 --- /dev/null +++ b/assets/guide_components.md.DKFLed6e.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components.md","filePath":"guide/components.md"}'),t={name:"guide/components.md"},l=n("",8),e=[l];function p(h,k,r,E,o,g){return a(),i("div",null,e)}const y=s(t,[["render",p]]);export{c as __pageData,y as default}; diff --git a/assets/guide_configure.md.DGLgmmVa.js b/assets/guide_configure.md.DGLgmmVa.js new file mode 100644 index 00000000..3a209dad --- /dev/null +++ b/assets/guide_configure.md.DGLgmmVa.js @@ -0,0 +1,62 @@ +import{_ as s,c as a,o as i,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/settings.png",_=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/configure.md","filePath":"guide/configure.md"}'),p={name:"guide/configure.md"},e=n(`

    配置

    环境配置

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

    yaml
    # 应用配置面板
    +VITE_APP_SETTING = true
    +# 页面标题
    +VITE_APP_TITLE = One-step-admin
    +# 接口请求地址,会设置到 axios 的 baseURL 参数上
    +VITE_APP_API_BASEURL = /
    +# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
    +VITE_APP_DEBUG_TOOL =
    +# 是否禁用开发者工具,可防止被调试
    +VITE_APP_DISABLE_DEVTOOL = false
    +
    +# 是否开启代理
    +VITE_OPEN_PROXY = false
    yaml
    # 应用配置面板
    +VITE_APP_SETTING = false
    +# 页面标题
    +VITE_APP_TITLE = One-step-admin
    +# 接口请求地址,会设置到 axios 的 baseURL 参数上
    +VITE_APP_API_BASEURL = /
    +# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
    +VITE_APP_DEBUG_TOOL =
    +# 是否禁用开发者工具,可防止被调试
    +VITE_APP_DISABLE_DEVTOOL = false
    +
    +# 是否在打包时启用 Mock
    +VITE_BUILD_MOCK = false
    +# 在构建时生成 sourcemap
    +VITE_BUILD_SOURCEMAP = true
    +# 在构建时开启压缩,支持 gzip 和 brotli
    +VITE_BUILD_COMPRESS =
    +# 是否在打包后生成存档,支持 zip 和 tar
    +VITE_BUILD_ARCHIVE =
    yaml
    # 应用配置面板
    +VITE_APP_SETTING = false
    +# 页面标题
    +VITE_APP_TITLE = One-step-admin
    +# 接口请求地址,会设置到 axios 的 baseURL 参数上
    +VITE_APP_API_BASEURL = /
    +# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
    +VITE_APP_DEBUG_TOOL =
    +# 是否禁用开发者工具,可防止被调试
    +VITE_APP_DISABLE_DEVTOOL = false
    +
    +# 是否在打包时启用 Mock
    +VITE_BUILD_MOCK = true
    +# 在构建时生成 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_APP_DISABLE_DEVTOOL 为必要配置,即不管是在开发、测试,还是生产环境都需要使用到。而其余配置则在不同环境下有不同用途,例如开发环境用于本地开发使用,测试环境和生产环境用于构建使用。

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

    注意

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

    如果希望提供用户一些定制化的能力,可以开启偏好设置,详细可阅读《用户偏好设置

    应用配置(框架配置)

    开发者请在 /src/settings.ts 文件中设置自定义配置,而 /src/settings.default.ts 为框架的默认配置,请勿在该文件内修改。

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

    ts
    // 这是基础版演示源码里的自定义配置示例
    +const globalSettings: Settings.all = {
    +  app: {
    +    enablePermission: true,
    +  },
    +  menu: {
    +    enableSubMenuCollapseButton: true,
    +    enableHotkeys: true,
    +  },
    +  toolbar: {
    +    enableFullscreen: true,
    +    enableColorScheme: true,
    +  },
    +}

    注意

    如果文档中提供的配置介绍,在你本地的开发环境中报错或者无法生效,说明你使用的版本不支持或者配置参数有变动,你可以打开 /src/settings.default.ts 查看当前版本的完整配置作为参考。并且如果你使用的是 Visual Studio Code ,鼠标悬浮到属性上时,会有属性的介绍:

    ',12),t=[e];function h(k,d,c,r,E,o){return i(),a("div",null,t)}const y=s(p,[["render",h]]);export{_ as __pageData,y as default}; diff --git a/assets/guide_configure.md.DGLgmmVa.lean.js b/assets/guide_configure.md.DGLgmmVa.lean.js new file mode 100644 index 00000000..c1755f48 --- /dev/null +++ b/assets/guide_configure.md.DGLgmmVa.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/settings.png",_=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/configure.md","filePath":"guide/configure.md"}'),p={name:"guide/configure.md"},e=n("",12),t=[e];function h(k,d,c,r,E,o){return i(),a("div",null,t)}const y=s(p,[["render",h]]);export{_ as __pageData,y as default}; diff --git a/assets/guide_copyright.md.DFx3AWRC.js b/assets/guide_copyright.md.DFx3AWRC.js new file mode 100644 index 00000000..770831b2 --- /dev/null +++ b/assets/guide_copyright.md.DFx3AWRC.js @@ -0,0 +1,21 @@ +import{_ as s,c as i,o as a,a6 as h}from"./chunks/framework.Bhh1y9_T.js";const t="/copyright.png",y=JSON.parse('{"title":"版权信息","description":"","frontmatter":{},"headers":[],"relativePath":"guide/copyright.md","filePath":"guide/copyright.md"}'),n={name:"guide/copyright.md"},l=h('

    版权信息

    版权信息位于页面底部显示。

    使用

    在应用配置中设置:

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

    网站运行日期

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  copyright: {
    +    dates: '2021-2022',
    +  },
    +}

    公司名称

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  copyright: {
    +    company: 'One-step-admin',
    +  },
    +}

    网站地址

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  copyright: {
    +    website: 'https://one-step-admin.hurui.me',
    +  },
    +}

    如果未设置公司名称,则该设置将被忽略。

    备案号

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  copyright: {
    +    beian: '',
    +  },
    +}
    `,19),p=[l];function e(k,d,g,r,E,c){return a(),i("div",null,p)}const F=s(n,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_copyright.md.DFx3AWRC.lean.js b/assets/guide_copyright.md.DFx3AWRC.lean.js new file mode 100644 index 00000000..1c95edd4 --- /dev/null +++ b/assets/guide_copyright.md.DFx3AWRC.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as h}from"./chunks/framework.Bhh1y9_T.js";const t="/copyright.png",y=JSON.parse('{"title":"版权信息","description":"","frontmatter":{},"headers":[],"relativePath":"guide/copyright.md","filePath":"guide/copyright.md"}'),n={name:"guide/copyright.md"},l=h("",19),p=[l];function e(k,d,g,r,E,c){return a(),i("div",null,p)}const F=s(n,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_error-log.md.CtmjfpdD.js b/assets/guide_error-log.md.CtmjfpdD.js new file mode 100644 index 00000000..58c6bb85 --- /dev/null +++ b/assets/guide_error-log.md.CtmjfpdD.js @@ -0,0 +1,5 @@ +import{_ as i,D as t,c as n,j as a,a as s,I as l,a6 as p,o as r}from"./chunks/framework.Bhh1y9_T.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.CtmjfpdD.lean.js b/assets/guide_error-log.md.CtmjfpdD.lean.js new file mode 100644 index 00000000..2df32ba0 --- /dev/null +++ b/assets/guide_error-log.md.CtmjfpdD.lean.js @@ -0,0 +1 @@ +import{_ as i,D as t,c as n,j as a,a as s,I as l,a6 as p,o as r}from"./chunks/framework.Bhh1y9_T.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_favorites.md.CmABV1kw.js b/assets/guide_favorites.md.CmABV1kw.js new file mode 100644 index 00000000..f2d967d6 --- /dev/null +++ b/assets/guide_favorites.md.CmABV1kw.js @@ -0,0 +1,5 @@ +import{_ as i,D as t,c as n,j as a,a as s,I as o,a6 as l,o as p}from"./chunks/framework.Bhh1y9_T.js";const h="/favorites.png",b=JSON.parse('{"title":"收藏夹","description":"","frontmatter":{},"headers":[],"relativePath":"guide/favorites.md","filePath":"guide/favorites.md"}'),d={name:"guide/favorites.md"},r={id:"收藏夹",tabindex:"-1"},c=a("a",{class:"header-anchor",href:"#收藏夹","aria-label":'Permalink to "收藏夹 "'},"​",-1),k=l('

    需在工具栏开启,开启后用户可将常用的导航菜单添加进收藏夹,方便快速访问。

    处理请求

    收藏夹默认存储在浏览器本地 localStorage 里,如果需要将数据存储到服务器,可以通过 favorites.storageTo 配置项来实现,具体配置如下:

    ts
    const globalSettings: Settings.all = {
    +  favorites: {
    +    storageTo: 'server',
    +  },
    +}

    然后到 /src/api/modules/user.ts 中找到 favorites()favoritesEdit() 这两个函数,并分别修改这两个函数的请求地址。

    建议

    为减轻后端处理,数据会直接以 JSON 字符串进行存储,建议后端可以在用户表增加相关字段,并将字段类型设为 lonetext

    `,7);function g(_,E,m,v,f,u){const e=t("Badge");return p(),n("div",null,[a("h1",r,[s("收藏夹 "),o(e,{type:"pro",text:"专业版"}),s(),c]),k])}const F=i(d,[["render",g]]);export{b as __pageData,F as default}; diff --git a/assets/guide_favorites.md.CmABV1kw.lean.js b/assets/guide_favorites.md.CmABV1kw.lean.js new file mode 100644 index 00000000..5a0f64a9 --- /dev/null +++ b/assets/guide_favorites.md.CmABV1kw.lean.js @@ -0,0 +1 @@ +import{_ as i,D as t,c as n,j as a,a as s,I as o,a6 as l,o as p}from"./chunks/framework.Bhh1y9_T.js";const h="/favorites.png",b=JSON.parse('{"title":"收藏夹","description":"","frontmatter":{},"headers":[],"relativePath":"guide/favorites.md","filePath":"guide/favorites.md"}'),d={name:"guide/favorites.md"},r={id:"收藏夹",tabindex:"-1"},c=a("a",{class:"header-anchor",href:"#收藏夹","aria-label":'Permalink to "收藏夹 "'},"​",-1),k=l("",7);function g(_,E,m,v,f,u){const e=t("Badge");return p(),n("div",null,[a("h1",r,[s("收藏夹 "),o(e,{type:"pro",text:"专业版"}),s(),c]),k])}const F=i(d,[["render",g]]);export{b as __pageData,F as default}; diff --git a/assets/guide_font.md.BA3rgSN5.js b/assets/guide_font.md.BA3rgSN5.js new file mode 100644 index 00000000..f528ef79 --- /dev/null +++ b/assets/guide_font.md.BA3rgSN5.js @@ -0,0 +1,4 @@ +import{_ as t,D as i,c as o,j as a,a as e,I as n,a6 as l,o as r}from"./chunks/framework.Bhh1y9_T.js";const d="/font1.png",p="/font2.png",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=a("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,[a("h1",h,[e("自定义字体 "),n(s,{type:"pro",text:"专业版"}),e(),k]),g])}const B=t(c,[["render",f]]);export{x as __pageData,B as default}; diff --git a/assets/guide_font.md.BA3rgSN5.lean.js b/assets/guide_font.md.BA3rgSN5.lean.js new file mode 100644 index 00000000..b5c27674 --- /dev/null +++ b/assets/guide_font.md.BA3rgSN5.lean.js @@ -0,0 +1 @@ +import{_ as t,D as i,c as o,j as a,a as e,I as n,a6 as l,o as r}from"./chunks/framework.Bhh1y9_T.js";const d="/font1.png",p="/font2.png",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=a("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,[a("h1",h,[e("自定义字体 "),n(s,{type:"pro",text:"专业版"}),e(),k]),g])}const B=t(c,[["render",f]]);export{x as __pageData,B as default}; diff --git a/assets/guide_i18n.md.DNvdKeNF.js b/assets/guide_i18n.md.DNvdKeNF.js new file mode 100644 index 00000000..76310986 --- /dev/null +++ b/assets/guide_i18n.md.DNvdKeNF.js @@ -0,0 +1,58 @@ +import{_ as n,D as l,c as h,j as i,a as s,I as t,a6 as e,o as p}from"./chunks/framework.Bhh1y9_T.js";const k="/i18n-ally.png",B=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/i18n.md","filePath":"guide/i18n.md"}'),E={name:"guide/i18n.md"},d={id:"国际化",tabindex:"-1"},r=i("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化 "'},"​",-1),g=e('

    INFO

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

    vscode 扩展

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

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

    语言选择器

    在应用配置里设置后,会在顶栏里显示语言选择器。

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    enableI18n: true,
    +  },
    +}

    同时还可在应用配置里设置默认语言,可选设置的值参考 /src/locales/lang/ 目录下文件名,留空则会根据浏览器语言自动判断,如果找不到对应的语言则使用 中文(简体) 兜底。

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

    语言包

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

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

    ts
    import elementLocaleZhCN from 'element-plus/lib/locale/lang/zh-cn'
    +import elementLocaleZhTW from 'element-plus/lib/locale/lang/zh-tw'
    +import elementLocaleEn from 'element-plus/lib/locale/lang/en'
    +// 引用 Element Plus 的日文语言包
    +import elementLocaleJa from 'element-plus/lib/locale/lang/ja'
    +
    +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
    +}

    修改完成后,需要重新启动项目才会生效。

    导航设置

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

    ts
    title: 'menu.i18n',

    框架设置

    以中文(简体)为例,打开 /src/locales/lang/zh-cn.json 文件可以看到框架相关的配置,在 app 对象里的就是框架部分的语言信息,如果需要对框架进行二次开发,请在这里扩展。

    json
    {
    +  "app": {
    +    "account": "用户名",
    +    "captcha": "验证码",
    +    "check": "确认",
    +    "goLogin": "去登录",
    +    "login": "登录",
    +    "logout": "退出登录",
    +    "newPassword": "新密码",
    +    "password": "密码",
    +    "profile": "个人设置",
    +    "sendCaptcha": "发送验证码"
    +  }
    +}

    单页组件

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

    与服务端交互

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

    关闭国际化

    如果不想开启国际化,可参考以下设置,该设置表示关闭语言选择器,并以中文(简体)显示。

    ts
    const globalSettings: Settings.all = {
    +  app: {
    +    defaultLang: 'zh-cn',
    +  },
    +  toolbar: {
    +    enableI18n: false,
    +  },
    +}
    `,28);function o(c,y,F,u,C,b){const a=l("Badge");return p(),h("div",null,[i("h1",d,[s("国际化 "),t(a,{type:"pro",text:"专业版"}),s(),r]),g])}const q=n(E,[["render",o]]);export{B as __pageData,q as default}; diff --git a/assets/guide_i18n.md.DNvdKeNF.lean.js b/assets/guide_i18n.md.DNvdKeNF.lean.js new file mode 100644 index 00000000..ee570928 --- /dev/null +++ b/assets/guide_i18n.md.DNvdKeNF.lean.js @@ -0,0 +1 @@ +import{_ as n,D as l,c as h,j as i,a as s,I as t,a6 as e,o as p}from"./chunks/framework.Bhh1y9_T.js";const k="/i18n-ally.png",B=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/i18n.md","filePath":"guide/i18n.md"}'),E={name:"guide/i18n.md"},d={id:"国际化",tabindex:"-1"},r=i("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化 "'},"​",-1),g=e("",28);function o(c,y,F,u,C,b){const a=l("Badge");return p(),h("div",null,[i("h1",d,[s("国际化 "),t(a,{type:"pro",text:"专业版"}),s(),r]),g])}const q=n(E,[["render",o]]);export{B as __pageData,q as default}; diff --git a/assets/guide_intro.md.sO_pu713.js b/assets/guide_intro.md.sO_pu713.js new file mode 100644 index 00000000..61bc0dab --- /dev/null +++ b/assets/guide_intro.md.sO_pu713.js @@ -0,0 +1 @@ +import{_ as s,D as r,c as o,j as t,a as e,I as i,a6 as n,o as c}from"./chunks/framework.Bhh1y9_T.js";const T=JSON.parse('{"title":"文档说明","description":"","frontmatter":{},"headers":[],"relativePath":"guide/intro.md","filePath":"guide/intro.md"}'),d={name:"guide/intro.md"},p=n('

    文档说明

    ⭐⭐⭐⭐⭐

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

    star

    star

    ',2),l=t("p",null,[e("如果你准备好了,那我们就"),t("a",{href:"/guide/ready.html"},"开始"),e("吧~")],-1);function _(m,h,g,u,b,f){const a=r("Badge");return c(),o("div",null,[p,t("p",null,[e("文档中标记 "),i(a,{type:"pro",text:"专业版"}),e(" 的地方,表示该功能仅提供于专业版使用,使用基础版的开发者可直接跳过阅读。")]),l])}const v=s(d,[["render",_]]);export{T as __pageData,v as default}; diff --git a/assets/guide_intro.md.sO_pu713.lean.js b/assets/guide_intro.md.sO_pu713.lean.js new file mode 100644 index 00000000..b9980243 --- /dev/null +++ b/assets/guide_intro.md.sO_pu713.lean.js @@ -0,0 +1 @@ +import{_ as s,D as r,c as o,j as t,a as e,I as i,a6 as n,o as c}from"./chunks/framework.Bhh1y9_T.js";const T=JSON.parse('{"title":"文档说明","description":"","frontmatter":{},"headers":[],"relativePath":"guide/intro.md","filePath":"guide/intro.md"}'),d={name:"guide/intro.md"},p=n("",2),l=t("p",null,[e("如果你准备好了,那我们就"),t("a",{href:"/guide/ready.html"},"开始"),e("吧~")],-1);function _(m,h,g,u,b,f){const a=r("Badge");return c(),o("div",null,[p,t("p",null,[e("文档中标记 "),i(a,{type:"pro",text:"专业版"}),e(" 的地方,表示该功能仅提供于专业版使用,使用基础版的开发者可直接跳过阅读。")]),l])}const v=s(d,[["render",_]]);export{T as __pageData,v as default}; diff --git a/assets/guide_layout.md.CtDYcY0J.js b/assets/guide_layout.md.CtDYcY0J.js new file mode 100644 index 00000000..40f6a130 --- /dev/null +++ b/assets/guide_layout.md.CtDYcY0J.js @@ -0,0 +1,29 @@ +import{_ as e,D as h,c as l,j as s,a as i,I as t,a6 as n,o as p}from"./chunks/framework.Bhh1y9_T.js";const k="/menu-mode-head.png",d="/menu-mode-side.png",g="/menu-mode-single.png",o="/menu-mode-only-side.png",r="/menu-mode-only-head.png",E="/menu-mode-side-panel.png",c="/menu-mode-head-panel.png",H=JSON.parse('{"title":"布局","description":"","frontmatter":{},"headers":[],"relativePath":"guide/layout.md","filePath":"guide/layout.md"}'),y={name:"guide/layout.md"},_=s("h1",{id:"布局",tabindex:"-1"},[i("布局 "),s("a",{class:"header-anchor",href:"#布局","aria-label":'Permalink to "布局"'},"​")],-1),m=s("p",null,[i("通过 7 种导航栏模式和 4 种页宽模式的组合搭配,可实现 28 种布局结构,再搭配默认提供的 6 款主题,"),s("strong",null,"即可实现上百种界面风格"),i("。")],-1),u=s("h2",{id:"导航栏模式",tabindex:"-1"},[i("导航栏模式 "),s("a",{class:"header-anchor",href:"#导航栏模式","aria-label":'Permalink to "导航栏模式"'},"​")],-1),F=s("p",null,"在应用配置里进行设置,可实现 7 种导航栏模式:",-1),b=s("li",null,"顶部模式",-1),C=s("li",null,"侧边栏模式(含主导航)",-1),v=s("li",null,"侧边栏模式(无主导航)",-1),A=n('

    顶部模式

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'head', // v4.5.0 之前版本为 menuMode
    +  },
    +}

    侧边栏模式(含主导航)

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'side', // v4.5.0 之前版本为 menuMode
    +  },
    +}

    侧边栏模式(无主导航)

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'single', // v4.5.0 之前版本为 menuMode
    +  },
    +}
    `,9),x={id:"侧边栏精简模式",tabindex:"-1"},B=s("a",{class:"header-anchor",href:"#侧边栏精简模式","aria-label":'Permalink to "侧边栏精简模式 "'},"​",-1),D=n('

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'only-side', // v4.5.0 之前版本为 menuMode
    +  },
    +}
    `,2),S={id:"顶部精简模式",tabindex:"-1"},T=s("a",{class:"header-anchor",href:"#顶部精简模式","aria-label":'Permalink to "顶部精简模式 "'},"​",-1),P=n('

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'only-head', // v4.5.0 之前版本为 menuMode
    +  },
    +}
    `,2),f={id:"侧边栏面板模式",tabindex:"-1"},V=s("a",{class:"header-anchor",href:"#侧边栏面板模式","aria-label":'Permalink to "侧边栏面板模式 "'},"​",-1),I=n('

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'side-panel',
    +  },
    +}
    `,2),N={id:"顶部面板模式",tabindex:"-1"},q=s("a",{class:"header-anchor",href:"#顶部面板模式","aria-label":'Permalink to "顶部面板模式 "'},"​",-1),z=n('

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'head-panel',
    +  },
    +}

    变量

    布局相关的变量存放在 /src/assets/styles/globals.css 文件中(注意看注释),均为 CSS 变量。

    `,4);function M(R,$,j,J,O,w){const a=h("Badge");return p(),l("div",null,[_,m,u,F,s("ul",null,[b,C,v,s("li",null,[i("侧边栏精简模式 "),t(a,{type:"pro",text:"专业版"})]),s("li",null,[i("顶部精简模式 "),t(a,{type:"pro",text:"专业版"})]),s("li",null,[i("侧边栏面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"})]),s("li",null,[i("顶部面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"})])]),A,s("h3",x,[i("侧边栏精简模式 "),t(a,{type:"pro",text:"专业版"}),i(),B]),D,s("h3",S,[i("顶部精简模式 "),t(a,{type:"pro",text:"专业版"}),i(),T]),P,s("h3",f,[i("侧边栏面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"}),i(),V]),I,s("h3",N,[i("顶部面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"}),i(),q]),z])}const K=e(y,[["render",M]]);export{H as __pageData,K as default}; diff --git a/assets/guide_layout.md.CtDYcY0J.lean.js b/assets/guide_layout.md.CtDYcY0J.lean.js new file mode 100644 index 00000000..0f70df24 --- /dev/null +++ b/assets/guide_layout.md.CtDYcY0J.lean.js @@ -0,0 +1 @@ +import{_ as e,D as h,c as l,j as s,a as i,I as t,a6 as n,o as p}from"./chunks/framework.Bhh1y9_T.js";const k="/menu-mode-head.png",d="/menu-mode-side.png",g="/menu-mode-single.png",o="/menu-mode-only-side.png",r="/menu-mode-only-head.png",E="/menu-mode-side-panel.png",c="/menu-mode-head-panel.png",H=JSON.parse('{"title":"布局","description":"","frontmatter":{},"headers":[],"relativePath":"guide/layout.md","filePath":"guide/layout.md"}'),y={name:"guide/layout.md"},_=s("h1",{id:"布局",tabindex:"-1"},[i("布局 "),s("a",{class:"header-anchor",href:"#布局","aria-label":'Permalink to "布局"'},"​")],-1),m=s("p",null,[i("通过 7 种导航栏模式和 4 种页宽模式的组合搭配,可实现 28 种布局结构,再搭配默认提供的 6 款主题,"),s("strong",null,"即可实现上百种界面风格"),i("。")],-1),u=s("h2",{id:"导航栏模式",tabindex:"-1"},[i("导航栏模式 "),s("a",{class:"header-anchor",href:"#导航栏模式","aria-label":'Permalink to "导航栏模式"'},"​")],-1),F=s("p",null,"在应用配置里进行设置,可实现 7 种导航栏模式:",-1),b=s("li",null,"顶部模式",-1),C=s("li",null,"侧边栏模式(含主导航)",-1),v=s("li",null,"侧边栏模式(无主导航)",-1),A=n("",9),x={id:"侧边栏精简模式",tabindex:"-1"},B=s("a",{class:"header-anchor",href:"#侧边栏精简模式","aria-label":'Permalink to "侧边栏精简模式 "'},"​",-1),D=n("",2),S={id:"顶部精简模式",tabindex:"-1"},T=s("a",{class:"header-anchor",href:"#顶部精简模式","aria-label":'Permalink to "顶部精简模式 "'},"​",-1),P=n("",2),f={id:"侧边栏面板模式",tabindex:"-1"},V=s("a",{class:"header-anchor",href:"#侧边栏面板模式","aria-label":'Permalink to "侧边栏面板模式 "'},"​",-1),I=n("",2),N={id:"顶部面板模式",tabindex:"-1"},q=s("a",{class:"header-anchor",href:"#顶部面板模式","aria-label":'Permalink to "顶部面板模式 "'},"​",-1),z=n("",4);function M(R,$,j,J,O,w){const a=h("Badge");return p(),l("div",null,[_,m,u,F,s("ul",null,[b,C,v,s("li",null,[i("侧边栏精简模式 "),t(a,{type:"pro",text:"专业版"})]),s("li",null,[i("顶部精简模式 "),t(a,{type:"pro",text:"专业版"})]),s("li",null,[i("侧边栏面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"})]),s("li",null,[i("顶部面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"})])]),A,s("h3",x,[i("侧边栏精简模式 "),t(a,{type:"pro",text:"专业版"}),i(),B]),D,s("h3",S,[i("顶部精简模式 "),t(a,{type:"pro",text:"专业版"}),i(),T]),P,s("h3",f,[i("侧边栏面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"}),i(),V]),I,s("h3",N,[i("顶部面板模式 "),t(a,{type:"pro",text:"专业版"}),i(),t(a,{type:"tip",text:"v4.5.0 新增"}),i(),q]),z])}const K=e(y,[["render",M]]);export{H as __pageData,K as default}; diff --git a/assets/guide_login.md.BgAQ9xap.js b/assets/guide_login.md.BgAQ9xap.js new file mode 100644 index 00000000..5e188a1d --- /dev/null +++ b/assets/guide_login.md.BgAQ9xap.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as i,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const h=JSON.parse('{"title":"登录","description":"","frontmatter":{},"headers":[],"relativePath":"guide/login.md","filePath":"guide/login.md"}'),l={name:"guide/login.md"},a=t('

    登录

    开发者通常在简单熟悉本框架后,涉及到的第一步业务开发就是修改登录功能,将其替换为自己的登录接口。

    但在实践过程中,经常会遇到一些问题,比如:

    • 替换真实接口后,无法正常登录
    • 登录接口请求成功,但是无法跳转到后台主页
    • ...

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

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

    导航

    项目导航配置存放在 /src/menu/modules/ 目录下,每一个 ts 文件会被视为一个导航模块。

    所有配置的导航模块均需要在 /src/menu/index.ts 文件里进行引入并放到主导航下。

    基本配置

    一级导航

    一个导航模块包含以下结构:

    ts
    const menus: Menu.recordRaw = {
    +  title: '演示',
    +  windowName: 'Example',
    +}
    +
    +export default menus

    注意事项

    整个项目所有导航的 windowName 不能重复

    多级导航

    ts
    const menus: Menu.recordRaw = {
    +  title: '演示',
    +  children: [
    +    {
    +      title: '演示页面',
    +      windowName: 'Example',
    +    },
    +  ],
    +}
    +
    +export default menus

    外链

    只需要将 windowName 设置为需要跳转的 HTTP 地址即可。

    ts
    const menus: Menu.recordRaw = {
    +  title: '官网',
    +  windowName: 'https://one-step-admin.hurui.me',
    +}
    +
    +export default menus

    主导航

    主导航会将我们配置好的导航模块进行归类,在 /src/menu/index.ts 里进行设置。

    ts
    const menu = [
    +  {
    +    title: '演示',
    +    icon: 'sidebar-default',
    +    children: [
    +      WindowExample,
    +    ],
    +  },
    +]

    主导航只需设置 titleiconchildren 三个参数,其中 children 则是存放我们配置的导航模块数据。

    导航配置

    title

    类型是否必须默认值说明
    string✔️/导航展示的标题
    `,20),k=s("a",{href:"./i18n.html"},"国际化",-1),o=i('

    windowName

    类型是否必须默认值说明
    string✔️/窗口组件名,确保唯一
    ',2),c={id:"windowwidth",tabindex:"-1"},g=s("a",{class:"header-anchor",href:"#windowwidth","aria-label":'Permalink to "windowWidth "'},"​",-1),E=i('
    类型是否必须默认值说明
    string / number✖️/窗口宽度,设置为数字时单位为 px
    ',1),y={id:"i18n",tabindex:"-1"},x=s("s",null,"i18n",-1),b=s("a",{class:"header-anchor",href:"#i18n","aria-label":'Permalink to "~~i18n~~ "'},"​",-1),_=i('
    类型是否必须默认值说明
    string✖️/标题国际化对应的 key 值

    详细可阅读《国际化》。

    ',2),u={id:"notitle",tabindex:"-1"},m=s("a",{class:"header-anchor",href:"#notitle","aria-label":'Permalink to "noTitle "'},"​",-1),F=i('
    类型是否必须默认值说明
    boolean✖️false是否显示窗口标题栏

    icon

    类型是否必须默认值说明
    string✖️/导航中显示的图标

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

    auth

    类型是否必须默认值说明
    string / array✖️/该路由访问权限,支持多个权限叠加,只要满足一个,即可进入

    用户在登录时,会获取用户权限,根据权限去过滤并动态注册路由。所以没有权限的路由不会被注册,也不会在侧边栏导航里显示,详细可阅读《权限 - 路由权限》。

    ',7),f={id:"badge",tabindex:"-1"},C=s("a",{class:"header-anchor",href:"#badge","aria-label":'Permalink to "badge "'},"​",-1),v=i(`
    类型是否必须默认值说明
    boolean / number / string✖️/导航标记

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

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

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

    ts
    badge: () => globalStore.number

    params

    类型是否必须默认值说明
    object✖️/窗口外部传入参数

    该属性通常不在导航里直接配置,而是通过调用全局 useWindow() 提供的 API ,在打开非导航窗口时动态传入窗口所需要的参数。

    后端生成

    在应用配置里开启:

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    baseOn: 'backend'
    +  }
    +}

    开启后在 /src/api/modules/app.ts 文件里找到 menuList() 这个函数,并修改这个函数的请求地址,请求返回的数据就是导航数据,你可以在 /src/mock/app.ts 里查看 mock 数据。

    开启后端生成后,导航权限有两种做法,第一种是返回全部的导航数据,让框架自行处理(推荐),第二种是后端直接返回用户具备访问权限的导航数据。

    `,13);function T(A,w,B,P,D,q){const e=l("Badge");return d(),h("div",null,[r,a(e,{type:"tip",text:"v4.4.0"}),t(" 开始,"),a(e,{type:"pro",text:"专业版"}),t(" 支持设置 i18n 对应的 key 值,详细可阅读《"),k,t("》。"),o,s("h3",c,[t("windowWidth "),a(e,{type:"pro",text:"专业版"}),t(),a(e,{type:"tip",text:"v4.6.0 新增"}),t(),g]),E,s("h3",y,[x,t(),a(e,{type:"pro",text:"专业版"}),t(),a(e,{type:"warning",text:"v4.4.0 移除"}),t(),b]),_,s("h3",u,[t("noTitle "),a(e,{type:"pro",text:"专业版"}),t(),m]),F,s("h3",f,[t("badge "),a(e,{type:"pro",text:"专业版"}),t(),C]),v])}const V=n(p,[["render",T]]);export{N as __pageData,V as default}; diff --git a/assets/guide_menu.md.DjhhAq8f.lean.js b/assets/guide_menu.md.DjhhAq8f.lean.js new file mode 100644 index 00000000..0b80df9d --- /dev/null +++ b/assets/guide_menu.md.DjhhAq8f.lean.js @@ -0,0 +1 @@ +import{_ as n,D as l,c as h,I as a,a as t,j as s,a6 as i,o as d}from"./chunks/framework.Bhh1y9_T.js";const N=JSON.parse('{"title":"导航","description":"","frontmatter":{},"headers":[],"relativePath":"guide/menu.md","filePath":"guide/menu.md"}'),p={name:"guide/menu.md"},r=i("",20),k=s("a",{href:"./i18n.html"},"国际化",-1),o=i("",2),c={id:"windowwidth",tabindex:"-1"},g=s("a",{class:"header-anchor",href:"#windowwidth","aria-label":'Permalink to "windowWidth "'},"​",-1),E=i("",1),y={id:"i18n",tabindex:"-1"},x=s("s",null,"i18n",-1),b=s("a",{class:"header-anchor",href:"#i18n","aria-label":'Permalink to "~~i18n~~ "'},"​",-1),_=i("",2),u={id:"notitle",tabindex:"-1"},m=s("a",{class:"header-anchor",href:"#notitle","aria-label":'Permalink to "noTitle "'},"​",-1),F=i("",7),f={id:"badge",tabindex:"-1"},C=s("a",{class:"header-anchor",href:"#badge","aria-label":'Permalink to "badge "'},"​",-1),v=i("",13);function T(A,w,B,P,D,q){const e=l("Badge");return d(),h("div",null,[r,a(e,{type:"tip",text:"v4.4.0"}),t(" 开始,"),a(e,{type:"pro",text:"专业版"}),t(" 支持设置 i18n 对应的 key 值,详细可阅读《"),k,t("》。"),o,s("h3",c,[t("windowWidth "),a(e,{type:"pro",text:"专业版"}),t(),a(e,{type:"tip",text:"v4.6.0 新增"}),t(),g]),E,s("h3",y,[x,t(),a(e,{type:"pro",text:"专业版"}),t(),a(e,{type:"warning",text:"v4.4.0 移除"}),t(),b]),_,s("h3",u,[t("noTitle "),a(e,{type:"pro",text:"专业版"}),t(),m]),F,s("h3",f,[t("badge "),a(e,{type:"pro",text:"专业版"}),t(),C]),v])}const V=n(p,[["render",T]]);export{N as __pageData,V as default}; diff --git a/assets/guide_permission.md.Bi4TpiJ3.js b/assets/guide_permission.md.Bi4TpiJ3.js new file mode 100644 index 00000000..72afa10f --- /dev/null +++ b/assets/guide_permission.md.Bi4TpiJ3.js @@ -0,0 +1,44 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.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 用户名登录,则在导航栏里看不到“权限验证”导航入口。

    鉴权组件

    页面中某个模块,当前用户具备该权限是如何显示,不具备该权限又是如何显示,针对这样的需求,框架提供了 <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'])
    `,14),l=[h];function k(p,e,E,d,r,g){return a(),i("div",null,l)}const F=s(n,[["render",k]]);export{c as __pageData,F as default}; diff --git a/assets/guide_permission.md.Bi4TpiJ3.lean.js b/assets/guide_permission.md.Bi4TpiJ3.lean.js new file mode 100644 index 00000000..7d34f69b --- /dev/null +++ b/assets/guide_permission.md.Bi4TpiJ3.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"权限","description":"","frontmatter":{},"headers":[],"relativePath":"guide/permission.md","filePath":"guide/permission.md"}'),n={name:"guide/permission.md"},h=t("",14),l=[h];function k(p,e,E,d,r,g){return a(),i("div",null,l)}const F=s(n,[["render",k]]);export{c as __pageData,F as default}; diff --git a/assets/guide_plop-module.md.DvVVYnkY.js b/assets/guide_plop-module.md.DvVVYnkY.js new file mode 100644 index 00000000..b5a88cb0 --- /dev/null +++ b/assets/guide_plop-module.md.DvVVYnkY.js @@ -0,0 +1,56 @@ +import{_ as n,D as p,c as l,j as i,a as s,I as e,a6 as t,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/module1.gif",d="/module2.gif",v=JSON.parse('{"title":"标准模块","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plop-module.md","filePath":"guide/plop-module.md"}'),E={name:"guide/plop-module.md"},r={id:"标准模块",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#标准模块","aria-label":'Permalink to "标准模块 "'},"​",-1),c=t(`

    在《代码文件自动生成 - module》里介绍了如何快速生成一个标准模块,这个标准模块是一个最基础的 CURD 模块,它包含列表页和编辑页,同时提供了搜索和删除的功能,并且同时也可以生成对应的 mock 文件,在这基础上可以更方便的进行业务扩展。

    下面我就实际操作一遍,并介绍一下这个标准模块有哪些特性。

    用法说明

    ? 请选择需要创建的模式: module - 创建标准窗口
    +? 请输入窗口组件名称 test window
    +? 请输入模块中文名称 默认模块
    +? 是否生成 Mock Yes
    +√  ++ \\src\\views\\windows\\TestWindow\\index.vue
    +√  ++ \\src\\views\\windows\\TestWindow\\components\\DetailForm\\index.vue
    +√  ++ \\src\\views\\windows\\TestWindow\\components\\FormMode\\index.vue
    +√  ++ \\src\\mock\\test-window.js

    这里我已经通过命令在 /src/views/windows/ 目录下创建好了一个 TestWindow 文件夹,并且也生成了 mock 数据。接下来需要去配置下导航,这样我们才可以在导航栏里访问到。

    首先在 /src/menu/modules/ 目录下新建一个 test.window.ts 文件,并在里面复制以下代码:

    ts
    cosnt menus: Menu.recordRaw = {
    +    title: '测试模块',
    +    windowName: 'TestWindow'
    +}
    +
    +export default menus

    然后到 /src/router/routes.ts 文件里加上这个路由配置文件的引用。

    ts
    import TestWindow from './modules/test.window'
    +
    +const menu = [
    +  ...,
    +  {
    +    title: '页面',
    +    icon: 'ri-pages-line',
    +    children: [
    +      ...PagesExample,
    +      TestWindow,
    +    ],
    +  },
    +  ...
    +]

    这时候就可以通过导航栏访问到我们的窗口了,我们的一个演示模块也就初步创建好了。

    特性介绍

    功能部分的介绍主要还是要看代码,先从列表页 index.vue 开始。

    最先看到的是这句文件导入代码,因为几乎每个列表页都需要翻页功能,所以把翻页相关的东西都存放在 /src/utils/composables/pagination/index.ts 方便复用。

    ts
    import usePagination from '@/utils/composables/usePagination'
    +
    +const { pagination, getParams, onSizeChange, onCurrentChange, onSortChange } = usePagination()

    接着在 data 里存放的是标准模块提供的一些配置项和必要数据参数字段。

    ts
    const data = ref({
    +  loading: false,
    +  /**
    +   * 详情展示模式
    +   * dialog 对话框
    +   * drawer 抽屉
    +   */
    +  formMode: 'dialog',
    +  // 详情
    +  formModeProps: {
    +    visible: false,
    +    id: '',
    +  },
    +  // 搜索
    +  search: {
    +    account: '',
    +    name: '',
    +    mobile: '',
    +    sex: '',
    +  },
    +  searchMore: false,
    +  // 批量操作
    +  batch: {
    +    enable: true,
    +    selectionDataList: [],
    +  },
    +  // 列表数据
    +  dataList: [],
    +})

    标准模块提供了 2 种详情展示模式,默认是弹窗的方式,你可以修改 formMode: 'drawer' 开启抽屉模式,保存后效果如下:

    再往下就是需要你修改或编写业务代码的部分,这里就不继续展开了。

    详情页的代码就不多介绍了,相对比较简单,可自行阅读理解。其中表单部分单独封装成组件存放在 /src/views/windows/[模块文件夹]/components/DetailForm/index.vue 里了,同样你在 components/ 文件夹下还能看到另外一个 FormMode 的文件夹,这样的用意是让表单可以复用,可以通过弹窗或抽屉的形式打开详情页

    可能有人会有疑问,为什么不在生成文件的时候直接让我选择用哪种形式,这样生成出来就是哪种,而是在生成好的代码文件里再进行配置?

    这样设计的目的主要有三点:

    1. 合理使用。关于表单具体使用哪种展示模式比较好,我们的建议是,当表单与当前列表页关联性较强,内容少则使用弹窗,内容多则使用抽屉;而当表单与当前列表页关联性较弱,且内容多,可以使用新建窗口的形式,让新窗口进行承载。
    2. 方便后期维护。考虑到需求会变,可能一开始是一个很简单的表单,后期需求一点点增加,变成了一个庞大的表单,这时候就要从弹窗改成抽屉的形式,反之也可能是从抽屉改成弹窗的形式,处理起来都很麻烦。所以方便后期维护,这部分是有意而为之,做成了 2 种形式共存,通过配置可一键切换。
    3. 跨窗口的组件调用。第一点里有提到,如果既不想使用弹窗,也不想使用抽屉,你还可以使用新窗口的形式进行处理,这时候由于表单部分已抽象成组件,所以即便是在新窗口里,也可以直接调用该组件,从而无需编写重复代码。

    当然标准模块也只是框架提供的一个标准,你可以沿用,也可以根据自己的需求指定一套标准,毕竟最终目的都是提高开发效率,同时也确保多人协作开发的时候有个统一标准,不会出现每个人做出来的模块风格都不一样。

    ',26);function g(y,F,m,u,C,D){const a=p("Badge");return h(),l("div",null,[i("h1",r,[s("标准模块 "),e(a,{type:"pro",text:"专业版"}),s(),o]),c])}const A=n(E,[["render",g]]);export{v as __pageData,A as default}; diff --git a/assets/guide_plop-module.md.DvVVYnkY.lean.js b/assets/guide_plop-module.md.DvVVYnkY.lean.js new file mode 100644 index 00000000..6626f161 --- /dev/null +++ b/assets/guide_plop-module.md.DvVVYnkY.lean.js @@ -0,0 +1 @@ +import{_ as n,D as p,c as l,j as i,a as s,I as e,a6 as t,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/module1.gif",d="/module2.gif",v=JSON.parse('{"title":"标准模块","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plop-module.md","filePath":"guide/plop-module.md"}'),E={name:"guide/plop-module.md"},r={id:"标准模块",tabindex:"-1"},o=i("a",{class:"header-anchor",href:"#标准模块","aria-label":'Permalink to "标准模块 "'},"​",-1),c=t("",26);function g(y,F,m,u,C,D){const a=p("Badge");return h(),l("div",null,[i("h1",r,[s("标准模块 "),e(a,{type:"pro",text:"专业版"}),s(),o]),c])}const A=n(E,[["render",g]]);export{v as __pageData,A as default}; diff --git a/assets/guide_plop.md.B0BZJ5As.js b/assets/guide_plop.md.B0BZJ5As.js new file mode 100644 index 00000000..2ceb94ff --- /dev/null +++ b/assets/guide_plop.md.B0BZJ5As.js @@ -0,0 +1 @@ +import{_ as l,D as p,c as s,j as e,a as o,I as a,a6 as c,o as n}from"./chunks/framework.Bhh1y9_T.js";const d="/plop-page.gif",r="/plop-component.gif",i="/plop-store.gif",_="/plop-mock.gif",m="/plop-module.gif",$=JSON.parse('{"title":"代码文件自动生成","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plop.md","filePath":"guide/plop.md"}'),h={name:"guide/plop.md"},u=c('

    代码文件自动生成

    INFO

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

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

    框架默认提供了 5 种模式,通过 pnpm run new 指令可以自行选择。

    ',4),g=e("li",null,[e("code",null,"page"),o(" 页面文件")],-1),f=e("li",null,[e("code",null,"component"),o(" 组件文件")],-1),k=e("li",null,[e("code",null,"store"),o(" pinia 全局状态文件")],-1),b=e("li",null,[e("code",null,"mock"),o(" mock 文件")],-1),x=e("code",null,"module",-1),T=c('

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

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

    page

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

    component

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

    store

    store 模式则会在 /src/store/modules/ 目录下生成一个空模板

    mock

    mock 模式则会在 /src/mock/ 目录下生成一个标准 CURD 的 mock 数据

    ',14),P={id:"module",tabindex:"-1"},q=e("a",{class:"header-anchor",href:"#module","aria-label":'Permalink to "module "'},"​",-1),N=e("p",null,[e("img",{src:m,alt:"","data-zoomable":""})],-1),S=e("p",null,"module 模式是一个标准模块模板,会在指定目录下生成模块文件夹,并且包含列表页、编辑(详情)页,以及相关局部组件。",-1),V=e("p",null,[o("这块部分详细介绍请阅读《"),e("a",{href:"./plop-module.html"},"标准模块"),o("》。")],-1);function v(w,A,B,C,I,z){const t=p("Badge");return n(),s("div",null,[u,e("ul",null,[g,f,k,b,e("li",null,[x,o(" 页面模块文件 "),a(t,{type:"pro",text:"专业版"})])]),T,e("h2",P,[o("module "),a(t,{type:"pro",text:"专业版"}),o(),q]),N,S,V])}const j=l(h,[["render",v]]);export{$ as __pageData,j as default}; diff --git a/assets/guide_plop.md.B0BZJ5As.lean.js b/assets/guide_plop.md.B0BZJ5As.lean.js new file mode 100644 index 00000000..5875aba3 --- /dev/null +++ b/assets/guide_plop.md.B0BZJ5As.lean.js @@ -0,0 +1 @@ +import{_ as l,D as p,c as s,j as e,a as o,I as a,a6 as c,o as n}from"./chunks/framework.Bhh1y9_T.js";const d="/plop-page.gif",r="/plop-component.gif",i="/plop-store.gif",_="/plop-mock.gif",m="/plop-module.gif",$=JSON.parse('{"title":"代码文件自动生成","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plop.md","filePath":"guide/plop.md"}'),h={name:"guide/plop.md"},u=c("",4),g=e("li",null,[e("code",null,"page"),o(" 页面文件")],-1),f=e("li",null,[e("code",null,"component"),o(" 组件文件")],-1),k=e("li",null,[e("code",null,"store"),o(" pinia 全局状态文件")],-1),b=e("li",null,[e("code",null,"mock"),o(" mock 文件")],-1),x=e("code",null,"module",-1),T=c("",14),P={id:"module",tabindex:"-1"},q=e("a",{class:"header-anchor",href:"#module","aria-label":'Permalink to "module "'},"​",-1),N=e("p",null,[e("img",{src:m,alt:"","data-zoomable":""})],-1),S=e("p",null,"module 模式是一个标准模块模板,会在指定目录下生成模块文件夹,并且包含列表页、编辑(详情)页,以及相关局部组件。",-1),V=e("p",null,[o("这块部分详细介绍请阅读《"),e("a",{href:"./plop-module.html"},"标准模块"),o("》。")],-1);function v(w,A,B,C,I,z){const t=p("Badge");return n(),s("div",null,[u,e("ul",null,[g,f,k,b,e("li",null,[x,o(" 页面模块文件 "),a(t,{type:"pro",text:"专业版"})])]),T,e("h2",P,[o("module "),a(t,{type:"pro",text:"专业版"}),o(),q]),N,S,V])}const j=l(h,[["render",v]]);export{$ as __pageData,j as default}; diff --git a/assets/guide_preferences.md.DClypLUq.js b/assets/guide_preferences.md.DClypLUq.js new file mode 100644 index 00000000..1dee1f19 --- /dev/null +++ b/assets/guide_preferences.md.DClypLUq.js @@ -0,0 +1,16 @@ +import{_ as e,D as n,c as t,j as i,a as s,I as l,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/preferences.png",f=JSON.parse('{"title":"用户偏好设置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/preferences.md","filePath":"guide/preferences.md"}'),r={name:"guide/preferences.md"},d={id:"用户偏好设置",tabindex:"-1"},c=i("a",{class:"header-anchor",href:"#用户偏好设置","aria-label":'Permalink to "用户偏好设置 "'},"​",-1),o=p(`

    如果希望将框架的部分应用配置项暴露给用户,让用户可以自行设置,那么可以使用用户偏好设置功能。

    开启

    在应用配置中设置:

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

    定制偏好设置内容

    然后打开 /src/store/modules/user.ts 文件,你可以在文件里进一步定制用户偏好设置里的内容:

    ts
    // 框架已将可提供给用户配置的选项提取出来,请勿新增其他选项,不需要的选项可以在这里注释掉
    +const preferences = ref<Settings.all>({
    +  app: {
    +    colorScheme: settingsDefault.app.colorScheme,
    +    theme: settingsDefault.app.theme,
    +  },
    +  ...
    +})

    如果仔细对比,会发现这里的配置项并不是框架的完整应用配置,这是因为有部分配置项并不适合暴露给用户,比如 userPreferences.enable 这个配置项就是用来控制是否开启用户偏好设置的,如果开启了用户偏好设置,那么这个配置项就不应该再暴露给用户了,否则用户就可以关闭用户偏好设置了,这样就没有意义了。再比如 menu.baseOn 这个配置项是用来控制导航数据来源的,修改它会直接影响代码的调整,所以也是不能暴露给用户的。

    所以请勿新增这里的配置项,你需要做的就是将不需要暴露给用户的配置项注释掉即可。

    处理请求

    用户偏好设置默认存储在浏览器本地 localStorage 里,如果需要将数据存储到服务器,可以通过 userPreferences.storageTo 配置项来实现,具体配置如下:

    ts
    const globalSettings: Settings.all = {
    +  userPreferences: {
    +    storageTo: 'server',
    +  },
    +}

    然后到 /src/api/modules/user.ts 中找到 preferences()preferencesEdit() 这两个函数,并分别修改这两个函数的请求地址。

    建议

    为减轻后端处理,数据会直接以 JSON 字符串进行存储,建议后端可以在用户表增加相关字段,并将字段类型设为 lonetext

    `,15);function g(E,y,u,F,m,_){const a=n("Badge");return h(),t("div",null,[i("h1",d,[s("用户偏好设置 "),l(a,{type:"pro",text:"专业版"}),s(),c]),o])}const C=e(r,[["render",g]]);export{f as __pageData,C as default}; diff --git a/assets/guide_preferences.md.DClypLUq.lean.js b/assets/guide_preferences.md.DClypLUq.lean.js new file mode 100644 index 00000000..34c4c2a1 --- /dev/null +++ b/assets/guide_preferences.md.DClypLUq.lean.js @@ -0,0 +1 @@ +import{_ as e,D as n,c as t,j as i,a as s,I as l,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/preferences.png",f=JSON.parse('{"title":"用户偏好设置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/preferences.md","filePath":"guide/preferences.md"}'),r={name:"guide/preferences.md"},d={id:"用户偏好设置",tabindex:"-1"},c=i("a",{class:"header-anchor",href:"#用户偏好设置","aria-label":'Permalink to "用户偏好设置 "'},"​",-1),o=p("",15);function g(E,y,u,F,m,_){const a=n("Badge");return h(),t("div",null,[i("h1",d,[s("用户偏好设置 "),l(a,{type:"pro",text:"专业版"}),s(),c]),o])}const C=e(r,[["render",g]]);export{f as __pageData,C as default}; diff --git a/assets/guide_q-a.md.DjjcUkzh.js b/assets/guide_q-a.md.DjjcUkzh.js new file mode 100644 index 00000000..cbd29ea2 --- /dev/null +++ b/assets/guide_q-a.md.DjjcUkzh.js @@ -0,0 +1,25 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const n="/qa1.png",y=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/q-a.md","filePath":"guide/q-a.md"}'),h={name:"guide/q-a.md"},p=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 不同的历史模式》。

    构建报错,提示内存溢出

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

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

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

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

    直接修改构建产物的接口地址

    如果你需要将构建产物部署到多台服务器,并且根据不同服务器配置不同的接口地址。这时候如果采用新增环境配置文件的方式,会存在一个弊端,就是不同环境需要分别进行构建。下面的方法可以让你直接修改构建产物的接口地址。

    新增 /public/config.js 文件:

    js
    window.globalConfig = {
    +  API_BASEURL: '/',
    +}

    /index.html 中引入:

    html
    <body>
    +  ...
    +  <script src="/config.js"></script>
    +  <script type="module" src="/src/main.ts"></script>
    +</body>

    修改 /src/api/index.ts ,仅在生产环境时使用:

    ts
    const api = axios.create({
    +  baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL, 
    +  baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : (import.meta.env.DEV ? import.meta.env.VITE_APP_API_BASEURL : (window as any).globalConfig.API_BASEURL), 
    +  timeout: 1000 * 60,
    +  responseType: 'json',
    +})

    之后你就可以在构建产物目录下直接修改 config.js 文件内的接口地址了,此方法不仅适用于接口地址,可以自行扩展。

    不会 TypeScript 怎么办

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

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

    `,29),l=[p];function e(k,E,r,d,o,g){return a(),i("div",null,l)}const F=s(h,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_q-a.md.DjjcUkzh.lean.js b/assets/guide_q-a.md.DjjcUkzh.lean.js new file mode 100644 index 00000000..04758eb6 --- /dev/null +++ b/assets/guide_q-a.md.DjjcUkzh.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const n="/qa1.png",y=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/q-a.md","filePath":"guide/q-a.md"}'),h={name:"guide/q-a.md"},p=t("",29),l=[p];function e(k,E,r,d,o,g){return a(),i("div",null,l)}const F=s(h,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_ready.md.CJkkBV7W.js b/assets/guide_ready.md.CJkkBV7W.js new file mode 100644 index 00000000..b65c9d9e --- /dev/null +++ b/assets/guide_ready.md.CJkkBV7W.js @@ -0,0 +1,7 @@ +import{_ as e,c as a,o as t,a6 as i}from"./chunks/framework.Bhh1y9_T.js";const s="/download.png",r="/vscode.png",b=JSON.parse('{"title":"准备工作","description":"","frontmatter":{},"headers":[],"relativePath":"guide/ready.md","filePath":"guide/ready.md"}'),l={name:"guide/ready.md"},n=i('

    准备工作

    源码

    阅读开发文档前,请确保手上已经有 One-step-admin 源码,因为文档中提及的内容,都是需要在本地项目中编写或修改代码并运行才能呈现的。如果还没有源码,可以通过下面两种方式获取:

    基础版

    说明

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

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

    或者也可以从 Github/Gitee 上拉取源码,但需要注意的是,这种方式拉取的是最新的代码,而不是稳定版本,可能会存在一些问题,所以请谨慎使用。

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

    专业版

    专业版用户会邀请加入到私有组织,获取源码的方式和基础版一致,只是仓库地址不同。

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

    开发环境

    使用本模板前,需要在本地依次安装好 Node.js, pnpm, GitVisual Studio Code

    注意

    Node.js 需要使用 18+ / 20+ 版本。

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

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

    建议

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

    除此之外,还需要准备好开发使用的浏览器,推荐使用 Chrome ,并且在 Chrome 里安装好 Vue.js devtools 扩展,安装 Vue 官方提供的调试工具在一定程度上可以提升解决 bug 的效率,当然这个扩展开启后,可能在开发环境操作会有些许卡顿,建议不需要时候可以将扩展禁用。

    不过由于安装 Vue.js devtools 需要访问 Chrome 应用商店,如果在大陆地区访问,需要自行准备相关可访问外网的工具。如果不具备该条件,也可访问 Vue.js devtools 官网 了解本地构建或者下载支持 Edge/Firefox 的 Vue.js devtools 。

    技术栈

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

    ',25),o=[n];function h(p,d,c,g,m,k){return t(),a("div",null,o)}const f=e(l,[["render",h]]);export{b as __pageData,f as default}; diff --git a/assets/guide_ready.md.CJkkBV7W.lean.js b/assets/guide_ready.md.CJkkBV7W.lean.js new file mode 100644 index 00000000..6f0f1af5 --- /dev/null +++ b/assets/guide_ready.md.CJkkBV7W.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a6 as i}from"./chunks/framework.Bhh1y9_T.js";const s="/download.png",r="/vscode.png",b=JSON.parse('{"title":"准备工作","description":"","frontmatter":{},"headers":[],"relativePath":"guide/ready.md","filePath":"guide/ready.md"}'),l={name:"guide/ready.md"},n=i("",25),o=[n];function h(p,d,c,g,m,k){return t(),a("div",null,o)}const f=e(l,[["render",h]]);export{b as __pageData,f as default}; diff --git a/assets/guide_replace-to-antd.md.BaHAuChd.js b/assets/guide_replace-to-antd.md.BaHAuChd.js new file mode 100644 index 00000000..e084bf1f --- /dev/null +++ b/assets/guide_replace-to-antd.md.BaHAuChd.js @@ -0,0 +1,93 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const t="/ui-antd.png",y=JSON.parse('{"title":"替换为 Ant Design Vue","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-antd.md","filePath":"guide/replace-to-antd.md"}'),l={name:"guide/replace-to-antd.md"},p=n(`

    替换为 Ant Design Vue

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Ant Design Vue
    +pnpm add ant-design-vue@4.x

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import Antd from 'ant-design-vue'
    +import 'ant-design-vue/dist/reset.css'
    +
    +function install(app: App) {
    +  app.use(Antd)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import antDesignVueLocaleZhCN from 'ant-design-vue/es/locale/zh_CN'
    +import { theme } from 'ant-design-vue'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="antDesignVueLocaleZhCN" :theme="settingsStore.currentColorScheme === 'dark' ? { algorithm: [theme.darkAlgorithm] } : {}">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import Antd from 'ant-design-vue'
    +import 'ant-design-vue/dist/reset.css'
    +
    +import zhCN from 'ant-design-vue/es/locale/zh_CN'
    +import zhTW from 'ant-design-vue/es/locale/zh_TW'
    +import en from 'ant-design-vue/es/locale/en_US'
    +
    +function install(app: App) {
    +  app.use(Antd)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhTW,
    +  'en': en,
    +}
    +
    +export default { install }
    +export { locales }

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

    vue
    <script setup lang="ts">
    +import { theme } from 'ant-design-vue'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="locales[settingsStore.lang]" :theme="settingsStore.currentColorScheme === 'dark' ? { algorithm: [theme.darkAlgorithm] } : {}">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    ',18),h=[p];function e(k,r,d,E,g,o){return a(),i("div",null,h)}const F=s(l,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_replace-to-antd.md.BaHAuChd.lean.js b/assets/guide_replace-to-antd.md.BaHAuChd.lean.js new file mode 100644 index 00000000..4c6334db --- /dev/null +++ b/assets/guide_replace-to-antd.md.BaHAuChd.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const t="/ui-antd.png",y=JSON.parse('{"title":"替换为 Ant Design Vue","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-antd.md","filePath":"guide/replace-to-antd.md"}'),l={name:"guide/replace-to-antd.md"},p=n("",18),h=[p];function e(k,r,d,E,g,o){return a(),i("div",null,h)}const F=s(l,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_replace-to-arco.md.DNOX62fS.js b/assets/guide_replace-to-arco.md.DNOX62fS.js new file mode 100644 index 00000000..686b1892 --- /dev/null +++ b/assets/guide_replace-to-arco.md.DNOX62fS.js @@ -0,0 +1,142 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-arco.png",o=JSON.parse('{"title":"替换为 Arco Design Vue","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-arco.md","filePath":"guide/replace-to-arco.md"}'),p={name:"guide/replace-to-arco.md"},h=n(`

    替换为 Arco Design Vue

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Arco Design Vue
    +pnpm add @arco-design/web-vue -D

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global", 
    +      ...
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import ArcoVue from '@arco-design/web-vue'
    +import '@arco-design/web-vue/dist/arco.css'
    +
    +function install(app: App) {
    +  app.use(ArcoVue)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import zhCN from '@arco-design/web-vue/es/locale/lang/zh-cn'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.body.removeAttribute('arco-theme')
    +      break
    +    case 'dark':
    +      document.body.setAttribute('arco-theme', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="zhCN">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import ArcoVue from '@arco-design/web-vue'
    +import '@arco-design/web-vue/dist/arco.css'
    +
    +import zhCN from '@arco-design/web-vue/es/locale/lang/zh-CN'
    +import zhTW from '@arco-design/web-vue/es/locale/lang/zh-TW'
    +import en from '@arco-design/web-vue/es/locale/lang/en-US'
    +
    +function install(app: App) {
    +  app.use(ArcoVue)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhTW,
    +  'en': en,
    +}
    +
    +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()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.body.removeAttribute('arco-theme')
    +      break
    +    case 'dark':
    +      document.body.setAttribute('arco-theme', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="locales[settingsStore.lang]">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    ',18),t=[h];function k(e,E,r,d,g,c){return a(),i("div",null,t)}const F=s(p,[["render",k]]);export{o as __pageData,F as default}; diff --git a/assets/guide_replace-to-arco.md.DNOX62fS.lean.js b/assets/guide_replace-to-arco.md.DNOX62fS.lean.js new file mode 100644 index 00000000..8c8afe25 --- /dev/null +++ b/assets/guide_replace-to-arco.md.DNOX62fS.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-arco.png",o=JSON.parse('{"title":"替换为 Arco Design Vue","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-arco.md","filePath":"guide/replace-to-arco.md"}'),p={name:"guide/replace-to-arco.md"},h=n("",18),t=[h];function k(e,E,r,d,g,c){return a(),i("div",null,t)}const F=s(p,[["render",k]]);export{o as __pageData,F as default}; diff --git a/assets/guide_replace-to-idux.md.h73pcns6.js b/assets/guide_replace-to-idux.md.h73pcns6.js new file mode 100644 index 00000000..48947dfa --- /dev/null +++ b/assets/guide_replace-to-idux.md.h73pcns6.js @@ -0,0 +1,102 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-idux.png",y=JSON.parse('{"title":"替换为 iDux","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-idux.md","filePath":"guide/replace-to-idux.md"}'),p={name:"guide/replace-to-idux.md"},t=n(`

    替换为 iDux

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 iDux
    +pnpm add @idux/cdk @idux/components

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import IduxCdk from '@idux/cdk'
    +import IduxComponents from '@idux/components'
    +import { IDUX_ICON_DEPENDENCIES, addIconDefinitions } from '@idux/components/icon'
    +import { createGlobalConfig } from '@idux/components/config'
    +import { zhCN } from '@idux/components/locales'
    +import '@idux/components/index.full.css'
    +
    +function install(app: App) {
    +  addIconDefinitions(IDUX_ICON_DEPENDENCIES)
    +  app.use(IduxCdk).use(IduxComponents).use(createGlobalConfig({ locale: zhCN }))
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <IxThemeProvider :preset-theme="settingsStore.currentColorScheme === 'dark' ? 'dark' : 'default'">
    +    <IxMessageProvider>
    +      <slot />
    +    </IxMessageProvider>
    +  </IxThemeProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import IduxCdk from '@idux/cdk'
    +import IduxComponents from '@idux/components'
    +import { IDUX_ICON_DEPENDENCIES, addIconDefinitions } from '@idux/components/icon'
    +import { enUS, zhCN } from '@idux/components/locales'
    +import '@idux/components/index.full.css'
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhCN,
    +  'en': enUS,
    +}
    +
    +function install(app: App) {
    +  addIconDefinitions(IDUX_ICON_DEPENDENCIES)
    +  app.use(IduxCdk).use(IduxComponents)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { useGlobalConfig } from '@idux/components/config'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const [, setLocale] = useGlobalConfig('locale', locales[settingsStore.lang])
    +watch(() => settingsStore.lang, val => setLocale(locales[settingsStore.lang]))
    +</script>
    +
    +<template>
    +  <IxThemeProvider :preset-theme="settingsStore.currentColorScheme === 'dark' ? 'dark' : 'default'">
    +    <IxMessageProvider>
    +      <slot />
    +    </IxMessageProvider>
    +  </IxThemeProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    ',18),h=[t];function k(e,d,E,r,g,o){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{y as __pageData,F as default}; diff --git a/assets/guide_replace-to-idux.md.h73pcns6.lean.js b/assets/guide_replace-to-idux.md.h73pcns6.lean.js new file mode 100644 index 00000000..41b17cfa --- /dev/null +++ b/assets/guide_replace-to-idux.md.h73pcns6.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-idux.png",y=JSON.parse('{"title":"替换为 iDux","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-idux.md","filePath":"guide/replace-to-idux.md"}'),p={name:"guide/replace-to-idux.md"},t=n("",18),h=[t];function k(e,d,E,r,g,o){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{y as __pageData,F as default}; diff --git a/assets/guide_replace-to-naive.md.BFtvI_Qz.js b/assets/guide_replace-to-naive.md.BFtvI_Qz.js new file mode 100644 index 00000000..c02008c7 --- /dev/null +++ b/assets/guide_replace-to-naive.md.BFtvI_Qz.js @@ -0,0 +1,93 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-naive.png",c=JSON.parse('{"title":"替换为 Naive UI","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-naive.md","filePath":"guide/replace-to-naive.md"}'),t={name:"guide/replace-to-naive.md"},h=n(`

    替换为 Naive UI

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Naive UI
    +pnpm add naive-ui -D

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +      "naive-ui/volar"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import naive from 'naive-ui'
    +
    +function install(app: App) {
    +  app.use(naive)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { darkTheme, dateZhCN, zhCN } from 'naive-ui'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <NConfigProvider :locale="zhCN" :date-locale="dateZhCN" :theme="settingsStore.currentColorScheme === 'dark' ? darkTheme : undefined" style="height: 100%;">
    +    <NMessageProvider>
    +      <slot />
    +      <NGlobalStyle />
    +    </NMessageProvider>
    +  </NConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +      "naive-ui/volar"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import naive, { dateEnUS, dateZhCN, dateZhTW, enUS, zhCN, zhTW } from 'naive-ui'
    +
    +function install(app: App) {
    +  app.use(naive)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': {
    +    ui: zhCN,
    +    date: dateZhCN,
    +  },
    +  'zh-tw': {
    +    ui: zhTW,
    +    date: dateZhTW,
    +  },
    +  'en': {
    +    ui: enUS,
    +    date: dateEnUS,
    +  },
    +}
    +
    +export default { install }
    +export { locales }

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

    vue
    <script setup lang="ts">
    +import { darkTheme } from 'naive-ui'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <NConfigProvider :locale="locales[settingsStore.lang].ui" :date-locale="locales[settingsStore.lang].date" :theme="settingsStore.currentColorScheme === 'dark' ? darkTheme : undefined" style="height: 100%;">
    +    <NMessageProvider>
    +      <slot />
    +      <NGlobalStyle />
    +    </NMessageProvider>
    +  </NConfigProvider>
    +</template>

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    ',18),p=[h];function k(e,E,r,d,g,y){return a(),i("div",null,p)}const F=s(t,[["render",k]]);export{c as __pageData,F as default}; diff --git a/assets/guide_replace-to-naive.md.BFtvI_Qz.lean.js b/assets/guide_replace-to-naive.md.BFtvI_Qz.lean.js new file mode 100644 index 00000000..bbf57be2 --- /dev/null +++ b/assets/guide_replace-to-naive.md.BFtvI_Qz.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-naive.png",c=JSON.parse('{"title":"替换为 Naive UI","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-naive.md","filePath":"guide/replace-to-naive.md"}'),t={name:"guide/replace-to-naive.md"},h=n("",18),p=[h];function k(e,E,r,d,g,y){return a(),i("div",null,p)}const F=s(t,[["render",k]]);export{c as __pageData,F as default}; diff --git a/assets/guide_replace-to-tdesign.md.B7ZFdjJZ.js b/assets/guide_replace-to-tdesign.md.B7ZFdjJZ.js new file mode 100644 index 00000000..f8e8936f --- /dev/null +++ b/assets/guide_replace-to-tdesign.md.B7ZFdjJZ.js @@ -0,0 +1,161 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-tdesign.png",o=JSON.parse('{"title":"替换为 TDesign","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-tdesign.md","filePath":"guide/replace-to-tdesign.md"}'),p={name:"guide/replace-to-tdesign.md"},t=n(`

    替换为 TDesign

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 TDesign
    +pnpm add tdesign-vue-next

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  },
    +  ...
    +  "include": [
    +    "src/**/*.ts",
    +    "src/**/*.d.ts",
    +    "src/**/*.tsx",
    +    "src/**/*.vue"
    +    "src/**/*.vue", 
    +    "node_modules/tdesign-vue-next/global.d.ts"
    +  ]
    +}

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

    ts
    import type { App } from 'vue'
    +import TDesign from 'tdesign-vue-next'
    +import 'tdesign-vue-next/es/style/index.css'
    +
    +function install(app: App) {
    +  app.use(TDesign)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { merge } from 'lodash-es'
    +import zhCN from 'tdesign-vue-next/es/locale/zh_CN'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.documentElement.removeAttribute('theme-mode')
    +      break
    +    case 'dark':
    +      document.documentElement.setAttribute('theme-mode', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <TConfigProvider :global-config="merge(zhCN)">
    +    <slot />
    +  </TConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  },
    +  ...
    +  "include": [
    +    "src/**/*.ts",
    +    "src/**/*.d.ts",
    +    "src/**/*.tsx",
    +    "src/**/*.vue"
    +    "src/**/*.vue", 
    +    "node_modules/tdesign-vue-next/global.d.ts"
    +  ]
    +}

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

    ts
    import type { App } from 'vue'
    +import TDesign from 'tdesign-vue-next'
    +import 'tdesign-vue-next/es/style/index.css'
    +
    +import zhCN from 'tdesign-vue-next/es/locale/zh_CN'
    +import zhTW from 'tdesign-vue-next/es/locale/zh_TW'
    +import en from 'tdesign-vue-next/es/locale/en_US'
    +
    +function install(app: App) {
    +  app.use(TDesign)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhTW,
    +  'en': en,
    +}
    +
    +export default { install }
    +export { locales }

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

    vue
    <script setup lang="ts">
    +import { merge } from 'lodash-es'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.documentElement.removeAttribute('theme-mode')
    +      break
    +    case 'dark':
    +      document.documentElement.setAttribute('theme-mode', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <TConfigProvider :global-config="merge(locales[settingsStore.lang])">
    +    <slot />
    +  </TConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    ',18),h=[t];function k(e,E,r,d,g,y){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{o as __pageData,F as default}; diff --git a/assets/guide_replace-to-tdesign.md.B7ZFdjJZ.lean.js b/assets/guide_replace-to-tdesign.md.B7ZFdjJZ.lean.js new file mode 100644 index 00000000..dba72e87 --- /dev/null +++ b/assets/guide_replace-to-tdesign.md.B7ZFdjJZ.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-tdesign.png",o=JSON.parse('{"title":"替换为 TDesign","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-tdesign.md","filePath":"guide/replace-to-tdesign.md"}'),p={name:"guide/replace-to-tdesign.md"},t=n("",18),h=[t];function k(e,E,r,d,g,y){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{o as __pageData,F as default}; diff --git a/assets/guide_replace-to-vexip.md.fMhR5uan.js b/assets/guide_replace-to-vexip.md.fMhR5uan.js new file mode 100644 index 00000000..1fb2f5e8 --- /dev/null +++ b/assets/guide_replace-to-vexip.md.fMhR5uan.js @@ -0,0 +1,90 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-vexip.png",y=JSON.parse('{"title":"替换为 Vexip UI","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-vexip.md","filePath":"guide/replace-to-vexip.md"}'),p={name:"guide/replace-to-vexip.md"},t=n(`

    替换为 Vexip UI

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Vexip UI
    +pnpm add vexip-ui

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import { install as vexipInstall } from 'vexip-ui'
    +import 'vexip-ui/css/index.css'
    +import 'vexip-ui/css/dark/index.css'
    +
    +function install(app: App) {
    +  app.use(vexipInstall, {
    +    prefix: 'vxp',
    +  })
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { zhCNLocale } from 'vexip-ui'
    +</script>
    +
    +<template>
    +  <VxpConfigProvider :locale="zhCNLocale()">
    +    <slot />
    +  </VxpConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import { install as vexipInstall, zhCNLocale, zhTWLocale, enUSLocale } from 'vexip-ui'
    +import 'vexip-ui/css/index.css'
    +import 'vexip-ui/css/dark/index.css'
    +
    +function install(app: App) {
    +  app.use(vexipInstall, {
    +    prefix: 'vxp',
    +  })
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCNLocale(),
    +  'zh-tw': zhTWLocale(),
    +  'en': enUSLocale(),
    +}
    +
    +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()
    +</script>
    +
    +<template>
    +  <VxpConfigProvider :locale="locales[settingsStore.lang]">
    +    <slot />
    +  </VxpConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    ',18),h=[t];function e(k,E,r,d,g,c){return a(),i("div",null,h)}const F=s(p,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_replace-to-vexip.md.fMhR5uan.lean.js b/assets/guide_replace-to-vexip.md.fMhR5uan.lean.js new file mode 100644 index 00000000..d48c4192 --- /dev/null +++ b/assets/guide_replace-to-vexip.md.fMhR5uan.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const l="/ui-vexip.png",y=JSON.parse('{"title":"替换为 Vexip UI","description":"","frontmatter":{},"headers":[],"relativePath":"guide/replace-to-vexip.md","filePath":"guide/replace-to-vexip.md"}'),p={name:"guide/replace-to-vexip.md"},t=n("",18),h=[t];function e(k,E,r,d,g,c){return a(),i("div",null,h)}const F=s(p,[["render",e]]);export{y as __pageData,F as default}; diff --git a/assets/guide_resources.md.lnq0yWPQ.js b/assets/guide_resources.md.lnq0yWPQ.js new file mode 100644 index 00000000..c03ba909 --- /dev/null +++ b/assets/guide_resources.md.lnq0yWPQ.js @@ -0,0 +1,41 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const g=JSON.parse('{"title":"资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/resources.md","filePath":"guide/resources.md"}'),h={name:"guide/resources.md"},t=n(`

    资源

    图片

    全局公共

    全局公共图片存放在 /src/assets/images/ 目录下,可自行新建文件夹分类管理。

    局部私有

    局部私有图片建议采用就近原则,你可以在需要的模块文件夹下建立一个 images 文件夹,专门用于存放局部私有图片。

    样式

    全局公共

    全局公共样式存放在 /src/assets/styles/ 目录下,可自行新建文件,并在 /src/main.ts 中引入即可。

    此目录下还有一个特殊目录,即 /src/assets/styles/resources/ ,这是全局 SCSS 资源目录,你可以在该目录下编写变量、函数、混合等支持 SCSS 特性的代码。

    局部私有

    基于单文件组件规范,局部私有样式建议直接在 .vue 文件中编写,框架集成了 UnoCSS / PostCSS / SCSS 方案,可选择自己适合的方案。更多单文件组件 CSS 功能请参考这里

    UnoCSS

    vue
    <template>
    +  <div class="flex flex-1 flex-col select-none text-center all:transition-400">
    +    <div class="ma">
    +      <div class="animate-bounce-alt animate-duration-1s animate-count-infinite text-5xl fw100">
    +        UnoCSS
    +      </div>
    +    </div>
    +  </div>
    +</template>

    PostCSS

    框架内置了 postcss-nested 插件,可实现接近于 SCSS 的写法和特性。

    vue
    <style scoped>
    +.phone {
    +  &_title {
    +    width: 500px;
    +    @media (max-width: 500px) {
    +      width: auto;
    +    }
    +    body.is_dark & {
    +      color: white;
    +    }
    +  }
    +  img {
    +    display: block;
    +  }
    +}
    +</style>

    SCSS

    vue
    <style lang="scss" scoped>
    +$width: 500px;
    +
    +.phone {
    +  &_title {
    +    width: $width;
    +    @media (max-width: $width) {
    +      width: auto;
    +    }
    +    body.is_dark & {
    +      color: white;
    +    }
    +  }
    +  img {
    +    display: block;
    +  }
    +}
    +</style>

    组件

    全局公共

    说明

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

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

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

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

    局部私有

    局部私有组件建议采用就近原则,你可以在需要的模块文件夹下建立一个 components 文件夹,专门用于存放局部私有组件。

    `,27),l=[t];function p(e,k,E,r,d,o){return a(),i("div",null,l)}const y=s(h,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/guide_resources.md.lnq0yWPQ.lean.js b/assets/guide_resources.md.lnq0yWPQ.lean.js new file mode 100644 index 00000000..419cfd55 --- /dev/null +++ b/assets/guide_resources.md.lnq0yWPQ.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.Bhh1y9_T.js";const g=JSON.parse('{"title":"资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/resources.md","filePath":"guide/resources.md"}'),h={name:"guide/resources.md"},t=n("",27),l=[t];function p(e,k,E,r,d,o){return a(),i("div",null,l)}const y=s(h,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/guide_router.md.Ct6hq6g7.js b/assets/guide_router.md.Ct6hq6g7.js new file mode 100644 index 00000000..d90c1753 --- /dev/null +++ b/assets/guide_router.md.Ct6hq6g7.js @@ -0,0 +1,18 @@ +import{_ as n,D as e,c as t,j as s,a as i,I as h,a6 as l,o as p}from"./chunks/framework.Bhh1y9_T.js";const C=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/router.md","filePath":"guide/router.md"}'),k={name:"guide/router.md"},d=s("h1",{id:"路由",tabindex:"-1"},[i("路由 "),s("a",{class:"header-anchor",href:"#路由","aria-label":'Permalink to "路由"'},"​")],-1),r=s("p",null,[i("由于框架采用了全新的交互方式,使得路由在本框架中并非核心功能。通过打开 "),s("code",null,"/src/router/index.ts"),i(" 可以看到,框架一共定义了两个路由地址,一个是登录地址,另一个是登录成功后的地址。")],-1),E={id:"免登录页面",tabindex:"-1"},o=s("a",{class:"header-anchor",href:"#免登录页面","aria-label":'Permalink to "免登录页面 "'},"​",-1),g=l(`

    基于设置的路由规则,新增的任何路由,都必须登录后才能访问。如果希望增加免登录的页面,也就是脱离框架本身,相对独立的页面,你可以按照下面的方式处理。

    首先在 /src/router/index.tsroutes 配置免登录页面的路由,然后在 noLoginWhitelist 里增加一句路由完整地址。例如下面的例子,就增加了一个 /no/login/example 的免登录页面地址。

    ts
    // 固定路由
    +const routes = [
    +  ...,
    +  {
    +    path: '/no/login/example',
    +    name: 'noLoginExample',
    +    component: () => import('@/views/no-login-example.vue'),
    +    meta: {
    +      title: '免登录页面',
    +    },
    +  },
    +]
    +
    +// 免登录白名单
    +const noLoginWhitelist = [
    +  ...,
    +  '/no/login/example',
    +]
    `,3);function c(y,_,F,m,u,x){const a=e("Badge");return p(),t("div",null,[d,r,s("h2",E,[i("免登录页面 "),h(a,{type:"pro",text:"专业版"}),i(),o]),g])}const D=n(k,[["render",c]]);export{C as __pageData,D as default}; diff --git a/assets/guide_router.md.Ct6hq6g7.lean.js b/assets/guide_router.md.Ct6hq6g7.lean.js new file mode 100644 index 00000000..a0202795 --- /dev/null +++ b/assets/guide_router.md.Ct6hq6g7.lean.js @@ -0,0 +1 @@ +import{_ as n,D as e,c as t,j as s,a as i,I as h,a6 as l,o as p}from"./chunks/framework.Bhh1y9_T.js";const C=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/router.md","filePath":"guide/router.md"}'),k={name:"guide/router.md"},d=s("h1",{id:"路由",tabindex:"-1"},[i("路由 "),s("a",{class:"header-anchor",href:"#路由","aria-label":'Permalink to "路由"'},"​")],-1),r=s("p",null,[i("由于框架采用了全新的交互方式,使得路由在本框架中并非核心功能。通过打开 "),s("code",null,"/src/router/index.ts"),i(" 可以看到,框架一共定义了两个路由地址,一个是登录地址,另一个是登录成功后的地址。")],-1),E={id:"免登录页面",tabindex:"-1"},o=s("a",{class:"header-anchor",href:"#免登录页面","aria-label":'Permalink to "免登录页面 "'},"​",-1),g=l("",3);function c(y,_,F,m,u,x){const a=e("Badge");return p(),t("div",null,[d,r,s("h2",E,[i("免登录页面 "),h(a,{type:"pro",text:"专业版"}),i(),o]),g])}const D=n(k,[["render",c]]);export{C as __pageData,D as default}; diff --git a/assets/guide_rtl.md.Cb10KXRS.js b/assets/guide_rtl.md.Cb10KXRS.js new file mode 100644 index 00000000..eaf9e019 --- /dev/null +++ b/assets/guide_rtl.md.Cb10KXRS.js @@ -0,0 +1,5 @@ +import{_ as e,D as n,c as l,j as t,a as s,I as i,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const r="/rtl.png",x=JSON.parse('{"title":"RTL 模式","description":"","frontmatter":{},"headers":[],"relativePath":"guide/rtl.md","filePath":"guide/rtl.md"}'),d={name:"guide/rtl.md"},o={id:"rtl-模式",tabindex:"-1"},k=t("a",{class:"header-anchor",href:"#rtl-模式","aria-label":'Permalink to "RTL 模式 "'},"​",-1),c=p(`

    使用

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  app: {
    +    direction: 'rtl',
    +  },
    +}

    效果如下:

    ',5);function g(_,E,y,m,u,F){const a=n("Badge");return h(),l("div",null,[t("h1",o,[s("RTL 模式 "),i(a,{type:"pro",text:"专业版"}),s(),i(a,{type:"tip",text:"v4.3.0 新增"}),s(),k]),c])}const B=e(d,[["render",g]]);export{x as __pageData,B as default}; diff --git a/assets/guide_rtl.md.Cb10KXRS.lean.js b/assets/guide_rtl.md.Cb10KXRS.lean.js new file mode 100644 index 00000000..26123ac8 --- /dev/null +++ b/assets/guide_rtl.md.Cb10KXRS.lean.js @@ -0,0 +1 @@ +import{_ as e,D as n,c as l,j as t,a as s,I as i,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const r="/rtl.png",x=JSON.parse('{"title":"RTL 模式","description":"","frontmatter":{},"headers":[],"relativePath":"guide/rtl.md","filePath":"guide/rtl.md"}'),d={name:"guide/rtl.md"},o={id:"rtl-模式",tabindex:"-1"},k=t("a",{class:"header-anchor",href:"#rtl-模式","aria-label":'Permalink to "RTL 模式 "'},"​",-1),c=p("",5);function g(_,E,y,m,u,F){const a=n("Badge");return h(),l("div",null,[t("h1",o,[s("RTL 模式 "),i(a,{type:"pro",text:"专业版"}),s(),i(a,{type:"tip",text:"v4.3.0 新增"}),s(),k]),c])}const B=e(d,[["render",g]]);export{x as __pageData,B as default}; diff --git a/assets/guide_start.md.BIHeICwp.js b/assets/guide_start.md.BIHeICwp.js new file mode 100644 index 00000000..0699b9f4 --- /dev/null +++ b/assets/guide_start.md.BIHeICwp.js @@ -0,0 +1,6 @@ +import{_ as s,c as a,o as e,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const _=JSON.parse('{"title":"开始","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start.md","filePath":"guide/start.md"}'),n={name:"guide/start.md"},i=t(`

    开始

    做好准备工作后,请在项目根目录下依次执行以下命令:

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

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

    报错

    安装依赖时提示 404 ,或者安装结束后,运行时提示「 'vite' 不是内部或外部命令,也不是可运行的程序或批处理文件 」,都些都是依赖未安装成功导致的。可以尝试执行 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(n,[["render",o]]);export{_ as __pageData,g as default}; diff --git a/assets/guide_start.md.BIHeICwp.lean.js b/assets/guide_start.md.BIHeICwp.lean.js new file mode 100644 index 00000000..9573a62a --- /dev/null +++ b/assets/guide_start.md.BIHeICwp.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as e,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const _=JSON.parse('{"title":"开始","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start.md","filePath":"guide/start.md"}'),n={name:"guide/start.md"},i=t("",5),p=[i];function o(l,c,r,d,h,k){return e(),a("div",null,p)}const g=s(n,[["render",o]]);export{_ as __pageData,g as default}; diff --git a/assets/guide_storage.md.D8cMKo8C.js b/assets/guide_storage.md.D8cMKo8C.js new file mode 100644 index 00000000..49a0f83c --- /dev/null +++ b/assets/guide_storage.md.D8cMKo8C.js @@ -0,0 +1,17 @@ +import{_ as e,D as t,c as n,j as a,a as s,I as l,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const v=JSON.parse('{"title":"私有 Storage 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/storage.md","filePath":"guide/storage.md"}'),k={name:"guide/storage.md"},o={id:"私有-storage-数据",tabindex:"-1"},r=a("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: 'osa_',
    +  },
    +}

    然后在需要使用到 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 i=t("Badge");return h(),n("div",null,[a("h1",o,[s("私有 Storage 数据 "),l(i,{type:"pro",text:"专业版"}),s(),r]),g])}const C=e(k,[["render",d]]);export{v as __pageData,C as default}; diff --git a/assets/guide_storage.md.D8cMKo8C.lean.js b/assets/guide_storage.md.D8cMKo8C.lean.js new file mode 100644 index 00000000..541f46b8 --- /dev/null +++ b/assets/guide_storage.md.D8cMKo8C.lean.js @@ -0,0 +1 @@ +import{_ as e,D as t,c as n,j as a,a as s,I as l,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const v=JSON.parse('{"title":"私有 Storage 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/storage.md","filePath":"guide/storage.md"}'),k={name:"guide/storage.md"},o={id:"私有-storage-数据",tabindex:"-1"},r=a("a",{class:"header-anchor",href:"#私有-storage-数据","aria-label":'Permalink to "私有 Storage 数据 "'},"​",-1),g=p("",8);function d(E,c,y,F,_,m){const i=t("Badge");return h(),n("div",null,[a("h1",o,[s("私有 Storage 数据 "),l(i,{type:"pro",text:"专业版"}),s(),r]),g])}const C=e(k,[["render",d]]);export{v as __pageData,C as default}; diff --git a/assets/guide_store.md.DBQc3j1R.js b/assets/guide_store.md.DBQc3j1R.js new file mode 100644 index 00000000..e64f45b4 --- /dev/null +++ b/assets/guide_store.md.DBQc3j1R.js @@ -0,0 +1,16 @@ +import{_ as s,c as i,o as a,a6 as e}from"./chunks/framework.Bhh1y9_T.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.DBQc3j1R.lean.js b/assets/guide_store.md.DBQc3j1R.lean.js new file mode 100644 index 00000000..62b5d63e --- /dev/null +++ b/assets/guide_store.md.DBQc3j1R.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as e}from"./chunks/framework.Bhh1y9_T.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.Bx5n5Xsc.js b/assets/guide_svg-icon.md.Bx5n5Xsc.js new file mode 100644 index 00000000..6ba52e80 --- /dev/null +++ b/assets/guide_svg-icon.md.Bx5n5Xsc.js @@ -0,0 +1,12 @@ +import{_ as t,D as n,c as e,j as s,a as i,I as l,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/icones1.png",o="/icones2.png",I=JSON.parse('{"title":"图标","description":"","frontmatter":{},"headers":[],"relativePath":"guide/svg-icon.md","filePath":"guide/svg-icon.md"}'),c={name:"guide/svg-icon.md"},r=p(`

    图标

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

    自定义图标

    你可以去阿里巴巴矢量图标库,或者其它支持下载 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" />

    离线/内网环境使用

    说明

    优先推荐使用 Unocss 方案,它不受网络环境限制,且相对于 Iconify 原生方案,它的性能更好。

    如果你清楚自己需要使用 Iconify 原生方案,并且想要在离线/内网环境使用,需要做一些额外的配置。因为 Iconify 图标默认是提供在线的服务,即首次调用会触发一个外部网络请求去获取 svg 原始数据,并缓存在 localStorage 和 sessionStorage 中,这样下次再调用的时候,则直接从缓存中获取并展示。

    框架提供了一份解决方案,在命令行执行 pnpm run generate:icons ,按照指引选择你需要用到的图标集(此处选择的图标集也是图标选择器里展示的图标集),并选择使用方式为离线。这样再在框架中使用这些图标,就不会触发外部网络请求了,但如果使用选择之外的图标,依旧还是会触发外部网络请求。

    `,28),d={id:"图标选择器",tabindex:"-1"},g=s("a",{class:"header-anchor",href:"#图标选择器","aria-label":'Permalink to "图标选择器 "'},"​",-1),E=s("p",null,"图标选择器是一个特殊的组件,它需要展示多套图标集内的所有图标。",-1),y=s("p",null,[i("通过执行 "),s("code",null,"pnpm run generate:icons"),i(" 命令,并按照指引完成操作后,图标选择器就会自动生效了。")],-1);function u(v,b,m,F,f,_){const a=n("Badge");return h(),e("div",null,[r,s("h2",d,[i("图标选择器 "),l(a,{type:"pro",text:"专业版"}),i(),g]),E,y])}const q=t(c,[["render",u]]);export{I as __pageData,q as default}; diff --git a/assets/guide_svg-icon.md.Bx5n5Xsc.lean.js b/assets/guide_svg-icon.md.Bx5n5Xsc.lean.js new file mode 100644 index 00000000..f451d9ed --- /dev/null +++ b/assets/guide_svg-icon.md.Bx5n5Xsc.lean.js @@ -0,0 +1 @@ +import{_ as t,D as n,c as e,j as s,a as i,I as l,a6 as p,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/icones1.png",o="/icones2.png",I=JSON.parse('{"title":"图标","description":"","frontmatter":{},"headers":[],"relativePath":"guide/svg-icon.md","filePath":"guide/svg-icon.md"}'),c={name:"guide/svg-icon.md"},r=p("",28),d={id:"图标选择器",tabindex:"-1"},g=s("a",{class:"header-anchor",href:"#图标选择器","aria-label":'Permalink to "图标选择器 "'},"​",-1),E=s("p",null,"图标选择器是一个特殊的组件,它需要展示多套图标集内的所有图标。",-1),y=s("p",null,[i("通过执行 "),s("code",null,"pnpm run generate:icons"),i(" 命令,并按照指引完成操作后,图标选择器就会自动生效了。")],-1);function u(v,b,m,F,f,_){const a=n("Badge");return h(),e("div",null,[r,s("h2",d,[i("图标选择器 "),l(a,{type:"pro",text:"专业版"}),i(),g]),E,y])}const q=t(c,[["render",u]]);export{I as __pageData,q as default}; diff --git a/assets/guide_theme.md.BLSJm2vH.js b/assets/guide_theme.md.BLSJm2vH.js new file mode 100644 index 00000000..e047a64b --- /dev/null +++ b/assets/guide_theme.md.BLSJm2vH.js @@ -0,0 +1,237 @@ +import{_ as k,D as l,c as p,j as i,a as s,I as h,a6 as a,o as t}from"./chunks/framework.Bhh1y9_T.js";const e="/theme.gif",E="/menu-style.png",r="/menu-isrounded.png",P=JSON.parse('{"title":"主题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/theme.md","filePath":"guide/theme.md"}'),g={name:"guide/theme.md"},d=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-app-bg': '#fff',
    +  '--g-main-bg': '#f2f2f2',
    +  '--g-border-color': '#f2f2f2',
    +  // 头部
    +  '--g-header-bg': '#fff',
    +  '--g-header-color': '#0f0f0f',
    +  '--g-header-menu-color': '#0f0f0f',
    +  '--g-header-menu-hover-bg': '#dde1e3',
    +  '--g-header-menu-hover-color': '#0f0f0f',
    +  '--g-header-menu-active-bg': '#0f0f0f',
    +  '--g-header-menu-active-color': '#fff',
    +  // 主导航
    +  '--g-main-sidebar-bg': '#f2f2f2',
    +  '--g-main-sidebar-menu-color': '#0f0f0f',
    +  '--g-main-sidebar-menu-hover-bg': '#dde1e3',
    +  '--g-main-sidebar-menu-hover-color': '#0f0f0f',
    +  '--g-main-sidebar-menu-active-bg': '#0f0f0f',
    +  '--g-main-sidebar-menu-active-color': '#fff',
    +  // 次导航
    +  '--g-sub-sidebar-bg': '#fff',
    +  '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +  '--g-sub-sidebar-logo-color': '#fff',
    +  '--g-sub-sidebar-menu-color': '#0f0f0f',
    +  '--g-sub-sidebar-menu-hover-bg': '#dde1e3',
    +  '--g-sub-sidebar-menu-hover-color': '#0f0f0f',
    +  '--g-sub-sidebar-menu-active-bg': '#0f0f0f',
    +  '--g-sub-sidebar-menu-active-color': '#fff',
    +  // 工具栏
    +  '--g-toolbar-bg': '#fff',
    +}
    +
    +export const darkTheme = {
    +  'color-scheme': 'dark',
    +  // 内置 UI
    +  '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
    +  '--ui-text': hex2rgba('#0f0f0f')!.join(' '),
    +  // 主体
    +  '--g-app-bg': '#141414',
    +  '--g-main-bg': '#0a0a0a',
    +  '--g-border-color': '#15191e',
    +  // 头部
    +  '--g-header-bg': '#141414',
    +  '--g-header-color': '#e5e5e5',
    +  '--g-header-menu-color': '#a8a29e',
    +  '--g-header-menu-hover-bg': '#141414',
    +  '--g-header-menu-hover-color': '#e5e5e5',
    +  '--g-header-menu-active-bg': '#e5e5e5',
    +  '--g-header-menu-active-color': '#0a0a0a',
    +  // 主导航
    +  '--g-main-sidebar-bg': '#0a0a0a',
    +  '--g-main-sidebar-menu-color': '#a8a29e',
    +  '--g-main-sidebar-menu-hover-bg': '#141414',
    +  '--g-main-sidebar-menu-hover-color': '#e5e5e5',
    +  '--g-main-sidebar-menu-active-bg': '#e5e5e5',
    +  '--g-main-sidebar-menu-active-color': '#0a0a0a',
    +  // 次导航
    +  '--g-sub-sidebar-bg': '#141414',
    +  '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +  '--g-sub-sidebar-logo-color': '#e5e5e5',
    +  '--g-sub-sidebar-menu-color': '#a8a29e',
    +  '--g-sub-sidebar-menu-hover-bg': '#0a0a0a',
    +  '--g-sub-sidebar-menu-hover-color': '#e5e5e5',
    +  '--g-sub-sidebar-menu-active-bg': '#e5e5e5',
    +  '--g-sub-sidebar-menu-active-color': '#0a0a0a',
    +  // 工具栏
    +  '--g-toolbar-bg': '#141414',
    +}

    专业版

    与基础版不同,专业版默认提供了 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-app-bg': '#fff',
    +    '--g-main-bg': '#f2f2f2',
    +    '--g-border-color': '#f2f2f2',
    +    // 头部
    +    '--g-header-bg': '#fff',
    +    '--g-header-color': '#0f0f0f',
    +    '--g-header-menu-color': '#0f0f0f',
    +    '--g-header-menu-hover-bg': '#dde1e3',
    +    '--g-header-menu-hover-color': '#0f0f0f',
    +    '--g-header-menu-active-bg': '#0f0f0f',
    +    '--g-header-menu-active-color': '#fff',
    +    // 主导航
    +    '--g-main-sidebar-bg': '#f2f2f2',
    +    '--g-main-sidebar-menu-color': '#0f0f0f',
    +    '--g-main-sidebar-menu-hover-bg': '#dde1e3',
    +    '--g-main-sidebar-menu-hover-color': '#0f0f0f',
    +    '--g-main-sidebar-menu-active-bg': '#0f0f0f',
    +    '--g-main-sidebar-menu-active-color': '#fff',
    +    // 次导航
    +    '--g-sub-sidebar-bg': '#fff',
    +    '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +    '--g-sub-sidebar-logo-color': '#fff',
    +    '--g-sub-sidebar-menu-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-hover-bg': '#dde1e3',
    +    '--g-sub-sidebar-menu-hover-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-active-bg': '#0f0f0f',
    +    '--g-sub-sidebar-menu-active-color': '#fff',
    +    // 工具栏
    +    '--g-toolbar-bg': '#fff',
    +  },
    +  ...
    +  dark: {
    +    // 颜色主题
    +    'color-scheme': 'dark',
    +    // 内置 UI
    +    '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
    +    '--ui-text': hex2rgba('#0f0f0f')!.join(' '),
    +    // 主体
    +    '--g-app-bg': '#141414',
    +    '--g-main-bg': '#0a0a0a',
    +    '--g-border-color': '#15191e',
    +    // 头部
    +    '--g-header-bg': '#141414',
    +    '--g-header-color': '#e5e5e5',
    +    '--g-header-menu-color': '#a8a29e',
    +    '--g-header-menu-hover-bg': '#141414',
    +    '--g-header-menu-hover-color': '#e5e5e5',
    +    '--g-header-menu-active-bg': '#e5e5e5',
    +    '--g-header-menu-active-color': '#0a0a0a',
    +    // 主导航
    +    '--g-main-sidebar-bg': '#0a0a0a',
    +    '--g-main-sidebar-menu-color': '#a8a29e',
    +    '--g-main-sidebar-menu-hover-bg': '#141414',
    +    '--g-main-sidebar-menu-hover-color': '#e5e5e5',
    +    '--g-main-sidebar-menu-active-bg': '#e5e5e5',
    +    '--g-main-sidebar-menu-active-color': '#0a0a0a',
    +    // 次导航
    +    '--g-sub-sidebar-bg': '#141414',
    +    '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +    '--g-sub-sidebar-logo-color': '#e5e5e5',
    +    '--g-sub-sidebar-menu-color': '#a8a29e',
    +    '--g-sub-sidebar-menu-hover-bg': '#0a0a0a',
    +    '--g-sub-sidebar-menu-hover-color': '#e5e5e5',
    +    '--g-sub-sidebar-menu-active-bg': '#e5e5e5',
    +    '--g-sub-sidebar-menu-active-color': '#0a0a0a',
    +    // 工具栏
    +    '--g-toolbar-bg': '#141414',
    +  },
    +  ...
    +}

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

    ts
    import { hex2rgba } from '@unocss/preset-mini/utils'
    +
    +export default {
    +  newThemeName: { // 主题名称
    +    // 颜色主题
    +    'color-scheme': 'light', // 可选值 light/dark ,表示该主题在明亮或暗黑模式下的配色
    +    // 内置 UI
    +    '--ui-primary': hex2rgba('#409eff')!.join(' '),
    +    '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
    +    // 主体
    +    '--g-app-bg': '#fff',
    +    '--g-main-bg': '#f2f2f2',
    +    '--g-border-color': '#f2f2f2',
    +    // 头部
    +    '--g-header-bg': '#222b45',
    +    '--g-header-color': '#fff',
    +    '--g-header-menu-color': '#fff',
    +    '--g-header-menu-hover-bg': '#334067',
    +    '--g-header-menu-hover-color': '#fff',
    +    '--g-header-menu-active-bg': '#334067',
    +    '--g-header-menu-active-color': '#fff',
    +    // 主导航
    +    '--g-main-sidebar-bg': '#222b45',
    +    '--g-main-sidebar-menu-color': '#fff',
    +    '--g-main-sidebar-menu-hover-bg': '#334067',
    +    '--g-main-sidebar-menu-hover-color': '#fff',
    +    '--g-main-sidebar-menu-active-bg': '#334067',
    +    '--g-main-sidebar-menu-active-color': '#fff',
    +    // 次导航
    +    '--g-sub-sidebar-bg': '#fff',
    +    '--g-sub-sidebar-logo-bg': '#222b45',
    +    '--g-sub-sidebar-logo-color': '#fff',
    +    '--g-sub-sidebar-menu-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-hover-bg': '#dde1e3',
    +    '--g-sub-sidebar-menu-hover-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-active-bg': '#409eff',
    +    '--g-sub-sidebar-menu-active-color': '#fff',
    +    // 工具栏
    +    '--g-toolbar-bg': '#fff',
    +  },
    +}

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

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

    颜色方案

    在应用配置中设置:

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

    在应用配置中设置:

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

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  app: {
    +    enableColorAmblyopiaMode: true,
    +  },
    +}
    `,2),b={id:"导航栏风格",tabindex:"-1"},f=i("a",{class:"header-anchor",href:"#导航栏风格","aria-label":'Permalink to "导航栏风格 "'},"​",-1),u=a(`

    风格

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    /**
    +     * 留空默认
    +     * arrow 箭头
    +     * line 线条
    +     * dot 圆点
    +     */
    +    style: '', // v4.5.0 之前版本为 menuActiveStyle
    +  },
    +}

    圆角

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    // 导航栏是否圆角
    +    isRounded: 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》,希望帮助你更好地在暗黑模式下开发出优秀的页面。

    `,14);function m(A,D,v,_,x,S){const n=l("Badge");return t(),p("div",null,[d,i("h2",F,[s("哀悼模式 "),h(n,{type:"tip",text:"v4.5.0 新增"}),s(),y]),c,i("h2",o,[s("色弱模式 "),h(n,{type:"tip",text:"v4.5.0 新增"}),s(),C]),B,i("h2",b,[s("导航栏风格 "),h(n,{type:"pro",text:"专业版"}),s(),f]),u])}const q=k(g,[["render",m]]);export{P as __pageData,q as default}; diff --git a/assets/guide_theme.md.BLSJm2vH.lean.js b/assets/guide_theme.md.BLSJm2vH.lean.js new file mode 100644 index 00000000..4f5df861 --- /dev/null +++ b/assets/guide_theme.md.BLSJm2vH.lean.js @@ -0,0 +1 @@ +import{_ as k,D as l,c as p,j as i,a as s,I as h,a6 as a,o as t}from"./chunks/framework.Bhh1y9_T.js";const e="/theme.gif",E="/menu-style.png",r="/menu-isrounded.png",P=JSON.parse('{"title":"主题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/theme.md","filePath":"guide/theme.md"}'),g={name:"guide/theme.md"},d=a("",16),F={id:"哀悼模式",tabindex:"-1"},y=i("a",{class:"header-anchor",href:"#哀悼模式","aria-label":'Permalink to "哀悼模式 "'},"​",-1),c=a("",2),o={id:"色弱模式",tabindex:"-1"},C=i("a",{class:"header-anchor",href:"#色弱模式","aria-label":'Permalink to "色弱模式 "'},"​",-1),B=a("",2),b={id:"导航栏风格",tabindex:"-1"},f=i("a",{class:"header-anchor",href:"#导航栏风格","aria-label":'Permalink to "导航栏风格 "'},"​",-1),u=a("",14);function m(A,D,v,_,x,S){const n=l("Badge");return t(),p("div",null,[d,i("h2",F,[s("哀悼模式 "),h(n,{type:"tip",text:"v4.5.0 新增"}),s(),y]),c,i("h2",o,[s("色弱模式 "),h(n,{type:"tip",text:"v4.5.0 新增"}),s(),C]),B,i("h2",b,[s("导航栏风格 "),h(n,{type:"pro",text:"专业版"}),s(),f]),u])}const q=k(g,[["render",m]]);export{P as __pageData,q as default}; diff --git a/assets/guide_toolbar.md.DcqYXkK3.js b/assets/guide_toolbar.md.DcqYXkK3.js new file mode 100644 index 00000000..95e20ab4 --- /dev/null +++ b/assets/guide_toolbar.md.DcqYXkK3.js @@ -0,0 +1,33 @@ +import{_ as n,D as l,c as e,j as i,a as s,I as h,a6 as a,o as p}from"./chunks/framework.Bhh1y9_T.js";const k="/toolbar.png",V=JSON.parse('{"title":"工具栏","description":"","frontmatter":{},"headers":[],"relativePath":"guide/toolbar.md","filePath":"guide/toolbar.md"}'),d={name:"guide/toolbar.md"},E=a('

    工具栏

    工具栏主要是红框处各类功能图标。

    窗口预览

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    previewWindows: true,
    +  },
    +}
    `,6),r={id:"收藏夹",tabindex:"-1"},g=i("a",{class:"header-anchor",href:"#收藏夹","aria-label":'Permalink to "收藏夹 "'},"​",-1),o=a(`

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    favorites: true,
    +  },
    +}

    详细可阅读《收藏夹》。

    导航搜索

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    navSearch: true,
    +  },
    +}
    `,6),c={id:"通知中心",tabindex:"-1"},y=i("a",{class:"header-anchor",href:"#通知中心","aria-label":'Permalink to "通知中心 "'},"​",-1),F=a(`

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    notification: true,
    +  },
    +}

    通知中心不涉及具体业务,需开发者自行实现,相关文件在:

    • /src/views/components/Tools/Notification/index.vue 通知中心下拉预览面板
    • /src/views/windows/PersonalNotification/index.vue 通知中心页面
    `,4),_={id:"国际化",tabindex:"-1"},C=i("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化 "'},"​",-1),b=a(`

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    i18n: true,
    +  },
    +}

    如果设置为不启用,并不代表不支持国际化切换,只是不会在工具栏显示切换语言的图标,详细可阅读《国际化》。

    浏览器全屏

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    fullscreen: true,
    +  },
    +}

    颜色主题

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    colorScheme: true,
    +  },
    +}

    如果设置为不启用,并不代表不支持颜色主题切换,只是不会在工具栏显示切换颜色主题的图标。

    `,10),u={id:"布局",tabindex:"-1"},v=i("a",{class:"header-anchor",href:"#布局","aria-label":'Permalink to "布局 "'},"​",-1),B=a(`

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    layout: ['previewWindows', 'favorites', '->', 'navSearch', 'notification', 'i18n', 'fullscreen', 'colorScheme'],
    +  },
    +}

    可自定义摆放位置和顺序,其中 -> 为分隔符,用于分隔左右两侧的工具栏。修改时请确保提供的所有值都存在,不可删减。

    `,3);function m(A,S,T,x,D,f){const t=l("Badge");return p(),e("div",null,[E,i("h2",r,[s("收藏夹 "),h(t,{type:"pro",text:"专业版"}),s(),g]),o,i("h2",c,[s("通知中心 "),h(t,{type:"pro",text:"专业版"}),s(),y]),F,i("h2",_,[s("国际化 "),h(t,{type:"pro",text:"专业版"}),s(),C]),b,i("h2",u,[s("布局 "),h(t,{type:"pro",text:"专业版"}),s(),v]),B])}const N=n(d,[["render",m]]);export{V as __pageData,N as default}; diff --git a/assets/guide_toolbar.md.DcqYXkK3.lean.js b/assets/guide_toolbar.md.DcqYXkK3.lean.js new file mode 100644 index 00000000..6b75d0df --- /dev/null +++ b/assets/guide_toolbar.md.DcqYXkK3.lean.js @@ -0,0 +1 @@ +import{_ as n,D as l,c as e,j as i,a as s,I as h,a6 as a,o as p}from"./chunks/framework.Bhh1y9_T.js";const k="/toolbar.png",V=JSON.parse('{"title":"工具栏","description":"","frontmatter":{},"headers":[],"relativePath":"guide/toolbar.md","filePath":"guide/toolbar.md"}'),d={name:"guide/toolbar.md"},E=a("",6),r={id:"收藏夹",tabindex:"-1"},g=i("a",{class:"header-anchor",href:"#收藏夹","aria-label":'Permalink to "收藏夹 "'},"​",-1),o=a("",6),c={id:"通知中心",tabindex:"-1"},y=i("a",{class:"header-anchor",href:"#通知中心","aria-label":'Permalink to "通知中心 "'},"​",-1),F=a("",4),_={id:"国际化",tabindex:"-1"},C=i("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化 "'},"​",-1),b=a("",10),u={id:"布局",tabindex:"-1"},v=i("a",{class:"header-anchor",href:"#布局","aria-label":'Permalink to "布局 "'},"​",-1),B=a("",3);function m(A,S,T,x,D,f){const t=l("Badge");return p(),e("div",null,[E,i("h2",r,[s("收藏夹 "),h(t,{type:"pro",text:"专业版"}),s(),g]),o,i("h2",c,[s("通知中心 "),h(t,{type:"pro",text:"专业版"}),s(),y]),F,i("h2",_,[s("国际化 "),h(t,{type:"pro",text:"专业版"}),s(),C]),b,i("h2",u,[s("布局 "),h(t,{type:"pro",text:"专业版"}),s(),v]),B])}const N=n(d,[["render",m]]);export{V as __pageData,N as default}; diff --git a/assets/guide_upgrade.md.eXeFHhaS.js b/assets/guide_upgrade.md.eXeFHhaS.js new file mode 100644 index 00000000..1340df76 --- /dev/null +++ b/assets/guide_upgrade.md.eXeFHhaS.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a6 as o}from"./chunks/framework.Bhh1y9_T.js";const g=JSON.parse('{"title":"框架更新","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade.md","filePath":"guide/upgrade.md"}'),p={name:"guide/upgrade.md"},r=o('

    框架更新

    首先明确一点,One-step-admin 无法像 npm 的插件一样更新,不仅我们的框架如此,其实大部分管理系统框架都是如此。

    因为本质上这类框架其实是一个初始模板,开发者会根据自身需求去修改,然后基于业务开展业务代码编写。

    所以一旦下载开始使用,基本是无法更新的,你在哪个时间点开始使用,项目就固定在什么版本了。

    虽然有小部分框架选择将部分核心源码封装成 npm 依赖包,由作者全权维护,这样的处理在一定程度上有解决版本更新的问题,但弊端也很明显,开发者在二次开发上会有明显的局限,作者认为是得不偿失的。

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

    1. 在基于 One-step-admin 做项目开发时尽量避免框架自带模块或组件的改动,或者改动地方做一个文档记录,可以清楚知道改动了哪些,这样当你需要进行新版本更新时,按照之前记录的文档可以有个大致的迁移方案,而业务代码则可以直接拷贝过去。
    2. 我们尽量在提交代码时标明每次提交改动的变更记录说明,这样你可以选择性的更新部分新代码到项目中,也就是局部更新。这种方案也是作者在公司内部项目经常使用的,因为大部分项目是无需全局更新到新版的,只需将必要的一些新特性或 bug 修复同步到原有项目中即可。
    3. 使用文件比较工具,例如 Beyond Compare,这款工具可以直接对比文件夹,可以清晰的列出文件夹内所有文件的差异,可以协助升级工作开展。

    当然个人建议是,做为一个中后台系统框架,稳定是第一诉求,不到万不得已不建议频繁更新,因为更新的成本挺高的,每一次大更新,都需要一次完整的回归测试,以确保功能正常运行。

    ',8),n=[r];function i(s,_,d,c,l,u){return a(),t("div",null,n)}const h=e(p,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/guide_upgrade.md.eXeFHhaS.lean.js b/assets/guide_upgrade.md.eXeFHhaS.lean.js new file mode 100644 index 00000000..8b0e8916 --- /dev/null +++ b/assets/guide_upgrade.md.eXeFHhaS.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a6 as o}from"./chunks/framework.Bhh1y9_T.js";const g=JSON.parse('{"title":"框架更新","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade.md","filePath":"guide/upgrade.md"}'),p={name:"guide/upgrade.md"},r=o("",8),n=[r];function i(s,_,d,c,l,u){return a(),t("div",null,n)}const h=e(p,[["render",i]]);export{g as __pageData,h as default}; diff --git a/assets/guide_vue3-composition-api.md.D_pqF34C.js b/assets/guide_vue3-composition-api.md.D_pqF34C.js new file mode 100644 index 00000000..7cbd4b38 --- /dev/null +++ b/assets/guide_vue3-composition-api.md.D_pqF34C.js @@ -0,0 +1,19 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"使用 Composition API 开发","description":"","frontmatter":{},"headers":[],"relativePath":"guide/vue3-composition-api.md","filePath":"guide/vue3-composition-api.md"}'),n={name:"guide/vue3-composition-api.md"},p=t(`

    使用 Composition API 开发

    TIP

    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'
    +
    +const count = ref(0)
    +const doubled = computed(() => count.value * 2)
    +</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 e(l,k,r,o,E,d){return a(),i("div",null,h)}const u=s(n,[["render",e]]);export{c as __pageData,u as default}; diff --git a/assets/guide_vue3-composition-api.md.D_pqF34C.lean.js b/assets/guide_vue3-composition-api.md.D_pqF34C.lean.js new file mode 100644 index 00000000..897dd1e7 --- /dev/null +++ b/assets/guide_vue3-composition-api.md.D_pqF34C.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a6 as t}from"./chunks/framework.Bhh1y9_T.js";const c=JSON.parse('{"title":"使用 Composition API 开发","description":"","frontmatter":{},"headers":[],"relativePath":"guide/vue3-composition-api.md","filePath":"guide/vue3-composition-api.md"}'),n={name:"guide/vue3-composition-api.md"},p=t("",11),h=[p];function e(l,k,r,o,E,d){return a(),i("div",null,h)}const u=s(n,[["render",e]]);export{c as __pageData,u as default}; diff --git a/assets/guide_watermark.md.Bfkh7IZ2.js b/assets/guide_watermark.md.Bfkh7IZ2.js new file mode 100644 index 00000000..1b9bc102 --- /dev/null +++ b/assets/guide_watermark.md.Bfkh7IZ2.js @@ -0,0 +1,17 @@ +import{_ as t,D as n,c as e,j as a,a as s,I as p,a6 as l,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/watermark.png",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.Bfkh7IZ2.lean.js b/assets/guide_watermark.md.Bfkh7IZ2.lean.js new file mode 100644 index 00000000..bd372d59 --- /dev/null +++ b/assets/guide_watermark.md.Bfkh7IZ2.lean.js @@ -0,0 +1 @@ +import{_ as t,D as n,c as e,j as a,a as s,I as p,a6 as l,o as h}from"./chunks/framework.Bhh1y9_T.js";const k="/watermark.png",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.DBObFHbq.js b/assets/guide_why.md.DBObFHbq.js new file mode 100644 index 00000000..ade8cc8c --- /dev/null +++ b/assets/guide_why.md.DBObFHbq.js @@ -0,0 +1 @@ +import{c as r,j as a,a as t,t as i,k as s,a6 as d,o as l}from"./chunks/framework.Bhh1y9_T.js";const c="/intro-1.gif",h="/intro-2.gif",p="/intro-3.gif",m="/intro-4.gif",_="/intro-5.gif",u=a("h1",{id:"为什么选择我们",tabindex:"-1"},[t("为什么选择我们 ? "),a("a",{class:"header-anchor",href:"#为什么选择我们","aria-label":'Permalink to "为什么选择我们 ?"'},"​")],-1),f=a("p",null,"如果你正在做后台框架相关的调研或选型,相信这篇介绍能帮助你快速了解 One-step-admin 的特点,以及与传统后台框架的对比。",-1),g=a("h2",{id:"长期且稳定",tabindex:"-1"},[t("长期且稳定 "),a("a",{class:"header-anchor",href:"#长期且稳定","aria-label":'Permalink to "长期且稳定"'},"​")],-1),b=d('

    高效的交互方式

    摆脱传统后台框架路由跳转的交互,将每个模块以窗口的形式展示在同一个界面中,让使用人员可以做到跨模块的多线操作。

    窗口最大化

    窗口默认宽度为 800px ,可以在项目中进行调整,也可以通过最大化按钮将窗口最大化展示,以便展示更多信息。

    快速定位操作窗口

    提供的预览界面可以帮助使用人员快速定位到需要操作的窗口。

    专注模式

    可勾选多个窗口平均分布在页面中,专注于所勾选的窗口进行操作。

    窗口排序

    快速调整窗口的展示顺序。

    继承自 Fantastic-admin

    本框架继承了 Fantastic-admin 许多优秀的特性。例如同样提供了 5 款导航栏模式,3 款导航栏风格以及 6 款主题配色,导航也提供了各种展示形态的设置,显隐、标题、图标、徽标、外链等。

    为什么不是 Fantastic-admin ?

    这里的 Fantastic-admin 代表了市面上几乎所有的传统后台框架,它们的优势在于理解成本低,每个页面的功能明确,需要做什么操作就进入不同的页面。

    而劣势也是因为这种优势导致的,例如要在多个模块之间进行操作,就需要频繁切换路由,而切换路由会导致之前页面上的数据丢失,进而扩展了页面缓存和标签栏的特性,但也变相增加了开发人员的开发成本。其次现在的显示器都在往高分屏/带鱼屏发展,当页面展示内容不多的时候,界面上会显示大量的留白,造成空间浪费。

    基于传统后台框架的这些痛点,One-step-admin 应运而生,它探索出了一种全新的交互方式,有效提高了使用人员的操作效率,同时也减轻了开发人员的开发成本

    以上面举例的场景,在 One-step-admin 里,因为模块都以窗口的形式在同一个界面上展示,所以就不存在切换路由,也就不存在切换路由导致页面数据丢失的场景,开发人员只需关注模块内的业务实现即可。

    ',22),F=JSON.parse('{"title":"为什么选择我们 ?","description":"","frontmatter":{},"headers":[],"relativePath":"guide/why.md","filePath":"guide/why.md"}'),q={name:"guide/why.md"},O=Object.assign(q,{setup(x){const e="2021/11/01",n=new Date().getTime()/1e3-new Date(e).getTime()/1e3,o=parseInt(n/60/60/24);return(P,k)=>(l(),r("div",null,[u,f,g,a("p",null,[t("One-step-admin 自 "+i(e)+" 正式对外发布,截止到今天为止,已持续维护 "),a("strong",null,i(s(o)),1),t(" 天。")]),b]))}});export{F as __pageData,O as default}; diff --git a/assets/guide_why.md.DBObFHbq.lean.js b/assets/guide_why.md.DBObFHbq.lean.js new file mode 100644 index 00000000..13bb94db --- /dev/null +++ b/assets/guide_why.md.DBObFHbq.lean.js @@ -0,0 +1 @@ +import{c as r,j as a,a as t,t as i,k as s,a6 as d,o as l}from"./chunks/framework.Bhh1y9_T.js";const c="/intro-1.gif",h="/intro-2.gif",p="/intro-3.gif",m="/intro-4.gif",_="/intro-5.gif",u=a("h1",{id:"为什么选择我们",tabindex:"-1"},[t("为什么选择我们 ? "),a("a",{class:"header-anchor",href:"#为什么选择我们","aria-label":'Permalink to "为什么选择我们 ?"'},"​")],-1),f=a("p",null,"如果你正在做后台框架相关的调研或选型,相信这篇介绍能帮助你快速了解 One-step-admin 的特点,以及与传统后台框架的对比。",-1),g=a("h2",{id:"长期且稳定",tabindex:"-1"},[t("长期且稳定 "),a("a",{class:"header-anchor",href:"#长期且稳定","aria-label":'Permalink to "长期且稳定"'},"​")],-1),b=d("",22),F=JSON.parse('{"title":"为什么选择我们 ?","description":"","frontmatter":{},"headers":[],"relativePath":"guide/why.md","filePath":"guide/why.md"}'),q={name:"guide/why.md"},O=Object.assign(q,{setup(x){const e="2021/11/01",n=new Date().getTime()/1e3-new Date(e).getTime()/1e3,o=parseInt(n/60/60/24);return(P,k)=>(l(),r("div",null,[u,f,g,a("p",null,[t("One-step-admin 自 "+i(e)+" 正式对外发布,截止到今天为止,已持续维护 "),a("strong",null,i(s(o)),1),t(" 天。")]),b]))}});export{F as __pageData,O as default}; diff --git a/assets/guide_window.md.s_rE98aQ.js b/assets/guide_window.md.s_rE98aQ.js new file mode 100644 index 00000000..321ca13a --- /dev/null +++ b/assets/guide_window.md.s_rE98aQ.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t,a6 as a}from"./chunks/framework.Bhh1y9_T.js";const w=JSON.parse('{"title":"窗口","description":"","frontmatter":{},"headers":[],"relativePath":"guide/window.md","filePath":"guide/window.md"}'),c={name:"guide/window.md"},d=a('

    窗口

    窗口即组件,存放在 /src/views/windows/ 目录下,类似于全局组件,文件夹名即为组件名,在窗口打开的时候会动态加载组件。

    每个窗口的文件夹内至少保留一个文件名为 index.vue 的入口文件。

    注意

    由于窗口展示的特殊性,请勿在窗口组件内使用 position: fixed; 样式。

    ',4),i=[d];function s(n,_,r,p,l,u){return t(),o("div",null,i)}const h=e(c,[["render",s]]);export{w as __pageData,h as default}; diff --git a/assets/guide_window.md.s_rE98aQ.lean.js b/assets/guide_window.md.s_rE98aQ.lean.js new file mode 100644 index 00000000..4f0a162d --- /dev/null +++ b/assets/guide_window.md.s_rE98aQ.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t,a6 as a}from"./chunks/framework.Bhh1y9_T.js";const w=JSON.parse('{"title":"窗口","description":"","frontmatter":{},"headers":[],"relativePath":"guide/window.md","filePath":"guide/window.md"}'),c={name:"guide/window.md"},d=a("",4),i=[d];function s(n,_,r,p,l,u){return t(),o("div",null,i)}const h=e(c,[["render",s]]);export{w as __pageData,h as default}; diff --git a/assets/index.md.Bg6s1Hx0.js b/assets/index.md.Bg6s1Hx0.js new file mode 100644 index 00000000..f2fe63ca --- /dev/null +++ b/assets/index.md.Bg6s1Hx0.js @@ -0,0 +1 @@ +import{y as n,c as a,o}from"./chunks/framework.Bhh1y9_T.js";function s(){const e=document.querySelector("div.VPHero.has-image.VPHomeHero > div > div.main > h1.name"),t=document.createElement("sup");t.classList.add("pure-tag"),t.textContent="纯前端框架",e==null||e.appendChild(t)}function l(){return fetch("https://api.github.com/repos/one-step-admin/basic/releases/latest").then(e=>e.json()).then(e=>e.tag_name??"").then(e=>{if(!e)return;const t=document.querySelector("div.VPHero.has-image.VPHomeHero > div > div.main > p.tagline"),i=document.createElement("samp");i.classList.add("github-release-tag"),i.textContent=e,t==null||t.appendChild(i)})}const m=JSON.parse('{"title":"One-step-admin","titleTemplate":"一款 Vue 中后台管理系统框架","description":"","frontmatter":{"layout":"home","title":"One-step-admin","titleTemplate":"一款 Vue 中后台管理系统框架","hero":{"name":"One-step-admin","text":"巧妙的管理系统框架","tagline":"快人一步,给你不一样的使用体验","image":{"src":"/logo.png","alt":"Vite"},"actions":[{"theme":"brand","text":"开始","link":"/guide/intro"},{"theme":"alt","text":"为什么选我们 ?","link":"/guide/why"},{"theme":"alt","text":"更新日志","link":"/guide/changelog"},{"theme":"cta buy","text":"购买合集,优惠更多","link":"/buy"},{"theme":"cta","text":"演示地址:基础版 ↗","link":"https://one-step-admin.hurui.me/basic-example"},{"theme":"cta","text":"演示地址:专业版 ↗","link":"https://one-step-admin.hurui.me/pro-example"}]},"features":[{"icon":"💪","title":"先进的技术栈","details":"Vite + Vue3 + Pinia + TypeScript ,采用业内先进的技术栈,使框架始终保持新鲜"},{"icon":"🖥️","title":"高效操作","details":"采用全新交互方式,大幅提升操作效率,更好的利用高分屏/带鱼屏显示器"},{"icon":"🎨","title":"风格百变","details":"通过布局与主题组合搭配,可实现数百种不同风格的界面"},{"icon":"🗺️","title":"多功能导航栏","details":"支持前/后端生成导航栏,轻松实现导航嵌套、外链、标记、权限等功能"},{"icon":"🔑","title":"全场景权限验证","details":"内置鉴权组件、鉴权指令和鉴权函数,真正实现各种场景下的权限验证"},{"icon":"🌐","title":"面向国际","details":"内置业内通用国际化解决方案,通过简单配置实现多国语言切换"},{"icon":"📦","title":"丰富的组件","details":"内置常用组件,提高开发效率;同时提供组件快速生成工具"},{"icon":"📃","title":"丰富的业务页面","details":"通过真实场景及真实需求,沉淀出数十个业务应用的静态页面,方便开发人员直接使用"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),c={name:"index.md"},p=Object.assign(c,{setup(e){return n(()=>{s(),l()}),(t,i)=>(o(),a("div"))}});export{m as __pageData,p as default}; diff --git a/assets/index.md.Bg6s1Hx0.lean.js b/assets/index.md.Bg6s1Hx0.lean.js new file mode 100644 index 00000000..f2fe63ca --- /dev/null +++ b/assets/index.md.Bg6s1Hx0.lean.js @@ -0,0 +1 @@ +import{y as n,c as a,o}from"./chunks/framework.Bhh1y9_T.js";function s(){const e=document.querySelector("div.VPHero.has-image.VPHomeHero > div > div.main > h1.name"),t=document.createElement("sup");t.classList.add("pure-tag"),t.textContent="纯前端框架",e==null||e.appendChild(t)}function l(){return fetch("https://api.github.com/repos/one-step-admin/basic/releases/latest").then(e=>e.json()).then(e=>e.tag_name??"").then(e=>{if(!e)return;const t=document.querySelector("div.VPHero.has-image.VPHomeHero > div > div.main > p.tagline"),i=document.createElement("samp");i.classList.add("github-release-tag"),i.textContent=e,t==null||t.appendChild(i)})}const m=JSON.parse('{"title":"One-step-admin","titleTemplate":"一款 Vue 中后台管理系统框架","description":"","frontmatter":{"layout":"home","title":"One-step-admin","titleTemplate":"一款 Vue 中后台管理系统框架","hero":{"name":"One-step-admin","text":"巧妙的管理系统框架","tagline":"快人一步,给你不一样的使用体验","image":{"src":"/logo.png","alt":"Vite"},"actions":[{"theme":"brand","text":"开始","link":"/guide/intro"},{"theme":"alt","text":"为什么选我们 ?","link":"/guide/why"},{"theme":"alt","text":"更新日志","link":"/guide/changelog"},{"theme":"cta buy","text":"购买合集,优惠更多","link":"/buy"},{"theme":"cta","text":"演示地址:基础版 ↗","link":"https://one-step-admin.hurui.me/basic-example"},{"theme":"cta","text":"演示地址:专业版 ↗","link":"https://one-step-admin.hurui.me/pro-example"}]},"features":[{"icon":"💪","title":"先进的技术栈","details":"Vite + Vue3 + Pinia + TypeScript ,采用业内先进的技术栈,使框架始终保持新鲜"},{"icon":"🖥️","title":"高效操作","details":"采用全新交互方式,大幅提升操作效率,更好的利用高分屏/带鱼屏显示器"},{"icon":"🎨","title":"风格百变","details":"通过布局与主题组合搭配,可实现数百种不同风格的界面"},{"icon":"🗺️","title":"多功能导航栏","details":"支持前/后端生成导航栏,轻松实现导航嵌套、外链、标记、权限等功能"},{"icon":"🔑","title":"全场景权限验证","details":"内置鉴权组件、鉴权指令和鉴权函数,真正实现各种场景下的权限验证"},{"icon":"🌐","title":"面向国际","details":"内置业内通用国际化解决方案,通过简单配置实现多国语言切换"},{"icon":"📦","title":"丰富的组件","details":"内置常用组件,提高开发效率;同时提供组件快速生成工具"},{"icon":"📃","title":"丰富的业务页面","details":"通过真实场景及真实需求,沉淀出数十个业务应用的静态页面,方便开发人员直接使用"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),c={name:"index.md"},p=Object.assign(c,{setup(e){return n(()=>{s(),l()}),(t,i)=>(o(),a("div"))}});export{m as __pageData,p 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 00000000..b6b603d5 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 00000000..def40a4f 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 00000000..e070c3d3 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 00000000..a3c16ca4 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 00000000..2210a899 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 00000000..790d62dc 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 00000000..1eec0775 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 00000000..2cfe6153 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 00000000..e3886dd1 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 00000000..36d67487 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 00000000..2bed1e85 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 00000000..9a8d1e2b 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 00000000..07d3c53a 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 00000000..57bdc22a Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/assets/style.DF-GpclC.css b/assets/style.DF-GpclC.css new file mode 100644 index 00000000..4eb03b5c --- /dev/null +++ b/assets/style.DF-GpclC.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 h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;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-4a25c188]{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-4a25c188],.VPBackdrop.fade-leave-to[data-v-4a25c188]{opacity:0}.VPBackdrop.fade-leave-active[data-v-4a25c188]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-4a25c188]{display:none}}.NotFound[data-v-d3e33f7f]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-d3e33f7f]{padding:96px 32px 168px}}.code[data-v-d3e33f7f]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-d3e33f7f]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-d3e33f7f]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-d3e33f7f]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-d3e33f7f]{padding-top:20px}.link[data-v-d3e33f7f]{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-d3e33f7f]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-00020b51]{position:relative;z-index:1}.nested[data-v-00020b51]{padding-right:16px;padding-left:16px}.outline-link[data-v-00020b51]{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-00020b51]:hover,.outline-link.active[data-v-00020b51]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-00020b51]{padding-left:13px}.VPDocAsideOutline[data-v-4c69a99b]{display:none}.VPDocAsideOutline.has-outline[data-v-4c69a99b]{display:block}.content[data-v-4c69a99b]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-4c69a99b]{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-4c69a99b]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-957a5c78]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-957a5c78]{flex-grow:1}.VPDocAside[data-v-957a5c78] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-957a5c78] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-957a5c78] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-c8439711]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-c8439711]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-6fb16c48]{margin-top:64px}.edit-info[data-v-6fb16c48]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-6fb16c48]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-6fb16c48]{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-6fb16c48]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-6fb16c48]{margin-right:8px}.prev-next[data-v-6fb16c48]{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-6fb16c48]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-6fb16c48]{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-6fb16c48]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-6fb16c48]{margin-left:auto;text-align:right}.desc[data-v-6fb16c48]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-6fb16c48]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-715d218f]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-715d218f]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-715d218f]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-715d218f]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-715d218f]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-715d218f]{display:flex;justify-content:center}.VPDoc .aside[data-v-715d218f]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-715d218f]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-715d218f]{max-width:1104px}}.container[data-v-715d218f]{margin:0 auto;width:100%}.aside[data-v-715d218f]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-715d218f]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-715d218f]{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-715d218f]::-webkit-scrollbar{display:none}.aside-curtain[data-v-715d218f]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-715d218f]{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-715d218f]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-715d218f]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-715d218f]{order:1;margin:0;min-width:640px}}.content-container[data-v-715d218f]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-715d218f]{max-width:688px}.VPButton[data-v-19112015]{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-19112015]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-19112015]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-19112015]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-19112015]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-19112015]: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-19112015]: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-19112015]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-19112015]: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-19112015]: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-19112015]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-19112015]: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-19112015]: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-c6276651]{display:none}.dark .VPImage.light[data-v-c6276651]{display:none}.VPHero[data-v-415d0179]{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-415d0179]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-415d0179]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-415d0179]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-415d0179]{flex-direction:row}}.main[data-v-415d0179]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-415d0179]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-415d0179]{text-align:left}}@media (min-width: 960px){.main[data-v-415d0179]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-415d0179]{max-width:592px}}.name[data-v-415d0179],.text[data-v-415d0179]{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-415d0179],.VPHero.has-image .text[data-v-415d0179]{margin:0 auto}.name[data-v-415d0179]{color:var(--vp-home-hero-name-color)}.clip[data-v-415d0179]{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-415d0179],.text[data-v-415d0179]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-415d0179],.text[data-v-415d0179]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-415d0179],.VPHero.has-image .text[data-v-415d0179]{margin:0}}.tagline[data-v-415d0179]{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-415d0179]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-415d0179]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-415d0179]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-415d0179]{margin:0}}.actions[data-v-415d0179]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-415d0179]{justify-content:center}@media (min-width: 640px){.actions[data-v-415d0179]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-415d0179]{justify-content:flex-start}}.action[data-v-415d0179]{flex-shrink:0;padding:6px}.image[data-v-415d0179]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-415d0179]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-415d0179]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-415d0179]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-415d0179]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-415d0179]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-415d0179]{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-415d0179]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-415d0179]{width:320px;height:320px}}[data-v-415d0179] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-415d0179] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-415d0179] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-0c8a99e7]{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-0c8a99e7]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-0c8a99e7]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-0c8a99e7]>.VPImage{margin-bottom:20px}.icon[data-v-0c8a99e7]{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-0c8a99e7]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-0c8a99e7]{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-0c8a99e7]{padding-top:8px}.link-text-value[data-v-0c8a99e7]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-0c8a99e7]{margin-left:6px}.VPFeatures[data-v-fdd7fd61]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-fdd7fd61]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-fdd7fd61]{padding:0 64px}}.container[data-v-fdd7fd61]{margin:0 auto;max-width:1152px}.items[data-v-fdd7fd61]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-fdd7fd61]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-fdd7fd61],.item.grid-4[data-v-fdd7fd61],.item.grid-6[data-v-fdd7fd61]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-fdd7fd61],.item.grid-4[data-v-fdd7fd61]{width:50%}.item.grid-3[data-v-fdd7fd61],.item.grid-6[data-v-fdd7fd61]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-fdd7fd61]{width:25%}}.container[data-v-38b3e09e]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-38b3e09e]{padding:0 48px}}@media (min-width: 960px){.container[data-v-38b3e09e]{width:100%;padding:0 64px}}.vp-doc[data-v-38b3e09e] .VPHomeSponsors,.vp-doc[data-v-38b3e09e] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-38b3e09e] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-38b3e09e] .VPHomeSponsors a,.vp-doc[data-v-38b3e09e] .VPTeamPage a{text-decoration:none}.VPHome[data-v-f3abe0bf]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-f3abe0bf]{margin-bottom:128px}}.VPContent[data-v-a399269d]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-a399269d]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-a399269d]{margin:0}@media (min-width: 960px){.VPContent[data-v-a399269d]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-a399269d]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-a399269d]{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-51d2e0a7]{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-51d2e0a7]{display:none}.VPFooter[data-v-51d2e0a7] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-51d2e0a7] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-51d2e0a7]{padding:32px}}.container[data-v-51d2e0a7]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-51d2e0a7],.copyright[data-v-51d2e0a7]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-55fc9c08]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-55fc9c08]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-55fc9c08]{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-55fc9c08]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-55fc9c08]{color:var(--vp-c-text-1)}.icon[data-v-55fc9c08]{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-55fc9c08]{font-size:14px}.icon[data-v-55fc9c08]{font-size:16px}}.open>.icon[data-v-55fc9c08]{transform:rotate(90deg)}.items[data-v-55fc9c08]{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-55fc9c08]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-55fc9c08]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-55fc9c08]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-55fc9c08]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-55fc9c08]{transition:all .2s ease-out}.flyout-leave-active[data-v-55fc9c08]{transition:all .15s ease-in}.flyout-enter-from[data-v-55fc9c08],.flyout-leave-to[data-v-55fc9c08]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-30188ab8]{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-30188ab8]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-30188ab8]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-30188ab8]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-30188ab8]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-30188ab8]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-30188ab8]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-30188ab8]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-30188ab8]{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-30188ab8]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-30188ab8]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-30188ab8]{display:none}}.menu-icon[data-v-30188ab8]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-30188ab8]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-30188ab8]{padding:12px 32px 11px}}.VPSwitch[data-v-3ee2f654]{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-3ee2f654]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-3ee2f654]{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-3ee2f654]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-3ee2f654] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-3ee2f654] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-9abaff51]{opacity:1}.moon[data-v-9abaff51],.dark .sun[data-v-9abaff51]{opacity:0}.dark .moon[data-v-9abaff51]{opacity:1}.dark .VPSwitchAppearance[data-v-9abaff51] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-87c5e7d2]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-87c5e7d2]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-a33e9249]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-a33e9249]{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-a33e9249]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-a33e9249]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-becbdab9]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-becbdab9]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-becbdab9]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-becbdab9]{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-26e1b36f]{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-26e1b36f] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-26e1b36f] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-26e1b36f] .group:last-child{padding-bottom:0}.VPMenu[data-v-26e1b36f] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-26e1b36f] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-26e1b36f] .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-26e1b36f] .action{padding-left:24px}.VPFlyout[data-v-779d1d76]{position:relative}.VPFlyout[data-v-779d1d76]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-779d1d76]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-779d1d76]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-779d1d76]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-779d1d76]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-779d1d76],.button[aria-expanded=true]+.menu[data-v-779d1d76]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-779d1d76]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-779d1d76]{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-779d1d76]{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-779d1d76]{margin-right:0;font-size:16px}.text-icon[data-v-779d1d76]{margin-left:4px;font-size:14px}.icon[data-v-779d1d76]{font-size:20px;transition:fill .25s}.menu[data-v-779d1d76]{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-d5c0951d]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-d5c0951d]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-d5c0951d]>svg,.VPSocialLink[data-v-d5c0951d]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-0c074974]{display:flex;justify-content:center}.VPNavBarExtra[data-v-3a857657]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-3a857657]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-3a857657]{display:none}}.trans-title[data-v-3a857657]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-3a857657],.item.social-links[data-v-3a857657]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-3a857657]{min-width:176px}.appearance-action[data-v-3a857657]{margin-right:-2px}.social-links-list[data-v-3a857657]{margin:-4px -8px}.VPNavBarHamburger[data-v-c2a24129]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-c2a24129]{display:none}}.container[data-v-c2a24129]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-c2a24129]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-c2a24129]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-c2a24129]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-c2a24129]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-c2a24129]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-c2a24129]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-c2a24129],.VPNavBarHamburger.active:hover .middle[data-v-c2a24129],.VPNavBarHamburger.active:hover .bottom[data-v-c2a24129]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-c2a24129],.middle[data-v-c2a24129],.bottom[data-v-c2a24129]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-c2a24129]{top:0;left:0;transform:translate(0)}.middle[data-v-c2a24129]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-c2a24129]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-86a4e124]{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-86a4e124],.VPNavBarMenuLink[data-v-86a4e124]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-af86387c]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-af86387c]{display:flex}}/*! @docsearch/css 3.6.1 | 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-9686c645]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-9686c645]{display:flex;align-items:center}}.title[data-v-b3258250]{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-b3258250]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-b3258250]{border-bottom-color:var(--vp-c-divider)}}[data-v-b3258250] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-d11f4714]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-d11f4714]{display:flex;align-items:center}}.title[data-v-d11f4714]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-4706692b]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-4706692b]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-4706692b]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-4706692b]:not(.home){background-color:transparent}.VPNavBar[data-v-4706692b]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-4706692b]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-4706692b]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-4706692b]{padding:0}}.container[data-v-4706692b]{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-4706692b],.container>.content[data-v-4706692b]{pointer-events:none}.container[data-v-4706692b] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-4706692b]{max-width:100%}}.title[data-v-4706692b]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-4706692b]{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-4706692b]{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-4706692b]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-4706692b]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-4706692b]{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-4706692b]{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-4706692b]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-4706692b]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-4706692b]{column-gap:.5rem}}.menu+.translations[data-v-4706692b]:before,.menu+.appearance[data-v-4706692b]:before,.menu+.social-links[data-v-4706692b]:before,.translations+.appearance[data-v-4706692b]:before,.appearance+.social-links[data-v-4706692b]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-4706692b]:before,.translations+.appearance[data-v-4706692b]:before{margin-right:16px}.appearance+.social-links[data-v-4706692b]:before{margin-left:16px}.social-links[data-v-4706692b]{margin-right:-8px}.divider[data-v-4706692b]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-4706692b]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-4706692b]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-4706692b]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-4706692b]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-4706692b]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-4706692b]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-e3518e41]{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-e3518e41]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-33292676]{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-33292676]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-2d8e3881]{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-2d8e3881]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-7ef2022d]{display:block}.title[data-v-7ef2022d]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-4671a8b5]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-4671a8b5]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-4671a8b5]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-4671a8b5]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-4671a8b5]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-4671a8b5]{transform:rotate(45deg)}.button[data-v-4671a8b5]{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-4671a8b5]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-4671a8b5]{transition:transform .25s}.group[data-v-4671a8b5]:first-child{padding-top:0}.group+.group[data-v-4671a8b5],.group+.item[data-v-4671a8b5]{padding-top:4px}.VPNavScreenTranslations[data-v-4cc74b28]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-4cc74b28]{height:auto}.title[data-v-4cc74b28]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-4cc74b28]{font-size:16px}.icon.lang[data-v-4cc74b28]{margin-right:8px}.icon.chevron[data-v-4cc74b28]{margin-left:4px}.list[data-v-4cc74b28]{padding:4px 0 0 24px}.link[data-v-4cc74b28]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-27670706]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-27670706],.VPNavScreen.fade-leave-active[data-v-27670706]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-27670706],.VPNavScreen.fade-leave-active .container[data-v-27670706]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-27670706],.VPNavScreen.fade-leave-to[data-v-27670706]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-27670706],.VPNavScreen.fade-leave-to .container[data-v-27670706]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-27670706]{display:none}}.container[data-v-27670706]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-27670706],.menu+.appearance[data-v-27670706],.translations+.appearance[data-v-27670706]{margin-top:24px}.menu+.social-links[data-v-27670706]{margin-top:16px}.appearance+.social-links[data-v-27670706]{margin-top:16px}.VPNav[data-v-7697d12e]{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-7697d12e]{position:fixed}}.VPSidebarItem.level-0[data-v-4e965525]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-4e965525]{padding-bottom:10px}.item[data-v-4e965525]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-4e965525]{cursor:pointer}.indicator[data-v-4e965525]{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-4e965525],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-4e965525],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-4e965525],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-4e965525]{background-color:var(--vp-c-brand-1)}.link[data-v-4e965525]{display:flex;align-items:center;flex-grow:1}.text[data-v-4e965525]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-4e965525]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-4e965525],.VPSidebarItem.level-2 .text[data-v-4e965525],.VPSidebarItem.level-3 .text[data-v-4e965525],.VPSidebarItem.level-4 .text[data-v-4e965525],.VPSidebarItem.level-5 .text[data-v-4e965525]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-4e965525],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-4e965525],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-4e965525],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-4e965525],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-4e965525],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-4e965525]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-4e965525],.VPSidebarItem.level-1.has-active>.item>.text[data-v-4e965525],.VPSidebarItem.level-2.has-active>.item>.text[data-v-4e965525],.VPSidebarItem.level-3.has-active>.item>.text[data-v-4e965525],.VPSidebarItem.level-4.has-active>.item>.text[data-v-4e965525],.VPSidebarItem.level-5.has-active>.item>.text[data-v-4e965525],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-4e965525],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-4e965525],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-4e965525],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-4e965525],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-4e965525],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-4e965525]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-4e965525],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-4e965525],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-4e965525],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-4e965525],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-4e965525],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-4e965525]{color:var(--vp-c-brand-1)}.caret[data-v-4e965525]{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-4e965525]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-4e965525]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-4e965525]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-4e965525]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-4e965525],.VPSidebarItem.level-2 .items[data-v-4e965525],.VPSidebarItem.level-3 .items[data-v-4e965525],.VPSidebarItem.level-4 .items[data-v-4e965525],.VPSidebarItem.level-5 .items[data-v-4e965525]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-4e965525]{display:none}.no-transition[data-v-091a4ebd] .caret-icon{transition:none}.group+.group[data-v-091a4ebd]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-091a4ebd]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-4cb49b8f]{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-4cb49b8f]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-4cb49b8f]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-4cb49b8f]{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-4cb49b8f]{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-4cb49b8f]{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-4cb49b8f]{outline:0}.VPSkipLink[data-v-bbad7db3]{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-bbad7db3]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-bbad7db3]{top:14px;left:16px}}.Layout[data-v-7fa59262]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-2d6b9597]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-2d6b9597]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-2d6b9597]{margin:128px 0}}.VPHomeSponsors[data-v-2d6b9597]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-2d6b9597]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-2d6b9597]{padding:0 64px}}.container[data-v-2d6b9597]{margin:0 auto;max-width:1152px}.love[data-v-2d6b9597]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-2d6b9597]{display:inline-block}.message[data-v-2d6b9597]{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-2d6b9597]{padding-top:32px}.action[data-v-2d6b9597]{padding-top:40px;text-align:center}.VPTeamPage[data-v-aede8e30]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-aede8e30]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-aede8e30-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-aede8e30-s],.VPTeamMembers+.VPTeamPageSection[data-v-aede8e30-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-aede8e30-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-aede8e30-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-aede8e30-s],.VPTeamMembers+.VPTeamPageSection[data-v-aede8e30-s]{margin-top:96px}}.VPTeamMembers[data-v-aede8e30-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-aede8e30-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-aede8e30-s]{padding:0 64px}}.VPTeamPageTitle[data-v-789c59d8]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-789c59d8]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-789c59d8]{padding:80px 64px 48px}}.title[data-v-789c59d8]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-789c59d8]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-789c59d8]{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-789c59d8]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-7282e979]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-7282e979]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-7282e979]{padding:0 64px}}.title[data-v-7282e979]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-7282e979]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-7282e979]{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-7282e979]{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-7282e979]{padding-top:40px}.VPTeamMembersItem[data-v-5786018f]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-5786018f]{padding:32px}.VPTeamMembersItem.small .data[data-v-5786018f]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-5786018f]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-5786018f]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-5786018f]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-5786018f]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-5786018f]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-5786018f]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-5786018f]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-5786018f]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-5786018f]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-5786018f]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-5786018f]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-5786018f]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-5786018f]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-5786018f]{text-align:center}.avatar[data-v-5786018f]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-5786018f]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-5786018f]{margin:0;font-weight:600}.affiliation[data-v-5786018f]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-5786018f]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-5786018f]:hover{color:var(--vp-c-brand-1)}.desc[data-v-5786018f]{margin:0 auto}.desc[data-v-5786018f] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-5786018f]{display:flex;justify-content:center;height:56px}.sp-link[data-v-5786018f]{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-5786018f]:hover,.sp .sp-link.link[data-v-5786018f]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-5786018f]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-d034ca84]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-d034ca84]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-d034ca84]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-d034ca84]{max-width:876px}.VPTeamMembers.medium .container[data-v-d034ca84]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-d034ca84]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-d034ca84]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-d034ca84]{max-width:760px}.container[data-v-d034ca84]{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, #67c23a 30%, #a2dc85 );--vp-home-hero-image-background-image: linear-gradient( -45deg, #67c23a 50%, #a2dc85 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}.custom-block.details summary{cursor:pointer}.github-release-tag{font-size:14px;font-weight:700;padding:4px 6px;margin-left:6px;background:var(--vp-c-brand);color:#fff;border-radius:10px;vertical-align:middle}.pure-tag{position:relative;left:-86px;top:-30px;display:inline-block;line-height:1;background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;font-size:18px;transform-origin:bottom center;animation:swing 2s ease infinite}@media (max-width: 960px){.pure-tag{display:none}}@keyframes swing{20%{transform:rotate3d(0,0,1,15deg)}40%{transform:rotate3d(0,0,1,-10deg)}60%{transform:rotate3d(0,0,1,5deg)}80%{transform:rotate3d(0,0,1,-5deg)}to{transform:rotate3d(0,0,1,0)}}.medium-zoom-overlay{z-index:30}.medium-zoom-image{z-index:31}.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}.banner-wrapper[data-v-3cd5c07b]{position:fixed;top:0;bottom:0;left:0;right:0;z-index:61;width:100%;height:100%;max-height:40px;background:linear-gradient(45deg,#0a2b4e,#835ec2);overflow:hidden;margin:0;transition:background-size .25s cubic-bezier(.39,.575,.565,1)}#banner[data-v-3cd5c07b]{position:relative;width:100%;height:100%;text-decoration:none;color:#fff;display:flex;justify-content:center;align-items:center;overflow:hidden;cursor:pointer}#banner .content[data-v-3cd5c07b]{margin:0;padding:0;font-weight:700;font-size:18px;letter-spacing:2px;text-align:center;background:linear-gradient(145deg,#c3ffac,#86ec87);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent}#banner-close[data-v-3cd5c07b]{position:absolute;width:40px;height:100%;top:0;right:0;color:#fff;font-size:20px;font-weight:700;display:flex;align-items:center;justify-content:center}#banner-close:hover>.close[data-v-3cd5c07b]{color:#86ec87}#banner-close>.close[data-v-3cd5c07b]{font-size:20px;font-weight:600}@media screen and (max-width: 767px){#banner .content[data-v-3cd5c07b]{font-size:14px}}html.mirror-site-menu-fixed{--vp-layout-top-height: 40px}html.mirror-site-menu-fixed .VPNav,html.mirror-site-menu-fixed .VPSidebar{top:40px}html.mirror-site-menu-fixed{scroll-padding-top:104px;overflow:auto}html.mirror-site-menu-fixed{margin-top:42px}@media (max-width: 960px){html.mirror-site-menu-fixed .VPNav,html.mirror-site-menu-fixed .VPSidebar{top:0}}.sponsors-aside-text[data-v-d8aff6a3]{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-d8aff6a3]{--max-width: 100%;display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--max-width),1fr));column-gap:4px}.sponsor-item[data-v-d8aff6a3]{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-d8aff6a3]{font-size:11px;color:var(--vt-c-text-3)}.sponsor-item img[data-v-d8aff6a3]{max-width:calc(var(--max-width) - 30px);max-height:calc(var(--max-width) / 2 - 20px)}.sponsor-item .info[data-v-d8aff6a3]{display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:4px}.sponsor-item .info .main[data-v-d8aff6a3]{font-weight:700;font-size:14px;line-height:1.5;color:var(--vp-c-text-1)}.sponsor-item .info .sub[data-v-d8aff6a3]{font-size:12px;line-height:1.2;color:var(--vp-c-text-3)}.special .sponsor-item[data-v-d8aff6a3]{height:160px}.special .sponsor-item img[data-v-d8aff6a3]{max-width:300px;max-height:150px}.dark .aside .sponsor-item[data-v-d8aff6a3],.dark .landing .sponsor-item[data-v-d8aff6a3]{background-color:var(--vp-c-gray-soft)}.aside .sponsor-item img[data-v-d8aff6a3],.landing .sponsor-item img[data-v-d8aff6a3]{transition:filter .2s ease}.dark .aside .sponsor-item img[data-v-d8aff6a3],.dark .landing .sponsor-item img[data-v-d8aff6a3]{filter:grayscale(1) invert(1)}.dark .sponsor-item:hover img[data-v-d8aff6a3]{filter:none}.sponsor-container.platinum.aside[data-v-d8aff6a3]{--max-width: 110px;column-gap:1px}.aside .sponsor-item[data-v-d8aff6a3]{margin:1px 0}.aside .special .sponsor-item[data-v-d8aff6a3]{width:100%;height:70px}.aside .special .sponsor-item img[data-v-d8aff6a3]{max-width:120px;max-height:36px}.home-preview-block[data-v-f619d5b7]{padding:0 24px}.home-preview[data-v-f619d5b7]{max-width:1152px;margin:50px auto 0}.home-preview h2[data-v-f619d5b7]{font-size:24px;font-weight:700;margin-bottom:20px;text-align:center}.home-preview .items[data-v-f619d5b7]{display:flex;flex-wrap:wrap;margin:-8px}.home-preview .items .item[data-v-f619d5b7]{width:100%;padding:8px}.home-preview .items .item p[data-v-f619d5b7]{padding:24px;border-radius:12px;background-color:var(--vp-c-bg-soft)}.home-preview .items .item p[data-v-f619d5b7] img{border:1px solid var(--vp-c-divider)}@media (min-width: 640px){.home-preview-block[data-v-f619d5b7]{padding:0 48px}.home-preview .items .item[data-v-f619d5b7]{width:50%}}@media (min-width: 960px){.home-preview-block[data-v-f619d5b7]{padding:0 64px}.home-preview .items .item[data-v-f619d5b7]{width:calc(100% / 3)}}.VPLocalSearchBox[data-v-ea4c1b97]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-ea4c1b97]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-ea4c1b97]{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-ea4c1b97]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-ea4c1b97]{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-ea4c1b97]{padding:0 8px}}.search-bar[data-v-ea4c1b97]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-ea4c1b97]{display:block;font-size:18px}.navigate-icon[data-v-ea4c1b97]{display:block;font-size:14px}.search-icon[data-v-ea4c1b97]{margin:8px}@media (max-width: 767px){.search-icon[data-v-ea4c1b97]{display:none}}.search-input[data-v-ea4c1b97]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-ea4c1b97]{padding:6px 4px}}.search-actions[data-v-ea4c1b97]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-ea4c1b97]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-ea4c1b97]{display:none}}.search-actions button[data-v-ea4c1b97]{padding:8px}.search-actions button[data-v-ea4c1b97]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-ea4c1b97]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-ea4c1b97]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-ea4c1b97]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-ea4c1b97]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-ea4c1b97]{display:none}}.search-keyboard-shortcuts kbd[data-v-ea4c1b97]{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-ea4c1b97]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-ea4c1b97]{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-ea4c1b97]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-ea4c1b97]{margin:8px}}.titles[data-v-ea4c1b97]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-ea4c1b97]{display:flex;align-items:center;gap:4px}.title.main[data-v-ea4c1b97]{font-weight:500}.title-icon[data-v-ea4c1b97]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-ea4c1b97]{opacity:.5}.result.selected[data-v-ea4c1b97]{--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-ea4c1b97]{position:relative}.excerpt[data-v-ea4c1b97]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-ea4c1b97]{opacity:1}.excerpt[data-v-ea4c1b97] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-ea4c1b97] mark,.excerpt[data-v-ea4c1b97] 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-ea4c1b97] .vp-code-group .tabs{display:none}.excerpt[data-v-ea4c1b97] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-ea4c1b97]{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-ea4c1b97]{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-ea4c1b97],.result.selected .title-icon[data-v-ea4c1b97]{color:var(--vp-c-brand-1)!important}.no-results[data-v-ea4c1b97]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-ea4c1b97]{flex:none} diff --git a/assets/support.md.C9-w0WzG.js b/assets/support.md.C9-w0WzG.js new file mode 100644 index 00000000..1f238373 --- /dev/null +++ b/assets/support.md.C9-w0WzG.js @@ -0,0 +1 @@ +import{c as a,j as e,k as t,a6 as s,o as r,g as i}from"./chunks/framework.Bhh1y9_T.js";const o=s('

    技术支持

    基础版

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

    专业版

    购买专业版的用户可以加我微信直接和我一对一沟通使用问题。

    ',6),n={align:"center"},l=["src"],p=JSON.parse('{"title":"技术支持","description":"","frontmatter":{},"headers":[],"relativePath":"support.md","filePath":"support.md"}'),c={name:"support.md"},m=Object.assign(c,{setup(_){return(h,d)=>(r(),a("div",null,[o,e("p",n,[e("img",{src:t(i)("/friend-wechat.png"),width:"300"},null,8,l)])]))}});export{p as __pageData,m as default}; diff --git a/assets/support.md.C9-w0WzG.lean.js b/assets/support.md.C9-w0WzG.lean.js new file mode 100644 index 00000000..45410c3c --- /dev/null +++ b/assets/support.md.C9-w0WzG.lean.js @@ -0,0 +1 @@ +import{c as a,j as e,k as t,a6 as s,o as r,g as i}from"./chunks/framework.Bhh1y9_T.js";const o=s("",6),n={align:"center"},l=["src"],p=JSON.parse('{"title":"技术支持","description":"","frontmatter":{},"headers":[],"relativePath":"support.md","filePath":"support.md"}'),c={name:"support.md"},m=Object.assign(c,{setup(_){return(h,d)=>(r(),a("div",null,[o,e("p",n,[e("img",{src:t(i)("/friend-wechat.png"),width:"300"},null,8,l)])]))}});export{p as __pageData,m as default}; diff --git a/buy.html b/buy.html new file mode 100644 index 00000000..5c245371 --- /dev/null +++ b/buy.html @@ -0,0 +1,33 @@ + + + + + + 购买专业版 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    购买专业版

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

    原价:¥999.00 One-step-admin + ¥1199.00 Fantastic-admin = ¥2198.00

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

    请加作者微信进行购买

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

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

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

    请加作者微信进行购买

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

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

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

    请加作者微信进行购买

    购买流程

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

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

    支付方式

    领红包

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

    One-step-admin 专业版
    限时优惠:699.00
    原价:¥999.00

    产品生命周期内提供长期更新维护

    企业/团队购买

    如果你有以下场景需求,推荐购买企业/团队版:

    • 我们是公司,开发团队有多名开发者,需要都能加入到 Github 组织;同时考虑到人员流动,需要可以更换加入到 Github 组织的开发者账号
    • 我们是给客户开发项目的,开发完毕后需要将完整源码一起交付给客户
    • 我们希望能有一个独立的技术支持微信群,方便我们的开发者可以随时咨询框架相关问题
    One-step-admin 专业版 (企业/团队版)
    限时优惠:2799.00
    原价:¥3599.00
    ⭐服务⭐个人企业/团队
    允许加入 Github 组织账号数15
    是否允许二开后交付源码
    提供独立技术支持微信群
    是否可以开发票支持开普票,价格已含税

    使用说明

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

    专业版与基础版区别

    ⭐功能与服务⭐基础版专业版
    长期维护更新,提供新特性
    定期修复 bug
    开发与构建工具Vue 3 / Vite
    UI 组件库Element Plus
    页面布局3 套5 套
    主题风格明亮 1 款 / 暗黑 1 款明亮 6 款 / 暗黑 6 款
    导航路由配置项5 个8 个
    外链导航
    窗口 API支持部分
    窗口右键功能
    窗口预览模式
    窗口专注模式
    窗口拖拽排序
    收藏夹
    全方位权限验证
    扩展组件12 个20 个
    用户偏好设置
    国际化
    Mock 数据
    错误日志上报
    文件自动生成支持部分
    业务应用静态页面
    团队代码规范
    框架版权信息需保留可删除
    技术支持查看
    演示地址访问访问

    什么场景需要 One-step-admin

    • 没有前端开发人员的小型公司。 据了解,有些小型公司没有前端开发人员,而这些公司在开发中后台系统的时候,直接要求后端开发人员来进行开发工作。所以借助 Vue 的易学习易上手特性,再加上本框架的加持,可以让后端开发人员能在短时间内转型成为全栈开发。
    • 前端开发人员不足的中小型公司。 根据招聘网站统计,几乎所有公司都缺前端,其中有很大一部分中小型公司标配只有1-2名前端开发人员,而这些公司在开发中后台系统的时候,如果能有一套现成的中后台框架系统,不仅能提高项目开发效率,同时还大大减轻前端开发人员工作压力。
    • 项目型公司。 特点为项目多,周期短,甲方对页面布局和主题风格有绝对话语权,而通过专业版提供的布局和主题风格,可应对绝大部分甲方需求,并且可自定义扩展主题风格的样式,实现高度定制化。
    • 产品型公司。 产品型公司最担心的就是产品开发中代码不可控的因素,本框架除了提供完善的开发文档和代码注释外,作者还提供一对一的技术支持,确保开发人员尽可能理解整套框架源码的方方面面,为产品保驾护航。
    • 个人开发者。 手里有一套可高度定制化的中后台框架,什么项目都不用担心啦~

    为什么选择 One-step-admin

    • 作者拥有10年+的前后端开发经验。 部分框架的作者由于缺少后端开发经验,可能会在设计框架的时候,很少或者没有考虑后端的实现逻辑,导致框架在实际使用中,业务场景无法落地,开发人员得通过修改源码自行实现业务。
    • 经历过数十个真实项目的打磨。 没用在真实业务场景中使用过的框架都是纸飞机,哪怕它提供的演示功能特别华丽。而本框架在作者就职的公司,已经稳定应用在电商、直播、OA、CRM、ERP等多个不同领域的中后台系统中。
    • 丰富的组件库。 除了支持 Element Plus 自带的组件外,框架还扩充了部分业务组件,以及第三方插件。借助以往的项目经验,提供最佳实践方案,方便开发人员直接使用。
    • 持续更新的业务应用静态页面。 通过项目积累,沉淀出数十个业务应用的静态页面,做到开发人员拿来即可使用,极大提升开发效率的同时,还省去了产品和设计人员的工作。
    • 长期维护。 无论是免费的基础版,还是付费的专业版,均提供长期维护。区别在于基础版侧重于稳定性维护,主要在修复 bug ,不定期增加新特性;专业版侧重于新特性开发,在确保稳定的基础上,会长期深挖中后台系统框架,持续产出可落地的特性或开发规范。
    + + + + \ No newline at end of file diff --git a/components/action-container.html b/components/action-container.html new file mode 100644 index 00000000..8122b162 --- /dev/null +++ b/components/action-container.html @@ -0,0 +1,33 @@ + + + + + + ActionContainer 固定底部操作栏 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/auth-all.html b/components/auth-all.html new file mode 100644 index 00000000..c73f0cd4 --- /dev/null +++ b/components/auth-all.html @@ -0,0 +1,33 @@ + + + + + + AuthAll 鉴权 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/auth.html b/components/auth.html new file mode 100644 index 00000000..4e8db982 --- /dev/null +++ b/components/auth.html @@ -0,0 +1,33 @@ + + + + + + Auth 鉴权 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/chip.html b/components/chip.html new file mode 100644 index 00000000..7e34907f --- /dev/null +++ b/components/chip.html @@ -0,0 +1,33 @@ + + + + + + Chip 纸片 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/colorful-card.html b/components/colorful-card.html new file mode 100644 index 00000000..9d3f3a44 --- /dev/null +++ b/components/colorful-card.html @@ -0,0 +1,33 @@ + + + + + + ColorfulCard 多彩渐变卡片 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    ColorfulCard 多彩渐变卡片 专业版

    Props

    参数说明类型可选值默认值
    color-from开始颜色string-'#843cf6'
    color-to终止颜色string-'#759bff'
    header头部标题string--
    num数字标记number--
    tip底行提示文字string--
    icon图标,使用 SvgIcon 组件,与该组件 name 参数相同string--
    + + + + \ No newline at end of file diff --git a/components/file-upload.html b/components/file-upload.html new file mode 100644 index 00000000..78e989d0 --- /dev/null +++ b/components/file-upload.html @@ -0,0 +1,33 @@ + + + + + + FileUpload 文件上传 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    FileUpload 文件上传

    Props

    参数说明类型可选值默认值
    action必选参数,上传的地址string--
    headers设置上传的请求头部object--
    data上传时附带的额外参数object--
    name上传的文件字段名string-file
    size上传文件大小限制,单位为MBnumber-2
    max上传数量限制number-3
    files上传的文件列表,例如:[{name: 'xxx.jpg', url: 'http://xxx.cdn.com/xxx.jpg'}]array-[]
    notip是否隐藏提示栏boolean-false
    ext支持的文件类型array-['zip', 'rar']
    + + + + \ No newline at end of file diff --git a/components/i18n-selector.html b/components/i18n-selector.html new file mode 100644 index 00000000..2d2c611c --- /dev/null +++ b/components/i18n-selector.html @@ -0,0 +1,33 @@ + + + + + + I18nSelector 国际化选择器 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/icon-picker.html b/components/icon-picker.html new file mode 100644 index 00000000..7f052b20 --- /dev/null +++ b/components/icon-picker.html @@ -0,0 +1,33 @@ + + + + + + IconPicker 图标选择器 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/image-preview.html b/components/image-preview.html new file mode 100644 index 00000000..c28c232e --- /dev/null +++ b/components/image-preview.html @@ -0,0 +1,33 @@ + + + + + + ImagePreview 图片预览 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/image-upload.html b/components/image-upload.html new file mode 100644 index 00000000..b78ee4f7 --- /dev/null +++ b/components/image-upload.html @@ -0,0 +1,33 @@ + + + + + + ImageUpload 单图上传 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    ImageUpload 单图上传

    Props

    参数说明类型可选值默认值
    v-model图片地址string--
    action必选参数,上传的地址string--
    headers设置上传的请求头部object--
    data上传时附带的额外参数object--
    name上传的文件字段名string-file
    size上传文件大小限制,单位为MBnumber-2
    width展示宽度number-150
    height展示高度number-150
    placeholder占位图string--
    notip是否隐藏提示栏boolean-false
    ext支持的文件类型array-['jpg', 'png', 'gif', 'bmp']
    + + + + \ No newline at end of file diff --git a/components/images-upload.html b/components/images-upload.html new file mode 100644 index 00000000..437bf245 --- /dev/null +++ b/components/images-upload.html @@ -0,0 +1,33 @@ + + + + + + ImagesUpload 多图上传 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    ImagesUpload 多图上传

    Props

    参数说明类型可选值默认值
    v-model图片列表array-[]
    action必选参数,上传的地址string--
    headers设置上传的请求头部object--
    data上传时附带的额外参数object--
    name上传的文件字段名string-file
    max上传数量限制number-3
    size上传文件大小限制,单位为MBnumber-2
    width展示宽度number-150
    height展示高度number-150
    placeholder占位图string--
    notip是否隐藏提示栏boolean-false
    ext支持的文件类型array-['jpg', 'png', 'gif', 'bmp']
    + + + + \ No newline at end of file diff --git a/components/index.html b/components/index.html new file mode 100644 index 00000000..f5432940 --- /dev/null +++ b/components/index.html @@ -0,0 +1,44 @@ + + + + + + 介绍 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    介绍

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

    基础组件

    基础组件由 Element Plus 提供,其中包含按钮文字链接单选框多选框输入框计数器级联选择器开关滑块50+ 个组件。

    阅读并学习请查看 Element Plus 官方文档

    说明

    为了统一图标的使用,框架没有采用 Element Plus 官方图标的使用方式,这意味着部分 Element Plus 组件的 icon 属性将无法使用,例如 Button 按钮组件。

    template
    <!-- 无法使用 -->
    +<el-button icon="el-icon-edit">编辑</el-button>
    +
    +<!-- 可以使用插槽代替 -->
    +<el-button>
    +  <template #icon>
    +    <el-icon>
    +      <svg-icon name="ep:edit" />
    +    </el-icon>
    +  </template>
    +  编辑
    +</el-button>

    如果你习惯 Element Plus 官方图标的使用方式,需执行 pnpm install @element-plus/icons-vue 安装依赖,并按照官方的使用方式引入图标,点击查看详细介绍。

    替换组件库

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

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

    内建组件

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

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

    扩展组件

    扩展组件为框架封装的组件,有全新开发的组件,也有在 Element Plus 组件上二次封装的组件,还有一些则是封装了第三方的插件。

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

    + + + + \ No newline at end of file diff --git a/components/page-header.html b/components/page-header.html new file mode 100644 index 00000000..4371c65e --- /dev/null +++ b/components/page-header.html @@ -0,0 +1,33 @@ + + + + + + PageHeader 页头 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/page-main.html b/components/page-main.html new file mode 100644 index 00000000..d2b819ba --- /dev/null +++ b/components/page-main.html @@ -0,0 +1,33 @@ + + + + + + PageMain 内容块 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/pcas-cascader.html b/components/pcas-cascader.html new file mode 100644 index 00000000..2fabddad --- /dev/null +++ b/components/pcas-cascader.html @@ -0,0 +1,33 @@ + + + + + + PcasCascader 省市区街道联动 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    PcasCascader 省市区街道联动

    Props

    参数说明类型可选值默认值
    v-model联动数据选中项绑定值array-[]
    type联动类型,pc 省市、pca 省市区、pcas 省市区街道stringpc / pca / pcaspca
    format绑定数据的格式化类型stringcode / name / bothcode
    disabled是否禁用boolean-false
    + + + + \ No newline at end of file diff --git a/components/search-bar.html b/components/search-bar.html new file mode 100644 index 00000000..0505f803 --- /dev/null +++ b/components/search-bar.html @@ -0,0 +1,33 @@ + + + + + + SearchBar 搜索面板 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content
    + + + + \ No newline at end of file diff --git a/components/sparkline.html b/components/sparkline.html new file mode 100644 index 00000000..627d38e8 --- /dev/null +++ b/components/sparkline.html @@ -0,0 +1,33 @@ + + + + + + Sparkline 迷你图 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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/storage-box.html b/components/storage-box.html new file mode 100644 index 00000000..fbd3bd6f --- /dev/null +++ b/components/storage-box.html @@ -0,0 +1,33 @@ + + + + + + StorageBox 储存箱 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    StorageBox 储存箱 专业版

    Props

    参数说明类型可选值默认值
    data需要储存的数据object / array--
    name数据存放的命名空间string--
    title下拉面板标题string-'储存箱'

    Slots

    name说明
    -触发下拉面板的 HTML 内容

    Events

    事件名称说明回调参数
    take-out点击下拉面板中某条记录的事件回调记录的数据
    + + + + \ No newline at end of file diff --git a/components/svg-icon.html b/components/svg-icon.html new file mode 100644 index 00000000..e198d63e --- /dev/null +++ b/components/svg-icon.html @@ -0,0 +1,33 @@ + + + + + + SvgIcon SVG图标 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/trend.html b/components/trend.html new file mode 100644 index 00000000..70ba3212 --- /dev/null +++ b/components/trend.html @@ -0,0 +1,33 @@ + + + + + + Trend 趋势标记 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/copyright.png b/copyright.png new file mode 100644 index 00000000..c7b9ff53 Binary files /dev/null and b/copyright.png differ diff --git a/download.png b/download.png new file mode 100644 index 00000000..7f532eee Binary files /dev/null and b/download.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 00000000..c30ac95c Binary files /dev/null and b/favicon.ico differ diff --git a/favorites.png b/favorites.png new file mode 100644 index 00000000..f54b3d8b Binary files /dev/null and b/favorites.png differ diff --git a/font1.png b/font1.png new file mode 100644 index 00000000..7a72fdc5 Binary files /dev/null and b/font1.png differ diff --git a/font2.png b/font2.png new file mode 100644 index 00000000..e53aa5bb Binary files /dev/null and b/font2.png differ diff --git a/friend-wechat.png b/friend-wechat.png new file mode 100644 index 00000000..0832dfd6 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 00000000..9f9fce61 --- /dev/null +++ b/guide/api.html @@ -0,0 +1,64 @@ + + + + + + 常用 API | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    常用 API

    接口请求

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

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

    鉴权

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

    ts
    import useAuth from '@/utils/composables/useAuth'
    +
    +const { auth, authAll } = useAuth()
    +
    +auth()
    +authAll()

    主导航

    切换

    切换主导航,index 为主导航序列数。

    ts
    import useMenu from '@/utils/composables/useMenu'
    +
    +useMenu().switchTo(index)

    窗口

    新增窗口

    ts
    import useWindow from '@/utils/composables/useWindow'
    +
    +useWindow.add('windowName')
    +
    +useWindow.add({
    +  title: '窗口标题',
    +	name: 'windowName'
    +})

    关闭窗口

    ts
    import useWindow from '@/utils/composables/useWindow'
    +
    +useWindow().remove('windowName')

    窗口全屏切换 专业版

    ts
    import useWindow from '@/utils/composables/useWindow'
    +
    +useWindow().toggleMaximize('windowName')

    判断窗口是否全屏 专业版

    ts
    import useWindow from '@/utils/composables/useWindow'
    +
    +useWindow().isMaximize('windowName')  // true / false

    窗口刷新

    ts
    import useWindow from '@/utils/composables/useWindow'
    +
    +useWindow().reload('windowName')

    事件总线

    基于 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 00000000..f611bb91 --- /dev/null +++ b/guide/axios.html @@ -0,0 +1,130 @@ + + + + + + 与服务端交互 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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 00000000..4b83ef89 --- /dev/null +++ b/guide/build.html @@ -0,0 +1,41 @@ + + + + + + 构建与预览 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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 安装指定模块并开启后才会生效。

    其它设置

    在环境配置文件里除了可以设置压缩选项,还可设置:

    # 是否在打包时生成 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 00000000..75c9fc9a --- /dev/null +++ b/guide/changelog.html @@ -0,0 +1,65 @@ + + + + + + 更新日志 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    更新日志

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

    4.7.0

    基础版

    🚨 Breaking Changes

    • 重构登录页面  -  by @hooray (b1cb9)

    🚀 Features

    • 扩充 unocss 自定义 shortcuts  -  by @hooray (6258e)
    • SvgIcon 组件支持传入本地图片,网络图片增加载入和失败状态  -  by @hooray (cea64)
    • 引入 postcss-nested  -  by @hooray (2ce2b)

    专业版

    🚨 Breaking Changes

    • 重构登录页面  -  by @hooray (f77f3)
    • 移除 I18nSelector 组件  -  by @hooray (83dd8)

    🚀 Features

    • 扩充 unocss 自定义 shortcuts  -  by @hooray (15a3f)
    • SvgIcon 组件支持传入本地图片,网络图片增加载入和失败状态  -  by @hooray (a1a81)
    • 引入 postcss-nested  -  by @hooray (5f4d6)

    4.6.0

    基础版

    🚨 Breaking Changes

    • 移除createInjectionKey函数  -  by @hooray (09d49)
    • 窗口宽度改为配置文件全局设置  -  by @hooray (fa5c5)

    🚀 Features

    • 上传组件增加自定义上传  -  by @hooray (43851)
    • FileUpload 组件文件列表增加下载功能  -  by @hooray (09b21)

    专业版

    🚨 Breaking Changes

    • 移除createInjectionKey函数,全局provide的generateI18nTitle函数放到useMenu()里提供  -  by @hooray (ebc63)
    • 调整 menu.enableSubMenuCollapseButton 的展示逻辑  -  by @hooray (3a6d7)

    🚀 Features

    • 上传组件增加自定义上传  -  by @hooray (dab41)
    • 窗口宽度改为在配置文件全局设置,支持单独设置窗口宽度  -  by @hooray (3837a)
    • FileUpload 组件文件列表增加下载功能  -  by @hooray (fd0ca)

    🐞 Bug Fixes

    • 修复类型警告  -  by @hooray (9783f)
    • 修复主题跟随系统且系统为明亮模式时,水印不生效  -  by @hooray (f9498)

    4.5.0

    基础版

    🚨 Breaking Changes

    • 配置项 menu.menuMode 变更为 menu.mode  -  by @hooray (10415)

    🚀 Features

    • 增加禁用开发者工具环境变量  -  by @hooray (306f3)
    • 新增哀悼模式和色弱模式  -  by @hooray (3c299)

    🐞 Bug Fixes

    • 修复vscode失效配置  -  by @hooray (e5cfa)

    专业版

    🚨 Breaking Changes

    • 配置项 menu.menuActiveStyle 变更为 menu.style  -  by @hooray (fce08)
    • 配置项 menu.menuMode 变更为 menu.mode  -  by @hooray (9091d)

    🚀 Features

    • 增加2种导航栏模式 side-panel / head-panel  -  by @hooray (cab92)
    • 增加禁用开发者工具环境变量  -  by @hooray (f2ef8)
    • 新增哀悼模式和色弱模式  -  by @hooray (9ebc8)

    🐞 Bug Fixes

    • 移除无用逻辑判断  -  by @hooray (51e90)
    • 修复vscode失效配置  -  by @hooray (d2dda):::

    4.4.1

    基础版

    无重大变化

    专业版

    🐞 Bug Fixes

    • 修复有 badge 的一级导航在收起时展示和其他导航不一样的问题  -  by @hooray (1441c)

    4.4.0

    基础版

    🚀 Features

    • 登录页增加扫码登录参考  -  by @hooray (bafaa)

    🐞 Bug Fixes

    • 修复顶部导航鼠标滚动回弹  -  by @hooray (216ac)
    • 修复顶部导航数量过多,导致工具栏被遮挡  -  by @hooray (f49b6)

    专业版

    🚨 Breaking Changes

    • 移除导航i18n配置项,合并到title配置项内  -  by @hooray (1921b)

    🚀 Features

    • 登录页增加扫码登录参考  -  by @hooray (fc082)

    🐞 Bug Fixes

    • 修复顶部导航鼠标滚动回弹  -  by @hooray (1d900)
    • 修复顶部导航数量过多,导致工具栏被遮挡  -  by @hooray (4c70b)
    • 修复水印开启报错  -  by @hooray (33add)

    4.3.0

    基础版

    无重大变化

    专业版

    🚀 Features

    • 提供 $t 函数,用于菜单 i18n 能在 VSCode I18n Ally 插件下正确显示  -  by @hooray (d8039)
    • 工具栏部分按钮增加交互动效  -  by @hooray (8f597)
    • 支持 RTL 模式  -  by @hooray (97483)

    🐞 Bug Fixes

    • 修复 mock 模板请求无响应数据  -  by @hooray (6c92d)

    4.2.3

    基础版

    无重大变化

    专业版

    无重大变化

    4.2.2

    基础版

    无重大变化

    专业版

    无重大变化

    4.2.1

    基础版

    无重大变化

    专业版

    🐞 Bug Fixes

    • 修复 IconPicker 组件样式错乱  -  by @hooray (3bd3b)

    4.2.0

    基础版

    🚀 Features

    • 引入 unplugin-turbo-console 优化开发体验  -  by @hooray (43d09)
    • 增加打包后生成存档文件支持  -  by @hooray (66d9e)
    • 增加图片支持,整站图标改用 unocss icon 方式使用,方便在内网环境使用  -  by @hooray (4bccd)
    • 导航菜单收起时,无二级的一级导航增加 tooltip 展示  -  by @hooray (5e61c)
    • 明暗模式设置为跟随系统时,支持动态切换  -  by @hooray (98792)

    🐞 Bug Fixes

    • Mock 数据修复  -  by @hooray (fd2f6)

    专业版

    🚨 Breaking Changes

    • 重构用户偏好模块,偏好设置可存放在 localStorage  -  by @hooray (7a554)
    • 重构页面水印,支持动态更新  -  by @hooray (7cdc8)
    • 移除内置 v-waves 指令,使用第三方 v-wave 插件  -  by @hooray (a7505)

    🚀 Features

    • 引入 unplugin-turbo-console 优化开发体验  -  by @hooray (f644e)
    • 增加打包后生成存档文件支持  -  by @hooray (2bb50)
    • SvgIcon 增加图片支持,整站图标改用 unocss icon 方式使用,方便在内网环境使用  -  by @hooray (d5715)
    • 导航菜单收起时,无二级的一级导航增加 tooltip 展示  -  by @hooray (95cf8)
    • 明暗模式设置为跟随系统时,支持动态切换  -  by @hooray (c7bcb)
    • 增加 v-zoomable 图片预览指令  -  by @hooray (3d58e)

    🐞 Bug Fixes

    • Mock 数据修复  -  by @hooray (5c9ba)

    4.1.0

    基础版

    🚨 Breaking Changes

    • Vite-plugin-fake-server 替换 vite-plugin-mock  -  by @hooray (38039)
    • 应用配置 toolbar 对象内属性调整  -  by @hooray (e2aaf)

    专业版

    🚨 Breaking Changes

    • Vite-plugin-fake-server 替换 vite-plugin-mock  -  by @hooray (bdfa4)
    • 应用配置 toolbar 对象内属性调整  -  by @hooray (c2915)

    🚀 Features

    • 应用配置新增 menu.subMenuAutoCollapse ,支持次导航收起时,鼠标悬停临时展开  -  by @hooray (970ef)
    • 应用配置新增 toolbar.layout 属性,支持工具栏自定义布局  -  by @hooray (cc87f)

    4.0.1

    基础版

    🐞 Bug Fixes

    • 修复登录页 Copyright 组件未展示  -  by @hooray (0b03a)

    专业版

    🐞 Bug Fixes

    • 修复登录页 Copyright 组件未展示  -  by @hooray (a808f)

    4.0.0

    基础版

    🚨 Breaking Changes

    • 启用新的 eslint 配置文件  -  by @hooray (5f9f1)
    • 移除应用配置中 Element Plus 默认尺寸的配置项  -  by @hooray (dfc51)

    🚀 Features

    • 支持使用 Iconify 完整图标库  -  by @hooray (2d642)
    • 重构框架核心源码  -  by @hooray (874e3)
    • Eslint 增加 unocss 配置  -  by @hooray (dcbcc)

    专业版

    🚨 Breaking Changes

    • 启用新的 eslint 配置文件  -  by @hooray (66160)
    • 移除应用配置中 Element Plus 默认尺寸的配置项  -  by @hooray (6720a)

    🚀 Features

    • 重构框架核心源码  -  by @hooray (215ef)
    • 全局搜索支持拼音  -  by @hooray (cbb68)
    • Eslint 增加 unocss 配置  -  by @hooray (0b078)

    🐞 Bug Fixes

    • 修复收藏夹默认存储位置错误  -  by @hooray (d2a2d)
    • 拥抱原子化 CSS ,启用 UnoCSS ,并对框架部分组件样式进行了重构

      如果你正在将老版本的业务代码向新版本迁移,推荐安装 UnoCSS 这个 VSCode 插件,它能高亮显示 UnoCSS 的代码。如果你的业务页面代码中定义的 class 和 UnoCSS 的 class 重名,也可以通过这个插件快速识别到并修改。

    • 与 Element Plus 组件库解耦,方便替换成其他第三方 UI 组件库,详细可阅读:

    • ESLint 配置文件格式调整,详细可阅读《代码规范 - ESLint 配置

      ESLint 提供了全新的配置方式,所有配置项将都在一个 eslint.config.js 文件中实现。

    • 基础版现在可以使用 Iconify 完整图标库,详细可阅读《图标 - Iconify 图标

    • 全新的主题配色方案,详细可阅读《主题 - 框架主题

    • 移除 Element Plus 自定义主题配置

      如果你依旧需要自定义 Element Plus 的主题,可以阅读 Element Plus 官方文档《自定义主题》,或者参考下面提供的最佳实践。

      /src/assets/styles/ 目录下分别新建 element-plus.scsselement-plus.dark.scss 并写入下面的代码:

      scss
      // element-plus.scss
      +@forward "element-plus/theme-chalk/src/common/var.scss" with (
      +  $colors: (
      +    "primary": (
      +      "base": green
      +    )
      +  )
      +);
      +@use "element-plus/theme-chalk/src/index.scss" as *;
      +@use "./element-plus.dark.scss" as *;
      scss
      // element-plus.dark.scss
      +@forward "element-plus/theme-chalk/src/dark/var.scss" with (
      +  $bg-color: (
      +    "page": #0a0a0a,
      +    "": #141414,
      +    "overlay": #1d1e1f,
      +  )
      +);
      +@use "element-plus/theme-chalk/src/dark/css-vars.scss" as *;

      修改 /src/main.ts

      ts
      ...
      +import ElementPlus from 'element-plus'
      +import 'element-plus/dist/index.css'
      +import 'element-plus/theme-chalk/dark/css-vars.css'
      +import '@/assets/styles/element-plus.scss'
      +...
    • 移除应用配置中 Element Plus 默认尺寸的配置项

      如果你依旧需要全局配置 Element Plus 的默认尺寸,可以参考《Config Provider 全局配置》并在 /src/App.vue 中进行修改。

    • 移除精灵图支持

      原有 /src/assets/sprites/ 目录中的图片,现在可以移动到 /src/assets/images/ 目录中,并修改代码中的使用方式。

    • 应用配置中导航栏填充风格的配置项名称变更 专业版

      ts
      const globalSettings: Settings.all = {
      +  menu: {
      +    /**
      +    * 留空默认
      +    * radius 圆角
      +    */
      +    menuFillStyle: '', 
      +    // 导航栏是否圆角
      +    isRounded: false, 
      +  },
      +}

    3.1.3

    基础版

    无重大变化

    专业版

    无重大变化

    3.1.2

    基础版

    无重大变化

    专业版

    无重大变化

    3.1.1

    基础版

    无重大变化

    专业版

    无重大变化

    3.1.0

    基础版

    无重大变化

    专业版

    🚀 Features

    • 增加收藏夹  -  by @hooray (7146d)
    • 新增用户偏好设置  -  by @hooray (ba111)

    3.0.0

    基础版

    🚨 Breaking Changes

    • 移除 BatchActionBar 组件  -  by @hooray (b1f8f)
    • 移除 Editor 组件  -  by @hooray (2ea5f)
    • 移除 vite-plugin-html 插件  -  by @hooray (9d1d3)
    • 调整应用配置的配置项,并将应用配置按钮从工具栏删除  -  by @hooray (ceffd)
    • 重构接口请求,统一管理接口请求模块  -  by @hooray (301d7)

    🚀 Features

    • 引入 stylelint-stylistic 插件  -  by @hooray (38e3f)

    🐞 Bug Fixes

    • 修复 axios baseURL 配置,解决构建后 baseURL 不生效的问题  -  by @hooray (87963)

    专业版

    🚨 Breaking Changes

    • 移除 BatchActionBar 组件  -  by @hooray (ca569)
    • 移除 Editor 组件  -  by @hooray (6fff3)
    • 移除 vite-plugin-html 插件  -  by @hooray (f9c4e)
    • 调整应用配置的配置项,并将应用配置按钮从工具栏删除  -  by @hooray (abea5)
    • 重构标准模块,增加表格高度自适应功能  -  by @hooray (f20ca)
    • 重构接口请求,统一管理接口请求模块  -  by @hooray (831ab)

    🚀 Features

    • 引入 stylelint-stylistic 插件  -  by @hooray (f0826)
    • 新增 StorageBox 组件  -  by @hooray (38efb)
    • 增加明暗切换过渡动效  -  by @hooray (44045)

    🐞 Bug Fixes

    • 修复 axios baseURL 配置,解决构建后 baseURL 不生效的问题  -  by @hooray (3fa26)
    • 增加 dropdown 组件外边框的临时解决方案  -  by @hooray (9cd44)

    2.3.2

    基础版

    无重大变化

    专业版

    无重大变化

    2.3.1

    基础版

    无重大变化

    专业版

    无重大变化

    2.3.0

    基础版

    🚨 Breaking Changes

    • Pinia store 改为 setup 写法  -  by @hooray (1cd93)
    • UseCurrentInstance() 重命名为 useGlobalProperties()  -  by @hooray (0311a)

    专业版

    🚨 Breaking Changes

    • Pinia store 改为 setup 写法  -  by @hooray (040a5)
    • UseCurrentInstance() 重命名为 useGlobalProperties()  -  by @hooray (39d56)

    🐞 Bug Fixes

    • 修复顶部主导航国际化配置不生效  -  by @hooray (02548)
    • 修复切换国际化语言时,主导航激活项被复原到第一个  -  by @hooray (e6846)

    2.2.0

    基础版

    🐞 Bug Fixes

    • 修复次导航收起时图标不居中  -  by @hooray (2b5ca)

    专业版

    🚀 Features

    • 个人设置窗口补充 i18n 配置  -  by @hooray (2655c)

    🐞 Bug Fixes

    • 修复次导航收起时图标不居中  -  by @hooray (2fc11)
    • 修复主导航国际化配置不生效  -  by @hooray (490b1)

    2.1.0

    基础版

    🐞 Bug Fixes

    • 修复类型报错  -  by @hooray (8aba7)

    专业版

    🐞 Bug Fixes

    • 修复 mock 文件后缀名错误  -  by @hooray (8bc65)
    • 修复无法打开修改密码窗口的问题  -  by @hooray (0c353)
    • 修复类型报错  -  by @hooray (56855)

    2.0.0

    基础版

    🚨 Breaking Changes

    • TypeScript 支持  -  by @hooray (0b8ac)

    专业版

    🚨 Breaking Changes

    • TypeScript 支持  -  by @hooray (13b2c)

    v1.0.0

    基础版

    JS 版本存档,框架下次更新将切换到 TS 版本,JS 版本将不再维护。

    专业版

    JS 版本存档,框架下次更新将切换到 TS 版本,JS 版本将不再维护。

    + + + + \ No newline at end of file diff --git a/guide/coding-standard.html b/guide/coding-standard.html new file mode 100644 index 00000000..fdb9c40e --- /dev/null +++ b/guide/coding-standard.html @@ -0,0 +1,53 @@ + + + + + + 代码规范 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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 配置

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

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

    TIP

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

    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/one-step-admin/ ,则在 package.json 里找到 simple-git-hooks 配置并修改:

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

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

    移除

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

    json
    {
    +  "scripts": {
    +    "postinstall": "simple-git-hooks && esno scripts/prepare.js", 
    +    "postinstall": "esno scripts/prepare.js", 
    +  },
    +  "simple-git-hooks": { 
    +    "pre-commit": "pnpm lint-staged", 
    +    "preserveUnused": true
    +  }, 
    +}
    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/components.html b/guide/components.html new file mode 100644 index 00000000..d7fa367f --- /dev/null +++ b/guide/components.html @@ -0,0 +1,49 @@ + + + + + + 介绍 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    介绍

    框架提供一系列的组件方便快速开发,其中基础组件Element Plus 原生提供的组件;而扩展组件有一部分是在 Element Plus 组件上进行了二次开发,还有一部分是封装了第三方插件。

    组件源码完全开放,如果觉得用着不顺手,可以到 /src/components/ 目录下找到对应组件进行修改。

    基础组件

    基础组件由 Element Plus 提供,其中包含按钮文字链接单选框多选框输入框计数器级联选择器开关滑块50+ 个组件。

    阅读并学习请查看 Element Plus 官方文档

    TIP

    框架严格按照 Element Plus 推荐的使用方式进行引入,即按需自动导入,意味着你可以直接在代码里使用组件,而无需手动注册。

    但也意味着 Element Plus 一些全局方法将无法使用,例如 Message 消息提示组件。

    js
    // 无法使用
    +const { proxy } = getCurrentInstance()
    +proxy.$message.success(options)
    +
    +// 可以使用
    +ElMessage.success(options)

    另外因为框架没有采用 Element Plus 官方的图标使用方式,这也意味着部分组件的 icon 属性将无法使用,例如 Button 按钮组件。

    template
    <!-- 无法使用 -->
    +<el-button icon="el-icon-edit">编辑</el-button>
    +
    +<!-- 可以使用插槽代替 -->
    +<el-button>
    +    <template #icon>
    +        <el-icon>
    +            <svg-icon name="ep:edit" />
    +        </el-icon>
    +    </template>
    +    编辑
    +</el-button>

    扩展组件

    + + + + \ No newline at end of file diff --git a/guide/configure.html b/guide/configure.html new file mode 100644 index 00000000..6ec740d3 --- /dev/null +++ b/guide/configure.html @@ -0,0 +1,94 @@ + + + + + + 配置 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    配置

    环境配置

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

    yaml
    # 应用配置面板
    +VITE_APP_SETTING = true
    +# 页面标题
    +VITE_APP_TITLE = One-step-admin
    +# 接口请求地址,会设置到 axios 的 baseURL 参数上
    +VITE_APP_API_BASEURL = /
    +# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
    +VITE_APP_DEBUG_TOOL =
    +# 是否禁用开发者工具,可防止被调试
    +VITE_APP_DISABLE_DEVTOOL = false
    +
    +# 是否开启代理
    +VITE_OPEN_PROXY = false
    yaml
    # 应用配置面板
    +VITE_APP_SETTING = false
    +# 页面标题
    +VITE_APP_TITLE = One-step-admin
    +# 接口请求地址,会设置到 axios 的 baseURL 参数上
    +VITE_APP_API_BASEURL = /
    +# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
    +VITE_APP_DEBUG_TOOL =
    +# 是否禁用开发者工具,可防止被调试
    +VITE_APP_DISABLE_DEVTOOL = false
    +
    +# 是否在打包时启用 Mock
    +VITE_BUILD_MOCK = false
    +# 在构建时生成 sourcemap
    +VITE_BUILD_SOURCEMAP = true
    +# 在构建时开启压缩,支持 gzip 和 brotli
    +VITE_BUILD_COMPRESS =
    +# 是否在打包后生成存档,支持 zip 和 tar
    +VITE_BUILD_ARCHIVE =
    yaml
    # 应用配置面板
    +VITE_APP_SETTING = false
    +# 页面标题
    +VITE_APP_TITLE = One-step-admin
    +# 接口请求地址,会设置到 axios 的 baseURL 参数上
    +VITE_APP_API_BASEURL = /
    +# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
    +VITE_APP_DEBUG_TOOL =
    +# 是否禁用开发者工具,可防止被调试
    +VITE_APP_DISABLE_DEVTOOL = false
    +
    +# 是否在打包时启用 Mock
    +VITE_BUILD_MOCK = true
    +# 在构建时生成 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_APP_DISABLE_DEVTOOL 为必要配置,即不管是在开发、测试,还是生产环境都需要使用到。而其余配置则在不同环境下有不同用途,例如开发环境用于本地开发使用,测试环境和生产环境用于构建使用。

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

    注意

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

    如果希望提供用户一些定制化的能力,可以开启偏好设置,详细可阅读《用户偏好设置

    应用配置(框架配置)

    开发者请在 /src/settings.ts 文件中设置自定义配置,而 /src/settings.default.ts 为框架的默认配置,请勿在该文件内修改。

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

    ts
    // 这是基础版演示源码里的自定义配置示例
    +const globalSettings: Settings.all = {
    +  app: {
    +    enablePermission: true,
    +  },
    +  menu: {
    +    enableSubMenuCollapseButton: true,
    +    enableHotkeys: true,
    +  },
    +  toolbar: {
    +    enableFullscreen: true,
    +    enableColorScheme: true,
    +  },
    +}

    注意

    如果文档中提供的配置介绍,在你本地的开发环境中报错或者无法生效,说明你使用的版本不支持或者配置参数有变动,你可以打开 /src/settings.default.ts 查看当前版本的完整配置作为参考。并且如果你使用的是 Visual Studio Code ,鼠标悬浮到属性上时,会有属性的介绍:

    + + + + \ No newline at end of file diff --git a/guide/copyright.html b/guide/copyright.html new file mode 100644 index 00000000..82ebf7c0 --- /dev/null +++ b/guide/copyright.html @@ -0,0 +1,53 @@ + + + + + + 版权信息 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content
    + + + + \ No newline at end of file diff --git a/guide/error-log.html b/guide/error-log.html new file mode 100644 index 00000000..b56fffc2 --- /dev/null +++ b/guide/error-log.html @@ -0,0 +1,37 @@ + + + + + + 错误日志 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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/favorites.html b/guide/favorites.html new file mode 100644 index 00000000..d9c8c523 --- /dev/null +++ b/guide/favorites.html @@ -0,0 +1,37 @@ + + + + + + 收藏夹 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    收藏夹 专业版

    需在工具栏开启,开启后用户可将常用的导航菜单添加进收藏夹,方便快速访问。

    处理请求

    收藏夹默认存储在浏览器本地 localStorage 里,如果需要将数据存储到服务器,可以通过 favorites.storageTo 配置项来实现,具体配置如下:

    ts
    const globalSettings: Settings.all = {
    +  favorites: {
    +    storageTo: 'server',
    +  },
    +}

    然后到 /src/api/modules/user.ts 中找到 favorites()favoritesEdit() 这两个函数,并分别修改这两个函数的请求地址。

    建议

    为减轻后端处理,数据会直接以 JSON 字符串进行存储,建议后端可以在用户表增加相关字段,并将字段类型设为 lonetext

    + + + + \ No newline at end of file diff --git a/guide/font.html b/guide/font.html new file mode 100644 index 00000000..b4eaf26a --- /dev/null +++ b/guide/font.html @@ -0,0 +1,36 @@ + + + + + + 自定义字体 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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/i18n.html b/guide/i18n.html new file mode 100644 index 00000000..54823f52 --- /dev/null +++ b/guide/i18n.html @@ -0,0 +1,90 @@ + + + + + + 国际化 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    国际化 专业版

    INFO

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

    vscode 扩展

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

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

    语言选择器

    在应用配置里设置后,会在顶栏里显示语言选择器。

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    enableI18n: true,
    +  },
    +}

    同时还可在应用配置里设置默认语言,可选设置的值参考 /src/locales/lang/ 目录下文件名,留空则会根据浏览器语言自动判断,如果找不到对应的语言则使用 中文(简体) 兜底。

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

    语言包

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

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

    ts
    import elementLocaleZhCN from 'element-plus/lib/locale/lang/zh-cn'
    +import elementLocaleZhTW from 'element-plus/lib/locale/lang/zh-tw'
    +import elementLocaleEn from 'element-plus/lib/locale/lang/en'
    +// 引用 Element Plus 的日文语言包
    +import elementLocaleJa from 'element-plus/lib/locale/lang/ja'
    +
    +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
    +}

    修改完成后,需要重新启动项目才会生效。

    导航设置

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

    ts
    title: 'menu.i18n',

    框架设置

    以中文(简体)为例,打开 /src/locales/lang/zh-cn.json 文件可以看到框架相关的配置,在 app 对象里的就是框架部分的语言信息,如果需要对框架进行二次开发,请在这里扩展。

    json
    {
    +  "app": {
    +    "account": "用户名",
    +    "captcha": "验证码",
    +    "check": "确认",
    +    "goLogin": "去登录",
    +    "login": "登录",
    +    "logout": "退出登录",
    +    "newPassword": "新密码",
    +    "password": "密码",
    +    "profile": "个人设置",
    +    "sendCaptcha": "发送验证码"
    +  }
    +}

    单页组件

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

    与服务端交互

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

    关闭国际化

    如果不想开启国际化,可参考以下设置,该设置表示关闭语言选择器,并以中文(简体)显示。

    ts
    const globalSettings: Settings.all = {
    +  app: {
    +    defaultLang: 'zh-cn',
    +  },
    +  toolbar: {
    +    enableI18n: false,
    +  },
    +}
    + + + + \ No newline at end of file diff --git a/guide/intro.html b/guide/intro.html new file mode 100644 index 00000000..6a5ac53e --- /dev/null +++ b/guide/intro.html @@ -0,0 +1,33 @@ + + + + + + 文档说明 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    文档说明

    ⭐⭐⭐⭐⭐

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

    star

    star

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

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

    + + + + \ No newline at end of file diff --git a/guide/layout.html b/guide/layout.html new file mode 100644 index 00000000..767d2381 --- /dev/null +++ b/guide/layout.html @@ -0,0 +1,61 @@ + + + + + + 布局 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    布局

    通过 7 种导航栏模式和 4 种页宽模式的组合搭配,可实现 28 种布局结构,再搭配默认提供的 6 款主题,即可实现上百种界面风格

    导航栏模式

    在应用配置里进行设置,可实现 7 种导航栏模式:

    • 顶部模式
    • 侧边栏模式(含主导航)
    • 侧边栏模式(无主导航)
    • 侧边栏精简模式 专业版
    • 顶部精简模式 专业版
    • 侧边栏面板模式 专业版 v4.5.0 新增
    • 顶部面板模式 专业版 v4.5.0 新增

    顶部模式

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'head', // v4.5.0 之前版本为 menuMode
    +  },
    +}

    侧边栏模式(含主导航)

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'side', // v4.5.0 之前版本为 menuMode
    +  },
    +}

    侧边栏模式(无主导航)

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'single', // v4.5.0 之前版本为 menuMode
    +  },
    +}

    侧边栏精简模式 专业版

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'only-side', // v4.5.0 之前版本为 menuMode
    +  },
    +}

    顶部精简模式 专业版

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'only-head', // v4.5.0 之前版本为 menuMode
    +  },
    +}

    侧边栏面板模式 专业版 v4.5.0 新增

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'side-panel',
    +  },
    +}

    顶部面板模式 专业版 v4.5.0 新增

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    mode: 'head-panel',
    +  },
    +}

    变量

    布局相关的变量存放在 /src/assets/styles/globals.css 文件中(注意看注释),均为 CSS 变量。

    + + + + \ No newline at end of file diff --git a/guide/login.html b/guide/login.html new file mode 100644 index 00000000..db89bee4 --- /dev/null +++ b/guide/login.html @@ -0,0 +1,33 @@ + + + + + + 登录 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content
    + + + + \ No newline at end of file diff --git a/guide/menu.html b/guide/menu.html new file mode 100644 index 00000000..9449ac2c --- /dev/null +++ b/guide/menu.html @@ -0,0 +1,65 @@ + + + + + + 导航 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    导航

    项目导航配置存放在 /src/menu/modules/ 目录下,每一个 ts 文件会被视为一个导航模块。

    所有配置的导航模块均需要在 /src/menu/index.ts 文件里进行引入并放到主导航下。

    基本配置

    一级导航

    一个导航模块包含以下结构:

    ts
    const menus: Menu.recordRaw = {
    +  title: '演示',
    +  windowName: 'Example',
    +}
    +
    +export default menus

    注意事项

    整个项目所有导航的 windowName 不能重复

    多级导航

    ts
    const menus: Menu.recordRaw = {
    +  title: '演示',
    +  children: [
    +    {
    +      title: '演示页面',
    +      windowName: 'Example',
    +    },
    +  ],
    +}
    +
    +export default menus

    外链

    只需要将 windowName 设置为需要跳转的 HTTP 地址即可。

    ts
    const menus: Menu.recordRaw = {
    +  title: '官网',
    +  windowName: 'https://one-step-admin.hurui.me',
    +}
    +
    +export default menus

    主导航

    主导航会将我们配置好的导航模块进行归类,在 /src/menu/index.ts 里进行设置。

    ts
    const menu = [
    +  {
    +    title: '演示',
    +    icon: 'sidebar-default',
    +    children: [
    +      WindowExample,
    +    ],
    +  },
    +]

    主导航只需设置 titleiconchildren 三个参数,其中 children 则是存放我们配置的导航模块数据。

    导航配置

    title

    类型是否必须默认值说明
    string✔️/导航展示的标题
    v4.4.0 开始,专业版 支持设置 i18n 对应的 key 值,详细可阅读《国际化》。

    windowName

    类型是否必须默认值说明
    string✔️/窗口组件名,确保唯一

    windowWidth 专业版 v4.6.0 新增

    类型是否必须默认值说明
    string / number✖️/窗口宽度,设置为数字时单位为 px

    i18n 专业版 v4.4.0 移除

    类型是否必须默认值说明
    string✖️/标题国际化对应的 key 值

    详细可阅读《国际化》。

    noTitle 专业版

    类型是否必须默认值说明
    boolean✖️false是否显示窗口标题栏

    icon

    类型是否必须默认值说明
    string✖️/导航中显示的图标

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

    auth

    类型是否必须默认值说明
    string / array✖️/该路由访问权限,支持多个权限叠加,只要满足一个,即可进入

    用户在登录时,会获取用户权限,根据权限去过滤并动态注册路由。所以没有权限的路由不会被注册,也不会在侧边栏导航里显示,详细可阅读《权限 - 路由权限》。

    badge 专业版

    类型是否必须默认值说明
    boolean / number / string✖️/导航标记

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

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

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

    ts
    badge: () => globalStore.number

    params

    类型是否必须默认值说明
    object✖️/窗口外部传入参数

    该属性通常不在导航里直接配置,而是通过调用全局 useWindow() 提供的 API ,在打开非导航窗口时动态传入窗口所需要的参数。

    后端生成

    在应用配置里开启:

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    baseOn: 'backend'
    +  }
    +}

    开启后在 /src/api/modules/app.ts 文件里找到 menuList() 这个函数,并修改这个函数的请求地址,请求返回的数据就是导航数据,你可以在 /src/mock/app.ts 里查看 mock 数据。

    开启后端生成后,导航权限有两种做法,第一种是返回全部的导航数据,让框架自行处理(推荐),第二种是后端直接返回用户具备访问权限的导航数据。

    + + + + \ No newline at end of file diff --git a/guide/permission.html b/guide/permission.html new file mode 100644 index 00000000..23a57121 --- /dev/null +++ b/guide/permission.html @@ -0,0 +1,76 @@ + + + + + + 权限 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    权限

    首先需要在应用配置里开启权限功能。

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

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

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

    鉴权组件

    页面中某个模块,当前用户具备该权限是如何显示,不具备该权限又是如何显示,针对这样的需求,框架提供了 <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'])
    + + + + \ No newline at end of file diff --git a/guide/plop-module.html b/guide/plop-module.html new file mode 100644 index 00000000..21b69e03 --- /dev/null +++ b/guide/plop-module.html @@ -0,0 +1,88 @@ + + + + + + 标准模块 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    标准模块 专业版

    在《代码文件自动生成 - module》里介绍了如何快速生成一个标准模块,这个标准模块是一个最基础的 CURD 模块,它包含列表页和编辑页,同时提供了搜索和删除的功能,并且同时也可以生成对应的 mock 文件,在这基础上可以更方便的进行业务扩展。

    下面我就实际操作一遍,并介绍一下这个标准模块有哪些特性。

    用法说明

    ? 请选择需要创建的模式: module - 创建标准窗口
    +? 请输入窗口组件名称 test window
    +? 请输入模块中文名称 默认模块
    +? 是否生成 Mock Yes
    +√  ++ \src\views\windows\TestWindow\index.vue
    +√  ++ \src\views\windows\TestWindow\components\DetailForm\index.vue
    +√  ++ \src\views\windows\TestWindow\components\FormMode\index.vue
    +√  ++ \src\mock\test-window.js

    这里我已经通过命令在 /src/views/windows/ 目录下创建好了一个 TestWindow 文件夹,并且也生成了 mock 数据。接下来需要去配置下导航,这样我们才可以在导航栏里访问到。

    首先在 /src/menu/modules/ 目录下新建一个 test.window.ts 文件,并在里面复制以下代码:

    ts
    cosnt menus: Menu.recordRaw = {
    +    title: '测试模块',
    +    windowName: 'TestWindow'
    +}
    +
    +export default menus

    然后到 /src/router/routes.ts 文件里加上这个路由配置文件的引用。

    ts
    import TestWindow from './modules/test.window'
    +
    +const menu = [
    +  ...,
    +  {
    +    title: '页面',
    +    icon: 'ri-pages-line',
    +    children: [
    +      ...PagesExample,
    +      TestWindow,
    +    ],
    +  },
    +  ...
    +]

    这时候就可以通过导航栏访问到我们的窗口了,我们的一个演示模块也就初步创建好了。

    特性介绍

    功能部分的介绍主要还是要看代码,先从列表页 index.vue 开始。

    最先看到的是这句文件导入代码,因为几乎每个列表页都需要翻页功能,所以把翻页相关的东西都存放在 /src/utils/composables/pagination/index.ts 方便复用。

    ts
    import usePagination from '@/utils/composables/usePagination'
    +
    +const { pagination, getParams, onSizeChange, onCurrentChange, onSortChange } = usePagination()

    接着在 data 里存放的是标准模块提供的一些配置项和必要数据参数字段。

    ts
    const data = ref({
    +  loading: false,
    +  /**
    +   * 详情展示模式
    +   * dialog 对话框
    +   * drawer 抽屉
    +   */
    +  formMode: 'dialog',
    +  // 详情
    +  formModeProps: {
    +    visible: false,
    +    id: '',
    +  },
    +  // 搜索
    +  search: {
    +    account: '',
    +    name: '',
    +    mobile: '',
    +    sex: '',
    +  },
    +  searchMore: false,
    +  // 批量操作
    +  batch: {
    +    enable: true,
    +    selectionDataList: [],
    +  },
    +  // 列表数据
    +  dataList: [],
    +})

    标准模块提供了 2 种详情展示模式,默认是弹窗的方式,你可以修改 formMode: 'drawer' 开启抽屉模式,保存后效果如下:

    再往下就是需要你修改或编写业务代码的部分,这里就不继续展开了。

    详情页的代码就不多介绍了,相对比较简单,可自行阅读理解。其中表单部分单独封装成组件存放在 /src/views/windows/[模块文件夹]/components/DetailForm/index.vue 里了,同样你在 components/ 文件夹下还能看到另外一个 FormMode 的文件夹,这样的用意是让表单可以复用,可以通过弹窗或抽屉的形式打开详情页

    可能有人会有疑问,为什么不在生成文件的时候直接让我选择用哪种形式,这样生成出来就是哪种,而是在生成好的代码文件里再进行配置?

    这样设计的目的主要有三点:

    1. 合理使用。关于表单具体使用哪种展示模式比较好,我们的建议是,当表单与当前列表页关联性较强,内容少则使用弹窗,内容多则使用抽屉;而当表单与当前列表页关联性较弱,且内容多,可以使用新建窗口的形式,让新窗口进行承载。
    2. 方便后期维护。考虑到需求会变,可能一开始是一个很简单的表单,后期需求一点点增加,变成了一个庞大的表单,这时候就要从弹窗改成抽屉的形式,反之也可能是从抽屉改成弹窗的形式,处理起来都很麻烦。所以方便后期维护,这部分是有意而为之,做成了 2 种形式共存,通过配置可一键切换。
    3. 跨窗口的组件调用。第一点里有提到,如果既不想使用弹窗,也不想使用抽屉,你还可以使用新窗口的形式进行处理,这时候由于表单部分已抽象成组件,所以即便是在新窗口里,也可以直接调用该组件,从而无需编写重复代码。

    当然标准模块也只是框架提供的一个标准,你可以沿用,也可以根据自己的需求指定一套标准,毕竟最终目的都是提高开发效率,同时也确保多人协作开发的时候有个统一标准,不会出现每个人做出来的模块风格都不一样。

    + + + + \ No newline at end of file diff --git a/guide/plop.html b/guide/plop.html new file mode 100644 index 00000000..d7f1df85 --- /dev/null +++ b/guide/plop.html @@ -0,0 +1,33 @@ + + + + + + 代码文件自动生成 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    代码文件自动生成

    INFO

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

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

    框架默认提供了 5 种模式,通过 pnpm run new 指令可以自行选择。

    • page 页面文件
    • component 组件文件
    • store pinia 全局状态文件
    • mock mock 文件
    • module 页面模块文件 专业版

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

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

    page

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

    component

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

    store

    store 模式则会在 /src/store/modules/ 目录下生成一个空模板

    mock

    mock 模式则会在 /src/mock/ 目录下生成一个标准 CURD 的 mock 数据

    module 专业版

    module 模式是一个标准模块模板,会在指定目录下生成模块文件夹,并且包含列表页、编辑(详情)页,以及相关局部组件。

    这块部分详细介绍请阅读《标准模块》。

    + + + + \ No newline at end of file diff --git a/guide/preferences.html b/guide/preferences.html new file mode 100644 index 00000000..32690de4 --- /dev/null +++ b/guide/preferences.html @@ -0,0 +1,48 @@ + + + + + + 用户偏好设置 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    用户偏好设置 专业版

    如果希望将框架的部分应用配置项暴露给用户,让用户可以自行设置,那么可以使用用户偏好设置功能。

    开启

    在应用配置中设置:

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

    定制偏好设置内容

    然后打开 /src/store/modules/user.ts 文件,你可以在文件里进一步定制用户偏好设置里的内容:

    ts
    // 框架已将可提供给用户配置的选项提取出来,请勿新增其他选项,不需要的选项可以在这里注释掉
    +const preferences = ref<Settings.all>({
    +  app: {
    +    colorScheme: settingsDefault.app.colorScheme,
    +    theme: settingsDefault.app.theme,
    +  },
    +  ...
    +})

    如果仔细对比,会发现这里的配置项并不是框架的完整应用配置,这是因为有部分配置项并不适合暴露给用户,比如 userPreferences.enable 这个配置项就是用来控制是否开启用户偏好设置的,如果开启了用户偏好设置,那么这个配置项就不应该再暴露给用户了,否则用户就可以关闭用户偏好设置了,这样就没有意义了。再比如 menu.baseOn 这个配置项是用来控制导航数据来源的,修改它会直接影响代码的调整,所以也是不能暴露给用户的。

    所以请勿新增这里的配置项,你需要做的就是将不需要暴露给用户的配置项注释掉即可。

    处理请求

    用户偏好设置默认存储在浏览器本地 localStorage 里,如果需要将数据存储到服务器,可以通过 userPreferences.storageTo 配置项来实现,具体配置如下:

    ts
    const globalSettings: Settings.all = {
    +  userPreferences: {
    +    storageTo: 'server',
    +  },
    +}

    然后到 /src/api/modules/user.ts 中找到 preferences()preferencesEdit() 这两个函数,并分别修改这两个函数的请求地址。

    建议

    为减轻后端处理,数据会直接以 JSON 字符串进行存储,建议后端可以在用户表增加相关字段,并将字段类型设为 lonetext

    + + + + \ No newline at end of file diff --git a/guide/q-a.html b/guide/q-a.html new file mode 100644 index 00000000..9016c2e1 --- /dev/null +++ b/guide/q-a.html @@ -0,0 +1,57 @@ + + + + + + 常见问题 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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 不同的历史模式》。

    构建报错,提示内存溢出

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

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

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

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

    直接修改构建产物的接口地址

    如果你需要将构建产物部署到多台服务器,并且根据不同服务器配置不同的接口地址。这时候如果采用新增环境配置文件的方式,会存在一个弊端,就是不同环境需要分别进行构建。下面的方法可以让你直接修改构建产物的接口地址。

    新增 /public/config.js 文件:

    js
    window.globalConfig = {
    +  API_BASEURL: '/',
    +}

    /index.html 中引入:

    html
    <body>
    +  ...
    +  <script src="/config.js"></script>
    +  <script type="module" src="/src/main.ts"></script>
    +</body>

    修改 /src/api/index.ts ,仅在生产环境时使用:

    ts
    const api = axios.create({
    +  baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL, 
    +  baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : (import.meta.env.DEV ? import.meta.env.VITE_APP_API_BASEURL : (window as any).globalConfig.API_BASEURL), 
    +  timeout: 1000 * 60,
    +  responseType: 'json',
    +})

    之后你就可以在构建产物目录下直接修改 config.js 文件内的接口地址了,此方法不仅适用于接口地址,可以自行扩展。

    不会 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 00000000..bf2c14a4 --- /dev/null +++ b/guide/ready.html @@ -0,0 +1,39 @@ + + + + + + 准备工作 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    准备工作

    源码

    阅读开发文档前,请确保手上已经有 One-step-admin 源码,因为文档中提及的内容,都是需要在本地项目中编写或修改代码并运行才能呈现的。如果还没有源码,可以通过下面两种方式获取:

    基础版

    说明

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

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

    或者也可以从 Github/Gitee 上拉取源码,但需要注意的是,这种方式拉取的是最新的代码,而不是稳定版本,可能会存在一些问题,所以请谨慎使用。

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

    专业版

    专业版用户会邀请加入到私有组织,获取源码的方式和基础版一致,只是仓库地址不同。

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

    开发环境

    使用本模板前,需要在本地依次安装好 Node.js, pnpm, GitVisual Studio Code

    注意

    Node.js 需要使用 18+ / 20+ 版本。

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

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

    建议

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

    除此之外,还需要准备好开发使用的浏览器,推荐使用 Chrome ,并且在 Chrome 里安装好 Vue.js devtools 扩展,安装 Vue 官方提供的调试工具在一定程度上可以提升解决 bug 的效率,当然这个扩展开启后,可能在开发环境操作会有些许卡顿,建议不需要时候可以将扩展禁用。

    不过由于安装 Vue.js devtools 需要访问 Chrome 应用商店,如果在大陆地区访问,需要自行准备相关可访问外网的工具。如果不具备该条件,也可访问 Vue.js devtools 官网 了解本地构建或者下载支持 Edge/Firefox 的 Vue.js devtools 。

    技术栈

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

    + + + + \ No newline at end of file diff --git a/guide/replace-to-antd.html b/guide/replace-to-antd.html new file mode 100644 index 00000000..2e19b208 --- /dev/null +++ b/guide/replace-to-antd.html @@ -0,0 +1,125 @@ + + + + + + 替换为 Ant Design Vue | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    替换为 Ant Design Vue

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Ant Design Vue
    +pnpm add ant-design-vue@4.x

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import Antd from 'ant-design-vue'
    +import 'ant-design-vue/dist/reset.css'
    +
    +function install(app: App) {
    +  app.use(Antd)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import antDesignVueLocaleZhCN from 'ant-design-vue/es/locale/zh_CN'
    +import { theme } from 'ant-design-vue'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="antDesignVueLocaleZhCN" :theme="settingsStore.currentColorScheme === 'dark' ? { algorithm: [theme.darkAlgorithm] } : {}">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import Antd from 'ant-design-vue'
    +import 'ant-design-vue/dist/reset.css'
    +
    +import zhCN from 'ant-design-vue/es/locale/zh_CN'
    +import zhTW from 'ant-design-vue/es/locale/zh_TW'
    +import en from 'ant-design-vue/es/locale/en_US'
    +
    +function install(app: App) {
    +  app.use(Antd)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhTW,
    +  'en': en,
    +}
    +
    +export default { install }
    +export { locales }

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

    vue
    <script setup lang="ts">
    +import { theme } from 'ant-design-vue'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="locales[settingsStore.lang]" :theme="settingsStore.currentColorScheme === 'dark' ? { algorithm: [theme.darkAlgorithm] } : {}">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    + + + + \ No newline at end of file diff --git a/guide/replace-to-arco.html b/guide/replace-to-arco.html new file mode 100644 index 00000000..c85df5db --- /dev/null +++ b/guide/replace-to-arco.html @@ -0,0 +1,174 @@ + + + + + + 替换为 Arco Design Vue | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    替换为 Arco Design Vue

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Arco Design Vue
    +pnpm add @arco-design/web-vue -D

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global", 
    +      ...
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import ArcoVue from '@arco-design/web-vue'
    +import '@arco-design/web-vue/dist/arco.css'
    +
    +function install(app: App) {
    +  app.use(ArcoVue)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import zhCN from '@arco-design/web-vue/es/locale/lang/zh-cn'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.body.removeAttribute('arco-theme')
    +      break
    +    case 'dark':
    +      document.body.setAttribute('arco-theme', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="zhCN">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import ArcoVue from '@arco-design/web-vue'
    +import '@arco-design/web-vue/dist/arco.css'
    +
    +import zhCN from '@arco-design/web-vue/es/locale/lang/zh-CN'
    +import zhTW from '@arco-design/web-vue/es/locale/lang/zh-TW'
    +import en from '@arco-design/web-vue/es/locale/lang/en-US'
    +
    +function install(app: App) {
    +  app.use(ArcoVue)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhTW,
    +  'en': en,
    +}
    +
    +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()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.body.removeAttribute('arco-theme')
    +      break
    +    case 'dark':
    +      document.body.setAttribute('arco-theme', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <AConfigProvider :locale="locales[settingsStore.lang]">
    +    <slot />
    +  </AConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    + + + + \ No newline at end of file diff --git a/guide/replace-to-idux.html b/guide/replace-to-idux.html new file mode 100644 index 00000000..fc6fd6c3 --- /dev/null +++ b/guide/replace-to-idux.html @@ -0,0 +1,134 @@ + + + + + + 替换为 iDux | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    替换为 iDux

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 iDux
    +pnpm add @idux/cdk @idux/components

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import IduxCdk from '@idux/cdk'
    +import IduxComponents from '@idux/components'
    +import { IDUX_ICON_DEPENDENCIES, addIconDefinitions } from '@idux/components/icon'
    +import { createGlobalConfig } from '@idux/components/config'
    +import { zhCN } from '@idux/components/locales'
    +import '@idux/components/index.full.css'
    +
    +function install(app: App) {
    +  addIconDefinitions(IDUX_ICON_DEPENDENCIES)
    +  app.use(IduxCdk).use(IduxComponents).use(createGlobalConfig({ locale: zhCN }))
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <IxThemeProvider :preset-theme="settingsStore.currentColorScheme === 'dark' ? 'dark' : 'default'">
    +    <IxMessageProvider>
    +      <slot />
    +    </IxMessageProvider>
    +  </IxThemeProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import IduxCdk from '@idux/cdk'
    +import IduxComponents from '@idux/components'
    +import { IDUX_ICON_DEPENDENCIES, addIconDefinitions } from '@idux/components/icon'
    +import { enUS, zhCN } from '@idux/components/locales'
    +import '@idux/components/index.full.css'
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhCN,
    +  'en': enUS,
    +}
    +
    +function install(app: App) {
    +  addIconDefinitions(IDUX_ICON_DEPENDENCIES)
    +  app.use(IduxCdk).use(IduxComponents)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { useGlobalConfig } from '@idux/components/config'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const [, setLocale] = useGlobalConfig('locale', locales[settingsStore.lang])
    +watch(() => settingsStore.lang, val => setLocale(locales[settingsStore.lang]))
    +</script>
    +
    +<template>
    +  <IxThemeProvider :preset-theme="settingsStore.currentColorScheme === 'dark' ? 'dark' : 'default'">
    +    <IxMessageProvider>
    +      <slot />
    +    </IxMessageProvider>
    +  </IxThemeProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    + + + + \ No newline at end of file diff --git a/guide/replace-to-naive.html b/guide/replace-to-naive.html new file mode 100644 index 00000000..8fd83635 --- /dev/null +++ b/guide/replace-to-naive.html @@ -0,0 +1,125 @@ + + + + + + 替换为 Naive UI | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    替换为 Naive UI

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Naive UI
    +pnpm add naive-ui -D

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +      "naive-ui/volar"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import naive from 'naive-ui'
    +
    +function install(app: App) {
    +  app.use(naive)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { darkTheme, dateZhCN, zhCN } from 'naive-ui'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <NConfigProvider :locale="zhCN" :date-locale="dateZhCN" :theme="settingsStore.currentColorScheme === 'dark' ? darkTheme : undefined" style="height: 100%;">
    +    <NMessageProvider>
    +      <slot />
    +      <NGlobalStyle />
    +    </NMessageProvider>
    +  </NConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +      "naive-ui/volar"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import naive, { dateEnUS, dateZhCN, dateZhTW, enUS, zhCN, zhTW } from 'naive-ui'
    +
    +function install(app: App) {
    +  app.use(naive)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': {
    +    ui: zhCN,
    +    date: dateZhCN,
    +  },
    +  'zh-tw': {
    +    ui: zhTW,
    +    date: dateZhTW,
    +  },
    +  'en': {
    +    ui: enUS,
    +    date: dateEnUS,
    +  },
    +}
    +
    +export default { install }
    +export { locales }

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

    vue
    <script setup lang="ts">
    +import { darkTheme } from 'naive-ui'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +</script>
    +
    +<template>
    +  <NConfigProvider :locale="locales[settingsStore.lang].ui" :date-locale="locales[settingsStore.lang].date" :theme="settingsStore.currentColorScheme === 'dark' ? darkTheme : undefined" style="height: 100%;">
    +    <NMessageProvider>
    +      <slot />
    +      <NGlobalStyle />
    +    </NMessageProvider>
    +  </NConfigProvider>
    +</template>

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    + + + + \ No newline at end of file diff --git a/guide/replace-to-tdesign.html b/guide/replace-to-tdesign.html new file mode 100644 index 00000000..0c9c71bd --- /dev/null +++ b/guide/replace-to-tdesign.html @@ -0,0 +1,193 @@ + + + + + + 替换为 TDesign | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    替换为 TDesign

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 TDesign
    +pnpm add tdesign-vue-next

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  },
    +  ...
    +  "include": [
    +    "src/**/*.ts",
    +    "src/**/*.d.ts",
    +    "src/**/*.tsx",
    +    "src/**/*.vue"
    +    "src/**/*.vue", 
    +    "node_modules/tdesign-vue-next/global.d.ts"
    +  ]
    +}

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

    ts
    import type { App } from 'vue'
    +import TDesign from 'tdesign-vue-next'
    +import 'tdesign-vue-next/es/style/index.css'
    +
    +function install(app: App) {
    +  app.use(TDesign)
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { merge } from 'lodash-es'
    +import zhCN from 'tdesign-vue-next/es/locale/zh_CN'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.documentElement.removeAttribute('theme-mode')
    +      break
    +    case 'dark':
    +      document.documentElement.setAttribute('theme-mode', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <TConfigProvider :global-config="merge(zhCN)">
    +    <slot />
    +  </TConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  },
    +  ...
    +  "include": [
    +    "src/**/*.ts",
    +    "src/**/*.d.ts",
    +    "src/**/*.tsx",
    +    "src/**/*.vue"
    +    "src/**/*.vue", 
    +    "node_modules/tdesign-vue-next/global.d.ts"
    +  ]
    +}

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

    ts
    import type { App } from 'vue'
    +import TDesign from 'tdesign-vue-next'
    +import 'tdesign-vue-next/es/style/index.css'
    +
    +import zhCN from 'tdesign-vue-next/es/locale/zh_CN'
    +import zhTW from 'tdesign-vue-next/es/locale/zh_TW'
    +import en from 'tdesign-vue-next/es/locale/en_US'
    +
    +function install(app: App) {
    +  app.use(TDesign)
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCN,
    +  'zh-tw': zhTW,
    +  'en': en,
    +}
    +
    +export default { install }
    +export { locales }

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

    vue
    <script setup lang="ts">
    +import { merge } from 'lodash-es'
    +import { locales } from './index'
    +import useSettingsStore from '@/store/modules/settings'
    +
    +const settingsStore = useSettingsStore()
    +
    +const prefersColorScheme = window.matchMedia('(prefers-color-scheme: dark)')
    +watch(() => settingsStore.settings.app.colorScheme, (colorScheme) => {
    +  if (colorScheme === '') {
    +    prefersColorScheme.addEventListener('change', updateTheme)
    +  }
    +  else {
    +    prefersColorScheme.removeEventListener('change', updateTheme)
    +  }
    +  nextTick(() => {
    +    updateTheme()
    +  })
    +}, {
    +  immediate: true,
    +})
    +function updateTheme() {
    +  switch (settingsStore.currentColorScheme) {
    +    case 'light':
    +      document.documentElement.removeAttribute('theme-mode')
    +      break
    +    case 'dark':
    +      document.documentElement.setAttribute('theme-mode', 'dark')
    +      break
    +  }
    +}
    +</script>
    +
    +<template>
    +  <TConfigProvider :global-config="merge(locales[settingsStore.lang])">
    +    <slot />
    +  </TConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    + + + + \ No newline at end of file diff --git a/guide/replace-to-vexip.html b/guide/replace-to-vexip.html new file mode 100644 index 00000000..58500286 --- /dev/null +++ b/guide/replace-to-vexip.html @@ -0,0 +1,122 @@ + + + + + + 替换为 Vexip UI | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    替换为 Vexip UI

    注意

    v4.0 之前的版本不支持替换组件库,本文适用于 v4.0 及之后的版本。

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

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

    安装

    sh
    # 安装依赖
    +pnpm install
    +
    +# 安装 Vexip UI
    +pnpm add vexip-ui

    代码调整

    基础版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import { install as vexipInstall } from 'vexip-ui'
    +import 'vexip-ui/css/index.css'
    +import 'vexip-ui/css/dark/index.css'
    +
    +function install(app: App) {
    +  app.use(vexipInstall, {
    +    prefix: 'vxp',
    +  })
    +}
    +
    +export default { install }

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

    vue
    <script setup lang="ts">
    +import { zhCNLocale } from 'vexip-ui'
    +</script>
    +
    +<template>
    +  <VxpConfigProvider :locale="zhCNLocale()">
    +    <slot />
    +  </VxpConfigProvider>
    +</template>

    删除相关文件

    .
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader
    专业版

    修改 /tsconfig.json 文件

    json
    {
    +  "compilerOptions": {
    +    ...
    +    "types": [
    +      ...
    +      "element-plus/global"
    +    ],
    +    ...
    +  }
    +}

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

    ts
    import type { App } from 'vue'
    +import { install as vexipInstall, zhCNLocale, zhTWLocale, enUSLocale } from 'vexip-ui'
    +import 'vexip-ui/css/index.css'
    +import 'vexip-ui/css/dark/index.css'
    +
    +function install(app: App) {
    +  app.use(vexipInstall, {
    +    prefix: 'vxp',
    +  })
    +}
    +
    +// 此处的对象属性和 src/locales/index.ts 中的 messages 对象属性一一对应
    +const locales: { [key: string]: any } = {
    +  'zh-cn': zhCNLocale(),
    +  'zh-tw': zhTWLocale(),
    +  'en': enUSLocale(),
    +}
    +
    +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()
    +</script>
    +
    +<template>
    +  <VxpConfigProvider :locale="locales[settingsStore.lang]">
    +    <slot />
    +  </VxpConfigProvider>
    +</template>

    删除相关文件

    .
    +├─ plop-templates
    +│  └─ module // 标准模块模板基于 Element Plus 开发,需要删除
    +└─ src
    +   └─ components // 下列扩展组件基于 Element Plus 二次封装,需要删除
    +     ├─ FileUpload
    +     ├─ IconPicker
    +     ├─ ImagePreview
    +     ├─ ImagesUpload
    +     ├─ ImageUpload
    +     └─ PcasCascader

    修改登录页

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

    卸载

    sh
    # 卸载 Element Plus
    +pnpm remove element-plus

    完成

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

    示例

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

    + + + + \ No newline at end of file diff --git a/guide/resources.html b/guide/resources.html new file mode 100644 index 00000000..10834923 --- /dev/null +++ b/guide/resources.html @@ -0,0 +1,73 @@ + + + + + + 资源 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    资源

    图片

    全局公共

    全局公共图片存放在 /src/assets/images/ 目录下,可自行新建文件夹分类管理。

    局部私有

    局部私有图片建议采用就近原则,你可以在需要的模块文件夹下建立一个 images 文件夹,专门用于存放局部私有图片。

    样式

    全局公共

    全局公共样式存放在 /src/assets/styles/ 目录下,可自行新建文件,并在 /src/main.ts 中引入即可。

    此目录下还有一个特殊目录,即 /src/assets/styles/resources/ ,这是全局 SCSS 资源目录,你可以在该目录下编写变量、函数、混合等支持 SCSS 特性的代码。

    局部私有

    基于单文件组件规范,局部私有样式建议直接在 .vue 文件中编写,框架集成了 UnoCSS / PostCSS / SCSS 方案,可选择自己适合的方案。更多单文件组件 CSS 功能请参考这里

    UnoCSS

    vue
    <template>
    +  <div class="flex flex-1 flex-col select-none text-center all:transition-400">
    +    <div class="ma">
    +      <div class="animate-bounce-alt animate-duration-1s animate-count-infinite text-5xl fw100">
    +        UnoCSS
    +      </div>
    +    </div>
    +  </div>
    +</template>

    PostCSS

    框架内置了 postcss-nested 插件,可实现接近于 SCSS 的写法和特性。

    vue
    <style scoped>
    +.phone {
    +  &_title {
    +    width: 500px;
    +    @media (max-width: 500px) {
    +      width: auto;
    +    }
    +    body.is_dark & {
    +      color: white;
    +    }
    +  }
    +  img {
    +    display: block;
    +  }
    +}
    +</style>

    SCSS

    vue
    <style lang="scss" scoped>
    +$width: 500px;
    +
    +.phone {
    +  &_title {
    +    width: $width;
    +    @media (max-width: $width) {
    +      width: auto;
    +    }
    +    body.is_dark & {
    +      color: white;
    +    }
    +  }
    +  img {
    +    display: block;
    +  }
    +}
    +</style>

    组件

    全局公共

    说明

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

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

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

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

    局部私有

    局部私有组件建议采用就近原则,你可以在需要的模块文件夹下建立一个 components 文件夹,专门用于存放局部私有组件。

    + + + + \ No newline at end of file diff --git a/guide/router.html b/guide/router.html new file mode 100644 index 00000000..eaaa4b51 --- /dev/null +++ b/guide/router.html @@ -0,0 +1,50 @@ + + + + + + 路由 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    路由

    由于框架采用了全新的交互方式,使得路由在本框架中并非核心功能。通过打开 /src/router/index.ts 可以看到,框架一共定义了两个路由地址,一个是登录地址,另一个是登录成功后的地址。

    免登录页面 专业版

    基于设置的路由规则,新增的任何路由,都必须登录后才能访问。如果希望增加免登录的页面,也就是脱离框架本身,相对独立的页面,你可以按照下面的方式处理。

    首先在 /src/router/index.tsroutes 配置免登录页面的路由,然后在 noLoginWhitelist 里增加一句路由完整地址。例如下面的例子,就增加了一个 /no/login/example 的免登录页面地址。

    ts
    // 固定路由
    +const routes = [
    +  ...,
    +  {
    +    path: '/no/login/example',
    +    name: 'noLoginExample',
    +    component: () => import('@/views/no-login-example.vue'),
    +    meta: {
    +      title: '免登录页面',
    +    },
    +  },
    +]
    +
    +// 免登录白名单
    +const noLoginWhitelist = [
    +  ...,
    +  '/no/login/example',
    +]
    + + + + \ No newline at end of file diff --git a/guide/rtl.html b/guide/rtl.html new file mode 100644 index 00000000..2d5b2b1f --- /dev/null +++ b/guide/rtl.html @@ -0,0 +1,37 @@ + + + + + + RTL 模式 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/start.html b/guide/start.html new file mode 100644 index 00000000..67c44fe8 --- /dev/null +++ b/guide/start.html @@ -0,0 +1,38 @@ + + + + + + 开始 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    开始

    做好准备工作后,请在项目根目录下依次执行以下命令:

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

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

    报错

    安装依赖时提示 404 ,或者安装结束后,运行时提示「 'vite' 不是内部或外部命令,也不是可运行的程序或批处理文件 」,都些都是依赖未安装成功导致的。可以尝试执行 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 00000000..1e2c0ccc --- /dev/null +++ b/guide/storage.html @@ -0,0 +1,49 @@ + + + + + + 私有 Storage 数据 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    私有 Storage 数据 专业版

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

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

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

    然后在需要使用到 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 00000000..f5f82726 --- /dev/null +++ b/guide/store.html @@ -0,0 +1,48 @@ + + + + + + 全局状态管理 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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 00000000..8006e866 --- /dev/null +++ b/guide/svg-icon.html @@ -0,0 +1,44 @@ + + + + + + 图标 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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" />

    离线/内网环境使用

    说明

    优先推荐使用 Unocss 方案,它不受网络环境限制,且相对于 Iconify 原生方案,它的性能更好。

    如果你清楚自己需要使用 Iconify 原生方案,并且想要在离线/内网环境使用,需要做一些额外的配置。因为 Iconify 图标默认是提供在线的服务,即首次调用会触发一个外部网络请求去获取 svg 原始数据,并缓存在 localStorage 和 sessionStorage 中,这样下次再调用的时候,则直接从缓存中获取并展示。

    框架提供了一份解决方案,在命令行执行 pnpm run generate:icons ,按照指引选择你需要用到的图标集(此处选择的图标集也是图标选择器里展示的图标集),并选择使用方式为离线。这样再在框架中使用这些图标,就不会触发外部网络请求了,但如果使用选择之外的图标,依旧还是会触发外部网络请求。

    图标选择器 专业版

    图标选择器是一个特殊的组件,它需要展示多套图标集内的所有图标。

    通过执行 pnpm run generate:icons 命令,并按照指引完成操作后,图标选择器就会自动生效了。

    + + + + \ No newline at end of file diff --git a/guide/theme.html b/guide/theme.html new file mode 100644 index 00000000..86152b00 --- /dev/null +++ b/guide/theme.html @@ -0,0 +1,269 @@ + + + + + + 主题 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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-app-bg': '#fff',
    +  '--g-main-bg': '#f2f2f2',
    +  '--g-border-color': '#f2f2f2',
    +  // 头部
    +  '--g-header-bg': '#fff',
    +  '--g-header-color': '#0f0f0f',
    +  '--g-header-menu-color': '#0f0f0f',
    +  '--g-header-menu-hover-bg': '#dde1e3',
    +  '--g-header-menu-hover-color': '#0f0f0f',
    +  '--g-header-menu-active-bg': '#0f0f0f',
    +  '--g-header-menu-active-color': '#fff',
    +  // 主导航
    +  '--g-main-sidebar-bg': '#f2f2f2',
    +  '--g-main-sidebar-menu-color': '#0f0f0f',
    +  '--g-main-sidebar-menu-hover-bg': '#dde1e3',
    +  '--g-main-sidebar-menu-hover-color': '#0f0f0f',
    +  '--g-main-sidebar-menu-active-bg': '#0f0f0f',
    +  '--g-main-sidebar-menu-active-color': '#fff',
    +  // 次导航
    +  '--g-sub-sidebar-bg': '#fff',
    +  '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +  '--g-sub-sidebar-logo-color': '#fff',
    +  '--g-sub-sidebar-menu-color': '#0f0f0f',
    +  '--g-sub-sidebar-menu-hover-bg': '#dde1e3',
    +  '--g-sub-sidebar-menu-hover-color': '#0f0f0f',
    +  '--g-sub-sidebar-menu-active-bg': '#0f0f0f',
    +  '--g-sub-sidebar-menu-active-color': '#fff',
    +  // 工具栏
    +  '--g-toolbar-bg': '#fff',
    +}
    +
    +export const darkTheme = {
    +  'color-scheme': 'dark',
    +  // 内置 UI
    +  '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
    +  '--ui-text': hex2rgba('#0f0f0f')!.join(' '),
    +  // 主体
    +  '--g-app-bg': '#141414',
    +  '--g-main-bg': '#0a0a0a',
    +  '--g-border-color': '#15191e',
    +  // 头部
    +  '--g-header-bg': '#141414',
    +  '--g-header-color': '#e5e5e5',
    +  '--g-header-menu-color': '#a8a29e',
    +  '--g-header-menu-hover-bg': '#141414',
    +  '--g-header-menu-hover-color': '#e5e5e5',
    +  '--g-header-menu-active-bg': '#e5e5e5',
    +  '--g-header-menu-active-color': '#0a0a0a',
    +  // 主导航
    +  '--g-main-sidebar-bg': '#0a0a0a',
    +  '--g-main-sidebar-menu-color': '#a8a29e',
    +  '--g-main-sidebar-menu-hover-bg': '#141414',
    +  '--g-main-sidebar-menu-hover-color': '#e5e5e5',
    +  '--g-main-sidebar-menu-active-bg': '#e5e5e5',
    +  '--g-main-sidebar-menu-active-color': '#0a0a0a',
    +  // 次导航
    +  '--g-sub-sidebar-bg': '#141414',
    +  '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +  '--g-sub-sidebar-logo-color': '#e5e5e5',
    +  '--g-sub-sidebar-menu-color': '#a8a29e',
    +  '--g-sub-sidebar-menu-hover-bg': '#0a0a0a',
    +  '--g-sub-sidebar-menu-hover-color': '#e5e5e5',
    +  '--g-sub-sidebar-menu-active-bg': '#e5e5e5',
    +  '--g-sub-sidebar-menu-active-color': '#0a0a0a',
    +  // 工具栏
    +  '--g-toolbar-bg': '#141414',
    +}

    专业版

    与基础版不同,专业版默认提供了 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-app-bg': '#fff',
    +    '--g-main-bg': '#f2f2f2',
    +    '--g-border-color': '#f2f2f2',
    +    // 头部
    +    '--g-header-bg': '#fff',
    +    '--g-header-color': '#0f0f0f',
    +    '--g-header-menu-color': '#0f0f0f',
    +    '--g-header-menu-hover-bg': '#dde1e3',
    +    '--g-header-menu-hover-color': '#0f0f0f',
    +    '--g-header-menu-active-bg': '#0f0f0f',
    +    '--g-header-menu-active-color': '#fff',
    +    // 主导航
    +    '--g-main-sidebar-bg': '#f2f2f2',
    +    '--g-main-sidebar-menu-color': '#0f0f0f',
    +    '--g-main-sidebar-menu-hover-bg': '#dde1e3',
    +    '--g-main-sidebar-menu-hover-color': '#0f0f0f',
    +    '--g-main-sidebar-menu-active-bg': '#0f0f0f',
    +    '--g-main-sidebar-menu-active-color': '#fff',
    +    // 次导航
    +    '--g-sub-sidebar-bg': '#fff',
    +    '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +    '--g-sub-sidebar-logo-color': '#fff',
    +    '--g-sub-sidebar-menu-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-hover-bg': '#dde1e3',
    +    '--g-sub-sidebar-menu-hover-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-active-bg': '#0f0f0f',
    +    '--g-sub-sidebar-menu-active-color': '#fff',
    +    // 工具栏
    +    '--g-toolbar-bg': '#fff',
    +  },
    +  ...
    +  dark: {
    +    // 颜色主题
    +    'color-scheme': 'dark',
    +    // 内置 UI
    +    '--ui-primary': hex2rgba('#e5e5e5')!.join(' '),
    +    '--ui-text': hex2rgba('#0f0f0f')!.join(' '),
    +    // 主体
    +    '--g-app-bg': '#141414',
    +    '--g-main-bg': '#0a0a0a',
    +    '--g-border-color': '#15191e',
    +    // 头部
    +    '--g-header-bg': '#141414',
    +    '--g-header-color': '#e5e5e5',
    +    '--g-header-menu-color': '#a8a29e',
    +    '--g-header-menu-hover-bg': '#141414',
    +    '--g-header-menu-hover-color': '#e5e5e5',
    +    '--g-header-menu-active-bg': '#e5e5e5',
    +    '--g-header-menu-active-color': '#0a0a0a',
    +    // 主导航
    +    '--g-main-sidebar-bg': '#0a0a0a',
    +    '--g-main-sidebar-menu-color': '#a8a29e',
    +    '--g-main-sidebar-menu-hover-bg': '#141414',
    +    '--g-main-sidebar-menu-hover-color': '#e5e5e5',
    +    '--g-main-sidebar-menu-active-bg': '#e5e5e5',
    +    '--g-main-sidebar-menu-active-color': '#0a0a0a',
    +    // 次导航
    +    '--g-sub-sidebar-bg': '#141414',
    +    '--g-sub-sidebar-logo-bg': '#0f0f0f',
    +    '--g-sub-sidebar-logo-color': '#e5e5e5',
    +    '--g-sub-sidebar-menu-color': '#a8a29e',
    +    '--g-sub-sidebar-menu-hover-bg': '#0a0a0a',
    +    '--g-sub-sidebar-menu-hover-color': '#e5e5e5',
    +    '--g-sub-sidebar-menu-active-bg': '#e5e5e5',
    +    '--g-sub-sidebar-menu-active-color': '#0a0a0a',
    +    // 工具栏
    +    '--g-toolbar-bg': '#141414',
    +  },
    +  ...
    +}

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

    ts
    import { hex2rgba } from '@unocss/preset-mini/utils'
    +
    +export default {
    +  newThemeName: { // 主题名称
    +    // 颜色主题
    +    'color-scheme': 'light', // 可选值 light/dark ,表示该主题在明亮或暗黑模式下的配色
    +    // 内置 UI
    +    '--ui-primary': hex2rgba('#409eff')!.join(' '),
    +    '--ui-text': hex2rgba('#fcfcfc')!.join(' '),
    +    // 主体
    +    '--g-app-bg': '#fff',
    +    '--g-main-bg': '#f2f2f2',
    +    '--g-border-color': '#f2f2f2',
    +    // 头部
    +    '--g-header-bg': '#222b45',
    +    '--g-header-color': '#fff',
    +    '--g-header-menu-color': '#fff',
    +    '--g-header-menu-hover-bg': '#334067',
    +    '--g-header-menu-hover-color': '#fff',
    +    '--g-header-menu-active-bg': '#334067',
    +    '--g-header-menu-active-color': '#fff',
    +    // 主导航
    +    '--g-main-sidebar-bg': '#222b45',
    +    '--g-main-sidebar-menu-color': '#fff',
    +    '--g-main-sidebar-menu-hover-bg': '#334067',
    +    '--g-main-sidebar-menu-hover-color': '#fff',
    +    '--g-main-sidebar-menu-active-bg': '#334067',
    +    '--g-main-sidebar-menu-active-color': '#fff',
    +    // 次导航
    +    '--g-sub-sidebar-bg': '#fff',
    +    '--g-sub-sidebar-logo-bg': '#222b45',
    +    '--g-sub-sidebar-logo-color': '#fff',
    +    '--g-sub-sidebar-menu-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-hover-bg': '#dde1e3',
    +    '--g-sub-sidebar-menu-hover-color': '#0f0f0f',
    +    '--g-sub-sidebar-menu-active-bg': '#409eff',
    +    '--g-sub-sidebar-menu-active-color': '#fff',
    +    // 工具栏
    +    '--g-toolbar-bg': '#fff',
    +  },
    +}

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

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

    颜色方案

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  app: {
    +    /**
    +     * 留空跟随系统
    +     * light 明亮模式
    +     * dark 暗黑模式
    +     */
    +    colorScheme: '',
    +  },
    +}

    哀悼模式 v4.5.0 新增

    在应用配置中设置:

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

    色弱模式 v4.5.0 新增

    在应用配置中设置:

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

    导航栏风格 专业版

    风格

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    /**
    +     * 留空默认
    +     * arrow 箭头
    +     * line 线条
    +     * dot 圆点
    +     */
    +    style: '', // v4.5.0 之前版本为 menuActiveStyle
    +  },
    +}

    圆角

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  menu: {
    +    // 导航栏是否圆角
    +    isRounded: 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/toolbar.html b/guide/toolbar.html new file mode 100644 index 00000000..e00d3ede --- /dev/null +++ b/guide/toolbar.html @@ -0,0 +1,65 @@ + + + + + + 工具栏 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    工具栏

    工具栏主要是红框处各类功能图标。

    窗口预览

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    previewWindows: true,
    +  },
    +}

    收藏夹 专业版

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    favorites: true,
    +  },
    +}

    详细可阅读《收藏夹》。

    导航搜索

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    navSearch: true,
    +  },
    +}

    通知中心 专业版

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    notification: true,
    +  },
    +}

    通知中心不涉及具体业务,需开发者自行实现,相关文件在:

    • /src/views/components/Tools/Notification/index.vue 通知中心下拉预览面板
    • /src/views/windows/PersonalNotification/index.vue 通知中心页面

    国际化 专业版

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    i18n: true,
    +  },
    +}

    如果设置为不启用,并不代表不支持国际化切换,只是不会在工具栏显示切换语言的图标,详细可阅读《国际化》。

    浏览器全屏

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    fullscreen: true,
    +  },
    +}

    颜色主题

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    colorScheme: true,
    +  },
    +}

    如果设置为不启用,并不代表不支持颜色主题切换,只是不会在工具栏显示切换颜色主题的图标。

    布局 专业版

    在应用配置中设置:

    ts
    const globalSettings: Settings.all = {
    +  toolbar: {
    +    layout: ['previewWindows', 'favorites', '->', 'navSearch', 'notification', 'i18n', 'fullscreen', 'colorScheme'],
    +  },
    +}

    可自定义摆放位置和顺序,其中 -> 为分隔符,用于分隔左右两侧的工具栏。修改时请确保提供的所有值都存在,不可删减。

    + + + + \ No newline at end of file diff --git a/guide/upgrade.html b/guide/upgrade.html new file mode 100644 index 00000000..e3521aaf --- /dev/null +++ b/guide/upgrade.html @@ -0,0 +1,33 @@ + + + + + + 框架更新 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    框架更新

    首先明确一点,One-step-admin 无法像 npm 的插件一样更新,不仅我们的框架如此,其实大部分管理系统框架都是如此。

    因为本质上这类框架其实是一个初始模板,开发者会根据自身需求去修改,然后基于业务开展业务代码编写。

    所以一旦下载开始使用,基本是无法更新的,你在哪个时间点开始使用,项目就固定在什么版本了。

    虽然有小部分框架选择将部分核心源码封装成 npm 依赖包,由作者全权维护,这样的处理在一定程度上有解决版本更新的问题,但弊端也很明显,开发者在二次开发上会有明显的局限,作者认为是得不偿失的。

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

    1. 在基于 One-step-admin 做项目开发时尽量避免框架自带模块或组件的改动,或者改动地方做一个文档记录,可以清楚知道改动了哪些,这样当你需要进行新版本更新时,按照之前记录的文档可以有个大致的迁移方案,而业务代码则可以直接拷贝过去。
    2. 我们尽量在提交代码时标明每次提交改动的变更记录说明,这样你可以选择性的更新部分新代码到项目中,也就是局部更新。这种方案也是作者在公司内部项目经常使用的,因为大部分项目是无需全局更新到新版的,只需将必要的一些新特性或 bug 修复同步到原有项目中即可。
    3. 使用文件比较工具,例如 Beyond Compare,这款工具可以直接对比文件夹,可以清晰的列出文件夹内所有文件的差异,可以协助升级工作开展。

    当然个人建议是,做为一个中后台系统框架,稳定是第一诉求,不到万不得已不建议频繁更新,因为更新的成本挺高的,每一次大更新,都需要一次完整的回归测试,以确保功能正常运行。

    + + + + \ 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 00000000..a380ad36 --- /dev/null +++ b/guide/vue3-composition-api.html @@ -0,0 +1,51 @@ + + + + + + 使用 Composition API 开发 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    使用 Composition API 开发

    TIP

    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'
    +
    +const count = ref(0)
    +const doubled = computed(() => count.value * 2)
    +</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 00000000..5fd5592a --- /dev/null +++ b/guide/watermark.html @@ -0,0 +1,49 @@ + + + + + + 页面水印 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    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 00000000..3fe81f2a --- /dev/null +++ b/guide/why.html @@ -0,0 +1,33 @@ + + + + + + 为什么选择我们 ? | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    为什么选择我们 ?

    如果你正在做后台框架相关的调研或选型,相信这篇介绍能帮助你快速了解 One-step-admin 的特点,以及与传统后台框架的对比。

    长期且稳定

    One-step-admin 自 2021/11/01 正式对外发布,截止到今天为止,已持续维护 1036 天。

    高效的交互方式

    摆脱传统后台框架路由跳转的交互,将每个模块以窗口的形式展示在同一个界面中,让使用人员可以做到跨模块的多线操作。

    窗口最大化

    窗口默认宽度为 800px ,可以在项目中进行调整,也可以通过最大化按钮将窗口最大化展示,以便展示更多信息。

    快速定位操作窗口

    提供的预览界面可以帮助使用人员快速定位到需要操作的窗口。

    专注模式

    可勾选多个窗口平均分布在页面中,专注于所勾选的窗口进行操作。

    窗口排序

    快速调整窗口的展示顺序。

    继承自 Fantastic-admin

    本框架继承了 Fantastic-admin 许多优秀的特性。例如同样提供了 5 款导航栏模式,3 款导航栏风格以及 6 款主题配色,导航也提供了各种展示形态的设置,显隐、标题、图标、徽标、外链等。

    为什么不是 Fantastic-admin ?

    这里的 Fantastic-admin 代表了市面上几乎所有的传统后台框架,它们的优势在于理解成本低,每个页面的功能明确,需要做什么操作就进入不同的页面。

    而劣势也是因为这种优势导致的,例如要在多个模块之间进行操作,就需要频繁切换路由,而切换路由会导致之前页面上的数据丢失,进而扩展了页面缓存和标签栏的特性,但也变相增加了开发人员的开发成本。其次现在的显示器都在往高分屏/带鱼屏发展,当页面展示内容不多的时候,界面上会显示大量的留白,造成空间浪费。

    基于传统后台框架的这些痛点,One-step-admin 应运而生,它探索出了一种全新的交互方式,有效提高了使用人员的操作效率,同时也减轻了开发人员的开发成本

    以上面举例的场景,在 One-step-admin 里,因为模块都以窗口的形式在同一个界面上展示,所以就不存在切换路由,也就不存在切换路由导致页面数据丢失的场景,开发人员只需关注模块内的业务实现即可。

    + + + + \ No newline at end of file diff --git a/guide/window.html b/guide/window.html new file mode 100644 index 00000000..dd51b8d1 --- /dev/null +++ b/guide/window.html @@ -0,0 +1,33 @@ + + + + + + 窗口 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    窗口

    窗口即组件,存放在 /src/views/windows/ 目录下,类似于全局组件,文件夹名即为组件名,在窗口打开的时候会动态加载组件。

    每个窗口的文件夹内至少保留一个文件名为 index.vue 的入口文件。

    注意

    由于窗口展示的特殊性,请勿在窗口组件内使用 position: fixed; 样式。

    + + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 00000000..0ce442fe --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"buy.md":"BpDcuvJD","components_action-container.md":"C6ADMMHn","components_auth-all.md":"CC4RPLIO","components_auth.md":"DJiNZXkN","components_chip.md":"DS5QQKp9","components_colorful-card.md":"C17Jec7Q","components_file-upload.md":"D7PBngz1","components_i18n-selector.md":"hlvQr2K-","components_icon-picker.md":"CDiXSf0R","components_image-preview.md":"O75IkQyb","components_image-upload.md":"D7rbM4Gb","components_images-upload.md":"RSnuNose","components_index.md":"IDIJOnXK","components_page-header.md":"DN9_VgJv","components_page-main.md":"t28_56LQ","components_pcas-cascader.md":"BEb_Ujl_","components_search-bar.md":"DyxwWVs4","components_sparkline.md":"B0Y5wjqT","components_storage-box.md":"DkmDy-9N","components_svg-icon.md":"BXB-K3yu","components_trend.md":"DxxgyeHY","guide_api.md":"UJgy_6go","guide_axios.md":"BhXyFrum","guide_build.md":"-GzyVqA3","guide_changelog.md":"DCflyckv","guide_coding-standard.md":"BOxNKpOC","guide_components.md":"DKFLed6e","guide_configure.md":"DGLgmmVa","guide_copyright.md":"DFx3AWRC","guide_error-log.md":"CtmjfpdD","guide_favorites.md":"CmABV1kw","guide_font.md":"BA3rgSN5","guide_i18n.md":"DNvdKeNF","guide_intro.md":"sO_pu713","guide_layout.md":"CtDYcY0J","guide_login.md":"BgAQ9xap","guide_menu.md":"DjhhAq8f","guide_permission.md":"Bi4TpiJ3","guide_plop-module.md":"DvVVYnkY","guide_plop.md":"B0BZJ5As","guide_preferences.md":"DClypLUq","guide_q-a.md":"DjjcUkzh","guide_ready.md":"CJkkBV7W","guide_replace-to-antd.md":"BaHAuChd","guide_replace-to-arco.md":"DNOX62fS","guide_replace-to-idux.md":"h73pcns6","guide_replace-to-naive.md":"BFtvI_Qz","guide_replace-to-tdesign.md":"B7ZFdjJZ","guide_replace-to-vexip.md":"fMhR5uan","guide_resources.md":"lnq0yWPQ","guide_router.md":"Ct6hq6g7","guide_rtl.md":"Cb10KXRS","guide_start.md":"BIHeICwp","guide_storage.md":"D8cMKo8C","guide_store.md":"DBQc3j1R","guide_svg-icon.md":"Bx5n5Xsc","guide_theme.md":"BLSJm2vH","guide_toolbar.md":"DcqYXkK3","guide_upgrade.md":"eXeFHhaS","guide_vue3-composition-api.md":"D_pqF34C","guide_watermark.md":"Bfkh7IZ2","guide_why.md":"DBObFHbq","guide_window.md":"s_rE98aQ","index.md":"Bg6s1Hx0","support.md":"C9-w0WzG"} diff --git a/i18n-ally.png b/i18n-ally.png new file mode 100644 index 00000000..b46c38c1 Binary files /dev/null and b/i18n-ally.png differ diff --git a/icones1.png b/icones1.png new file mode 100644 index 00000000..8f35bc50 Binary files /dev/null and b/icones1.png differ diff --git a/icones2.png b/icones2.png new file mode 100644 index 00000000..72f13e58 Binary files /dev/null and b/icones2.png differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..36ff4067 --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + + + One-step-admin | 一款 Vue 中后台管理系统框架 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    One-step-admin

    巧妙的管理系统框架

    快人一步,给你不一样的使用体验

    Vite

    截图预览

    + + + + \ No newline at end of file diff --git a/intro-1.gif b/intro-1.gif new file mode 100644 index 00000000..5825fac0 Binary files /dev/null and b/intro-1.gif differ diff --git a/intro-2.gif b/intro-2.gif new file mode 100644 index 00000000..579e7aaf Binary files /dev/null and b/intro-2.gif differ diff --git a/intro-3.gif b/intro-3.gif new file mode 100644 index 00000000..672e9ac4 Binary files /dev/null and b/intro-3.gif differ diff --git a/intro-4.gif b/intro-4.gif new file mode 100644 index 00000000..44fd17eb Binary files /dev/null and b/intro-4.gif differ diff --git a/intro-5.gif b/intro-5.gif new file mode 100644 index 00000000..1089cac3 Binary files /dev/null and b/intro-5.gif differ diff --git a/logo.png b/logo.png new file mode 100644 index 00000000..7bfa7dbd Binary files /dev/null and b/logo.png differ diff --git a/menu-isrounded.png b/menu-isrounded.png new file mode 100644 index 00000000..4969e495 Binary files /dev/null and b/menu-isrounded.png differ diff --git a/menu-mode-head-panel.png b/menu-mode-head-panel.png new file mode 100644 index 00000000..b66290ea Binary files /dev/null and b/menu-mode-head-panel.png differ diff --git a/menu-mode-head.png b/menu-mode-head.png new file mode 100644 index 00000000..9b6de2d5 Binary files /dev/null and b/menu-mode-head.png differ diff --git a/menu-mode-only-head.png b/menu-mode-only-head.png new file mode 100644 index 00000000..68b2e789 Binary files /dev/null and b/menu-mode-only-head.png differ diff --git a/menu-mode-only-side.png b/menu-mode-only-side.png new file mode 100644 index 00000000..9b3a3b10 Binary files /dev/null and b/menu-mode-only-side.png differ diff --git a/menu-mode-side-panel.png b/menu-mode-side-panel.png new file mode 100644 index 00000000..c76c0488 Binary files /dev/null and b/menu-mode-side-panel.png differ diff --git a/menu-mode-side.png b/menu-mode-side.png new file mode 100644 index 00000000..9e7dd585 Binary files /dev/null and b/menu-mode-side.png differ diff --git a/menu-mode-single.png b/menu-mode-single.png new file mode 100644 index 00000000..5ee5c2b0 Binary files /dev/null and b/menu-mode-single.png differ diff --git a/menu-style.png b/menu-style.png new file mode 100644 index 00000000..4a64ab37 Binary files /dev/null and b/menu-style.png differ diff --git a/module1.gif b/module1.gif new file mode 100644 index 00000000..34d9005d Binary files /dev/null and b/module1.gif differ diff --git a/module2.gif b/module2.gif new file mode 100644 index 00000000..ecdf104e Binary files /dev/null and b/module2.gif differ diff --git a/plop-component.gif b/plop-component.gif new file mode 100644 index 00000000..b3940bac Binary files /dev/null and b/plop-component.gif differ diff --git a/plop-mock.gif b/plop-mock.gif new file mode 100644 index 00000000..ce919aa5 Binary files /dev/null and b/plop-mock.gif differ diff --git a/plop-module.gif b/plop-module.gif new file mode 100644 index 00000000..c633ee30 Binary files /dev/null and b/plop-module.gif differ diff --git a/plop-page.gif b/plop-page.gif new file mode 100644 index 00000000..34c80e9b Binary files /dev/null and b/plop-page.gif differ diff --git a/plop-store.gif b/plop-store.gif new file mode 100644 index 00000000..67604674 Binary files /dev/null and b/plop-store.gif differ diff --git a/preferences.png b/preferences.png new file mode 100644 index 00000000..ce2ebe93 Binary files /dev/null and b/preferences.png differ diff --git a/preview1.png b/preview1.png new file mode 100644 index 00000000..09889d13 Binary files /dev/null and b/preview1.png differ diff --git a/preview2.png b/preview2.png new file mode 100644 index 00000000..839fc75b Binary files /dev/null and b/preview2.png differ diff --git a/preview3.png b/preview3.png new file mode 100644 index 00000000..b585f595 Binary files /dev/null and b/preview3.png differ diff --git a/preview4.png b/preview4.png new file mode 100644 index 00000000..3c31f4b4 Binary files /dev/null and b/preview4.png differ diff --git a/preview5.png b/preview5.png new file mode 100644 index 00000000..a373a161 Binary files /dev/null and b/preview5.png differ diff --git a/preview6.png b/preview6.png new file mode 100644 index 00000000..9a863100 Binary files /dev/null and b/preview6.png differ diff --git a/qa1.png b/qa1.png new file mode 100644 index 00000000..72663512 Binary files /dev/null and b/qa1.png differ diff --git a/qrcode-alipay-699.png b/qrcode-alipay-699.png new file mode 100644 index 00000000..0aa9a550 Binary files /dev/null and b/qrcode-alipay-699.png differ diff --git a/qrcode-alipay-799.png b/qrcode-alipay-799.png new file mode 100644 index 00000000..84fad466 Binary files /dev/null and b/qrcode-alipay-799.png differ diff --git a/qrcode-alipay-all.png b/qrcode-alipay-all.png new file mode 100644 index 00000000..e230c9cc Binary files /dev/null and b/qrcode-alipay-all.png differ diff --git a/qrcode-alipay-hongbao.jpg b/qrcode-alipay-hongbao.jpg new file mode 100644 index 00000000..735045c0 Binary files /dev/null and b/qrcode-alipay-hongbao.jpg differ diff --git a/qrcode-wechat-699.png b/qrcode-wechat-699.png new file mode 100644 index 00000000..91c5ae0f Binary files /dev/null and b/qrcode-wechat-699.png differ diff --git a/qrcode-wechat-799.png b/qrcode-wechat-799.png new file mode 100644 index 00000000..2cb4c260 Binary files /dev/null and b/qrcode-wechat-799.png differ diff --git a/qrcode-wechat-all.png b/qrcode-wechat-all.png new file mode 100644 index 00000000..ec227854 Binary files /dev/null and b/qrcode-wechat-all.png differ diff --git a/rtl.png b/rtl.png new file mode 100644 index 00000000..0201aef0 Binary files /dev/null and b/rtl.png differ diff --git a/settings.png b/settings.png new file mode 100644 index 00000000..16d500b1 Binary files /dev/null and b/settings.png differ diff --git a/support.html b/support.html new file mode 100644 index 00000000..e10e9c0a --- /dev/null +++ b/support.html @@ -0,0 +1,33 @@ + + + + + + 技术支持 | One-step-admin 官方文档 + + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    技术支持

    基础版

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

    专业版

    购买专业版的用户可以加我微信直接和我一对一沟通使用问题。

    + + + + \ No newline at end of file diff --git a/tencent13317398997609913126.txt b/tencent13317398997609913126.txt new file mode 100644 index 00000000..d73382d6 --- /dev/null +++ b/tencent13317398997609913126.txt @@ -0,0 +1 @@ +15436924157164566991 \ No newline at end of file diff --git a/theme.gif b/theme.gif new file mode 100644 index 00000000..c879b1b0 Binary files /dev/null and b/theme.gif differ diff --git a/toolbar.png b/toolbar.png new file mode 100644 index 00000000..d41e8f1a Binary files /dev/null and b/toolbar.png differ diff --git a/ui-antd.png b/ui-antd.png new file mode 100644 index 00000000..5a7f27f8 Binary files /dev/null and b/ui-antd.png differ diff --git a/ui-arco.png b/ui-arco.png new file mode 100644 index 00000000..ad963d5d Binary files /dev/null and b/ui-arco.png differ diff --git a/ui-idux.png b/ui-idux.png new file mode 100644 index 00000000..2d341ed1 Binary files /dev/null and b/ui-idux.png differ diff --git a/ui-naive.png b/ui-naive.png new file mode 100644 index 00000000..fe0062b3 Binary files /dev/null and b/ui-naive.png differ diff --git a/ui-tdesign.png b/ui-tdesign.png new file mode 100644 index 00000000..bdf07dd3 Binary files /dev/null and b/ui-tdesign.png differ diff --git a/ui-vexip.png b/ui-vexip.png new file mode 100644 index 00000000..b70abab0 Binary files /dev/null and b/ui-vexip.png differ diff --git a/vscode.png b/vscode.png new file mode 100644 index 00000000..d6f68934 Binary files /dev/null and b/vscode.png differ diff --git a/watermark.png b/watermark.png new file mode 100644 index 00000000..36b9996b Binary files /dev/null and b/watermark.png differ