├── .browserslistrc ├── .changeset ├── README.md └── config.json ├── .commitlintrc.js ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .gitconfig ├── .gitignore ├── .gitpod.yml ├── .husky ├── commit-msg ├── post-merge └── pre-commit ├── .lintstagedrc.mjs ├── .node-version ├── .npmrc ├── .prettierignore ├── .prettierrc.mjs ├── .stylelintignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── apps ├── backend-mock │ ├── .env │ ├── README.md │ ├── api │ │ ├── auth │ │ │ ├── codes.ts │ │ │ ├── login.post.ts │ │ │ ├── logout.post.ts │ │ │ └── refresh.post.ts │ │ ├── menu │ │ │ └── all.ts │ │ ├── status.ts │ │ ├── system │ │ │ ├── dept │ │ │ │ ├── .post.ts │ │ │ │ ├── [id].delete.ts │ │ │ │ ├── [id].put.ts │ │ │ │ └── list.ts │ │ │ ├── menu │ │ │ │ ├── list.ts │ │ │ │ ├── name-exists.ts │ │ │ │ └── path-exists.ts │ │ │ └── role │ │ │ │ └── list.ts │ │ ├── table │ │ │ └── list.ts │ │ ├── test.get.ts │ │ ├── test.post.ts │ │ └── user │ │ │ └── info.ts │ ├── error.ts │ ├── middleware │ │ └── 1.api.ts │ ├── nitro.config.ts │ ├── package.json │ ├── routes │ │ └── [...].ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── utils │ │ ├── cookie-utils.ts │ │ ├── jwt-utils.ts │ │ ├── mock-data.ts │ │ └── response.ts └── web-antd │ ├── .env │ ├── .env.analyze │ ├── .env.development │ ├── .env.production │ ├── .env.test │ ├── index.html │ ├── package.json │ ├── postcss.config.mjs │ ├── public │ ├── favicon.ico │ └── tinymce │ │ ├── icons │ │ └── default │ │ │ └── icons.min.js │ │ ├── langs │ │ ├── README.md │ │ └── zh_CN.js │ │ ├── license.md │ │ ├── models │ │ └── dom │ │ │ └── model.min.js │ │ ├── plugins │ │ ├── accordion │ │ │ └── plugin.min.js │ │ ├── advlist │ │ │ └── plugin.min.js │ │ ├── anchor │ │ │ └── plugin.min.js │ │ ├── autolink │ │ │ └── plugin.min.js │ │ ├── autoresize │ │ │ └── plugin.min.js │ │ ├── autosave │ │ │ └── plugin.min.js │ │ ├── charmap │ │ │ └── plugin.min.js │ │ ├── code │ │ │ └── plugin.min.js │ │ ├── codesample │ │ │ └── plugin.min.js │ │ ├── directionality │ │ │ └── plugin.min.js │ │ ├── emoticons │ │ │ ├── js │ │ │ │ ├── emojiimages.js │ │ │ │ ├── emojiimages.min.js │ │ │ │ ├── emojis.js │ │ │ │ └── emojis.min.js │ │ │ └── plugin.min.js │ │ ├── fullscreen │ │ │ └── plugin.min.js │ │ ├── help │ │ │ ├── js │ │ │ │ └── i18n │ │ │ │ │ └── keynav │ │ │ │ │ ├── ar.js │ │ │ │ │ ├── bg_BG.js │ │ │ │ │ ├── ca.js │ │ │ │ │ ├── cs.js │ │ │ │ │ ├── da.js │ │ │ │ │ ├── de.js │ │ │ │ │ ├── el.js │ │ │ │ │ ├── en.js │ │ │ │ │ ├── es.js │ │ │ │ │ ├── eu.js │ │ │ │ │ ├── fa.js │ │ │ │ │ ├── fi.js │ │ │ │ │ ├── fr_FR.js │ │ │ │ │ ├── he_IL.js │ │ │ │ │ ├── hi.js │ │ │ │ │ ├── hr.js │ │ │ │ │ ├── hu_HU.js │ │ │ │ │ ├── id.js │ │ │ │ │ ├── it.js │ │ │ │ │ ├── ja.js │ │ │ │ │ ├── kk.js │ │ │ │ │ ├── ko_KR.js │ │ │ │ │ ├── ms.js │ │ │ │ │ ├── nb_NO.js │ │ │ │ │ ├── nl.js │ │ │ │ │ ├── pl.js │ │ │ │ │ ├── pt_BR.js │ │ │ │ │ ├── pt_PT.js │ │ │ │ │ ├── ro.js │ │ │ │ │ ├── ru.js │ │ │ │ │ ├── sk.js │ │ │ │ │ ├── sl_SI.js │ │ │ │ │ ├── sv_SE.js │ │ │ │ │ ├── th_TH.js │ │ │ │ │ ├── tr.js │ │ │ │ │ ├── uk.js │ │ │ │ │ ├── vi.js │ │ │ │ │ ├── zh_CN.js │ │ │ │ │ └── zh_TW.js │ │ │ └── plugin.min.js │ │ ├── image │ │ │ └── plugin.min.js │ │ ├── importcss │ │ │ └── plugin.min.js │ │ ├── insertdatetime │ │ │ └── plugin.min.js │ │ ├── link │ │ │ └── plugin.min.js │ │ ├── lists │ │ │ └── plugin.min.js │ │ ├── media │ │ │ └── plugin.min.js │ │ ├── nonbreaking │ │ │ └── plugin.min.js │ │ ├── pagebreak │ │ │ └── plugin.min.js │ │ ├── preview │ │ │ └── plugin.min.js │ │ ├── quickbars │ │ │ └── plugin.min.js │ │ ├── save │ │ │ └── plugin.min.js │ │ ├── searchreplace │ │ │ └── plugin.min.js │ │ ├── table │ │ │ └── plugin.min.js │ │ ├── visualblocks │ │ │ └── plugin.min.js │ │ ├── visualchars │ │ │ └── plugin.min.js │ │ └── wordcount │ │ │ └── plugin.min.js │ │ ├── skins │ │ ├── content │ │ │ ├── dark │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── default │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── document │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── tinymce-5-dark │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ ├── tinymce-5 │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ │ └── writer │ │ │ │ ├── content.js │ │ │ │ └── content.min.css │ │ └── ui │ │ │ ├── oxide-dark │ │ │ ├── content.inline.js │ │ │ ├── content.inline.min.css │ │ │ ├── content.js │ │ │ ├── content.min.css │ │ │ ├── skin.js │ │ │ ├── skin.min.css │ │ │ ├── skin.shadowdom.js │ │ │ └── skin.shadowdom.min.css │ │ │ ├── oxide │ │ │ ├── content.inline.js │ │ │ ├── content.inline.min.css │ │ │ ├── content.js │ │ │ ├── content.min.css │ │ │ ├── skin.js │ │ │ ├── skin.min.css │ │ │ ├── skin.shadowdom.js │ │ │ └── skin.shadowdom.min.css │ │ │ ├── tinymce-5-dark │ │ │ ├── content.inline.js │ │ │ ├── content.inline.min.css │ │ │ ├── content.js │ │ │ ├── content.min.css │ │ │ ├── skin.js │ │ │ ├── skin.min.css │ │ │ ├── skin.shadowdom.js │ │ │ └── skin.shadowdom.min.css │ │ │ └── tinymce-5 │ │ │ ├── content.inline.js │ │ │ ├── content.inline.min.css │ │ │ ├── content.js │ │ │ ├── content.min.css │ │ │ ├── skin.js │ │ │ ├── skin.min.css │ │ │ ├── skin.shadowdom.js │ │ │ └── skin.shadowdom.min.css │ │ ├── themes │ │ └── silver │ │ │ └── theme.min.js │ │ ├── tinymce.d.ts │ │ └── tinymce.min.js │ ├── src │ ├── adapter │ │ ├── component │ │ │ └── index.ts │ │ ├── form.ts │ │ └── vxe-table.ts │ ├── api │ │ ├── common.d.ts │ │ ├── core │ │ │ ├── auth.ts │ │ │ ├── captcha.ts │ │ │ ├── index.ts │ │ │ ├── menu.ts │ │ │ ├── upload.ts │ │ │ └── user.ts │ │ ├── helper.ts │ │ ├── index.ts │ │ ├── monitor │ │ │ ├── cache │ │ │ │ └── index.ts │ │ │ ├── logininfo │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── online │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ └── operlog │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ ├── request.ts │ │ ├── system │ │ │ ├── client │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── config │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── configurationManage │ │ │ │ └── index.ts │ │ │ ├── dept │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── dict │ │ │ │ ├── dict-data-model.d.ts │ │ │ │ ├── dict-data.ts │ │ │ │ ├── dict-type-model.d.ts │ │ │ │ └── dict-type.ts │ │ │ ├── gpts │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── knowledgeBase │ │ │ │ └── index.ts │ │ │ ├── menu │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── message │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── model │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── notice │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── oss-config │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── oss │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── packagePlan │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── payOrder │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── plugin │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── post │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── profile │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── role │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── social │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── tenant-package │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── tenant │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── user │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ └── voucher │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ ├── tool │ │ │ └── gen │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ └── workflow │ │ │ ├── category │ │ │ ├── index.ts │ │ │ └── model.d.ts │ │ │ ├── definition │ │ │ ├── index.ts │ │ │ └── model.d.ts │ │ │ ├── instance │ │ │ ├── index.ts │ │ │ └── model.d.ts │ │ │ └── task │ │ │ ├── index.ts │ │ │ └── model.d.ts │ ├── app.vue │ ├── bootstrap.ts │ ├── components │ │ ├── cropper │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── cropper-avatar.vue │ │ │ │ ├── cropper-modal.vue │ │ │ │ ├── cropper.vue │ │ │ │ └── typing.ts │ │ ├── description │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── description.vue │ │ │ │ ├── typing.ts │ │ │ │ └── useDescription.ts │ │ ├── dict │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── data.tsx │ │ │ │ └── index.vue │ │ ├── global │ │ │ ├── button.ts │ │ │ └── index.ts │ │ ├── table │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── options-tag.vue │ │ │ │ └── table-switch.vue │ │ ├── tenant-toggle │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ └── index.vue │ │ ├── tinymce │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── editor.vue │ │ │ │ ├── helper.ts │ │ │ │ ├── img-upload.vue │ │ │ │ └── tinymce.ts │ │ ├── tree │ │ │ ├── index.ts │ │ │ └── src │ │ │ │ ├── data.tsx │ │ │ │ ├── helper.tsx │ │ │ │ ├── hook.tsx │ │ │ │ ├── menu-select-table.vue │ │ │ │ └── tree-select-panel.vue │ │ └── upload │ │ │ ├── index.ts │ │ │ └── src │ │ │ ├── file-upload.vue │ │ │ ├── helper.ts │ │ │ ├── image-upload.vue │ │ │ ├── typing.ts │ │ │ └── use-upload.ts │ ├── layouts │ │ ├── auth.vue │ │ ├── basic.vue │ │ └── index.ts │ ├── locales │ │ ├── README.md │ │ ├── index.ts │ │ └── langs │ │ │ ├── en-US │ │ │ ├── component.json │ │ │ ├── demos.json │ │ │ ├── http.json │ │ │ ├── menu.json │ │ │ ├── page.json │ │ │ └── pages.json │ │ │ └── zh-CN │ │ │ ├── component.json │ │ │ ├── demos.json │ │ │ ├── http.json │ │ │ ├── menu.json │ │ │ ├── page.json │ │ │ └── pages.json │ ├── main.ts │ ├── preferences.ts │ ├── router │ │ ├── access.ts │ │ ├── guard.ts │ │ ├── index.ts │ │ └── routes │ │ │ ├── core.ts │ │ │ ├── index.ts │ │ │ ├── local.ts │ │ │ ├── modules │ │ │ ├── dashboard.ts │ │ │ └── vben.ts │ │ │ └── workflow-iframe.ts │ ├── store │ │ ├── auth.ts │ │ ├── dict.ts │ │ ├── index.ts │ │ ├── notify.ts │ │ └── tenant.ts │ ├── utils │ │ ├── dict.ts │ │ ├── encryption │ │ │ ├── crypto.ts │ │ │ └── jsencrypt.ts │ │ ├── file │ │ │ ├── base64Conver.ts │ │ │ ├── download.ts │ │ │ └── index.ts │ │ ├── modal.tsx │ │ └── render.tsx │ └── views │ │ ├── _core │ │ ├── README.md │ │ ├── about │ │ │ └── index.vue │ │ ├── authentication │ │ │ ├── code-login.vue │ │ │ ├── forget-password.vue │ │ │ ├── login.vue │ │ │ ├── oauth-login.vue │ │ │ ├── qrcode-login.vue │ │ │ └── register.vue │ │ ├── fallback │ │ │ ├── coming-soon.vue │ │ │ ├── forbidden.vue │ │ │ ├── internal-error.vue │ │ │ ├── not-found.vue │ │ │ └── offline.vue │ │ ├── oauth-common.ts │ │ ├── profile │ │ │ ├── components │ │ │ │ ├── account-bind.vue │ │ │ │ ├── base-setting.vue │ │ │ │ ├── online-device.vue │ │ │ │ └── secure-setting.vue │ │ │ ├── index.vue │ │ │ ├── mitt.ts │ │ │ ├── profile-panel.vue │ │ │ └── setting-panel.vue │ │ └── social-callback │ │ │ └── index.vue │ │ ├── dashboard │ │ ├── analytics │ │ │ ├── analytics-trends.vue │ │ │ ├── analytics-visits-data.vue │ │ │ ├── analytics-visits-sales.vue │ │ │ ├── analytics-visits-source.vue │ │ │ ├── analytics-visits.vue │ │ │ └── index.vue │ │ └── workspace │ │ │ └── index.vue │ │ ├── demo │ │ ├── demo │ │ │ ├── api │ │ │ │ ├── index.ts │ │ │ │ └── model.d.ts │ │ │ ├── data.ts │ │ │ ├── demo-modal.vue │ │ │ └── index.vue │ │ └── tree │ │ │ ├── api │ │ │ ├── index.ts │ │ │ └── model.d.ts │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── tree-modal.vue │ │ ├── monitor │ │ ├── admin │ │ │ └── index.vue │ │ ├── cache │ │ │ ├── components │ │ │ │ ├── command-chart.vue │ │ │ │ ├── index.ts │ │ │ │ ├── memory-chart.vue │ │ │ │ └── redis-description.vue │ │ │ └── index.vue │ │ ├── logininfor │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ └── login-info-modal.vue │ │ ├── online │ │ │ ├── data.ts │ │ │ └── index.vue │ │ ├── operlog │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ └── operation-preview-drawer.vue │ │ └── snailjob │ │ │ └── index.vue │ │ ├── system │ │ ├── client │ │ │ ├── client-drawer.vue │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ └── secret-input.vue │ │ ├── config │ │ │ ├── config-modal.vue │ │ │ ├── data.ts │ │ │ └── index.vue │ │ ├── configurationManage │ │ │ └── index.vue │ │ ├── dept │ │ │ ├── data.ts │ │ │ ├── dept-drawer.vue │ │ │ └── index.vue │ │ ├── dict │ │ │ ├── data │ │ │ │ ├── data.ts │ │ │ │ ├── dict-data-drawer.vue │ │ │ │ ├── index.vue │ │ │ │ └── tag-style-picker.vue │ │ │ ├── index.vue │ │ │ ├── mitt.ts │ │ │ └── type │ │ │ │ ├── data.ts │ │ │ │ ├── dict-type-modal.vue │ │ │ │ └── index.vue │ │ ├── gpts │ │ │ ├── data.ts │ │ │ ├── gpts-modal.vue │ │ │ └── index.vue │ │ ├── knowledgeBase │ │ │ └── index.vue │ │ ├── menu │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ └── menu-drawer.vue │ │ ├── message │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── message-modal.vue │ │ ├── model │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── model-modal.vue │ │ ├── notice │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── notice-modal.vue │ │ ├── oss-config │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ └── oss-config-drawer.vue │ │ ├── oss │ │ │ ├── data.tsx │ │ │ ├── file-upload-modal.vue │ │ │ ├── image-upload-modal.vue │ │ │ └── index.vue │ │ ├── packagePlan │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── packagePlan-modal.vue │ │ ├── payOrder │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── payOrder-modal.vue │ │ ├── plugin │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── plugin-modal.vue │ │ ├── post │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── post-drawer.vue │ │ ├── role-assign │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ └── role-assign-drawer.vue │ │ ├── role │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ ├── role-auth-modal.vue │ │ │ └── role-drawer.vue │ │ ├── tenant │ │ │ ├── data.tsx │ │ │ ├── index.vue │ │ │ └── tenant-drawer.vue │ │ ├── tenantPackage │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ ├── tenant-package-drawer.vue │ │ │ └── tree-item.tsx │ │ ├── user │ │ │ ├── data.tsx │ │ │ ├── dept-tree.vue │ │ │ ├── index.vue │ │ │ ├── info.tsx │ │ │ ├── user-drawer.vue │ │ │ ├── user-import-modal.vue │ │ │ ├── user-info-modal.vue │ │ │ └── user-reset-pwd-modal.vue │ │ └── voucher │ │ │ ├── data.ts │ │ │ ├── index.vue │ │ │ └── voucher-modal.vue │ │ ├── tool │ │ └── gen │ │ │ ├── code-preview-modal.vue │ │ │ ├── data.tsx │ │ │ ├── edit-gen.vue │ │ │ ├── edit-steps │ │ │ ├── basic-setting.vue │ │ │ ├── basic.tsx │ │ │ ├── gen-config.vue │ │ │ ├── gen-data.tsx │ │ │ └── index.ts │ │ │ ├── index.vue │ │ │ └── table-import-modal.vue │ │ └── workflow │ │ ├── category │ │ ├── category-modal.vue │ │ ├── data.ts │ │ └── index.vue │ │ ├── components │ │ ├── apply-modal.vue │ │ ├── approval-card.vue │ │ ├── approval-content.vue │ │ ├── approval-details.vue │ │ ├── approval-modal.vue │ │ ├── approval-panel.vue │ │ ├── approval-rejection-modal.vue │ │ ├── approval-timeline-item.vue │ │ ├── approval-timeline.vue │ │ ├── copy-component.vue │ │ ├── flow-designer.vue │ │ ├── flow-info-modal.vue │ │ ├── flow-interfere-modal.vue │ │ ├── helper.tsx │ │ ├── index.ts │ │ └── user-select-modal.vue │ │ ├── leave │ │ ├── api │ │ │ ├── index.ts │ │ │ └── model.d.ts │ │ ├── data.tsx │ │ ├── index.vue │ │ ├── leave-description.vue │ │ └── leave-form.vue │ │ ├── processDefinition │ │ ├── category-tree.vue │ │ ├── constant.ts │ │ ├── data.tsx │ │ ├── index.vue │ │ ├── process-definition-deploy-modal.vue │ │ └── process-definition-modal.vue │ │ ├── processInstance │ │ ├── data.tsx │ │ ├── index.vue │ │ ├── instance-invalid-modal.vue │ │ └── instance-variable-modal.vue │ │ └── task │ │ ├── allTaskWaiting.vue │ │ ├── myDocument.vue │ │ ├── taskCopyList.vue │ │ ├── taskFinish.vue │ │ └── taskWaiting.vue │ ├── tailwind.config.mjs │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── types │ ├── directive.d.ts │ └── global-components.d.ts │ └── vite.config.mts ├── cspell.json ├── docs ├── .vitepress │ ├── components │ │ ├── demo-preview.vue │ │ ├── index.ts │ │ └── preview-group.vue │ ├── config │ │ ├── en.mts │ │ ├── index.mts │ │ ├── plugins │ │ │ └── demo-preview.ts │ │ ├── shared.mts │ │ └── zh.mts │ └── theme │ │ ├── components │ │ ├── site-layout.vue │ │ └── vben-contributors.vue │ │ ├── index.ts │ │ ├── plugins │ │ └── hm.ts │ │ └── styles │ │ ├── base.css │ │ ├── index.ts │ │ └── variables.css ├── package.json ├── src │ ├── _env │ │ ├── adapter │ │ │ ├── component.ts │ │ │ ├── form.ts │ │ │ └── vxe-table.ts │ │ └── node │ │ │ └── adapter │ │ │ ├── form.ts │ │ │ └── vxe-table.ts │ ├── commercial │ │ ├── community.md │ │ ├── customized.md │ │ └── technical-support.md │ ├── components │ │ ├── common-ui │ │ │ ├── vben-api-component.md │ │ │ ├── vben-count-to-animator.md │ │ │ ├── vben-drawer.md │ │ │ ├── vben-ellipsis-text.md │ │ │ ├── vben-form.md │ │ │ ├── vben-modal.md │ │ │ └── vben-vxe-table.md │ │ ├── introduction.md │ │ └── layout-ui │ │ │ └── page.md │ ├── demos │ │ ├── vben-api-component │ │ │ └── cascader │ │ │ │ └── index.vue │ │ ├── vben-count-to-animator │ │ │ ├── basic │ │ │ │ └── index.vue │ │ │ └── custom │ │ │ │ └── index.vue │ │ ├── vben-drawer │ │ │ ├── auto-height │ │ │ │ ├── drawer.vue │ │ │ │ └── index.vue │ │ │ ├── basic │ │ │ │ └── index.vue │ │ │ ├── dynamic │ │ │ │ ├── drawer.vue │ │ │ │ └── index.vue │ │ │ ├── extra │ │ │ │ ├── drawer.vue │ │ │ │ └── index.vue │ │ │ └── shared-data │ │ │ │ ├── drawer.vue │ │ │ │ └── index.vue │ │ ├── vben-ellipsis-text │ │ │ ├── expand │ │ │ │ └── index.vue │ │ │ ├── line │ │ │ │ └── index.vue │ │ │ └── tooltip │ │ │ │ └── index.vue │ │ ├── vben-form │ │ │ ├── api │ │ │ │ └── index.vue │ │ │ ├── basic │ │ │ │ └── index.vue │ │ │ ├── custom │ │ │ │ └── index.vue │ │ │ ├── dynamic │ │ │ │ └── index.vue │ │ │ ├── query │ │ │ │ └── index.vue │ │ │ └── rules │ │ │ │ └── index.vue │ │ ├── vben-modal │ │ │ ├── auto-height │ │ │ │ ├── index.vue │ │ │ │ └── modal.vue │ │ │ ├── basic │ │ │ │ └── index.vue │ │ │ ├── draggable │ │ │ │ ├── index.vue │ │ │ │ └── modal.vue │ │ │ ├── dynamic │ │ │ │ ├── index.vue │ │ │ │ └── modal.vue │ │ │ ├── extra │ │ │ │ ├── index.vue │ │ │ │ └── modal.vue │ │ │ └── shared-data │ │ │ │ ├── index.vue │ │ │ │ └── modal.vue │ │ └── vben-vxe-table │ │ │ ├── basic │ │ │ └── index.vue │ │ │ ├── custom-cell │ │ │ └── index.vue │ │ │ ├── edit-cell │ │ │ └── index.vue │ │ │ ├── edit-row │ │ │ └── index.vue │ │ │ ├── fixed │ │ │ └── index.vue │ │ │ ├── form │ │ │ └── index.vue │ │ │ ├── mock-api.ts │ │ │ ├── remote │ │ │ └── index.vue │ │ │ ├── table-data.ts │ │ │ ├── tree │ │ │ └── index.vue │ │ │ └── virtual │ │ │ └── index.vue │ ├── en │ │ ├── guide │ │ │ ├── essentials │ │ │ │ ├── build.md │ │ │ │ ├── concept.md │ │ │ │ ├── development.md │ │ │ │ ├── external-module.md │ │ │ │ ├── icons.md │ │ │ │ ├── route.md │ │ │ │ ├── server.md │ │ │ │ ├── settings.md │ │ │ │ └── styles.md │ │ │ ├── in-depth │ │ │ │ ├── access.md │ │ │ │ ├── check-updates.md │ │ │ │ ├── features.md │ │ │ │ ├── layout.md │ │ │ │ ├── loading.md │ │ │ │ ├── locale.md │ │ │ │ ├── login.md │ │ │ │ ├── theme.md │ │ │ │ └── ui-framework.md │ │ │ ├── introduction │ │ │ │ ├── changelog.md │ │ │ │ ├── quick-start.md │ │ │ │ ├── roadmap.md │ │ │ │ ├── thin.md │ │ │ │ ├── vben.md │ │ │ │ └── why.md │ │ │ ├── other │ │ │ │ ├── faq.md │ │ │ │ ├── project-update.md │ │ │ │ └── remove-code.md │ │ │ └── project │ │ │ │ ├── changeset.md │ │ │ │ ├── cli.md │ │ │ │ ├── dir.md │ │ │ │ ├── standard.md │ │ │ │ ├── tailwindcss.md │ │ │ │ ├── test.md │ │ │ │ └── vite.md │ │ └── index.md │ ├── friend-links │ │ └── index.md │ ├── guide │ │ ├── essentials │ │ │ ├── build.md │ │ │ ├── concept.md │ │ │ ├── development.md │ │ │ ├── external-module.md │ │ │ ├── icons.md │ │ │ ├── route.md │ │ │ ├── server.md │ │ │ ├── settings.md │ │ │ └── styles.md │ │ ├── in-depth │ │ │ ├── access.md │ │ │ ├── check-updates.md │ │ │ ├── features.md │ │ │ ├── layout.md │ │ │ ├── loading.md │ │ │ ├── locale.md │ │ │ ├── login.md │ │ │ ├── theme.md │ │ │ └── ui-framework.md │ │ ├── introduction │ │ │ ├── changelog.md │ │ │ ├── quick-start.md │ │ │ ├── roadmap.md │ │ │ ├── thin.md │ │ │ ├── vben.md │ │ │ └── why.md │ │ ├── other │ │ │ ├── faq.md │ │ │ ├── project-update.md │ │ │ └── remove-code.md │ │ └── project │ │ │ ├── changeset.md │ │ │ ├── cli.md │ │ │ ├── dir.md │ │ │ ├── standard.md │ │ │ ├── tailwindcss.md │ │ │ ├── test.md │ │ │ └── vite.md │ ├── index.md │ ├── public │ │ ├── favicon.ico │ │ ├── guide │ │ │ ├── devtools.png │ │ │ ├── loading.png │ │ │ ├── locale.png │ │ │ ├── login-expired.png │ │ │ ├── login.png │ │ │ ├── preferences.png │ │ │ ├── qq.png │ │ │ ├── qq_channel.png │ │ │ ├── report.png │ │ │ ├── test.png │ │ │ └── update-notice.png │ │ └── logos │ │ │ ├── nitro.svg │ │ │ ├── shadcn-ui.svg │ │ │ ├── turborepo.svg │ │ │ └── vite.svg │ └── sponsor │ │ └── personal.md ├── tailwind.config.mjs └── tsconfig.json ├── eslint.config.mjs ├── internal ├── lint-configs │ ├── commitlint-config │ │ ├── index.mjs │ │ └── package.json │ ├── eslint-config │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── configs │ │ │ │ ├── command.ts │ │ │ │ ├── comments.ts │ │ │ │ ├── disableds.ts │ │ │ │ ├── ignores.ts │ │ │ │ ├── import.ts │ │ │ │ ├── index.ts │ │ │ │ ├── javascript.ts │ │ │ │ ├── jsdoc.ts │ │ │ │ ├── jsonc.ts │ │ │ │ ├── node.ts │ │ │ │ ├── perfectionist.ts │ │ │ │ ├── prettier.ts │ │ │ │ ├── regexp.ts │ │ │ │ ├── test.ts │ │ │ │ ├── turbo.ts │ │ │ │ ├── typescript.ts │ │ │ │ ├── unicorn.ts │ │ │ │ └── vue.ts │ │ │ ├── custom-config.ts │ │ │ ├── index.ts │ │ │ └── util.ts │ │ └── tsconfig.json │ ├── prettier-config │ │ ├── index.mjs │ │ └── package.json │ └── stylelint-config │ │ ├── index.mjs │ │ └── package.json ├── node-utils │ ├── build.config.ts │ ├── package.json │ ├── src │ │ ├── __tests__ │ │ │ ├── hash.test.ts │ │ │ └── path.test.ts │ │ ├── constants.ts │ │ ├── date.ts │ │ ├── fs.ts │ │ ├── git.ts │ │ ├── hash.ts │ │ ├── index.ts │ │ ├── monorepo.ts │ │ ├── path.ts │ │ ├── prettier.ts │ │ └── spinner.ts │ └── tsconfig.json ├── tailwind-config │ ├── build.config.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── module.d.ts │ │ ├── plugins │ │ │ └── entry.ts │ │ └── postcss.config.ts │ └── tsconfig.json ├── tsconfig │ ├── base.json │ ├── library.json │ ├── node.json │ ├── package.json │ ├── web-app.json │ └── web.json └── vite-config │ ├── build.config.ts │ ├── package.json │ ├── src │ ├── config │ │ ├── application.ts │ │ ├── common.ts │ │ ├── index.ts │ │ └── library.ts │ ├── index.ts │ ├── options.ts │ ├── plugins │ │ ├── archiver.ts │ │ ├── extra-app-config.ts │ │ ├── importmap.ts │ │ ├── index.ts │ │ ├── inject-app-loading │ │ │ ├── README.md │ │ │ ├── default-loading-antd.html │ │ │ ├── default-loading.html │ │ │ └── index.ts │ │ ├── inject-metadata.ts │ │ ├── license.ts │ │ ├── nitro-mock.ts │ │ ├── print.ts │ │ └── vxe-table.ts │ ├── typing.ts │ └── utils │ │ └── env.ts │ └── tsconfig.json ├── package.json ├── packages ├── @core │ ├── README.md │ ├── base │ │ ├── README.md │ │ ├── design │ │ │ ├── package.json │ │ │ ├── src │ │ │ │ ├── css │ │ │ │ │ ├── global.css │ │ │ │ │ ├── nprogress.css │ │ │ │ │ ├── transition.css │ │ │ │ │ └── ui.css │ │ │ │ ├── design-tokens │ │ │ │ │ ├── dark.css │ │ │ │ │ ├── default.css │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── scss-bem │ │ │ │ │ ├── bem.scss │ │ │ │ │ └── constants.scss │ │ │ ├── tsconfig.json │ │ │ └── vite.config.mts │ │ ├── icons │ │ │ ├── build.config.ts │ │ │ ├── package.json │ │ │ ├── src │ │ │ │ ├── create-icon.ts │ │ │ │ ├── index.ts │ │ │ │ └── lucide.ts │ │ │ └── tsconfig.json │ │ ├── shared │ │ │ ├── build.config.ts │ │ │ ├── package.json │ │ │ ├── src │ │ │ │ ├── cache │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── storage-manager.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── storage-manager.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── color │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── convert.test.ts │ │ │ │ │ ├── color.ts │ │ │ │ │ ├── convert.ts │ │ │ │ │ ├── generator.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── constants │ │ │ │ │ ├── dict-enum.ts │ │ │ │ │ ├── globals.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── vben.ts │ │ │ │ ├── global-state.ts │ │ │ │ ├── store.ts │ │ │ │ └── utils │ │ │ │ │ ├── __tests__ │ │ │ │ │ ├── diff.test.ts │ │ │ │ │ ├── dom.test.ts │ │ │ │ │ ├── inference.test.ts │ │ │ │ │ ├── letter.test.ts │ │ │ │ │ ├── state-handler.test.ts │ │ │ │ │ ├── tree.test.ts │ │ │ │ │ ├── unique.test.ts │ │ │ │ │ ├── update-css-variables.test.ts │ │ │ │ │ ├── util.test.ts │ │ │ │ │ └── window.test.ts │ │ │ │ │ ├── cn.ts │ │ │ │ │ ├── date.ts │ │ │ │ │ ├── diff.ts │ │ │ │ │ ├── dom.ts │ │ │ │ │ ├── download.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── inference.ts │ │ │ │ │ ├── letter.ts │ │ │ │ │ ├── merge.ts │ │ │ │ │ ├── nprogress.ts │ │ │ │ │ ├── state-handler.ts │ │ │ │ │ ├── to.ts │ │ │ │ │ ├── tree.ts │ │ │ │ │ ├── unique.ts │ │ │ │ │ ├── update-css-variables.ts │ │ │ │ │ ├── util.ts │ │ │ │ │ └── window.ts │ │ │ └── tsconfig.json │ │ └── typings │ │ │ ├── build.config.ts │ │ │ ├── package.json │ │ │ ├── src │ │ │ ├── app.d.ts │ │ │ ├── basic.d.ts │ │ │ ├── helper.d.ts │ │ │ ├── index.ts │ │ │ ├── menu-record.ts │ │ │ ├── tabs.ts │ │ │ └── vue-router.d.ts │ │ │ ├── tsconfig.json │ │ │ └── vue-router.d.ts │ ├── composables │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── __tests__ │ │ │ │ └── use-sortable.test.ts │ │ │ ├── index.ts │ │ │ ├── use-is-mobile.ts │ │ │ ├── use-layout-style.ts │ │ │ ├── use-namespace.ts │ │ │ ├── use-priority-value.ts │ │ │ ├── use-scroll-lock.ts │ │ │ ├── use-simple-locale │ │ │ │ ├── README.md │ │ │ │ ├── index.ts │ │ │ │ └── messages.ts │ │ │ └── use-sortable.ts │ │ └── tsconfig.json │ ├── preferences │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ └── config.test.ts.snap │ │ │ ├── config.test.ts │ │ │ └── preferences.test.ts │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── config.ts │ │ │ ├── constants.ts │ │ │ ├── index.ts │ │ │ ├── preferences.ts │ │ │ ├── types.ts │ │ │ ├── update-css-variables.ts │ │ │ └── use-preferences.ts │ │ └── tsconfig.json │ └── ui-kit │ │ ├── README.md │ │ ├── form-ui │ │ ├── __tests__ │ │ │ └── form-api.test.ts │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ │ ├── components │ │ │ │ └── form-actions.vue │ │ │ ├── config.ts │ │ │ ├── form-api.ts │ │ │ ├── form-render │ │ │ │ ├── context.ts │ │ │ │ ├── dependencies.ts │ │ │ │ ├── expandable.ts │ │ │ │ ├── form-field.vue │ │ │ │ ├── form-label.vue │ │ │ │ ├── form.vue │ │ │ │ ├── helper.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ ├── use-form-context.ts │ │ │ ├── use-vben-form.ts │ │ │ ├── vben-form.vue │ │ │ └── vben-use-form.vue │ │ ├── tailwind.config.mjs │ │ └── tsconfig.json │ │ ├── layout-ui │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ │ ├── components │ │ │ │ ├── index.ts │ │ │ │ ├── layout-content.vue │ │ │ │ ├── layout-footer.vue │ │ │ │ ├── layout-header.vue │ │ │ │ ├── layout-sidebar.vue │ │ │ │ ├── layout-tabbar.vue │ │ │ │ └── widgets │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── sidebar-collapse-button.vue │ │ │ │ │ └── sidebar-fixed-button.vue │ │ │ ├── hooks │ │ │ │ └── use-layout.ts │ │ │ ├── index.ts │ │ │ ├── vben-layout.ts │ │ │ └── vben-layout.vue │ │ ├── tailwind.config.mjs │ │ └── tsconfig.json │ │ ├── menu-ui │ │ ├── README.md │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ │ ├── components │ │ │ │ ├── collapse-transition.vue │ │ │ │ ├── index.ts │ │ │ │ ├── menu-badge-dot.vue │ │ │ │ ├── menu-badge.vue │ │ │ │ ├── menu-item.vue │ │ │ │ ├── menu.vue │ │ │ │ ├── normal-menu │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── normal-menu.ts │ │ │ │ │ └── normal-menu.vue │ │ │ │ ├── sub-menu-content.vue │ │ │ │ └── sub-menu.vue │ │ │ ├── hooks │ │ │ │ ├── index.ts │ │ │ │ ├── use-menu-context.ts │ │ │ │ └── use-menu.ts │ │ │ ├── index.ts │ │ │ ├── menu.vue │ │ │ ├── sub-menu.vue │ │ │ ├── types.ts │ │ │ └── utils │ │ │ │ └── index.ts │ │ ├── tailwind.config.mjs │ │ └── tsconfig.json │ │ ├── popup-ui │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ │ ├── drawer │ │ │ │ ├── __tests__ │ │ │ │ │ └── drawer-api.test.ts │ │ │ │ ├── drawer-api.ts │ │ │ │ ├── drawer.ts │ │ │ │ ├── drawer.vue │ │ │ │ ├── index.ts │ │ │ │ └── use-drawer.ts │ │ │ ├── index.ts │ │ │ └── modal │ │ │ │ ├── __tests__ │ │ │ │ └── modal-api.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── modal-api.ts │ │ │ │ ├── modal.ts │ │ │ │ ├── modal.vue │ │ │ │ ├── use-modal-draggable.ts │ │ │ │ └── use-modal.ts │ │ ├── tailwind.config.mjs │ │ └── tsconfig.json │ │ ├── shadcn-ui │ │ ├── build.config.ts │ │ ├── components.json │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ │ ├── components │ │ │ │ ├── avatar │ │ │ │ │ ├── avatar.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── back-top │ │ │ │ │ ├── back-top.vue │ │ │ │ │ ├── backtop.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── use-backtop.ts │ │ │ │ ├── breadcrumb │ │ │ │ │ ├── breadcrumb-background.vue │ │ │ │ │ ├── breadcrumb-view.vue │ │ │ │ │ ├── breadcrumb.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── button │ │ │ │ │ ├── button-group.vue │ │ │ │ │ ├── button.ts │ │ │ │ │ ├── button.vue │ │ │ │ │ ├── check-button-group.vue │ │ │ │ │ ├── icon-button.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── checkbox │ │ │ │ │ ├── checkbox.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── context-menu │ │ │ │ │ ├── context-menu.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── interface.ts │ │ │ │ ├── count-to-animator │ │ │ │ │ ├── count-to-animator.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── dropdown-menu │ │ │ │ │ ├── dropdown-menu.vue │ │ │ │ │ ├── dropdown-radio-menu.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── interface.ts │ │ │ │ ├── expandable-arrow │ │ │ │ │ ├── expandable-arrow.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── full-screen │ │ │ │ │ ├── full-screen.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── hover-card │ │ │ │ │ ├── hover-card.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── icon │ │ │ │ │ ├── icon.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── input-captcha │ │ │ │ │ ├── index.ts │ │ │ │ │ └── input-captcha.vue │ │ │ │ ├── input-password │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input-password.vue │ │ │ │ │ └── password-strength.vue │ │ │ │ ├── logo │ │ │ │ │ ├── index.ts │ │ │ │ │ └── logo.vue │ │ │ │ ├── pin-input │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input.vue │ │ │ │ │ └── types.ts │ │ │ │ ├── popover │ │ │ │ │ ├── index.ts │ │ │ │ │ └── popover.vue │ │ │ │ ├── render-content │ │ │ │ │ ├── index.ts │ │ │ │ │ └── render-content.vue │ │ │ │ ├── scrollbar │ │ │ │ │ ├── index.ts │ │ │ │ │ └── scrollbar.vue │ │ │ │ ├── segmented │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── segmented.vue │ │ │ │ │ ├── tabs-indicator.vue │ │ │ │ │ └── types.ts │ │ │ │ ├── select │ │ │ │ │ ├── index.ts │ │ │ │ │ └── select.vue │ │ │ │ ├── spine-text │ │ │ │ │ ├── index.ts │ │ │ │ │ └── spine-text.vue │ │ │ │ ├── spinner │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── loading.vue │ │ │ │ │ └── spinner.vue │ │ │ │ └── tooltip │ │ │ │ │ ├── help-tooltip.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── tooltip.vue │ │ │ ├── index.ts │ │ │ └── ui │ │ │ │ ├── accordion │ │ │ │ ├── Accordion.vue │ │ │ │ ├── AccordionContent.vue │ │ │ │ ├── AccordionItem.vue │ │ │ │ ├── AccordionTrigger.vue │ │ │ │ └── index.ts │ │ │ │ ├── avatar │ │ │ │ ├── Avatar.vue │ │ │ │ ├── AvatarFallback.vue │ │ │ │ ├── AvatarImage.vue │ │ │ │ ├── avatar.ts │ │ │ │ └── index.ts │ │ │ │ ├── badge │ │ │ │ ├── Badge.vue │ │ │ │ ├── badge.ts │ │ │ │ └── index.ts │ │ │ │ ├── breadcrumb │ │ │ │ ├── Breadcrumb.vue │ │ │ │ ├── BreadcrumbEllipsis.vue │ │ │ │ ├── BreadcrumbItem.vue │ │ │ │ ├── BreadcrumbLink.vue │ │ │ │ ├── BreadcrumbList.vue │ │ │ │ ├── BreadcrumbPage.vue │ │ │ │ ├── BreadcrumbSeparator.vue │ │ │ │ └── index.ts │ │ │ │ ├── button │ │ │ │ ├── Button.vue │ │ │ │ ├── button.ts │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ │ ├── card │ │ │ │ ├── Card.vue │ │ │ │ ├── CardContent.vue │ │ │ │ ├── CardDescription.vue │ │ │ │ ├── CardFooter.vue │ │ │ │ ├── CardHeader.vue │ │ │ │ ├── CardTitle.vue │ │ │ │ └── index.ts │ │ │ │ ├── checkbox │ │ │ │ ├── Checkbox.vue │ │ │ │ └── index.ts │ │ │ │ ├── context-menu │ │ │ │ ├── ContextMenu.vue │ │ │ │ ├── ContextMenuCheckboxItem.vue │ │ │ │ ├── ContextMenuContent.vue │ │ │ │ ├── ContextMenuGroup.vue │ │ │ │ ├── ContextMenuItem.vue │ │ │ │ ├── ContextMenuLabel.vue │ │ │ │ ├── ContextMenuPortal.vue │ │ │ │ ├── ContextMenuRadioGroup.vue │ │ │ │ ├── ContextMenuRadioItem.vue │ │ │ │ ├── ContextMenuSeparator.vue │ │ │ │ ├── ContextMenuShortcut.vue │ │ │ │ ├── ContextMenuSub.vue │ │ │ │ ├── ContextMenuSubContent.vue │ │ │ │ ├── ContextMenuSubTrigger.vue │ │ │ │ ├── ContextMenuTrigger.vue │ │ │ │ └── index.ts │ │ │ │ ├── dialog │ │ │ │ ├── Dialog.vue │ │ │ │ ├── DialogClose.vue │ │ │ │ ├── DialogContent.vue │ │ │ │ ├── DialogDescription.vue │ │ │ │ ├── DialogFooter.vue │ │ │ │ ├── DialogHeader.vue │ │ │ │ ├── DialogOverlay.vue │ │ │ │ ├── DialogScrollContent.vue │ │ │ │ ├── DialogTitle.vue │ │ │ │ ├── DialogTrigger.vue │ │ │ │ └── index.ts │ │ │ │ ├── dropdown-menu │ │ │ │ ├── DropdownMenu.vue │ │ │ │ ├── DropdownMenuCheckboxItem.vue │ │ │ │ ├── DropdownMenuContent.vue │ │ │ │ ├── DropdownMenuGroup.vue │ │ │ │ ├── DropdownMenuItem.vue │ │ │ │ ├── DropdownMenuLabel.vue │ │ │ │ ├── DropdownMenuRadioGroup.vue │ │ │ │ ├── DropdownMenuRadioItem.vue │ │ │ │ ├── DropdownMenuSeparator.vue │ │ │ │ ├── DropdownMenuShortcut.vue │ │ │ │ ├── DropdownMenuSub.vue │ │ │ │ ├── DropdownMenuSubContent.vue │ │ │ │ ├── DropdownMenuSubTrigger.vue │ │ │ │ ├── DropdownMenuTrigger.vue │ │ │ │ └── index.ts │ │ │ │ ├── form │ │ │ │ ├── FormControl.vue │ │ │ │ ├── FormDescription.vue │ │ │ │ ├── FormItem.vue │ │ │ │ ├── FormLabel.vue │ │ │ │ ├── FormMessage.vue │ │ │ │ ├── index.ts │ │ │ │ ├── injectionKeys.ts │ │ │ │ └── useFormField.ts │ │ │ │ ├── hover-card │ │ │ │ ├── HoverCard.vue │ │ │ │ ├── HoverCardContent.vue │ │ │ │ ├── HoverCardTrigger.vue │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── input │ │ │ │ ├── Input.vue │ │ │ │ └── index.ts │ │ │ │ ├── label │ │ │ │ ├── Label.vue │ │ │ │ └── index.ts │ │ │ │ ├── number-field │ │ │ │ ├── NumberField.vue │ │ │ │ ├── NumberFieldContent.vue │ │ │ │ ├── NumberFieldDecrement.vue │ │ │ │ ├── NumberFieldIncrement.vue │ │ │ │ ├── NumberFieldInput.vue │ │ │ │ └── index.ts │ │ │ │ ├── pagination │ │ │ │ ├── PaginationEllipsis.vue │ │ │ │ ├── PaginationFirst.vue │ │ │ │ ├── PaginationLast.vue │ │ │ │ ├── PaginationNext.vue │ │ │ │ ├── PaginationPrev.vue │ │ │ │ └── index.ts │ │ │ │ ├── pin-input │ │ │ │ ├── PinInput.vue │ │ │ │ ├── PinInputGroup.vue │ │ │ │ ├── PinInputInput.vue │ │ │ │ ├── PinInputSeparator.vue │ │ │ │ └── index.ts │ │ │ │ ├── popover │ │ │ │ ├── Popover.vue │ │ │ │ ├── PopoverContent.vue │ │ │ │ ├── PopoverTrigger.vue │ │ │ │ └── index.ts │ │ │ │ ├── radio-group │ │ │ │ ├── RadioGroup.vue │ │ │ │ ├── RadioGroupItem.vue │ │ │ │ └── index.ts │ │ │ │ ├── resizable │ │ │ │ ├── ResizableHandle.vue │ │ │ │ ├── ResizablePanelGroup.vue │ │ │ │ └── index.ts │ │ │ │ ├── scroll-area │ │ │ │ ├── ScrollArea.vue │ │ │ │ ├── ScrollBar.vue │ │ │ │ └── index.ts │ │ │ │ ├── select │ │ │ │ ├── Select.vue │ │ │ │ ├── SelectContent.vue │ │ │ │ ├── SelectGroup.vue │ │ │ │ ├── SelectItem.vue │ │ │ │ ├── SelectItemText.vue │ │ │ │ ├── SelectLabel.vue │ │ │ │ ├── SelectScrollDownButton.vue │ │ │ │ ├── SelectScrollUpButton.vue │ │ │ │ ├── SelectSeparator.vue │ │ │ │ ├── SelectTrigger.vue │ │ │ │ ├── SelectValue.vue │ │ │ │ └── index.ts │ │ │ │ ├── separator │ │ │ │ ├── Separator.vue │ │ │ │ └── index.ts │ │ │ │ ├── sheet │ │ │ │ ├── Sheet.vue │ │ │ │ ├── SheetClose.vue │ │ │ │ ├── SheetContent.vue │ │ │ │ ├── SheetDescription.vue │ │ │ │ ├── SheetFooter.vue │ │ │ │ ├── SheetHeader.vue │ │ │ │ ├── SheetOverlay.vue │ │ │ │ ├── SheetTitle.vue │ │ │ │ ├── SheetTrigger.vue │ │ │ │ ├── index.ts │ │ │ │ └── sheet.ts │ │ │ │ ├── switch │ │ │ │ ├── Switch.vue │ │ │ │ └── index.ts │ │ │ │ ├── tabs │ │ │ │ ├── Tabs.vue │ │ │ │ ├── TabsContent.vue │ │ │ │ ├── TabsList.vue │ │ │ │ ├── TabsTrigger.vue │ │ │ │ └── index.ts │ │ │ │ ├── textarea │ │ │ │ ├── Textarea.vue │ │ │ │ └── index.ts │ │ │ │ ├── toggle-group │ │ │ │ ├── ToggleGroup.vue │ │ │ │ ├── ToggleGroupItem.vue │ │ │ │ └── index.ts │ │ │ │ ├── toggle │ │ │ │ ├── Toggle.vue │ │ │ │ ├── index.ts │ │ │ │ └── toggle.ts │ │ │ │ ├── tooltip │ │ │ │ ├── Tooltip.vue │ │ │ │ ├── TooltipContent.vue │ │ │ │ ├── TooltipProvider.vue │ │ │ │ ├── TooltipTrigger.vue │ │ │ │ └── index.ts │ │ │ │ └── tree │ │ │ │ ├── index.ts │ │ │ │ └── tree.vue │ │ ├── tailwind.config.mjs │ │ └── tsconfig.json │ │ └── tabs-ui │ │ ├── build.config.ts │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src │ │ ├── components │ │ │ ├── index.ts │ │ │ ├── tabs-chrome │ │ │ │ └── tabs.vue │ │ │ ├── tabs │ │ │ │ └── tabs.vue │ │ │ └── widgets │ │ │ │ ├── index.ts │ │ │ │ ├── tool-more.vue │ │ │ │ └── tool-screen.vue │ │ ├── index.ts │ │ ├── tabs-view.vue │ │ ├── types.ts │ │ ├── use-tabs-drag.ts │ │ └── use-tabs-view-scroll.ts │ │ ├── tailwind.config.mjs │ │ └── tsconfig.json ├── constants │ ├── README.md │ ├── package.json │ ├── src │ │ ├── core.ts │ │ └── index.ts │ └── tsconfig.json ├── effects │ ├── README.md │ ├── access │ │ ├── package.json │ │ ├── src │ │ │ ├── access-control.vue │ │ │ ├── accessible.ts │ │ │ ├── directive.ts │ │ │ ├── index.ts │ │ │ └── use-access.ts │ │ └── tsconfig.json │ ├── common-ui │ │ ├── package.json │ │ ├── src │ │ │ ├── components │ │ │ │ ├── api-component │ │ │ │ │ ├── api-component.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── captcha │ │ │ │ │ ├── hooks │ │ │ │ │ │ └── useCaptchaPoints.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── point-selection-captcha │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ └── point-selection-captcha-card.vue │ │ │ │ │ ├── slider-captcha │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ ├── slider-captcha-action.vue │ │ │ │ │ │ ├── slider-captcha-bar.vue │ │ │ │ │ │ └── slider-captcha-content.vue │ │ │ │ │ ├── slider-rotate-captcha │ │ │ │ │ │ └── index.vue │ │ │ │ │ └── types.ts │ │ │ │ ├── code-mirror │ │ │ │ │ ├── code-mirror.vue │ │ │ │ │ ├── data.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── col-page │ │ │ │ │ ├── col-page.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── count-to │ │ │ │ │ ├── count-to.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── ellipsis-text │ │ │ │ │ ├── ellipsis-text.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── icon-picker │ │ │ │ │ ├── icon-picker.vue │ │ │ │ │ ├── icons.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── json-preview │ │ │ │ │ ├── index.ts │ │ │ │ │ └── json-preview.vue │ │ │ │ ├── json-viewer │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── index.vue │ │ │ │ │ ├── style.scss │ │ │ │ │ └── types.ts │ │ │ │ ├── loading │ │ │ │ │ ├── directive.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── loading.vue │ │ │ │ │ └── spinner.vue │ │ │ │ ├── markdown │ │ │ │ │ ├── editor.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── preview.vue │ │ │ │ ├── page │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── page.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── page.vue │ │ │ │ │ └── types.ts │ │ │ │ ├── resize │ │ │ │ │ ├── index.ts │ │ │ │ │ └── resize.vue │ │ │ │ └── tippy │ │ │ │ │ ├── directive.ts │ │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── ui │ │ │ │ ├── about │ │ │ │ ├── about.ts │ │ │ │ ├── about.vue │ │ │ │ └── index.ts │ │ │ │ ├── authentication │ │ │ │ ├── auth-title.vue │ │ │ │ ├── code-login.vue │ │ │ │ ├── forget-password.vue │ │ │ │ ├── index.ts │ │ │ │ ├── login-expired-modal.vue │ │ │ │ ├── login.vue │ │ │ │ ├── qrcode-login.vue │ │ │ │ ├── register.vue │ │ │ │ ├── third-party-login.vue │ │ │ │ └── types.ts │ │ │ │ ├── dashboard │ │ │ │ ├── analysis │ │ │ │ │ ├── analysis-chart-card.vue │ │ │ │ │ ├── analysis-charts-tabs.vue │ │ │ │ │ ├── analysis-overview.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── typing.ts │ │ │ │ └── workbench │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── workbench-header.vue │ │ │ │ │ ├── workbench-project.vue │ │ │ │ │ ├── workbench-quick-nav.vue │ │ │ │ │ ├── workbench-todo.vue │ │ │ │ │ └── workbench-trends.vue │ │ │ │ ├── fallback │ │ │ │ ├── fallback.ts │ │ │ │ ├── fallback.vue │ │ │ │ ├── icons │ │ │ │ │ ├── icon-403.vue │ │ │ │ │ ├── icon-404.vue │ │ │ │ │ ├── icon-500.vue │ │ │ │ │ ├── icon-coming-soon.vue │ │ │ │ │ ├── icon-offline.vue │ │ │ │ │ └── warning.svg │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── hooks │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── use-app-config.ts │ │ │ ├── use-content-maximize.ts │ │ │ ├── use-design-tokens.ts │ │ │ ├── use-hover-toggle.ts │ │ │ ├── use-pagination.ts │ │ │ ├── use-refresh.ts │ │ │ ├── use-tabs.ts │ │ │ └── use-watermark.ts │ │ └── tsconfig.json │ ├── layouts │ │ ├── package.json │ │ ├── src │ │ │ ├── authentication │ │ │ │ ├── authentication.vue │ │ │ │ ├── form.vue │ │ │ │ ├── icons │ │ │ │ │ └── slogan.vue │ │ │ │ ├── index.ts │ │ │ │ ├── toolbar.vue │ │ │ │ └── types.ts │ │ │ ├── basic │ │ │ │ ├── README.md │ │ │ │ ├── content │ │ │ │ │ ├── content-spinner.vue │ │ │ │ │ ├── content.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── use-content-spinner.ts │ │ │ │ ├── copyright │ │ │ │ │ ├── copyright.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── footer │ │ │ │ │ ├── footer.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── header │ │ │ │ │ ├── header.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── layout.vue │ │ │ │ ├── menu │ │ │ │ │ ├── extra-menu.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── menu.vue │ │ │ │ │ ├── mixed-menu.vue │ │ │ │ │ ├── use-extra-menu.ts │ │ │ │ │ ├── use-mixed-menu.ts │ │ │ │ │ └── use-navigation.ts │ │ │ │ └── tabbar │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── tabbar.vue │ │ │ │ │ └── use-tabbar.ts │ │ │ ├── iframe │ │ │ │ ├── iframe-router-view.vue │ │ │ │ ├── iframe-view.vue │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── widgets │ │ │ │ ├── breadcrumb.vue │ │ │ │ ├── check-updates │ │ │ │ ├── check-updates.vue │ │ │ │ └── index.ts │ │ │ │ ├── color-toggle.vue │ │ │ │ ├── global-search │ │ │ │ ├── global-search.vue │ │ │ │ ├── index.ts │ │ │ │ └── search-panel.vue │ │ │ │ ├── index.ts │ │ │ │ ├── language-toggle.vue │ │ │ │ ├── layout-toggle.vue │ │ │ │ ├── lock-screen │ │ │ │ ├── index.ts │ │ │ │ ├── lock-screen-modal.vue │ │ │ │ └── lock-screen.vue │ │ │ │ ├── notification │ │ │ │ ├── index.ts │ │ │ │ ├── notification.vue │ │ │ │ └── types.ts │ │ │ │ ├── preferences │ │ │ │ ├── blocks │ │ │ │ │ ├── block.vue │ │ │ │ │ ├── general │ │ │ │ │ │ ├── animation.vue │ │ │ │ │ │ └── general.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input-item.vue │ │ │ │ │ ├── layout │ │ │ │ │ │ ├── breadcrumb.vue │ │ │ │ │ │ ├── content.vue │ │ │ │ │ │ ├── copyright.vue │ │ │ │ │ │ ├── footer.vue │ │ │ │ │ │ ├── header.vue │ │ │ │ │ │ ├── layout.vue │ │ │ │ │ │ ├── navigation.vue │ │ │ │ │ │ ├── sidebar.vue │ │ │ │ │ │ ├── tabbar.vue │ │ │ │ │ │ └── widget.vue │ │ │ │ │ ├── number-field-item.vue │ │ │ │ │ ├── select-item.vue │ │ │ │ │ ├── shortcut-keys │ │ │ │ │ │ └── global.vue │ │ │ │ │ ├── switch-item.vue │ │ │ │ │ ├── theme │ │ │ │ │ │ ├── builtin.vue │ │ │ │ │ │ ├── color-mode.vue │ │ │ │ │ │ ├── radius.vue │ │ │ │ │ │ └── theme.vue │ │ │ │ │ └── toggle-item.vue │ │ │ │ ├── icons │ │ │ │ │ ├── content-compact.vue │ │ │ │ │ ├── full-content.vue │ │ │ │ │ ├── header-mixed-nav.vue │ │ │ │ │ ├── header-nav.vue │ │ │ │ │ ├── header-sidebar-nav.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── mixed-nav.vue │ │ │ │ │ ├── setting.vue │ │ │ │ │ ├── sidebar-mixed-nav.vue │ │ │ │ │ └── sidebar-nav.vue │ │ │ │ ├── index.ts │ │ │ │ ├── preferences-button.vue │ │ │ │ ├── preferences-drawer.vue │ │ │ │ ├── preferences.vue │ │ │ │ └── use-open-preferences.ts │ │ │ │ ├── theme-toggle │ │ │ │ ├── index.ts │ │ │ │ ├── theme-button.vue │ │ │ │ └── theme-toggle.vue │ │ │ │ └── user-dropdown │ │ │ │ ├── index.ts │ │ │ │ └── user-dropdown.vue │ │ └── tsconfig.json │ ├── plugins │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── echarts │ │ │ │ ├── echarts-ui.vue │ │ │ │ ├── echarts.ts │ │ │ │ ├── index.ts │ │ │ │ └── use-echarts.ts │ │ │ ├── motion │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ └── vxe-table │ │ │ │ ├── api.ts │ │ │ │ ├── extends.ts │ │ │ │ ├── index.ts │ │ │ │ ├── init.ts │ │ │ │ ├── style.css │ │ │ │ ├── types.ts │ │ │ │ ├── use-vxe-grid.ts │ │ │ │ └── use-vxe-grid.vue │ │ └── tsconfig.json │ └── request │ │ ├── package.json │ │ ├── src │ │ ├── index.ts │ │ └── request-client │ │ │ ├── index.ts │ │ │ ├── modules │ │ │ ├── downloader.test.ts │ │ │ ├── downloader.ts │ │ │ ├── interceptor.ts │ │ │ ├── uploader.test.ts │ │ │ └── uploader.ts │ │ │ ├── preset-interceptors.ts │ │ │ ├── request-client.test.ts │ │ │ ├── request-client.ts │ │ │ └── types.ts │ │ └── tsconfig.json ├── icons │ ├── README.md │ ├── package.json │ ├── src │ │ ├── iconify-offline │ │ │ ├── index.ts │ │ │ └── menu-icons.ts │ │ ├── iconify │ │ │ └── index.ts │ │ ├── icons │ │ │ └── empty-icon.vue │ │ ├── index.ts │ │ └── svg │ │ │ ├── icons │ │ │ ├── antdv-logo.svg │ │ │ ├── avatar-1.svg │ │ │ ├── avatar-2.svg │ │ │ ├── avatar-3.svg │ │ │ ├── avatar-4.svg │ │ │ ├── bell.svg │ │ │ ├── cake.svg │ │ │ ├── card.svg │ │ │ ├── download.svg │ │ │ ├── max-key.svg │ │ │ ├── message.svg │ │ │ ├── qq.svg │ │ │ ├── topiam.svg │ │ │ └── wechat.svg │ │ │ ├── index.ts │ │ │ └── load.ts │ └── tsconfig.json ├── locales │ ├── package.json │ ├── src │ │ ├── i18n.ts │ │ ├── index.ts │ │ ├── langs │ │ │ ├── en-US │ │ │ │ ├── authentication.json │ │ │ │ ├── common.json │ │ │ │ ├── preferences.json │ │ │ │ └── ui.json │ │ │ └── zh-CN │ │ │ │ ├── authentication.json │ │ │ │ ├── common.json │ │ │ │ ├── preferences.json │ │ │ │ └── ui.json │ │ └── typing.ts │ └── tsconfig.json ├── preferences │ ├── package.json │ ├── src │ │ └── index.ts │ └── tsconfig.json ├── stores │ ├── package.json │ ├── shim-pinia.d.ts │ ├── src │ │ ├── index.ts │ │ ├── modules │ │ │ ├── access.test.ts │ │ │ ├── access.ts │ │ │ ├── index.ts │ │ │ ├── lock.test.ts │ │ │ ├── lock.ts │ │ │ ├── tabbar.test.ts │ │ │ ├── tabbar.ts │ │ │ ├── user.test.ts │ │ │ └── user.ts │ │ └── setup.ts │ └── tsconfig.json ├── styles │ ├── README.md │ ├── package.json │ ├── src │ │ ├── antd │ │ │ └── index.css │ │ ├── ele │ │ │ └── index.css │ │ ├── global │ │ │ └── index.scss │ │ ├── index.ts │ │ └── naive │ │ │ └── index.css │ └── tsconfig.json ├── types │ ├── README.md │ ├── global.d.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── user.ts │ └── tsconfig.json └── utils │ ├── README.md │ ├── package.json │ ├── src │ ├── helpers │ │ ├── __tests__ │ │ │ ├── enum-options.test.ts │ │ │ ├── find-menu-by-path.test.ts │ │ │ ├── generate-menus.test.ts │ │ │ ├── generate-routes-frontend.test.ts │ │ │ └── merge-route-modules.test.ts │ │ ├── enum-options.ts │ │ ├── find-menu-by-path.ts │ │ ├── generate-menus.ts │ │ ├── generate-routes-backend.ts │ │ ├── generate-routes-frontend.ts │ │ ├── get-popup-container.ts │ │ ├── index.ts │ │ ├── merge-route-modules.ts │ │ ├── mitt.ts │ │ ├── request.ts │ │ ├── reset-routes.ts │ │ ├── safe.ts │ │ ├── tree.ts │ │ ├── unmount-global-loading.ts │ │ └── uuid.ts │ └── index.ts │ └── tsconfig.json ├── playground ├── .env ├── .env.analyze ├── .env.development ├── .env.production ├── __tests__ │ └── e2e │ │ ├── auth-login.spec.ts │ │ └── common │ │ └── auth.ts ├── index.html ├── package.json ├── playwright.config.ts ├── postcss.config.mjs ├── public │ └── favicon.ico ├── src │ ├── adapter │ │ ├── component │ │ │ └── index.ts │ │ ├── form.ts │ │ └── vxe-table.ts │ ├── api │ │ ├── core │ │ │ ├── auth.ts │ │ │ ├── index.ts │ │ │ ├── menu.ts │ │ │ └── user.ts │ │ ├── examples │ │ │ ├── download.ts │ │ │ ├── index.ts │ │ │ ├── status.ts │ │ │ └── table.ts │ │ ├── index.ts │ │ ├── request.ts │ │ └── system │ │ │ ├── dept.ts │ │ │ ├── index.ts │ │ │ ├── menu.ts │ │ │ └── role.ts │ ├── app.vue │ ├── bootstrap.ts │ ├── layouts │ │ ├── auth.vue │ │ ├── basic.vue │ │ └── index.ts │ ├── locales │ │ ├── README.md │ │ ├── index.ts │ │ └── langs │ │ │ ├── en-US │ │ │ ├── demos.json │ │ │ ├── examples.json │ │ │ ├── page.json │ │ │ └── system.json │ │ │ └── zh-CN │ │ │ ├── demos.json │ │ │ ├── examples.json │ │ │ ├── page.json │ │ │ └── system.json │ ├── main.ts │ ├── preferences.ts │ ├── router │ │ ├── access.ts │ │ ├── guard.ts │ │ ├── index.ts │ │ └── routes │ │ │ ├── core.ts │ │ │ ├── index.ts │ │ │ └── modules │ │ │ ├── dashboard.ts │ │ │ ├── demos.ts │ │ │ ├── examples.ts │ │ │ ├── system.ts │ │ │ └── vben.ts │ ├── store │ │ ├── auth.ts │ │ └── index.ts │ └── views │ │ ├── _core │ │ ├── README.md │ │ ├── about │ │ │ └── index.vue │ │ ├── authentication │ │ │ ├── code-login.vue │ │ │ ├── forget-password.vue │ │ │ ├── login.vue │ │ │ ├── qrcode-login.vue │ │ │ └── register.vue │ │ └── fallback │ │ │ ├── coming-soon.vue │ │ │ ├── forbidden.vue │ │ │ ├── internal-error.vue │ │ │ ├── not-found.vue │ │ │ └── offline.vue │ │ ├── dashboard │ │ ├── analytics │ │ │ ├── analytics-trends.vue │ │ │ ├── analytics-visits-data.vue │ │ │ ├── analytics-visits-sales.vue │ │ │ ├── analytics-visits-source.vue │ │ │ ├── analytics-visits.vue │ │ │ └── index.vue │ │ └── workspace │ │ │ └── index.vue │ │ ├── demos │ │ ├── access │ │ │ ├── admin-visible.vue │ │ │ ├── button-control.vue │ │ │ ├── index.vue │ │ │ ├── menu-visible-403.vue │ │ │ ├── super-visible.vue │ │ │ └── user-visible.vue │ │ ├── active-icon │ │ │ └── index.vue │ │ ├── badge │ │ │ └── index.vue │ │ ├── breadcrumb │ │ │ ├── lateral-detail.vue │ │ │ ├── lateral.vue │ │ │ └── level-detail.vue │ │ ├── features │ │ │ ├── clipboard │ │ │ │ └── index.vue │ │ │ ├── file-download │ │ │ │ ├── base64.ts │ │ │ │ └── index.vue │ │ │ ├── full-screen │ │ │ │ └── index.vue │ │ │ ├── hide-menu-children │ │ │ │ ├── children.vue │ │ │ │ └── parent.vue │ │ │ ├── icons │ │ │ │ └── index.vue │ │ │ ├── login-expired │ │ │ │ └── index.vue │ │ │ ├── menu-query │ │ │ │ └── index.vue │ │ │ ├── new-window │ │ │ │ └── index.vue │ │ │ ├── tabs │ │ │ │ ├── index.vue │ │ │ │ └── tab-detail.vue │ │ │ ├── vue-query │ │ │ │ ├── index.vue │ │ │ │ ├── infinite-queries.vue │ │ │ │ ├── paginated-queries.vue │ │ │ │ ├── query-retries.vue │ │ │ │ └── typing.ts │ │ │ └── watermark │ │ │ │ └── index.vue │ │ └── nested │ │ │ ├── menu-1.vue │ │ │ ├── menu-2-1.vue │ │ │ ├── menu-3-1.vue │ │ │ └── menu-3-2-1.vue │ │ ├── examples │ │ ├── button-group │ │ │ └── index.vue │ │ ├── captcha │ │ │ ├── point-selection-captcha.vue │ │ │ ├── slider-captcha.vue │ │ │ └── slider-rotate-captcha.vue │ │ ├── count-to │ │ │ └── index.vue │ │ ├── doc-button.vue │ │ ├── drawer │ │ │ ├── auto-height-demo.vue │ │ │ ├── base-demo.vue │ │ │ ├── dynamic-demo.vue │ │ │ ├── form-drawer-demo.vue │ │ │ ├── in-content-demo.vue │ │ │ ├── index.vue │ │ │ └── shared-data-demo.vue │ │ ├── ellipsis │ │ │ └── index.vue │ │ ├── form │ │ │ ├── api.vue │ │ │ ├── basic.vue │ │ │ ├── custom-layout.vue │ │ │ ├── custom.vue │ │ │ ├── dynamic.vue │ │ │ ├── merge.vue │ │ │ ├── modules │ │ │ │ └── two-fields.vue │ │ │ ├── query.vue │ │ │ └── rules.vue │ │ ├── json-viewer │ │ │ ├── data.ts │ │ │ └── index.vue │ │ ├── layout │ │ │ └── col-page.vue │ │ ├── loading │ │ │ └── index.vue │ │ ├── modal │ │ │ ├── auto-height-demo.vue │ │ │ ├── base-demo.vue │ │ │ ├── blur-demo.vue │ │ │ ├── drag-demo.vue │ │ │ ├── dynamic-demo.vue │ │ │ ├── form-modal-demo.vue │ │ │ ├── in-content-demo.vue │ │ │ ├── index.vue │ │ │ ├── nested-demo.vue │ │ │ └── shared-data-demo.vue │ │ ├── motion │ │ │ └── index.vue │ │ ├── resize │ │ │ └── basic.vue │ │ ├── tippy │ │ │ └── index.vue │ │ └── vxe-table │ │ │ ├── basic.vue │ │ │ ├── custom-cell.vue │ │ │ ├── edit-cell.vue │ │ │ ├── edit-row.vue │ │ │ ├── fixed.vue │ │ │ ├── form.vue │ │ │ ├── remote.vue │ │ │ ├── table-data.ts │ │ │ ├── tree.vue │ │ │ └── virtual.vue │ │ └── system │ │ ├── dept │ │ ├── data.ts │ │ ├── list.vue │ │ └── modules │ │ │ └── form.vue │ │ ├── menu │ │ ├── data.ts │ │ ├── list.vue │ │ └── modules │ │ │ └── form.vue │ │ └── role │ │ ├── data.ts │ │ ├── list.vue │ │ └── modules │ │ └── form.vue ├── tailwind.config.mjs ├── tsconfig.json ├── tsconfig.node.json └── vite.config.mts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts ├── clean.mjs ├── deploy │ ├── Dockerfile │ ├── build-local-docker-image.sh │ └── nginx.conf ├── preview │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── turbo-run │ ├── README.md │ ├── bin │ │ └── turbo-run.mjs │ ├── build.config.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── run.ts │ └── tsconfig.json ├── vsh │ ├── README.md │ ├── bin │ │ └── vsh.mjs │ ├── build.config.ts │ ├── package.json │ ├── src │ │ ├── check-circular │ │ │ └── index.ts │ │ ├── check-dep │ │ │ └── index.ts │ │ ├── code-workspace │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── lint │ │ │ └── index.ts │ │ └── publint │ │ │ └── index.ts │ └── tsconfig.json └── 菜单图标替换sql │ └── update_icon.sql ├── stylelint.config.mjs ├── tea.yaml ├── turbo.json ├── vben-admin.code-workspace ├── vitest.config.ts └── vitest.workspace.ts /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | not ie 11 5 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets) 4 | 5 | We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 6 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", 3 | "changelog": [ 4 | "@changesets/changelog-github", 5 | { "repo": "vbenjs/vue-vben-admin" } 6 | ], 7 | "commit": false, 8 | "fixed": [["@vben-core/*", "@vben/*"]], 9 | "snapshot": { 10 | "prereleaseTemplate": "{tag}-{datetime}" 11 | }, 12 | "privatePackages": { "version": true, "tag": true }, 13 | "linked": [], 14 | "access": "public", 15 | "baseBranch": "main", 16 | "updateInternalDependencies": "patch", 17 | "ignore": [] 18 | } 19 | -------------------------------------------------------------------------------- /.commitlintrc.js: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/commitlint-config'; 2 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .git 3 | .gitignore 4 | *.md 5 | dist 6 | .turbo 7 | dist.zip 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset=utf-8 5 | end_of_line=lf 6 | insert_final_newline=true 7 | indent_style=space 8 | indent_size=2 9 | max_line_length = 100 10 | trim_trailing_whitespace = true 11 | quote_type = single 12 | 13 | [*.{yml,yaml,json}] 14 | indent_style = space 15 | indent_size = 2 16 | 17 | [*.md] 18 | trim_trailing_whitespace = false 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings 2 | 3 | # Automatically normalize line endings (to LF) for all text-based files. 4 | * text=auto eol=lf 5 | 6 | # Declare files that will always have CRLF line endings on checkout. 7 | *.{cmd,[cC][mM][dD]} text eol=crlf 8 | *.{bat,[bB][aA][tT]} text eol=crlf 9 | 10 | # Denote all files that are truly binary and should not be modified. 11 | *.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary -------------------------------------------------------------------------------- /.gitconfig: -------------------------------------------------------------------------------- 1 | [core] 2 | ignorecase = false 3 | -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | ports: 2 | - port: 5555 3 | onOpen: open-preview 4 | tasks: 5 | - init: corepack enable && pnpm install 6 | command: pnpm run dev:play 7 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | echo Start running commit-msg hook... 2 | 3 | # Check whether the git commit information is standardized 4 | pnpm exec commitlint --edit "$1" 5 | 6 | echo Run commit-msg hook done. 7 | -------------------------------------------------------------------------------- /.husky/post-merge: -------------------------------------------------------------------------------- 1 | # 每次 git pull 之后, 安装依赖 2 | 3 | pnpm install 4 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | # update `.vscode/vben-admin.code-workspace` file 2 | pnpm vsh code-workspace --auto-commit 3 | 4 | # Format and submit code according to lintstagedrc.js configuration 5 | pnpm exec lint-staged 6 | 7 | echo Run pre-commit hook done. 8 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 20.14.0 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | registry = "https://registry.npmmirror.com" 2 | public-hoist-pattern[]=husky 3 | public-hoist-pattern[]=eslint 4 | public-hoist-pattern[]=prettier 5 | public-hoist-pattern[]=prettier-plugin-tailwindcss 6 | public-hoist-pattern[]=stylelint 7 | public-hoist-pattern[]=*postcss* 8 | public-hoist-pattern[]=@commitlint/* 9 | public-hoist-pattern[]=czg 10 | 11 | strict-peer-dependencies=false 12 | auto-install-peers=true 13 | dedupe-peer-dependents=true 14 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | dev-dist 3 | .local 4 | .output.js 5 | node_modules 6 | .nvmrc 7 | coverage 8 | CODEOWNERS 9 | .nitro 10 | .output 11 | 12 | 13 | **/*.svg 14 | **/*.sh 15 | 16 | public 17 | .npmrc 18 | *-lock.yaml 19 | -------------------------------------------------------------------------------- /.prettierrc.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/prettier-config'; 2 | -------------------------------------------------------------------------------- /.stylelintignore: -------------------------------------------------------------------------------- 1 | dist 2 | public 3 | __tests__ 4 | coverage 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 平台简介 2 | 后台管理 -------------------------------------------------------------------------------- /apps/backend-mock/.env: -------------------------------------------------------------------------------- 1 | PORT=5320 2 | ACCESS_TOKEN_SECRET=access_token_secret 3 | REFRESH_TOKEN_SECRET=refresh_token_secret 4 | -------------------------------------------------------------------------------- /apps/backend-mock/README.md: -------------------------------------------------------------------------------- 1 | # @vben/backend-mock 2 | 3 | ## Description 4 | 5 | Vben Admin 数据 mock 服务,没有对接任何的数据库,所有数据都是模拟的,用于前端开发时提供数据支持。线上环境不再提供 mock 集成,可自行部署服务或者对接真实数据,由于 `mock.js` 等工具有一些限制,比如上传文件不行、无法模拟复杂的逻辑等,所以这里使用了真实的后端服务来实现。唯一麻烦的是本地需要同时启动后端服务和前端服务,但是这样可以更好的模拟真实环境。该服务不需要手动启动,已经集成在 vite 插件内,随应用一起启用。 6 | 7 | ## Running the app 8 | 9 | ```bash 10 | # development 11 | $ pnpm run start 12 | 13 | # production mode 14 | $ pnpm run build 15 | ``` 16 | -------------------------------------------------------------------------------- /apps/backend-mock/api/auth/codes.ts: -------------------------------------------------------------------------------- 1 | import { verifyAccessToken } from '~/utils/jwt-utils'; 2 | import { unAuthorizedResponse } from '~/utils/response'; 3 | 4 | export default eventHandler((event) => { 5 | const userinfo = verifyAccessToken(event); 6 | if (!userinfo) { 7 | return unAuthorizedResponse(event); 8 | } 9 | 10 | const codes = 11 | MOCK_CODES.find((item) => item.username === userinfo.username)?.codes ?? []; 12 | 13 | return useResponseSuccess(codes); 14 | }); 15 | -------------------------------------------------------------------------------- /apps/backend-mock/api/auth/logout.post.ts: -------------------------------------------------------------------------------- 1 | import { 2 | clearRefreshTokenCookie, 3 | getRefreshTokenFromCookie, 4 | } from '~/utils/cookie-utils'; 5 | 6 | export default defineEventHandler(async (event) => { 7 | const refreshToken = getRefreshTokenFromCookie(event); 8 | if (!refreshToken) { 9 | return useResponseSuccess(''); 10 | } 11 | 12 | clearRefreshTokenCookie(event); 13 | 14 | return useResponseSuccess(''); 15 | }); 16 | -------------------------------------------------------------------------------- /apps/backend-mock/api/menu/all.ts: -------------------------------------------------------------------------------- 1 | import { verifyAccessToken } from '~/utils/jwt-utils'; 2 | import { unAuthorizedResponse } from '~/utils/response'; 3 | 4 | export default eventHandler(async (event) => { 5 | const userinfo = verifyAccessToken(event); 6 | if (!userinfo) { 7 | return unAuthorizedResponse(event); 8 | } 9 | 10 | const menus = 11 | MOCK_MENUS.find((item) => item.username === userinfo.username)?.menus ?? []; 12 | return useResponseSuccess(menus); 13 | }); 14 | -------------------------------------------------------------------------------- /apps/backend-mock/api/status.ts: -------------------------------------------------------------------------------- 1 | export default eventHandler((event) => { 2 | const { status } = getQuery(event); 3 | setResponseStatus(event, Number(status)); 4 | return useResponseError(`${status}`); 5 | }); 6 | -------------------------------------------------------------------------------- /apps/backend-mock/api/system/dept/.post.ts: -------------------------------------------------------------------------------- 1 | import { verifyAccessToken } from '~/utils/jwt-utils'; 2 | import { 3 | sleep, 4 | unAuthorizedResponse, 5 | useResponseSuccess, 6 | } from '~/utils/response'; 7 | 8 | export default eventHandler(async (event) => { 9 | const userinfo = verifyAccessToken(event); 10 | if (!userinfo) { 11 | return unAuthorizedResponse(event); 12 | } 13 | await sleep(600); 14 | return useResponseSuccess(null); 15 | }); 16 | -------------------------------------------------------------------------------- /apps/backend-mock/api/system/dept/[id].delete.ts: -------------------------------------------------------------------------------- 1 | import { verifyAccessToken } from '~/utils/jwt-utils'; 2 | import { 3 | sleep, 4 | unAuthorizedResponse, 5 | useResponseSuccess, 6 | } from '~/utils/response'; 7 | 8 | export default eventHandler(async (event) => { 9 | const userinfo = verifyAccessToken(event); 10 | if (!userinfo) { 11 | return unAuthorizedResponse(event); 12 | } 13 | await sleep(1000); 14 | return useResponseSuccess(null); 15 | }); 16 | -------------------------------------------------------------------------------- /apps/backend-mock/api/system/dept/[id].put.ts: -------------------------------------------------------------------------------- 1 | import { verifyAccessToken } from '~/utils/jwt-utils'; 2 | import { 3 | sleep, 4 | unAuthorizedResponse, 5 | useResponseSuccess, 6 | } from '~/utils/response'; 7 | 8 | export default eventHandler(async (event) => { 9 | const userinfo = verifyAccessToken(event); 10 | if (!userinfo) { 11 | return unAuthorizedResponse(event); 12 | } 13 | await sleep(2000); 14 | return useResponseSuccess(null); 15 | }); 16 | -------------------------------------------------------------------------------- /apps/backend-mock/api/system/menu/list.ts: -------------------------------------------------------------------------------- 1 | import { verifyAccessToken } from '~/utils/jwt-utils'; 2 | import { MOCK_MENU_LIST } from '~/utils/mock-data'; 3 | import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; 4 | 5 | export default eventHandler(async (event) => { 6 | const userinfo = verifyAccessToken(event); 7 | if (!userinfo) { 8 | return unAuthorizedResponse(event); 9 | } 10 | 11 | return useResponseSuccess(MOCK_MENU_LIST); 12 | }); 13 | -------------------------------------------------------------------------------- /apps/backend-mock/api/test.get.ts: -------------------------------------------------------------------------------- 1 | export default defineEventHandler(() => 'Test get handler'); 2 | -------------------------------------------------------------------------------- /apps/backend-mock/api/test.post.ts: -------------------------------------------------------------------------------- 1 | export default defineEventHandler(() => 'Test post handler'); 2 | -------------------------------------------------------------------------------- /apps/backend-mock/api/user/info.ts: -------------------------------------------------------------------------------- 1 | import { verifyAccessToken } from '~/utils/jwt-utils'; 2 | import { unAuthorizedResponse } from '~/utils/response'; 3 | 4 | export default eventHandler((event) => { 5 | const userinfo = verifyAccessToken(event); 6 | if (!userinfo) { 7 | return unAuthorizedResponse(event); 8 | } 9 | return useResponseSuccess(userinfo); 10 | }); 11 | -------------------------------------------------------------------------------- /apps/backend-mock/error.ts: -------------------------------------------------------------------------------- 1 | import type { NitroErrorHandler } from 'nitropack'; 2 | 3 | const errorHandler: NitroErrorHandler = function (error, event) { 4 | event.node.res.end(`[Error Handler] ${error.stack}`); 5 | }; 6 | 7 | export default errorHandler; 8 | -------------------------------------------------------------------------------- /apps/backend-mock/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@vben/backend-mock", 3 | "version": "0.0.1", 4 | "description": "", 5 | "private": true, 6 | "license": "MIT", 7 | "author": "", 8 | "scripts": { 9 | "build": "nitro build", 10 | "start": "nitro dev" 11 | }, 12 | "dependencies": { 13 | "@faker-js/faker": "catalog:", 14 | "jsonwebtoken": "catalog:", 15 | "nitropack": "catalog:" 16 | }, 17 | "devDependencies": { 18 | "@types/jsonwebtoken": "catalog:", 19 | "h3": "catalog:" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /apps/backend-mock/routes/[...].ts: -------------------------------------------------------------------------------- 1 | export default defineEventHandler(() => { 2 | return ` 3 |

Hello Vben Admin

4 |

Mock service is starting

5 | 11 | `; 12 | }); 13 | -------------------------------------------------------------------------------- /apps/backend-mock/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /apps/backend-mock/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.nitro/types/tsconfig.json" 3 | } 4 | -------------------------------------------------------------------------------- /apps/web-antd/.env: -------------------------------------------------------------------------------- 1 | # 应用标题 2 | VITE_APP_TITLE=RuoYi AI 3 | 4 | # 应用命名空间,用于缓存、store等功能的前缀,确保隔离 5 | VITE_APP_NAMESPACE=vben-web-antd 6 | -------------------------------------------------------------------------------- /apps/web-antd/.env.analyze: -------------------------------------------------------------------------------- 1 | # public path 2 | VITE_BASE=/ 3 | 4 | # Basic interface address SPA 5 | VITE_GLOB_API_URL=/api 6 | 7 | VITE_VISUALIZER=true 8 | -------------------------------------------------------------------------------- /apps/web-antd/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /apps/web-antd/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/apps/web-antd/public/favicon.ico -------------------------------------------------------------------------------- /apps/web-antd/public/tinymce/langs/README.md: -------------------------------------------------------------------------------- 1 | This is where language files should be placed. 2 | 3 | Please DO NOT translate these directly, use this service instead: https://crowdin.com/project/tinymce 4 | -------------------------------------------------------------------------------- /apps/web-antd/public/tinymce/license.md: -------------------------------------------------------------------------------- 1 | # Software License Agreement 2 | 3 | **TinyMCE** – [](https://github.com/tinymce/tinymce) 4 | Copyright (c) 2024, Ephox Corporation DBA Tiny Technologies, Inc. 5 | 6 | Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). 7 | -------------------------------------------------------------------------------- /apps/web-antd/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /apps/web-antd/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /apps/web-antd/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /apps/web-antd/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/core/index.ts: -------------------------------------------------------------------------------- 1 | export * from './auth'; 2 | export * from './menu'; 3 | export * from './upload'; 4 | export * from './user'; 5 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/index.ts: -------------------------------------------------------------------------------- 1 | export * from './core'; 2 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/monitor/cache/index.ts: -------------------------------------------------------------------------------- 1 | import { requestClient } from '#/api/request'; 2 | 3 | export interface CommandStats { 4 | name: string; 5 | value: string; 6 | } 7 | 8 | export interface RedisInfo { 9 | [key: string]: string; 10 | } 11 | 12 | export interface CacheInfo { 13 | commandStats: CommandStats[]; 14 | dbSize: number; 15 | info: RedisInfo; 16 | } 17 | 18 | /** 19 | * 20 | * @returns redis信息 21 | */ 22 | export function redisCacheInfo() { 23 | return requestClient.get('/monitor/cache'); 24 | } 25 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/monitor/logininfo/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface LoginLog { 2 | infoId: string; 3 | tenantId: string; 4 | userName: string; 5 | status: string; 6 | ipaddr: string; 7 | loginLocation: string; 8 | browser: string; 9 | os: string; 10 | msg: string; 11 | loginTime: string; 12 | } 13 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/monitor/online/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface OnlineUser { 2 | tokenId: string; 3 | deptName: string; 4 | userName: string; 5 | ipaddr: string; 6 | loginLocation: string; 7 | browser: string; 8 | os: string; 9 | loginTime: number; 10 | } 11 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/monitor/operlog/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface OperationLog { 2 | operId: string; 3 | tenantId: string; 4 | title: string; 5 | businessType: number; 6 | businessTypes?: any; 7 | method: string; 8 | requestMethod: string; 9 | operatorType: number; 10 | operName: string; 11 | deptName: string; 12 | operUrl: string; 13 | operIp: string; 14 | operLocation: string; 15 | operParam: string; 16 | jsonResult: string; 17 | status: number; 18 | errorMsg: string; 19 | operTime: string; 20 | costTime: number; 21 | } 22 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/client/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface Client { 2 | id: number; 3 | clientId: string; 4 | clientKey: string; 5 | clientSecret: string; 6 | grantTypeList: string[]; 7 | grantType: string; 8 | deviceType: string; 9 | activeTimeout: number; 10 | timeout: number; 11 | status: string; 12 | } 13 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/config/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface SysConfig { 2 | configId: number; 3 | configName: string; 4 | configKey: string; 5 | configValue: string; 6 | configType: string; 7 | remark: string; 8 | createTime: string; 9 | } 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/configurationManage/index.ts: -------------------------------------------------------------------------------- 1 | import { requestClient } from '#/api/request'; 2 | 3 | enum Api { 4 | addConfig = '/chat/config/saveOrUpdate', 5 | listConfig = '/chat/config/list', 6 | // updateConfig = '/system/config', 7 | } 8 | 9 | export function listConfig() { 10 | return requestClient.get(Api.listConfig); 11 | } 12 | 13 | // export function updateConfig(data: any) { 14 | // return requestClient.put(Api.updateConfig, data); 15 | // } 16 | 17 | export function addConfig(data: any) { 18 | return requestClient.post(Api.addConfig, data); 19 | } 20 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/dept/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface Dept { 2 | createBy: string; 3 | createTime: string; 4 | updateBy?: string; 5 | updateTime?: string; 6 | remark?: string; 7 | deptId: number; 8 | parentId: number; 9 | ancestors: string; 10 | deptName: string; 11 | orderNum: number; 12 | leader: string; 13 | phone: string; 14 | email: string; 15 | status: string; 16 | delFlag: string; 17 | parentName?: string; 18 | children?: Dept[]; 19 | } 20 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/dict/dict-data-model.d.ts: -------------------------------------------------------------------------------- 1 | export interface DictData { 2 | createBy: string; 3 | createTime: string; 4 | cssClass: string; 5 | default: boolean; 6 | dictCode: number; 7 | dictLabel: string; 8 | dictSort: number; 9 | dictType: string; 10 | dictValue: string; 11 | isDefault: string; 12 | listClass: string; 13 | remark: string; 14 | status: string; 15 | updateBy?: any; 16 | updateTime?: any; 17 | } 18 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/dict/dict-type-model.d.ts: -------------------------------------------------------------------------------- 1 | export interface DictType { 2 | createTime: string; 3 | dictId: number; 4 | dictName: string; 5 | dictType: string; 6 | remark: string; 7 | status: string; 8 | } 9 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/notice/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface Notice { 2 | noticeId: number; 3 | noticeTitle: string; 4 | noticeType: string; 5 | noticeContent: string; 6 | status: string; 7 | remark: string; 8 | createBy: number; 9 | createByName: string; 10 | createTime: string; 11 | } 12 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/oss-config/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface OssConfig { 2 | ossConfigId: number; 3 | configKey: string; 4 | accessKey: string; 5 | secretKey: string; 6 | bucketName: string; 7 | prefix: string; 8 | endpoint: string; 9 | domain: string; 10 | isHttps: string; 11 | region: string; 12 | status: string; 13 | ext1: string; 14 | remark: string; 15 | accessPolicy: string; 16 | } 17 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/post/model.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description: Post interface 3 | */ 4 | export interface Post { 5 | postId: number; 6 | postCode: string; 7 | postName: string; 8 | postSort: number; 9 | status: string; 10 | remark: string; 11 | createTime: string; 12 | } 13 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/tenant-package/model.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @description 租户套餐 3 | * @param packageId id 4 | * @param packageName 名称 5 | * @param menuIds 菜单id 格式为[1,2,3] 返回为string 提交为数组 6 | * @param remark 备注 7 | * @param menuCheckStrictly 是否关联父节点 8 | * @param status 状态 9 | */ 10 | export interface TenantPackage { 11 | packageId: string; 12 | packageName: string; 13 | menuIds: number[] | string; 14 | remark: string; 15 | menuCheckStrictly: boolean; 16 | status: string; 17 | } 18 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/system/tenant/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface Tenant { 2 | accountCount: number; 3 | address?: string; 4 | companyName: string; 5 | contactPhone: string; 6 | contactUserName: string; 7 | domain?: string; 8 | expireTime?: string; 9 | id: number; 10 | intro: string; 11 | licenseNumber?: any; 12 | packageId: string; 13 | remark?: string; 14 | status: string; 15 | tenantId: string; 16 | } 17 | -------------------------------------------------------------------------------- /apps/web-antd/src/api/workflow/definition/model.d.ts: -------------------------------------------------------------------------------- 1 | export interface ProcessDefinition { 2 | id: string; 3 | createTime: string; 4 | updateTime: string; 5 | tenantId: string; 6 | delFlag: string; 7 | flowCode: string; 8 | flowName: string; 9 | category: string; 10 | categoryName: string; 11 | version: string; 12 | isPublish: number; 13 | formCustom: string; 14 | formPath: string; 15 | activityStatus: number; 16 | listenerType?: any; 17 | listenerPath?: any; 18 | ext?: any; 19 | } 20 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/cropper/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CropperAvatar } from './src/cropper-avatar.vue'; 2 | export { default as CropperImage } from './src/cropper.vue'; 3 | export type { Cropper } from './src/typing'; 4 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/cropper/src/typing.ts: -------------------------------------------------------------------------------- 1 | import type Cropper from 'cropperjs'; 2 | 3 | export interface CropendResult { 4 | imgBase64: string; 5 | imgInfo: Cropper.Data; 6 | } 7 | 8 | export type { Cropper }; 9 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/description/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Description } from './src/description.vue'; 2 | export * from './src/typing'; 3 | export { useDescription } from './src/useDescription'; 4 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/dict/index.ts: -------------------------------------------------------------------------------- 1 | export { tagSelectOptions, tagTypes } from './src/data'; 2 | export { default as DictTag } from './src/index.vue'; 3 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/global/index.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue'; 2 | 3 | import { Button as AButton } from 'ant-design-vue'; 4 | 5 | import { GhostButton } from './button'; 6 | 7 | /** 8 | * 全局组件注册 9 | */ 10 | export function setupGlobalComponent(app: App) { 11 | app.use(AButton); 12 | // 表格操作列专用按钮 13 | app.component('GhostButton', GhostButton); 14 | } 15 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/table/index.ts: -------------------------------------------------------------------------------- 1 | export { default as OptionsTag } from './src/options-tag.vue'; 2 | export { default as TableSwitch } from './src/table-switch.vue'; 3 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/tenant-toggle/index.ts: -------------------------------------------------------------------------------- 1 | export { default as TenantToggle } from './src/index.vue'; 2 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/tinymce/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tinymce } from './src/editor.vue'; 2 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/tree/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MenuSelectTable } from './src/menu-select-table.vue'; 2 | export { default as TreeSelectPanel } from './src/tree-select-panel.vue'; 3 | -------------------------------------------------------------------------------- /apps/web-antd/src/components/upload/index.ts: -------------------------------------------------------------------------------- 1 | export { default as FileUpload } from './src/file-upload.vue'; 2 | export { default as ImageUpload } from './src/image-upload.vue'; 3 | -------------------------------------------------------------------------------- /apps/web-antd/src/layouts/index.ts: -------------------------------------------------------------------------------- 1 | const BasicLayout = () => import('./basic.vue'); 2 | const AuthPageLayout = () => import('./auth.vue'); 3 | 4 | const IFrameView = () => import('@vben/layouts').then((m) => m.IFrameView); 5 | 6 | export { AuthPageLayout, BasicLayout, IFrameView }; 7 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/README.md: -------------------------------------------------------------------------------- 1 | # locale 2 | 3 | 每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。 4 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/langs/en-US/demos.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Demos", 3 | "antd": "Ant Design Vue", 4 | "vben": { 5 | "title": "Project", 6 | "about": "About", 7 | "document": "Document", 8 | "antdv": "Ant Design Vue Version", 9 | "naive-ui": "Naive UI Version", 10 | "element-plus": "Element Plus Version" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/langs/en-US/http.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiRequestFailed": "Operation failed", 3 | "operationSuccess": "Operation Success", 4 | "successTip": "Success Tip", 5 | "errorTip": "Error Tip", 6 | "loginTimeout": "Login timeout, please log in again" 7 | } 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/langs/en-US/page.json: -------------------------------------------------------------------------------- 1 | { 2 | "auth": { 3 | "login": "Login", 4 | "register": "Register", 5 | "codeLogin": "Code Login", 6 | "qrcodeLogin": "Qr Code Login", 7 | "forgetPassword": "Forget Password", 8 | "oauthLogin": "Oauth Login" 9 | }, 10 | "dashboard": { 11 | "title": "Dashboard", 12 | "analytics": "Analytics", 13 | "workspace": "Workspace" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/langs/zh-CN/demos.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "演示", 3 | "antd": "Ant Design Vue", 4 | "vben": { 5 | "title": "项目", 6 | "about": "关于", 7 | "document": "文档", 8 | "antdv": "Ant Design Vue 版本", 9 | "naive-ui": "Naive UI 版本", 10 | "element-plus": "Element Plus 版本" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/langs/zh-CN/http.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiRequestFailed": "请求出错,请稍候重试", 3 | "operationSuccess": "操作成功", 4 | "successTip": "成功提示", 5 | "errorTip": "错误提示", 6 | "loginTimeout": "登录超时, 请重新登录" 7 | } 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/langs/zh-CN/page.json: -------------------------------------------------------------------------------- 1 | { 2 | "auth": { 3 | "login": "登录", 4 | "register": "注册", 5 | "codeLogin": "验证码登录", 6 | "qrcodeLogin": "二维码登录", 7 | "forgetPassword": "忘记密码", 8 | "oauthLogin": "第三方登录" 9 | }, 10 | "dashboard": { 11 | "title": "概览", 12 | "analytics": "分析页", 13 | "workspace": "工作台" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/web-antd/src/locales/langs/zh-CN/pages.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "add": "新增", 4 | "edit": "编辑", 5 | "delete": "删除", 6 | "more": "更多", 7 | "search": "搜索", 8 | "reset": "重置", 9 | "import": "导入", 10 | "export": "导出", 11 | "expand": "展开", 12 | "collapse": "收起", 13 | "info": "详情", 14 | "clear": "清空", 15 | "unlock": "解锁", 16 | "download": "下载", 17 | "sync": "同步", 18 | "refresh": "刷新", 19 | "generate": "生成", 20 | "downloadLoading": "下载中, 请稍后...", 21 | "preview": "预览" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /apps/web-antd/src/router/routes/workflow-iframe.ts: -------------------------------------------------------------------------------- 1 | import type { RouteRecordRaw } from '@vben/types'; 2 | 3 | /** 4 | * 该文件存放workflow表单的iframe内嵌路由 5 | * 不需要权限认证 少走两个接口😅 6 | */ 7 | export const workflowIframeRoutes: RouteRecordRaw[] = [ 8 | // 这里是iframe使用的 去掉外层的BasicLayout 9 | { 10 | name: 'WorkflowLeaveInner', 11 | path: '/workflow/leaveEdit/index/iframe', 12 | component: () => import('#/views/workflow/leave/leave-form.vue'), 13 | meta: { 14 | hideInTab: true, 15 | title: '请假申请', 16 | }, 17 | }, 18 | ]; 19 | -------------------------------------------------------------------------------- /apps/web-antd/src/store/index.ts: -------------------------------------------------------------------------------- 1 | export * from './auth'; 2 | export * from './notify'; 3 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/README.md: -------------------------------------------------------------------------------- 1 | # \_core 2 | 3 | 此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。 4 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/about/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/authentication/qrcode-login.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/coming-soon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/forbidden.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/internal-error.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/not-found.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/offline.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/profile/mitt.ts: -------------------------------------------------------------------------------- 1 | import { mitt } from '@vben/utils'; 2 | 3 | type Events = { 4 | updateProfile: void; 5 | }; 6 | 7 | export const emitter = mitt(); 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/monitor/admin/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/monitor/cache/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CommandChart } from './command-chart.vue'; 2 | export { default as MemoryChart } from './memory-chart.vue'; 3 | export { default as RedisDescription } from './redis-description.vue'; 4 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/monitor/snailjob/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/system/dict/mitt.ts: -------------------------------------------------------------------------------- 1 | import { mitt } from '@vben/utils'; 2 | 3 | /** 4 | * dictType: string 5 | */ 6 | type Events = { 7 | rowClick: string; 8 | }; 9 | 10 | export const emitter = mitt(); 11 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/tool/gen/edit-steps/index.ts: -------------------------------------------------------------------------------- 1 | export { default as BasicSetting } from './basic-setting.vue'; 2 | export { default as GenConfig } from './gen-config.vue'; 3 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/workflow/components/approval-timeline.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /apps/web-antd/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /apps/web-antd/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web-app.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "#/*": ["./src/*"] 8 | } 9 | }, 10 | "references": [{ "path": "./tsconfig.node.json" }], 11 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "types/**/*.d.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /apps/web-antd/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "compilerOptions": { 5 | "composite": true, 6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 7 | "noEmit": false 8 | }, 9 | "include": ["vite.config.mts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/web-antd/types/directive.d.ts: -------------------------------------------------------------------------------- 1 | import type { Directive } from 'vue'; 2 | 3 | declare module 'vue' { 4 | export interface ComponentCustomProperties { 5 | /** 6 | * 判断权限: v-access:code="" 7 | * 判断角色 v-access:role="" 8 | * 需要VueOfficial插件版本 >= 2.1.8 9 | */ 10 | vAccess: Directive; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/web-antd/types/global-components.d.ts: -------------------------------------------------------------------------------- 1 | export {}; 2 | 3 | /* prettier-ignore */ 4 | declare module 'vue' { 5 | export interface GlobalComponents { 6 | AButton: typeof import('ant-design-vue/es/button')['default']; 7 | GhostButton: typeof import('#/components/global/button')['GhostButton'] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /docs/.vitepress/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DemoPreview } from './demo-preview.vue'; 2 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/styles/base.css: -------------------------------------------------------------------------------- 1 | html.dark { 2 | color-scheme: dark; 3 | } 4 | 5 | .dark .VPContent { 6 | /* background-color: #14161a; */ 7 | } 8 | 9 | .form-valid-error p { 10 | margin: 0; 11 | } 12 | 13 | /* 顶部导航栏选中项样式 */ 14 | .VPNavBarMenuLink, 15 | .VPNavBarMenuGroup { 16 | border-bottom: 1px solid transparent; 17 | } 18 | 19 | .VPNavBarMenuLink.active, 20 | .VPNavBarMenuGroup.active { 21 | border-bottom-color: var(--vp-c-brand-1); 22 | } 23 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/styles/index.ts: -------------------------------------------------------------------------------- 1 | import '@vben/styles'; 2 | 3 | import './variables.css'; 4 | import './base.css'; 5 | -------------------------------------------------------------------------------- /docs/src/_env/node/adapter/form.ts: -------------------------------------------------------------------------------- 1 | export const useVbenForm = () => {}; 2 | export const z = {}; 3 | export type VbenFormSchema = any; 4 | export type VbenFormProps = any; 5 | -------------------------------------------------------------------------------- /docs/src/_env/node/adapter/vxe-table.ts: -------------------------------------------------------------------------------- 1 | export type * from '@vben/plugins/vxe-table'; 2 | 3 | export const useVbenVxeGrid = () => {}; 4 | -------------------------------------------------------------------------------- /docs/src/commercial/customized.md: -------------------------------------------------------------------------------- 1 | # 定制开发 2 | 3 | 我们提供基于 Vben Admin 的技术支持服务及定制开发,基本需求我们都可以满足。 4 | 5 | 详细需求可添加作者了解,并注明来意: 6 | 7 | - 通过邮箱联系开发者: [ann.vben@gmail.com](mailto:ann.vben@gmail.com) 8 | - 通过微信联系开发者: 9 | 10 | 11 | 12 | 我们会在第一时间回复您,定制费用根据需求而定。 13 | -------------------------------------------------------------------------------- /docs/src/commercial/technical-support.md: -------------------------------------------------------------------------------- 1 | # 技术支持 2 | 3 | ## 问题反馈 4 | 5 | 在使用项目的过程中,如果遇到问题,你可以先详细阅读本文档,未找到解决方案时,可以通过以下方式获取技术支持: 6 | 7 | - 通过 [GitHub Issues](https://github.com/vbenjs/vue-vben-admin/issues) 8 | - 通过 [GitHub Discussions](https://github.com/vbenjs/vue-vben-admin/discussions) 9 | -------------------------------------------------------------------------------- /docs/src/components/introduction.md: -------------------------------------------------------------------------------- 1 | # 介绍 2 | 3 | ::: info README 4 | 5 | 该文档介绍的是框架组件的使用方法、属性、事件等。如果你觉得现有组件的封装不够理想,或者不完全符合你的需求,大可以直接使用原生组件,亦或亲手封装一个适合的组件。框架提供的组件并非束缚,使用与否,完全取决于你的需求与自由。 6 | 7 | ::: 8 | 9 | ## 布局组件 10 | 11 | 布局组件一般在页面内容区域用作顶层容器组件,提供一些统一的布局样式和基本功能。 12 | 13 | ## 通用组件 14 | 15 | 通用组件是一些常用的组件,比如弹窗、抽屉、表单等。大部分基于 `Tailwind CSS` 实现,可适用于不同 UI 组件库的应用。 16 | -------------------------------------------------------------------------------- /docs/src/demos/vben-count-to-animator/basic/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 7 | -------------------------------------------------------------------------------- /docs/src/demos/vben-count-to-animator/custom/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 13 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/auto-height/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/basic/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 12 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/extra/drawer.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/extra/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-ellipsis-text/tooltip/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 15 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/auto-height/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/basic/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 12 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/draggable/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/draggable/modal.vue: -------------------------------------------------------------------------------- 1 | 8 | 11 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/extra/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/extra/modal.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /docs/src/en/guide/in-depth/layout.md: -------------------------------------------------------------------------------- 1 | # Layout 2 | -------------------------------------------------------------------------------- /docs/src/en/guide/introduction/changelog.md: -------------------------------------------------------------------------------- 1 | # CHANGE LOG 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/src/en/guide/introduction/roadmap.md: -------------------------------------------------------------------------------- 1 | # Roadmap 2 | 3 | TODO: 4 | -------------------------------------------------------------------------------- /docs/src/en/guide/other/remove-code.md: -------------------------------------------------------------------------------- 1 | # Remove Code 2 | 3 | ## Remove Code 4 | 5 | In the corresponding application's `index.html` file, find the following code and delete it: 6 | 7 | ```html 8 | 9 | 18 | ``` 19 | -------------------------------------------------------------------------------- /docs/src/guide/in-depth/layout.md: -------------------------------------------------------------------------------- 1 | # 布局 2 | -------------------------------------------------------------------------------- /docs/src/guide/in-depth/ui-framework.md: -------------------------------------------------------------------------------- 1 | # 组件库切换 2 | 3 | `Vue Admin` 支持你自由选择组件库,目前演示站点的默认组件库是 `Ant Design Vue`,与旧版本保持一致。同时框架还内置了 `Element Plus` 版本和 `Naive UI` 版本,你可以根据自己的喜好选择。 4 | 5 | ## 新增组件库应用 6 | 7 | 如果你想用其他别的组件库,你只需要按以下步骤进行操作: 8 | 9 | 1. 在`apps`内创建一个新的文件夹,例如`apps/web-xxx`。 10 | 2. 更改`apps/web-xxx/package.json`的`name`字段为`web-xxx`。 11 | 3. 移除其他组件库依赖及代码,并用你的组件库进行替换相应逻辑,需要改动的地方不多。 12 | 4. 调整`locales`内的语言文件。 13 | 5. 调整 `app.vue` 内的组件。 14 | 6. 自行适配组件库的主题,与 `Vben Admin` 契合。 15 | 7. 调整 `.env` 内的应用名 16 | 8. 在大仓根目录增加 `dev:xxx` 脚本 17 | 9. 执行 `pnpm install` 安装依赖 18 | -------------------------------------------------------------------------------- /docs/src/guide/introduction/changelog.md: -------------------------------------------------------------------------------- 1 | # 更新日志 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/src/guide/introduction/roadmap.md: -------------------------------------------------------------------------------- 1 | # 路线图 2 | 3 | TODO: 4 | -------------------------------------------------------------------------------- /docs/src/guide/other/remove-code.md: -------------------------------------------------------------------------------- 1 | # 移除代码 2 | 3 | ## 移除百度统计代码 4 | 5 | 在对应应用的 `index.html` 文件中,找到如下代码,删除即可: 6 | 7 | ```html 8 | 9 | 18 | ``` 19 | -------------------------------------------------------------------------------- /docs/src/guide/project/changeset.md: -------------------------------------------------------------------------------- 1 | # Changeset 2 | 3 | 项目内置了 [changeset](https://github.com/changesets/changesets) 作为版本管理工具。Changeset 是一个版本管理工具,它可以帮助我们更好的管理版本,生成 changelog,以及自动发布。 4 | 5 | 详细使用方式可查看官方文档,这里不再阐述。如果你不需要它,可以直接忽略。 6 | 7 | ## 命令行 8 | 9 | changeset 命令在项目中已经内置: 10 | 11 | ### 交互式填写变更集 12 | 13 | ```bash 14 | pnpm run changeset 15 | ``` 16 | 17 | ### 统一提升版本号 18 | 19 | ```bash 20 | pnpm run version 21 | ``` 22 | -------------------------------------------------------------------------------- /docs/src/guide/project/tailwindcss.md: -------------------------------------------------------------------------------- 1 | # Tailwind CSS 2 | 3 | [Tailwind CSS](https://tailwindcss.com/) 是一个实用性优先的CSS框架,用于快速构建自定义设计。 4 | 5 | ## 配置 6 | 7 | 项目的配置文件位于 `internal/tailwind-config` 下,你可以在这里修改 Tailwind CSS 的配置。 8 | 9 | ::: tip 包使用 tailwindcss 的限制 10 | 11 | 当前只有对应的包下面存在 `tailwind.config.mjs` 文件才会启用 tailwindcss 的编译,否则不会启用 tailwindcss。如果你是纯粹的 SDK 包,不需要使用 tailwindcss,可以不用创建 `tailwind.config.mjs` 文件。 12 | 13 | ::: 14 | -------------------------------------------------------------------------------- /docs/src/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/favicon.ico -------------------------------------------------------------------------------- /docs/src/public/guide/devtools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/devtools.png -------------------------------------------------------------------------------- /docs/src/public/guide/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/loading.png -------------------------------------------------------------------------------- /docs/src/public/guide/locale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/locale.png -------------------------------------------------------------------------------- /docs/src/public/guide/login-expired.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/login-expired.png -------------------------------------------------------------------------------- /docs/src/public/guide/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/login.png -------------------------------------------------------------------------------- /docs/src/public/guide/preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/preferences.png -------------------------------------------------------------------------------- /docs/src/public/guide/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/qq.png -------------------------------------------------------------------------------- /docs/src/public/guide/qq_channel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/qq_channel.png -------------------------------------------------------------------------------- /docs/src/public/guide/report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/report.png -------------------------------------------------------------------------------- /docs/src/public/guide/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/test.png -------------------------------------------------------------------------------- /docs/src/public/guide/update-notice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/update-notice.png -------------------------------------------------------------------------------- /docs/src/public/logos/shadcn-ui.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/src/sponsor/personal.md: -------------------------------------------------------------------------------- 1 | # 赞助 2 | 3 | 如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持! 4 | 5 | ![](https://unpkg.com/@vbenjs/static-source@0.1.7/source/sponsor.png) 6 | 7 | 您的赞助将帮助我们: 8 | 9 | - 维持项目的基础设施,如服务器、域名、社群费用。 10 | - 支持开发者的贡献和加快新功能的开发。 11 | 12 | 感谢所有现有的和未来的赞助者,您的支持对我们来说至关重要,让我们一起推动项目继续前行。 13 | -------------------------------------------------------------------------------- /docs/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | import tailwindcssConfig from '@vben/tailwind-config'; 2 | 3 | export default { 4 | ...tailwindcssConfig, 5 | content: [ 6 | ...tailwindcssConfig.content, 7 | '.vitepress/**/*.{js,mts,ts,vue}', 8 | 'src/demos/**/*.{js,mts,ts,vue}', 9 | 'src/**/*.md', 10 | ], 11 | }; 12 | -------------------------------------------------------------------------------- /docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "#/*": ["./src/_env/*"] 8 | } 9 | }, 10 | "include": [ 11 | ".vitepress/*.mts", 12 | ".vitepress/**/*.ts", 13 | ".vitepress/**/*.vue", 14 | "src/*.mts", 15 | "src/**/*.ts", 16 | "src/**/*.vue" 17 | ], 18 | "exclude": ["node_modules"] 19 | } 20 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import { defineConfig } from '@vben/eslint-config'; 4 | 5 | export default defineConfig(); 6 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/src/configs/command.ts: -------------------------------------------------------------------------------- 1 | import createCommand from 'eslint-plugin-command/config'; 2 | 3 | export async function command() { 4 | return [ 5 | { 6 | // @ts-expect-error - no types 7 | ...createCommand(), 8 | }, 9 | ]; 10 | } 11 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/src/configs/index.ts: -------------------------------------------------------------------------------- 1 | export * from './command'; 2 | export * from './comments'; 3 | export * from './disableds'; 4 | export * from './ignores'; 5 | export * from './import'; 6 | export * from './javascript'; 7 | export * from './jsdoc'; 8 | export * from './jsonc'; 9 | export * from './node'; 10 | export * from './perfectionist'; 11 | export * from './prettier'; 12 | export * from './regexp'; 13 | export * from './test'; 14 | export * from './turbo'; 15 | export * from './typescript'; 16 | export * from './unicorn'; 17 | export * from './vue'; 18 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/src/configs/prettier.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from 'eslint'; 2 | 3 | import { interopDefault } from '../util'; 4 | 5 | export async function prettier(): Promise { 6 | const [pluginPrettier] = await Promise.all([ 7 | interopDefault(import('eslint-plugin-prettier')), 8 | ] as const); 9 | return [ 10 | { 11 | plugins: { 12 | prettier: pluginPrettier, 13 | }, 14 | rules: { 15 | 'prettier/prettier': 'error', 16 | }, 17 | }, 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/src/configs/regexp.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from 'eslint'; 2 | 3 | import { interopDefault } from '../util'; 4 | 5 | export async function regexp(): Promise { 6 | const [pluginRegexp] = await Promise.all([ 7 | interopDefault(import('eslint-plugin-regexp')), 8 | ] as const); 9 | 10 | return [ 11 | { 12 | plugins: { 13 | regexp: pluginRegexp, 14 | }, 15 | rules: { 16 | ...pluginRegexp.configs.recommended.rules, 17 | }, 18 | }, 19 | ]; 20 | } 21 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/src/configs/turbo.ts: -------------------------------------------------------------------------------- 1 | import type { Linter } from 'eslint'; 2 | 3 | import { interopDefault } from '../util'; 4 | 5 | export async function turbo(): Promise { 6 | const [pluginTurbo] = await Promise.all([ 7 | // @ts-expect-error - no types 8 | interopDefault(import('eslint-config-turbo')), 9 | ] as const); 10 | 11 | return [ 12 | { 13 | plugins: { 14 | turbo: pluginTurbo, 15 | }, 16 | }, 17 | ]; 18 | } 19 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/src/util.ts: -------------------------------------------------------------------------------- 1 | export type Awaitable = Promise | T; 2 | 3 | export async function interopDefault( 4 | m: Awaitable, 5 | ): Promise { 6 | const resolved = await m; 7 | return (resolved as any).default || resolved; 8 | } 9 | -------------------------------------------------------------------------------- /internal/lint-configs/eslint-config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /internal/lint-configs/prettier-config/index.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | endOfLine: 'auto', 3 | overrides: [ 4 | { 5 | files: ['*.json5'], 6 | options: { 7 | quoteProps: 'preserve', 8 | singleQuote: false, 9 | }, 10 | }, 11 | ], 12 | plugins: ['prettier-plugin-tailwindcss'], 13 | printWidth: 80, 14 | proseWrap: 'never', 15 | semi: true, 16 | singleQuote: true, 17 | trailingComma: 'all', 18 | }; 19 | -------------------------------------------------------------------------------- /internal/node-utils/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /internal/node-utils/src/constants.ts: -------------------------------------------------------------------------------- 1 | enum UNICODE { 2 | FAILURE = '\u2716', // ✖ 3 | SUCCESS = '\u2714', // ✔ 4 | } 5 | 6 | export { UNICODE }; 7 | -------------------------------------------------------------------------------- /internal/node-utils/src/date.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | import timezone from 'dayjs/plugin/timezone'; 3 | import utc from 'dayjs/plugin/utc'; 4 | 5 | dayjs.extend(utc); 6 | dayjs.extend(timezone); 7 | 8 | dayjs.tz.setDefault('Asia/Shanghai'); 9 | 10 | const dateUtil = dayjs; 11 | 12 | export { dateUtil }; 13 | -------------------------------------------------------------------------------- /internal/node-utils/src/hash.ts: -------------------------------------------------------------------------------- 1 | import { createHash } from 'node:crypto'; 2 | 3 | /** 4 | * 生产基于内容的 hash,可自定义长度 5 | * @param content 6 | * @param hashLSize 7 | */ 8 | function generatorContentHash(content: string, hashLSize?: number) { 9 | const hash = createHash('md5').update(content, 'utf8').digest('hex'); 10 | 11 | if (hashLSize) { 12 | return hash.slice(0, hashLSize); 13 | } 14 | 15 | return hash; 16 | } 17 | 18 | export { generatorContentHash }; 19 | -------------------------------------------------------------------------------- /internal/node-utils/src/path.ts: -------------------------------------------------------------------------------- 1 | import { posix } from 'node:path'; 2 | 3 | /** 4 | * 将给定的文件路径转换为 POSIX 风格。 5 | * @param {string} pathname - 原始文件路径。 6 | */ 7 | function toPosixPath(pathname: string) { 8 | return pathname.split(`\\`).join(posix.sep); 9 | } 10 | 11 | export { toPosixPath }; 12 | -------------------------------------------------------------------------------- /internal/node-utils/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /internal/tailwind-config/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index', './src/postcss.config'], 7 | rollup: { 8 | emitCJS: true, 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /internal/tailwind-config/src/module.d.ts: -------------------------------------------------------------------------------- 1 | declare module '@tailwindcss/nesting' { 2 | export default any; 3 | } 4 | -------------------------------------------------------------------------------- /internal/tailwind-config/src/postcss.config.ts: -------------------------------------------------------------------------------- 1 | import config from '.'; 2 | 3 | export default { 4 | plugins: { 5 | ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}), 6 | // Specifying the config is not necessary in most cases, but it is included 7 | autoprefixer: {}, 8 | // 修复 element-plus 和 ant-design-vue 的样式和tailwindcss冲突问题 9 | 'postcss-antd-fixes': { prefixes: ['ant', 'el'] }, 10 | 'postcss-import': {}, 11 | 'postcss-preset-env': {}, 12 | tailwindcss: { config }, 13 | 'tailwindcss/nesting': {}, 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /internal/tailwind-config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /internal/tsconfig/library.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Web Application", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "jsx": "preserve", 7 | "lib": ["ESNext", "DOM", "DOM.Iterable"], 8 | "useDefineForClassFields": true, 9 | "moduleResolution": "bundler", 10 | "declaration": true, 11 | "noEmit": false 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /internal/tsconfig/node.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Node Config", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "composite": false, 7 | "lib": ["ESNext"], 8 | "baseUrl": "./", 9 | "types": ["node"], 10 | "noImplicitAny": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /internal/tsconfig/web-app.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Web Application", 4 | "extends": "./web.json", 5 | "compilerOptions": { 6 | "types": ["vite/client", "@vben/types/global"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /internal/tsconfig/web.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Web Package", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "jsx": "preserve", 7 | "jsxImportSource": "vue", 8 | "lib": ["ESNext", "DOM", "DOM.Iterable"], 9 | "useDefineForClassFields": true, 10 | "moduleResolution": "bundler", 11 | "types": ["vite/client"], 12 | "declaration": false 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /internal/vite-config/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /internal/vite-config/src/config/common.ts: -------------------------------------------------------------------------------- 1 | import type { UserConfig } from 'vite'; 2 | 3 | async function getCommonConfig(): Promise { 4 | return { 5 | build: { 6 | chunkSizeWarningLimit: 2000, 7 | reportCompressedSize: false, 8 | sourcemap: false, 9 | }, 10 | }; 11 | } 12 | 13 | export { getCommonConfig }; 14 | -------------------------------------------------------------------------------- /internal/vite-config/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './config'; 2 | export * from './options'; 3 | export * from './plugins'; 4 | export { loadAndConvertEnv } from './utils/env'; 5 | -------------------------------------------------------------------------------- /internal/vite-config/src/plugins/inject-app-loading/README.md: -------------------------------------------------------------------------------- 1 | # inject-app-loading 2 | 3 | 用于在应用加载时显示加载动画的插件,可自行选择加载动画的样式。 4 | -------------------------------------------------------------------------------- /internal/vite-config/src/plugins/vxe-table.ts: -------------------------------------------------------------------------------- 1 | import type { PluginOption } from 'vite'; 2 | 3 | import { lazyImport, VxeResolver } from 'vite-plugin-lazy-import'; 4 | 5 | async function viteVxeTableImportsPlugin(): Promise { 6 | return [ 7 | lazyImport({ 8 | resolvers: [ 9 | VxeResolver({ 10 | libraryName: 'vxe-table', 11 | }), 12 | VxeResolver({ 13 | libraryName: 'vxe-pc-ui', 14 | }), 15 | ], 16 | }), 17 | ]; 18 | } 19 | 20 | export { viteVxeTableImportsPlugin }; 21 | -------------------------------------------------------------------------------- /internal/vite-config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/README.md: -------------------------------------------------------------------------------- 1 | # @vben-core 2 | 3 | 系统一些比较基础的SDK和UI组件库,该目录后续完善后,可能会迁移出去或者发布到npm,请勿将任何业务逻辑和业务包放在该目录。 4 | -------------------------------------------------------------------------------- /packages/@core/base/README.md: -------------------------------------------------------------------------------- 1 | # base 2 | 3 | 基础共享包,请勿引入 workspace 依赖 4 | 5 | - 6 | -------------------------------------------------------------------------------- /packages/@core/base/design/src/design-tokens/index.ts: -------------------------------------------------------------------------------- 1 | import './default.css'; 2 | import './dark.css'; 3 | 4 | export {}; 5 | -------------------------------------------------------------------------------- /packages/@core/base/design/src/index.ts: -------------------------------------------------------------------------------- 1 | import './design-tokens'; 2 | 3 | import './css/global.css'; 4 | import './css/transition.css'; 5 | import './css/nprogress.css'; 6 | import './css/ui.css'; 7 | 8 | export {}; 9 | -------------------------------------------------------------------------------- /packages/@core/base/design/src/scss-bem/constants.scss: -------------------------------------------------------------------------------- 1 | $namespace: 'vben' !default; 2 | $common-separator: '-' !default; 3 | $element-separator: '__' !default; 4 | $modifier-separator: '--' !default; 5 | $state-prefix: 'is' !default; 6 | -------------------------------------------------------------------------------- /packages/@core/base/design/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/base/design/vite.config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@vben/vite-config'; 2 | 3 | export default defineConfig(async () => { 4 | return { 5 | vite: { 6 | publicDir: 'src/scss-bem', 7 | }, 8 | }; 9 | }); 10 | -------------------------------------------------------------------------------- /packages/@core/base/icons/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /packages/@core/base/icons/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './create-icon'; 2 | 3 | export * from './lucide'; 4 | 5 | export type { IconifyIcon as IconifyIconStructure } from '@iconify/vue'; 6 | export { 7 | addCollection, 8 | addIcon, 9 | Icon as IconifyIcon, 10 | listIcons, 11 | } from '@iconify/vue'; 12 | 13 | /** 14 | * 从@iconify/vue/dist/offline'导出的组件为离线ICON 不支持在线 15 | * 从@iconify/vue'导出的组件为在能找到本地图标为离线 否则会在线获取(适用性更强) 16 | */ 17 | -------------------------------------------------------------------------------- /packages/@core/base/icons/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/base/shared/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: [ 7 | 'src/store', 8 | 'src/constants/index', 9 | 'src/utils/index', 10 | 'src/color/index', 11 | 'src/cache/index', 12 | 'src/global-state', 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/cache/index.ts: -------------------------------------------------------------------------------- 1 | export * from './storage-manager'; 2 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/cache/types.ts: -------------------------------------------------------------------------------- 1 | type StorageType = 'localStorage' | 'sessionStorage'; 2 | 3 | interface StorageValue { 4 | data: T; 5 | expiry: null | number; 6 | } 7 | 8 | interface IStorageCache { 9 | clear(): void; 10 | getItem(key: string): null | T; 11 | key(index: number): null | string; 12 | length(): number; 13 | removeItem(key: string): void; 14 | setItem(key: string, value: T, expiryInMinutes?: number): void; 15 | } 16 | 17 | export type { IStorageCache, StorageType, StorageValue }; 18 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/color/color.ts: -------------------------------------------------------------------------------- 1 | import { TinyColor } from '@ctrl/tinycolor'; 2 | 3 | export function isDarkColor(color: string) { 4 | return new TinyColor(color).isDark(); 5 | } 6 | 7 | export function isLightColor(color: string) { 8 | return new TinyColor(color).isLight(); 9 | } 10 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/color/index.ts: -------------------------------------------------------------------------------- 1 | export * from './color'; 2 | export * from './convert'; 3 | export * from './generator'; 4 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from './dict-enum'; 2 | export * from './globals'; 3 | export * from './vben'; 4 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/store.ts: -------------------------------------------------------------------------------- 1 | export * from '@tanstack/vue-store'; 2 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/utils/cn.ts: -------------------------------------------------------------------------------- 1 | import type { ClassValue } from 'clsx'; 2 | 3 | import { clsx } from 'clsx'; 4 | import { twMerge } from 'tailwind-merge'; 5 | 6 | function cn(...inputs: ClassValue[]) { 7 | return twMerge(clsx(inputs)); 8 | } 9 | 10 | export { cn }; 11 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/utils/merge.ts: -------------------------------------------------------------------------------- 1 | import { createDefu } from 'defu'; 2 | 3 | export { createDefu as createMerge, defu as merge } from 'defu'; 4 | 5 | export const mergeWithArrayOverride = createDefu((originObj, key, updates) => { 6 | if (Array.isArray(originObj[key]) && Array.isArray(updates)) { 7 | originObj[key] = updates; 8 | return true; 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /packages/@core/base/shared/src/utils/unique.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 根据指定字段对对象数组进行去重 3 | * @param arr 要去重的对象数组 4 | * @param key 去重依据的字段名 5 | * @returns 去重后的对象数组 6 | */ 7 | function uniqueByField(arr: T[], key: keyof T): T[] { 8 | const seen = new Map(); 9 | return arr.filter((item) => { 10 | const value = item[key]; 11 | return seen.has(value) ? false : (seen.set(value, item), true); 12 | }); 13 | } 14 | 15 | export { uniqueByField }; 16 | -------------------------------------------------------------------------------- /packages/@core/base/shared/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/library.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/base/typings/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /packages/@core/base/typings/src/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './app'; 2 | export type * from './basic'; 3 | export type * from './helper'; 4 | export type * from './menu-record'; 5 | export type * from './tabs'; 6 | export type * from './vue-router'; 7 | -------------------------------------------------------------------------------- /packages/@core/base/typings/src/tabs.ts: -------------------------------------------------------------------------------- 1 | import type { RouteLocationNormalized } from 'vue-router'; 2 | 3 | export type TabDefinition = RouteLocationNormalized; 4 | -------------------------------------------------------------------------------- /packages/@core/base/typings/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/library.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/base/typings/vue-router.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-restricted-imports */ 2 | import type { RouteMeta as IRouteMeta } from '@vben-core/typings'; 3 | 4 | import 'vue-router'; 5 | 6 | declare module 'vue-router' { 7 | // eslint-disable-next-line @typescript-eslint/no-empty-object-type 8 | interface RouteMeta extends IRouteMeta {} 9 | } 10 | -------------------------------------------------------------------------------- /packages/@core/composables/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /packages/@core/composables/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-is-mobile'; 2 | export * from './use-layout-style'; 3 | export * from './use-namespace'; 4 | export * from './use-priority-value'; 5 | export * from './use-scroll-lock'; 6 | export * from './use-simple-locale'; 7 | export * from './use-sortable'; 8 | export { 9 | useEmitAsProps, 10 | useForwardExpose, 11 | useForwardProps, 12 | useForwardPropsEmits, 13 | } from 'radix-vue'; 14 | -------------------------------------------------------------------------------- /packages/@core/composables/src/use-is-mobile.ts: -------------------------------------------------------------------------------- 1 | import { breakpointsTailwind, useBreakpoints } from '@vueuse/core'; 2 | 3 | export function useIsMobile() { 4 | const breakpoints = useBreakpoints(breakpointsTailwind); 5 | const isMobile = breakpoints.smaller('md'); 6 | return { isMobile }; 7 | } 8 | -------------------------------------------------------------------------------- /packages/@core/composables/src/use-simple-locale/README.md: -------------------------------------------------------------------------------- 1 | # Simple i18n 2 | 3 | Simple i18 implementation 4 | -------------------------------------------------------------------------------- /packages/@core/composables/src/use-simple-locale/messages.ts: -------------------------------------------------------------------------------- 1 | export type Locale = 'en-US' | 'zh-CN'; 2 | 3 | export const messages: Record> = { 4 | 'en-US': { 5 | cancel: 'Cancel', 6 | collapse: 'Collapse', 7 | confirm: 'Confirm', 8 | expand: 'Expand', 9 | reset: 'Reset', 10 | submit: 'Submit', 11 | }, 12 | 'zh-CN': { 13 | cancel: '取消', 14 | collapse: '收起', 15 | confirm: '确认', 16 | expand: '展开', 17 | reset: '重置', 18 | submit: '提交', 19 | }, 20 | }; 21 | 22 | export const getMessages = (locale: Locale) => messages[locale]; 23 | -------------------------------------------------------------------------------- /packages/@core/composables/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/library.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/preferences/__tests__/config.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { defaultPreferences } from '../src/config'; 4 | 5 | describe('defaultPreferences immutability test', () => { 6 | // 创建快照,确保默认配置对象不被修改 7 | it('should not modify the config object', () => { 8 | expect(defaultPreferences).toMatchSnapshot(); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /packages/@core/preferences/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /packages/@core/preferences/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src", "__tests__"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/README.md: -------------------------------------------------------------------------------- 1 | # ui-kit 2 | 3 | 用于管理公共组件、不同UI组件库封装的组件 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/form-ui/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: [ 7 | { 8 | builder: 'mkdist', 9 | input: './src', 10 | loaders: ['vue'], 11 | pattern: ['**/*.vue'], 12 | }, 13 | { 14 | builder: 'mkdist', 15 | format: 'esm', 16 | input: './src', 17 | loaders: ['js'], 18 | pattern: ['**/*.ts'], 19 | }, 20 | ], 21 | }); 22 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/form-ui/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/form-ui/src/form-render/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Form } from './form.vue'; 2 | export { default as FormField } from './form-field.vue'; 3 | export { default as FormLabel } from './form-label.vue'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/form-ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export { setupVbenForm } from './config'; 2 | 3 | export type { 4 | BaseFormComponentType, 5 | ExtendedFormApi, 6 | VbenFormProps, 7 | FormSchema as VbenFormSchema, 8 | } from './types'; 9 | 10 | export * from './use-vben-form'; 11 | // export { default as VbenForm } from './vben-form.vue'; 12 | export * as z from 'zod'; 13 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/form-ui/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/form-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src", "__tests__"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/layout-ui/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: [ 7 | { 8 | builder: 'mkdist', 9 | input: './src', 10 | loaders: ['vue'], 11 | pattern: ['**/*.vue'], 12 | }, 13 | { 14 | builder: 'mkdist', 15 | format: 'esm', 16 | input: './src', 17 | loaders: ['js'], 18 | pattern: ['**/*.ts'], 19 | }, 20 | ], 21 | }); 22 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/layout-ui/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/layout-ui/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LayoutContent } from './layout-content.vue'; 2 | export { default as LayoutFooter } from './layout-footer.vue'; 3 | export { default as LayoutHeader } from './layout-header.vue'; 4 | export { default as LayoutSidebar } from './layout-sidebar.vue'; 5 | export { default as LayoutTabbar } from './layout-tabbar.vue'; 6 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/layout-ui/src/components/widgets/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SidebarCollapseButton } from './sidebar-collapse-button.vue'; 2 | export { default as SidebarFixedButton } from './sidebar-fixed-button.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/layout-ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './vben-layout'; 2 | export { default as VbenAdminLayout } from './vben-layout.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/layout-ui/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/layout-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/README.md: -------------------------------------------------------------------------------- 1 | # 菜单组件 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MenuBadge } from './menu-badge.vue'; 2 | export { default as MenuItem } from './menu-item.vue'; 3 | export { default as Menu } from './menu.vue'; 4 | export { default as SubMenu } from './sub-menu.vue'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/src/components/normal-menu/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './normal-menu'; 2 | export { default as NormalMenu } from './normal-menu.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/src/components/normal-menu/normal-menu.ts: -------------------------------------------------------------------------------- 1 | import type { MenuRecordRaw } from '@vben-core/typings'; 2 | 3 | interface NormalMenuProps { 4 | /** 5 | * 菜单数据 6 | */ 7 | activePath?: string; 8 | /** 9 | * 是否折叠 10 | */ 11 | collapse?: boolean; 12 | /** 13 | * 菜单项 14 | */ 15 | menus?: MenuRecordRaw[]; 16 | /** 17 | * @zh_CN 是否圆润风格 18 | * @default true 19 | */ 20 | rounded?: boolean; 21 | /** 22 | * 主题 23 | */ 24 | theme?: 'dark' | 'light'; 25 | } 26 | 27 | export type { NormalMenuProps }; 28 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/src/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-menu'; 2 | export * from './use-menu-context'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MenuBadge } from './components/menu-badge.vue'; 2 | export * from './components/normal-menu'; 3 | export { default as Menu } from './menu.vue'; 4 | export type * from './types'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/menu-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/popup-ui/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: [ 7 | { 8 | builder: 'mkdist', 9 | input: './src', 10 | loaders: ['vue'], 11 | pattern: ['**/*.vue'], 12 | }, 13 | { 14 | builder: 'mkdist', 15 | format: 'esm', 16 | input: './src', 17 | loaders: ['js'], 18 | pattern: ['**/*.ts'], 19 | }, 20 | ], 21 | }); 22 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/popup-ui/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/popup-ui/src/drawer/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './drawer'; 2 | export { default as VbenDrawer } from './drawer.vue'; 3 | export { setDefaultDrawerProps, useVbenDrawer } from './use-drawer'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/popup-ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './drawer'; 2 | export * from './modal'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/popup-ui/src/modal/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './modal'; 2 | export { default as VbenModal } from './modal.vue'; 3 | export { setDefaultModalProps, useVbenModal } from './use-modal'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/popup-ui/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/popup-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://shadcn-vue.com/schema.json", 3 | "style": "new-york", 4 | "typescript": true, 5 | "tailwind": { 6 | "config": "tailwind.config.mjs", 7 | "css": "src/assets/index.css", 8 | "baseColor": "slate", 9 | "cssVariables": true 10 | }, 11 | "framework": "vite", 12 | "aliases": { 13 | "components": "@vben-core/shadcn-ui/components", 14 | "utils": "@vben-core/shared/utils" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/avatar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenAvatar } from './avatar.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/back-top/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenBackTop } from './back-top.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/breadcrumb/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenBreadcrumbView } from './breadcrumb-view.vue'; 2 | 3 | export type * from './types'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/breadcrumb/types.ts: -------------------------------------------------------------------------------- 1 | import type { Component } from 'vue'; 2 | 3 | import type { BreadcrumbStyleType } from '@vben-core/typings'; 4 | 5 | export interface IBreadcrumb { 6 | icon?: Component | string; 7 | isHome?: boolean; 8 | items?: IBreadcrumb[]; 9 | path?: string; 10 | title?: string; 11 | } 12 | 13 | export interface BreadcrumbProps { 14 | breadcrumbs: IBreadcrumb[]; 15 | showIcon?: boolean; 16 | styleType?: BreadcrumbStyleType; 17 | } 18 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/button/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './button'; 2 | export { default as VbenButtonGroup } from './button-group.vue'; 3 | export { default as VbenButton } from './button.vue'; 4 | export { default as VbenCheckButtonGroup } from './check-button-group.vue'; 5 | export { default as VbenIconButton } from './icon-button.vue'; 6 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/checkbox/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenCheckbox } from './checkbox.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/context-menu/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenContextMenu } from './context-menu.vue'; 2 | 3 | export type * from './interface'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/count-to-animator/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenCountToAnimator } from './count-to-animator.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/dropdown-menu/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenDropdownMenu } from './dropdown-menu.vue'; 2 | export { default as VbenDropdownRadioMenu } from './dropdown-radio-menu.vue'; 3 | 4 | export type * from './interface'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/expandable-arrow/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenExpandableArrow } from './expandable-arrow.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/full-screen/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenFullScreen } from './full-screen.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/hover-card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenHoverCard } from './hover-card.vue'; 2 | export type { HoverCardContentProps } from 'radix-vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/icon/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenIcon } from './icon.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/input-captcha/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenInputCaptcha } from './input-captcha.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/input-password/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenInputPassword } from './input-password.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/logo/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenLogo } from './logo.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/pin-input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenPinInput } from './input.vue'; 2 | 3 | export type * from './types'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenPopover } from './popover.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/render-content/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenRenderContent } from './render-content.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/scrollbar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenScrollbar } from './scrollbar.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/segmented/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenSegmented } from './segmented.vue'; 2 | 3 | export type * from './types'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/segmented/types.ts: -------------------------------------------------------------------------------- 1 | interface SegmentedItem { 2 | label: string; 3 | value: string; 4 | } 5 | 6 | export type { SegmentedItem }; 7 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/select/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenSelect } from './select.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/spine-text/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenSpineText } from './spine-text.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/spinner/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenLoading } from './loading.vue'; 2 | export { default as VbenSpinner } from './spinner.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/components/tooltip/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenHelpTooltip } from './help-tooltip.vue'; 2 | export { default as VbenTooltip } from './tooltip.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components'; 2 | export * from './ui'; 3 | export { createContext, Slot, VisuallyHidden } from 'radix-vue'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/accordion/Accordion.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/accordion/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Accordion } from './Accordion.vue'; 2 | export { default as AccordionContent } from './AccordionContent.vue'; 3 | export { default as AccordionItem } from './AccordionItem.vue'; 4 | export { default as AccordionTrigger } from './AccordionTrigger.vue'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/avatar/AvatarFallback.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/avatar/AvatarImage.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/avatar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './avatar'; 2 | export { default as Avatar } from './Avatar.vue'; 3 | export { default as AvatarFallback } from './AvatarFallback.vue'; 4 | export { default as AvatarImage } from './AvatarImage.vue'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/badge/Badge.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/badge/index.ts: -------------------------------------------------------------------------------- 1 | export * from './badge'; 2 | 3 | export { default as Badge } from './Badge.vue'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/Breadcrumb.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbItem.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbLink.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbList.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbPage.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 19 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbSeparator.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Breadcrumb } from './Breadcrumb.vue'; 2 | export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue'; 3 | export { default as BreadcrumbItem } from './BreadcrumbItem.vue'; 4 | export { default as BreadcrumbLink } from './BreadcrumbLink.vue'; 5 | export { default as BreadcrumbList } from './BreadcrumbList.vue'; 6 | export { default as BreadcrumbPage } from './BreadcrumbPage.vue'; 7 | export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue'; 8 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/button/index.ts: -------------------------------------------------------------------------------- 1 | export * from './button'; 2 | 3 | export { default as Button } from './Button.vue'; 4 | 5 | export type * from './types'; 6 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/button/types.ts: -------------------------------------------------------------------------------- 1 | export type ButtonVariantSize = 2 | | 'default' 3 | | 'icon' 4 | | 'lg' 5 | | 'sm' 6 | | 'xs' 7 | | null 8 | | undefined; 9 | 10 | export type ButtonVariants = 11 | | 'default' 12 | | 'destructive' 13 | | 'ghost' 14 | | 'heavy' 15 | | 'icon' 16 | | 'link' 17 | | 'outline' 18 | | 'secondary' 19 | | null 20 | | undefined; 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/Card.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardContent.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardDescription.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardFooter.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardHeader.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardTitle.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Card } from './Card.vue'; 2 | export { default as CardContent } from './CardContent.vue'; 3 | export { default as CardDescription } from './CardDescription.vue'; 4 | export { default as CardFooter } from './CardFooter.vue'; 5 | export { default as CardHeader } from './CardHeader.vue'; 6 | export { default as CardTitle } from './CardTitle.vue'; 7 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/checkbox/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Checkbox } from './Checkbox.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuPortal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuSub.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/Dialog.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogClose.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogFooter.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogHeader.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogOverlay.vue: -------------------------------------------------------------------------------- 1 | 9 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuSub.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormControl.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 20 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormDescription.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormItem.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormLabel.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormMessage.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/index.ts: -------------------------------------------------------------------------------- 1 | export { default as FormControl } from './FormControl.vue'; 2 | export { default as FormDescription } from './FormDescription.vue'; 3 | export { default as FormItem } from './FormItem.vue'; 4 | export { default as FormLabel } from './FormLabel.vue'; 5 | export { default as FormMessage } from './FormMessage.vue'; 6 | export { FORM_ITEM_INJECTION_KEY } from './injectionKeys'; 7 | export { 8 | Form, 9 | Field as FormField, 10 | FieldArray as FormFieldArray, 11 | } from 'vee-validate'; 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/injectionKeys.ts: -------------------------------------------------------------------------------- 1 | import type { InjectionKey } from 'vue'; 2 | 3 | // eslint-disable-next-line symbol-description 4 | export const FORM_ITEM_INJECTION_KEY = Symbol() as InjectionKey; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/hover-card/HoverCard.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/hover-card/HoverCardTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/hover-card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as HoverCard } from './HoverCard.vue'; 2 | export { default as HoverCardContent } from './HoverCardContent.vue'; 3 | export { default as HoverCardTrigger } from './HoverCardTrigger.vue'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Input } from './Input.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/label/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Label } from './Label.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/number-field/NumberFieldContent.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/number-field/index.ts: -------------------------------------------------------------------------------- 1 | export { default as NumberField } from './NumberField.vue'; 2 | export { default as NumberFieldContent } from './NumberFieldContent.vue'; 3 | export { default as NumberFieldDecrement } from './NumberFieldDecrement.vue'; 4 | export { default as NumberFieldIncrement } from './NumberFieldIncrement.vue'; 5 | export { default as NumberFieldInput } from './NumberFieldInput.vue'; 6 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/pagination/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PaginationEllipsis } from './PaginationEllipsis.vue'; 2 | export { default as PaginationFirst } from './PaginationFirst.vue'; 3 | export { default as PaginationLast } from './PaginationLast.vue'; 4 | export { default as PaginationNext } from './PaginationNext.vue'; 5 | export { default as PaginationPrev } from './PaginationPrev.vue'; 6 | export { 7 | PaginationRoot as Pagination, 8 | PaginationList, 9 | PaginationListItem, 10 | } from 'radix-vue'; 11 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/pin-input/PinInputSeparator.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/pin-input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PinInput } from './PinInput.vue'; 2 | export { default as PinInputGroup } from './PinInputGroup.vue'; 3 | export { default as PinInputInput } from './PinInputInput.vue'; 4 | export { default as PinInputSeparator } from './PinInputSeparator.vue'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/popover/Popover.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/popover/PopoverTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/popover/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Popover } from './Popover.vue'; 2 | export { default as PopoverContent } from './PopoverContent.vue'; 3 | export { default as PopoverTrigger } from './PopoverTrigger.vue'; 4 | export { PopoverAnchor } from 'radix-vue'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/radio-group/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RadioGroup } from './RadioGroup.vue'; 2 | export { default as RadioGroupItem } from './RadioGroupItem.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/resizable/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ResizableHandle } from './ResizableHandle.vue'; 2 | export { default as ResizablePanelGroup } from './ResizablePanelGroup.vue'; 3 | export { SplitterPanel as ResizablePanel } from 'radix-vue'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/scroll-area/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ScrollArea } from './ScrollArea.vue'; 2 | export { default as ScrollBar } from './ScrollBar.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/select/Select.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectItemText.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectLabel.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectValue.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/separator/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Separator } from './Separator.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/Sheet.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetClose.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetFooter.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetHeader.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetOverlay.vue: -------------------------------------------------------------------------------- 1 | 9 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/index.ts: -------------------------------------------------------------------------------- 1 | export * from './sheet'; 2 | export { default as Sheet } from './Sheet.vue'; 3 | export { default as SheetClose } from './SheetClose.vue'; 4 | export { default as SheetContent } from './SheetContent.vue'; 5 | export { default as SheetDescription } from './SheetDescription.vue'; 6 | export { default as SheetFooter } from './SheetFooter.vue'; 7 | export { default as SheetHeader } from './SheetHeader.vue'; 8 | export { default as SheetTitle } from './SheetTitle.vue'; 9 | 10 | export { default as SheetTrigger } from './SheetTrigger.vue'; 11 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/switch/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Switch } from './Switch.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tabs/Tabs.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tabs/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tabs } from './Tabs.vue'; 2 | export { default as TabsContent } from './TabsContent.vue'; 3 | export { default as TabsList } from './TabsList.vue'; 4 | export { default as TabsTrigger } from './TabsTrigger.vue'; 5 | export { TabsIndicator } from 'radix-vue'; 6 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/textarea/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Textarea } from './Textarea.vue'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/toggle-group/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ToggleGroup } from './ToggleGroup.vue'; 2 | export { default as ToggleGroupItem } from './ToggleGroupItem.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/toggle/index.ts: -------------------------------------------------------------------------------- 1 | export * from './toggle'; 2 | export { default as Toggle } from './Toggle.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/Tooltip.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/TooltipProvider.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/TooltipTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tooltip } from './Tooltip.vue'; 2 | export { default as TooltipContent } from './TooltipContent.vue'; 3 | export { default as TooltipProvider } from './TooltipProvider.vue'; 4 | export { default as TooltipTrigger } from './TooltipTrigger.vue'; 5 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tree/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VbenTree } from './tree.vue'; 2 | export type { FlattenedItem } from 'radix-vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "@vben-core/shadcn-ui/*": ["./src/*"] 8 | } 9 | }, 10 | "include": ["src"], 11 | "exclude": ["node_modules"] 12 | } 13 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/tabs-ui/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: [ 7 | { 8 | builder: 'mkdist', 9 | input: './src', 10 | loaders: ['vue'], 11 | pattern: ['**/*.vue'], 12 | }, 13 | { 14 | builder: 'mkdist', 15 | format: 'esm', 16 | input: './src', 17 | loaders: ['js'], 18 | pattern: ['**/*.ts'], 19 | }, 20 | ], 21 | }); 22 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/tabs-ui/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/tabs-ui/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Tabs } from './tabs/tabs.vue'; 2 | export { default as TabsChrome } from './tabs-chrome/tabs.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/tabs-ui/src/components/widgets/index.ts: -------------------------------------------------------------------------------- 1 | export { default as TabsToolMore } from './tool-more.vue'; 2 | export { default as TabsToolScreen } from './tool-screen.vue'; 3 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/tabs-ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components/widgets'; 2 | export { default as TabsView } from './tabs-view.vue'; 3 | export type { IContextMenuItem } from '@vben-core/shadcn-ui'; 4 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/tabs-ui/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/tabs-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/constants/README.md: -------------------------------------------------------------------------------- 1 | # @vben/constants 2 | 3 | 用于多个 `app` 公用的常量,继承了 `@vben-core/shared/constants` 的所有能力。业务上有通用常量可以放在这里。 4 | 5 | ## 用法 6 | 7 | ### 添加依赖 8 | 9 | ```bash 10 | # 进入目标应用目录,例如 apps/xxxx-app 11 | # cd apps/xxxx-app 12 | pnpm add @vben/constants 13 | ``` 14 | 15 | ### 使用 16 | 17 | ```ts 18 | import { DEFAULT_HOME_PATH } from '@vben/constants'; 19 | ``` 20 | -------------------------------------------------------------------------------- /packages/constants/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './core'; 2 | export * from '@vben-core/shared/constants'; 3 | -------------------------------------------------------------------------------- /packages/constants/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/effects/README.md: -------------------------------------------------------------------------------- 1 | ## Effects 目录 2 | 3 | `effects` 目录专门用于存放与轻微耦合相关的代码和逻辑。如果你的包具有以下特点,建议将其放置在 `effects` 目录下: 4 | 5 | - **状态管理**:使用状态管理框架 `pinia`,并包含处理副作用(如异步操作、API 调用)的部分。 6 | - **用户偏好设置**:使用 `@vben-core/preferences` 处理用户偏好设置,涉及本地存储或浏览器缓存逻辑(如使用 `localStorage`)。 7 | - **导航和路由**:处理导航、页面跳转等场景,需要管理路由变化的逻辑。 8 | - **组件库依赖**:包含与特定组件库紧密耦合或依赖大型仓库的部分。 9 | 10 | 通过将相关代码归类到 `effects` 目录,可以使项目结构更加清晰,便于维护和扩展。 11 | -------------------------------------------------------------------------------- /packages/effects/access/src/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AccessControl } from './access-control.vue'; 2 | export * from './accessible'; 3 | export * from './directive'; 4 | export * from './use-access'; 5 | -------------------------------------------------------------------------------- /packages/effects/access/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/api-component/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ApiComponent } from './api-component.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/captcha/hooks/useCaptchaPoints.ts: -------------------------------------------------------------------------------- 1 | import type { CaptchaPoint } from '../types'; 2 | 3 | import { reactive } from 'vue'; 4 | 5 | export function useCaptchaPoints() { 6 | const points = reactive([]); 7 | function addPoint(point: CaptchaPoint) { 8 | points.push(point); 9 | } 10 | 11 | function clearPoints() { 12 | points.splice(0, points.length); 13 | } 14 | return { 15 | addPoint, 16 | clearPoints, 17 | points, 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/captcha/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PointSelectionCaptcha } from './point-selection-captcha/index.vue'; 2 | export { default as PointSelectionCaptchaCard } from './point-selection-captcha/index.vue'; 3 | 4 | export { default as SliderCaptcha } from './slider-captcha/index.vue'; 5 | export { default as SliderRotateCaptcha } from './slider-rotate-captcha/index.vue'; 6 | export type * from './types'; 7 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/code-mirror/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CodeMirror } from './code-mirror.vue'; 2 | export type { LanguageSupport } from './data'; 3 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/col-page/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ColPage } from './col-page.vue'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/count-to/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CountTo } from './count-to.vue'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/ellipsis-text/index.ts: -------------------------------------------------------------------------------- 1 | export { default as EllipsisText } from './ellipsis-text.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/icon-picker/index.ts: -------------------------------------------------------------------------------- 1 | export { default as IconPicker } from './icon-picker.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/json-preview/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JsonPreview } from './json-preview.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/json-preview/json-preview.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/json-viewer/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JsonViewer } from './index.vue'; 2 | 3 | export * from './types'; 4 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/loading/index.ts: -------------------------------------------------------------------------------- 1 | export * from './directive'; 2 | export { default as Loading } from './loading.vue'; 3 | export { default as Spinner } from './spinner.vue'; 4 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/markdown/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MarkdownEditor } from './editor.vue'; 2 | export { default as MarkdownPreviewer } from './preview.vue'; 3 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/page/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Page } from './page.vue'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/page/types.ts: -------------------------------------------------------------------------------- 1 | export interface PageProps { 2 | title?: string; 3 | description?: string; 4 | contentClass?: string; 5 | /** 6 | * 根据content可见高度自适应 7 | */ 8 | autoContentHeight?: boolean; 9 | headerClass?: string; 10 | footerClass?: string; 11 | } 12 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/components/resize/index.ts: -------------------------------------------------------------------------------- 1 | export { default as VResize } from './resize.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components'; 2 | export * from './ui'; 3 | export { VbenAvatar } from '@vben-core/shadcn-ui'; 4 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/about/about.ts: -------------------------------------------------------------------------------- 1 | import type { Component } from 'vue'; 2 | 3 | interface AboutProps { 4 | description?: string; 5 | name?: string; 6 | title?: string; 7 | } 8 | 9 | interface DescriptionItem { 10 | content: Component | string; 11 | title: string; 12 | } 13 | 14 | export type { AboutProps, DescriptionItem }; 15 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/about/index.ts: -------------------------------------------------------------------------------- 1 | export { default as About } from './about.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/authentication/auth-title.vue: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/dashboard/analysis/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AnalysisChartCard } from './analysis-chart-card.vue'; 2 | export { default as AnalysisChartsTabs } from './analysis-charts-tabs.vue'; 3 | export { default as AnalysisOverview } from './analysis-overview.vue'; 4 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/dashboard/index.ts: -------------------------------------------------------------------------------- 1 | export * from './analysis'; 2 | export type * from './typing'; 3 | export * from './workbench'; 4 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/dashboard/workbench/index.ts: -------------------------------------------------------------------------------- 1 | export { default as WorkbenchHeader } from './workbench-header.vue'; 2 | export { default as WorkbenchProject } from './workbench-project.vue'; 3 | export { default as WorkbenchQuickNav } from './workbench-quick-nav.vue'; 4 | export { default as WorkbenchTodo } from './workbench-todo.vue'; 5 | export { default as WorkbenchTrends } from './workbench-trends.vue'; 6 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/fallback/fallback.ts: -------------------------------------------------------------------------------- 1 | interface FallbackProps { 2 | /** 3 | * 描述 4 | */ 5 | description?: string; 6 | /** 7 | * @zh_CN 首页路由地址 8 | * @default / 9 | */ 10 | homePath?: string; 11 | /** 12 | * @zh_CN 默认显示的图片 13 | * @default pageNotFoundSvg 14 | */ 15 | image?: string; 16 | /** 17 | * @zh_CN 内置类型 18 | */ 19 | status?: '403' | '404' | '500' | 'coming-soon' | 'offline'; 20 | /** 21 | * @zh_CN 页面提示语 22 | */ 23 | title?: string; 24 | } 25 | export type { FallbackProps }; 26 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/fallback/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './fallback'; 2 | export { default as Fallback } from './fallback.vue'; 3 | -------------------------------------------------------------------------------- /packages/effects/common-ui/src/ui/index.ts: -------------------------------------------------------------------------------- 1 | export * from './about'; 2 | export * from './authentication'; 3 | export * from './dashboard'; 4 | export * from './fallback'; 5 | -------------------------------------------------------------------------------- /packages/effects/common-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/effects/hooks/README.md: -------------------------------------------------------------------------------- 1 | # @vben/hooks 2 | 3 | 用于多个 `app` 公用的 hook,继承了 `@vben/hooks` 的所有能力。业务上有通用 hooks 可以放在这里。 4 | 5 | ## 用法 6 | 7 | ### 添加依赖 8 | 9 | ```bash 10 | # 进入目标应用目录,例如 apps/xxxx-app 11 | # cd apps/xxxx-app 12 | pnpm add @vben/hooks 13 | ``` 14 | 15 | ### 使用 16 | 17 | ```ts 18 | import { useNamespace } from '@vben/hooks'; 19 | ``` 20 | -------------------------------------------------------------------------------- /packages/effects/hooks/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-app-config'; 2 | export * from './use-content-maximize'; 3 | export * from './use-design-tokens'; 4 | export * from './use-hover-toggle'; 5 | export * from './use-pagination'; 6 | export * from './use-refresh'; 7 | export * from './use-tabs'; 8 | export * from './use-watermark'; 9 | export * from '@vben-core/composables'; 10 | -------------------------------------------------------------------------------- /packages/effects/hooks/src/use-refresh.ts: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'vue-router'; 2 | 3 | import { useTabbarStore } from '@vben/stores'; 4 | 5 | export function useRefresh() { 6 | const router = useRouter(); 7 | const tabbarStore = useTabbarStore(); 8 | 9 | async function refresh() { 10 | await tabbarStore.refresh(router); 11 | } 12 | 13 | return { 14 | refresh, 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /packages/effects/hooks/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "compilerOptions": { 5 | "types": ["vite/client", "@vben/types/global"] 6 | }, 7 | "include": ["src"], 8 | "exclude": ["node_modules"] 9 | } 10 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/authentication/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AuthPageLayout } from './authentication.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/authentication/types.ts: -------------------------------------------------------------------------------- 1 | export type ToolbarType = 'color' | 'language' | 'layout' | 'theme'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/README.md: -------------------------------------------------------------------------------- 1 | ## layout 2 | 3 | ### header 4 | 5 | - 支持N个自定义插槽,命名方式:header-right-n,header-left-n 6 | - header-left-n ,排序方式:0-19 ,breadcrumb 21-x 7 | - header-right-n ,排序方式:0-49,global-search,51-59,theme-toggle,61-69,language-toggle,71-79,fullscreen,81-89,notification,91-149,user-dropdown,151-x 8 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/content/content-spinner.vue: -------------------------------------------------------------------------------- 1 | 10 | 13 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/content/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LayoutContent } from './content.vue'; 2 | export { default as LayoutContentSpinner } from './content-spinner.vue'; 3 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/copyright/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Copyright } from './copyright.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/footer/footer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/footer/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LayoutFooter } from './footer.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/header/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LayoutHeader } from './header.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/index.ts: -------------------------------------------------------------------------------- 1 | export { default as BasicLayout } from './layout.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/menu/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LayoutExtraMenu } from './extra-menu.vue'; 2 | export { default as LayoutMenu } from './menu.vue'; 3 | export { default as LayoutMixedMenu } from './mixed-menu.vue'; 4 | export * from './use-extra-menu'; 5 | export * from './use-mixed-menu'; 6 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/basic/tabbar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LayoutTabbar } from './tabbar.vue'; 2 | export * from './use-tabbar'; 3 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/iframe/iframe-view.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/iframe/index.ts: -------------------------------------------------------------------------------- 1 | export { default as IFrameRouterView } from './iframe-router-view.vue'; 2 | export { default as IFrameView } from './iframe-view.vue'; 3 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './authentication'; 2 | export * from './basic'; 3 | export * from './iframe'; 4 | export * from './widgets'; 5 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/check-updates/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CheckUpdates } from './check-updates.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/global-search/index.ts: -------------------------------------------------------------------------------- 1 | export { default as GlobalSearch } from './global-search.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Breadcrumb } from './breadcrumb.vue'; 2 | export * from './check-updates'; 3 | export { default as AuthenticationColorToggle } from './color-toggle.vue'; 4 | export * from './global-search'; 5 | export { default as LanguageToggle } from './language-toggle.vue'; 6 | export { default as AuthenticationLayoutToggle } from './layout-toggle.vue'; 7 | export * from './lock-screen'; 8 | export * from './notification'; 9 | export * from './preferences'; 10 | export * from './theme-toggle'; 11 | export * from './user-dropdown'; 12 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/lock-screen/index.ts: -------------------------------------------------------------------------------- 1 | export { default as LockScreen } from './lock-screen.vue'; 2 | export { default as LockScreenModal } from './lock-screen-modal.vue'; 3 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/notification/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Notification } from './notification.vue'; 2 | 3 | export type * from './types'; 4 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/notification/types.ts: -------------------------------------------------------------------------------- 1 | interface NotificationItem { 2 | avatar: string; 3 | date: string; 4 | isRead?: boolean; 5 | message: string; 6 | title: string; 7 | userId: number | string; 8 | } 9 | 10 | export type { NotificationItem }; 11 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/preferences/blocks/block.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/preferences/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Preferences } from './preferences.vue'; 2 | export { default as PreferencesButton } from './preferences-button.vue'; 3 | export * from './use-open-preferences'; 4 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/preferences/use-open-preferences.ts: -------------------------------------------------------------------------------- 1 | import { ref } from 'vue'; 2 | 3 | const openPreferences = ref(false); 4 | 5 | function useOpenPreferences() { 6 | function handleOpenPreference() { 7 | openPreferences.value = true; 8 | } 9 | 10 | return { 11 | handleOpenPreference, 12 | openPreferences, 13 | }; 14 | } 15 | 16 | export { useOpenPreferences }; 17 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/theme-toggle/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ThemeToggle } from './theme-toggle.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/src/widgets/user-dropdown/index.ts: -------------------------------------------------------------------------------- 1 | export { default as UserDropdown } from './user-dropdown.vue'; 2 | -------------------------------------------------------------------------------- /packages/effects/layouts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/effects/plugins/README.md: -------------------------------------------------------------------------------- 1 | # @vben/plugins 2 | 3 | 该目录用于存放项目中集成的第三方库及其相关插件。每个插件都包含了可重用的逻辑、配置和组件,方便在项目中进行统一管理和调用。 4 | 5 | ## 注意 6 | 7 | 所有的第三方插件都必须以 `subpath` 形式引入,例: 8 | 9 | 以 `echarts` 为例,引入方式如下: 10 | 11 | **packages.json** 12 | 13 | ```json 14 | "exports": { 15 | "./echarts": { 16 | "types": "./src/echarts/index.ts", 17 | "default": "./src/echarts/index.ts" 18 | } 19 | } 20 | ``` 21 | 22 | **使用方式** 23 | 24 | ```ts 25 | import { useEcharts } from '@vben/plugins/echarts'; 26 | ``` 27 | 28 | 这样做的好处是,应用可以自行选择是否使用插件,而不会因为插件的引入及副作用而导致打包体积增大,只引入需要的插件即可。 29 | -------------------------------------------------------------------------------- /packages/effects/plugins/src/echarts/echarts-ui.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 16 | -------------------------------------------------------------------------------- /packages/effects/plugins/src/echarts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './echarts'; 2 | export { default as EchartsUI } from './echarts-ui.vue'; 3 | export * from './use-echarts'; 4 | -------------------------------------------------------------------------------- /packages/effects/plugins/src/motion/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types'; 2 | 3 | export { 4 | MotionComponent as Motion, 5 | MotionDirective, 6 | MotionGroupComponent as MotionGroup, 7 | MotionPlugin, 8 | } from '@vueuse/motion'; 9 | -------------------------------------------------------------------------------- /packages/effects/plugins/src/vxe-table/index.ts: -------------------------------------------------------------------------------- 1 | export { setupVbenVxeTable } from './init'; 2 | export type { VxeTableGridOptions } from './types'; 3 | export * from './use-vxe-grid'; 4 | export { default as VbenVxeGrid } from './use-vxe-grid.vue'; 5 | export type { 6 | VxeGridDefines, 7 | VxeGridListeners, 8 | VxeGridProps, 9 | VxeGridPropTypes, 10 | } from 'vxe-table'; 11 | -------------------------------------------------------------------------------- /packages/effects/plugins/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/effects/request/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './request-client'; 2 | export * from 'axios'; 3 | export { stringify } from 'qs'; 4 | -------------------------------------------------------------------------------- /packages/effects/request/src/request-client/index.ts: -------------------------------------------------------------------------------- 1 | export * from './preset-interceptors'; 2 | export * from './request-client'; 3 | export type * from './types'; 4 | -------------------------------------------------------------------------------- /packages/effects/request/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/icons/README.md: -------------------------------------------------------------------------------- 1 | # @vben/icons 2 | 3 | 用于多个 `app` 公用的图标文件,继承了 `@vben-core/icons` 的所有能力。业务上有通用图标可以放在这里。 4 | 5 | ## 用法 6 | 7 | ### 添加依赖 8 | 9 | ```bash 10 | # 进入目标应用目录,例如 apps/xxxx-app 11 | # cd apps/xxxx-app 12 | pnpm add @vben/icons 13 | ``` 14 | 15 | ### 使用 16 | 17 | ```ts 18 | import { X } from '@vben/icons'; 19 | ``` 20 | -------------------------------------------------------------------------------- /packages/icons/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './iconify-offline/index.js'; 2 | export * from './iconify/index.js'; 3 | export { default as EmptyIcon } from './icons/empty-icon.vue'; 4 | export * from './svg/index.js'; 5 | export { VbenIcon } from '@vben-core/shadcn-ui'; 6 | -------------------------------------------------------------------------------- /packages/icons/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/locales/src/langs/en-US/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "back": "Back", 3 | "backToHome": "Back To Home", 4 | "login": "Login", 5 | "logout": "Logout", 6 | "prompt": "Prompt", 7 | "cancel": "Cancel", 8 | "confirm": "Confirm", 9 | "reset": "Reset", 10 | "noData": "No Data", 11 | "refresh": "Refresh", 12 | "loadingMenu": "Loading Menu", 13 | "query": "Search", 14 | "search": "Search", 15 | "enabled": "Enabled", 16 | "disabled": "Disabled", 17 | "edit": "Edit", 18 | "delete": "Delete", 19 | "create": "Create", 20 | "yes": "Yes", 21 | "no": "No" 22 | } 23 | -------------------------------------------------------------------------------- /packages/locales/src/langs/zh-CN/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "back": "返回", 3 | "backToHome": "返回首页", 4 | "login": "登录", 5 | "logout": "退出登录", 6 | "prompt": "提示", 7 | "cancel": "取消", 8 | "confirm": "确认", 9 | "reset": "重置", 10 | "noData": "暂无数据", 11 | "refresh": "刷新", 12 | "loadingMenu": "加载菜单中", 13 | "query": "查询", 14 | "search": "搜索", 15 | "enabled": "已启用", 16 | "disabled": "已禁用", 17 | "edit": "修改", 18 | "delete": "删除", 19 | "create": "新增", 20 | "yes": "是", 21 | "no": "否" 22 | } 23 | -------------------------------------------------------------------------------- /packages/locales/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/preferences/src/index.ts: -------------------------------------------------------------------------------- 1 | import type { Preferences } from '@vben-core/preferences'; 2 | import type { DeepPartial } from '@vben-core/typings'; 3 | 4 | /** 5 | * 如果你想所有的app都使用相同的默认偏好设置,你可以在这里定义 6 | * 而不是去修改 @vben-core/preferences 中的默认偏好设置 7 | * @param preferences 8 | * @returns 9 | */ 10 | 11 | function defineOverridesPreferences(preferences: DeepPartial) { 12 | return preferences; 13 | } 14 | 15 | export { defineOverridesPreferences }; 16 | 17 | export * from '@vben-core/preferences'; 18 | -------------------------------------------------------------------------------- /packages/preferences/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/stores/shim-pinia.d.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/vuejs/pinia/issues/2098 2 | declare module 'pinia' { 3 | export function acceptHMRUpdate( 4 | initialUseStore: any | StoreDefinition, 5 | hot: any, 6 | ): (newModule: any) => any; 7 | } 8 | 9 | export {}; 10 | -------------------------------------------------------------------------------- /packages/stores/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './modules'; 2 | export * from './setup'; 3 | export { defineStore, storeToRefs } from 'pinia'; 4 | -------------------------------------------------------------------------------- /packages/stores/src/modules/index.ts: -------------------------------------------------------------------------------- 1 | export * from './access'; 2 | export * from './lock'; 3 | export * from './tabbar'; 4 | export * from './user'; 5 | -------------------------------------------------------------------------------- /packages/stores/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src", "shim-pinia.d.ts"] 5 | } 6 | -------------------------------------------------------------------------------- /packages/styles/README.md: -------------------------------------------------------------------------------- 1 | # @vben/styles 2 | 3 | 用于多个 `app` 公用的样式文件,继承了 `@vben-core/design` 的所有能力。业务上有通用的样式文件可以放在这里。 4 | 5 | ## 用法 6 | 7 | ### 添加依赖 8 | 9 | ```bash 10 | # 进入目标应用目录,例如 apps/xxxx-app 11 | # cd apps/xxxx-app 12 | pnpm add @vben/styles 13 | ``` 14 | 15 | ### 使用 16 | 17 | ```ts 18 | import '@vben/styles'; 19 | ``` 20 | -------------------------------------------------------------------------------- /packages/styles/src/global/index.scss: -------------------------------------------------------------------------------- 1 | @use '@vben-core/design/bem' as *; 2 | -------------------------------------------------------------------------------- /packages/styles/src/index.ts: -------------------------------------------------------------------------------- 1 | import '@vben-core/design'; 2 | -------------------------------------------------------------------------------- /packages/styles/src/naive/index.css: -------------------------------------------------------------------------------- 1 | .form-valid-error { 2 | .n-base-selection__state-border, 3 | .n-input__state-border, 4 | .n-radio-group__splitor { 5 | border: var(--n-border-error); 6 | } 7 | 8 | .n-radio-group .n-radio-button, 9 | .n-radio-group .n-radio-group__splitor { 10 | --n-button-border-color: rgb(255 56 96); 11 | } 12 | 13 | .n-radio__dot { 14 | --n-box-shadow: inset 0 0 0 1px rgb(255 56 96); 15 | } 16 | 17 | .n-checkbox-box__border { 18 | --n-border: 1px solid rgb(255 56 96); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/styles/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/types/README.md: -------------------------------------------------------------------------------- 1 | # @vben/types 2 | 3 | 用于多个 `app` 公用的工具类型,继承了 `@vben-core/typings` 的所有能力。业务上有通用的类型定义可以放在这里。 4 | 5 | ## 用法 6 | 7 | ### 添加依赖 8 | 9 | ```bash 10 | # 进入目标应用目录,例如 apps/xxxx-app 11 | # cd apps/xxxx-app 12 | pnpm add @vben/types 13 | ``` 14 | 15 | ### 使用 16 | 17 | ```ts 18 | // 推荐加上 type 19 | import type { SelectOption } from '@vben/types'; 20 | ``` 21 | -------------------------------------------------------------------------------- /packages/types/src/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './user'; 2 | export type * from '@vben-core/typings'; 3 | -------------------------------------------------------------------------------- /packages/types/src/user.ts: -------------------------------------------------------------------------------- 1 | import type { BasicUserInfo } from '@vben-core/typings'; 2 | 3 | /** 用户信息 */ 4 | interface UserInfo extends BasicUserInfo { 5 | /** 6 | * 拓展使用 7 | */ 8 | [key: string]: any; 9 | } 10 | 11 | export type { UserInfo }; 12 | -------------------------------------------------------------------------------- /packages/types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/utils/README.md: -------------------------------------------------------------------------------- 1 | # @vben/utils 2 | 3 | 用于多个 `app` 公用的工具包,继承了 `@vben-core/shared/utils` 的所有能力。业务上有通用的工具函数可以放在这里。 4 | 5 | ## 用法 6 | 7 | ### 添加依赖 8 | 9 | ```bash 10 | # 进入目标应用目录,例如 apps/xxxx-app 11 | # cd apps/xxxx-app 12 | pnpm add @vben/utils 13 | ``` 14 | 15 | ### 使用 16 | 17 | ```ts 18 | import { isString } from '@vben/utils'; 19 | ``` 20 | -------------------------------------------------------------------------------- /packages/utils/src/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './enum-options'; 2 | export * from './find-menu-by-path'; 3 | export * from './generate-menus'; 4 | export * from './generate-routes-backend'; 5 | export * from './generate-routes-frontend'; 6 | export * from './get-popup-container'; 7 | export * from './merge-route-modules'; 8 | export * from './mitt'; 9 | export * from './request'; 10 | export * from './reset-routes'; 11 | export * from './safe'; 12 | export * from './tree'; 13 | export * from './unmount-global-loading'; 14 | export * from './uuid'; 15 | -------------------------------------------------------------------------------- /packages/utils/src/helpers/safe.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 跟后台逻辑一致 3 | * Number.isSafeInteger形参只能为Number类型 其他的直接返回false 4 | * @param str 数字 5 | * @returns 安全数内返回number类型 否则返回原字符串 6 | */ 7 | export function safeParseNumber(str: string): number | string { 8 | const num = Number(str); 9 | return Number.isSafeInteger(num) ? num : str; 10 | } 11 | -------------------------------------------------------------------------------- /packages/utils/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './helpers'; 2 | export * from '@vben-core/shared/cache'; 3 | export * from '@vben-core/shared/color'; 4 | export * from '@vben-core/shared/utils'; 5 | export { fileTypeFromBlob } from 'file-type'; 6 | -------------------------------------------------------------------------------- /packages/utils/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/library.json", 4 | "compilerOptions": { 5 | "types": ["@vben-core/typings/vue-router"] 6 | }, 7 | "include": ["src"], 8 | "exclude": ["node_modules"] 9 | } 10 | -------------------------------------------------------------------------------- /playground/.env: -------------------------------------------------------------------------------- 1 | # 应用标题 2 | VITE_APP_TITLE=Vben Admin 3 | 4 | # 应用命名空间,用于缓存、store等功能的前缀,确保隔离 5 | VITE_APP_NAMESPACE=vben-web-play 6 | -------------------------------------------------------------------------------- /playground/.env.analyze: -------------------------------------------------------------------------------- 1 | # public path 2 | VITE_BASE=/ 3 | 4 | # Basic interface address SPA 5 | VITE_GLOB_API_URL=/api 6 | 7 | VITE_VISUALIZER=true 8 | -------------------------------------------------------------------------------- /playground/.env.development: -------------------------------------------------------------------------------- 1 | # 端口号 2 | VITE_PORT=5555 3 | 4 | VITE_BASE=/ 5 | 6 | # 接口地址 7 | VITE_GLOB_API_URL=/api 8 | 9 | # 是否开启 Nitro Mock服务,true 为开启,false 为关闭 10 | VITE_NITRO_MOCK=true 11 | 12 | # 是否打开 devtools,true 为打开,false 为关闭 13 | VITE_DEVTOOLS=false 14 | 15 | # 是否注入全局loading 16 | VITE_INJECT_APP_LOADING=true 17 | -------------------------------------------------------------------------------- /playground/.env.production: -------------------------------------------------------------------------------- 1 | VITE_BASE=/ 2 | 3 | # 接口地址 4 | VITE_GLOB_API_URL=https://mock-napi.vben.pro/api 5 | 6 | # 是否开启压缩,可以设置为 none, brotli, gzip 7 | VITE_COMPRESS=none 8 | 9 | # 是否开启 PWA 10 | VITE_PWA=false 11 | 12 | # vue-router 的模式 13 | VITE_ROUTER_HISTORY=hash 14 | 15 | # 是否注入全局loading 16 | VITE_INJECT_APP_LOADING=true 17 | 18 | # 打包后是否生成dist.zip 19 | VITE_ARCHIVER=true 20 | -------------------------------------------------------------------------------- /playground/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config/postcss'; 2 | -------------------------------------------------------------------------------- /playground/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/playground/public/favicon.ico -------------------------------------------------------------------------------- /playground/src/api/core/index.ts: -------------------------------------------------------------------------------- 1 | export * from './auth'; 2 | export * from './menu'; 3 | export * from './user'; 4 | -------------------------------------------------------------------------------- /playground/src/api/core/menu.ts: -------------------------------------------------------------------------------- 1 | import type { RouteRecordStringComponent } from '@vben/types'; 2 | 3 | import { requestClient } from '#/api/request'; 4 | 5 | /** 6 | * 获取用户所有菜单 7 | */ 8 | export async function getAllMenusApi() { 9 | return requestClient.get('/menu/all'); 10 | } 11 | -------------------------------------------------------------------------------- /playground/src/api/core/user.ts: -------------------------------------------------------------------------------- 1 | import type { UserInfo } from '@vben/types'; 2 | 3 | import { requestClient } from '#/api/request'; 4 | 5 | /** 6 | * 获取用户信息 7 | */ 8 | export async function getUserInfoApi() { 9 | return requestClient.get('/user/info'); 10 | } 11 | -------------------------------------------------------------------------------- /playground/src/api/examples/index.ts: -------------------------------------------------------------------------------- 1 | export * from './status'; 2 | export * from './table'; 3 | -------------------------------------------------------------------------------- /playground/src/api/examples/status.ts: -------------------------------------------------------------------------------- 1 | import { requestClient } from '#/api/request'; 2 | 3 | /** 4 | * 模拟任意状态码 5 | */ 6 | async function getMockStatusApi(status: string) { 7 | return requestClient.get('/status', { params: { status } }); 8 | } 9 | 10 | export { getMockStatusApi }; 11 | -------------------------------------------------------------------------------- /playground/src/api/examples/table.ts: -------------------------------------------------------------------------------- 1 | import { requestClient } from '#/api/request'; 2 | 3 | export namespace DemoTableApi { 4 | export interface PageFetchParams { 5 | [key: string]: any; 6 | page: number; 7 | pageSize: number; 8 | } 9 | } 10 | 11 | /** 12 | * 获取示例表格数据 13 | */ 14 | async function getExampleTableApi(params: DemoTableApi.PageFetchParams) { 15 | return requestClient.get('/table/list', { params }); 16 | } 17 | 18 | export { getExampleTableApi }; 19 | -------------------------------------------------------------------------------- /playground/src/api/index.ts: -------------------------------------------------------------------------------- 1 | export * from './core'; 2 | export * from './examples'; 3 | export * from './system'; 4 | -------------------------------------------------------------------------------- /playground/src/api/system/index.ts: -------------------------------------------------------------------------------- 1 | export * from './dept'; 2 | export * from './menu'; 3 | export * from './role'; 4 | -------------------------------------------------------------------------------- /playground/src/layouts/index.ts: -------------------------------------------------------------------------------- 1 | const BasicLayout = () => import('./basic.vue'); 2 | const AuthPageLayout = () => import('./auth.vue'); 3 | 4 | const IFrameView = () => import('@vben/layouts').then((m) => m.IFrameView); 5 | 6 | export { AuthPageLayout, BasicLayout, IFrameView }; 7 | -------------------------------------------------------------------------------- /playground/src/locales/README.md: -------------------------------------------------------------------------------- 1 | # locale 2 | 3 | 每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。 4 | -------------------------------------------------------------------------------- /playground/src/locales/langs/en-US/page.json: -------------------------------------------------------------------------------- 1 | { 2 | "auth": { 3 | "login": "Login", 4 | "register": "Register", 5 | "codeLogin": "Code Login", 6 | "qrcodeLogin": "Qr Code Login", 7 | "forgetPassword": "Forget Password", 8 | "sendingCode": "SMS Code is sending...", 9 | "codeSentTo": "Code has been sent to {0}" 10 | }, 11 | "dashboard": { 12 | "title": "Dashboard", 13 | "analytics": "Analytics", 14 | "workspace": "Workspace" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /playground/src/locales/langs/zh-CN/page.json: -------------------------------------------------------------------------------- 1 | { 2 | "auth": { 3 | "login": "登录", 4 | "register": "注册", 5 | "codeLogin": "验证码登录", 6 | "qrcodeLogin": "二维码登录", 7 | "forgetPassword": "忘记密码", 8 | "sendingCode": "正在发送验证码", 9 | "codeSentTo": "验证码已发送至{0}" 10 | }, 11 | "dashboard": { 12 | "title": "概览", 13 | "analytics": "分析页", 14 | "workspace": "工作台" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /playground/src/preferences.ts: -------------------------------------------------------------------------------- 1 | import { defineOverridesPreferences } from '@vben/preferences'; 2 | 3 | /** 4 | * @description 项目配置文件 5 | * 只需要覆盖项目中的一部分配置,不需要的配置不用覆盖,会自动使用默认配置 6 | * !!! 更改配置后请清空缓存,否则可能不生效 7 | */ 8 | export const overridesPreferences = defineOverridesPreferences({ 9 | // overrides 10 | app: { 11 | name: import.meta.env.VITE_APP_TITLE, 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /playground/src/store/index.ts: -------------------------------------------------------------------------------- 1 | export * from './auth'; 2 | -------------------------------------------------------------------------------- /playground/src/views/_core/README.md: -------------------------------------------------------------------------------- 1 | # \_core 2 | 3 | 此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。 4 | -------------------------------------------------------------------------------- /playground/src/views/_core/about/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/authentication/qrcode-login.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/coming-soon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/forbidden.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/internal-error.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/not-found.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/offline.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/admin-visible.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/menu-visible-403.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/super-visible.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/user-visible.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/active-icon/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/breadcrumb/lateral-detail.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /playground/src/views/demos/breadcrumb/level-detail.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/features/hide-menu-children/parent.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | -------------------------------------------------------------------------------- /playground/src/views/demos/features/menu-query/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/features/new-window/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/features/vue-query/typing.ts: -------------------------------------------------------------------------------- 1 | export interface IProducts { 2 | limit: number; 3 | products: { 4 | brand: string; 5 | category: string; 6 | description: string; 7 | discountPercentage: string; 8 | id: string; 9 | images: string[]; 10 | price: string; 11 | rating: string; 12 | stock: string; 13 | thumbnail: string; 14 | title: string; 15 | }[]; 16 | skip: number; 17 | total: number; 18 | } 19 | -------------------------------------------------------------------------------- /playground/src/views/demos/nested/menu-1.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/demos/nested/menu-2-1.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/demos/nested/menu-3-1.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/demos/nested/menu-3-2-1.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/examples/modal/drag-demo.vue: -------------------------------------------------------------------------------- 1 | 17 | 20 | -------------------------------------------------------------------------------- /playground/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | export { default } from '@vben/tailwind-config'; 2 | -------------------------------------------------------------------------------- /playground/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/web-app.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "#/*": ["./src/*"] 8 | } 9 | }, 10 | "references": [{ "path": "./tsconfig.node.json" }], 11 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] 12 | } 13 | -------------------------------------------------------------------------------- /playground/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "compilerOptions": { 5 | "composite": true, 6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 7 | "noEmit": false 8 | }, 9 | "include": ["vite.config.mts"] 10 | } 11 | -------------------------------------------------------------------------------- /playground/vite.config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@vben/vite-config'; 2 | 3 | export default defineConfig(async () => { 4 | return { 5 | application: {}, 6 | vite: { 7 | server: { 8 | proxy: { 9 | '/api': { 10 | changeOrigin: true, 11 | rewrite: (path) => path.replace(/^\/api/, ''), 12 | // mock代理目标地址 13 | target: 'http://localhost:5320/api', 14 | ws: true, 15 | }, 16 | }, 17 | }, 18 | }, 19 | }; 20 | }); 21 | -------------------------------------------------------------------------------- /scripts/preview/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/1.png -------------------------------------------------------------------------------- /scripts/preview/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/2.png -------------------------------------------------------------------------------- /scripts/preview/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/3.png -------------------------------------------------------------------------------- /scripts/preview/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/4.png -------------------------------------------------------------------------------- /scripts/preview/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/5.png -------------------------------------------------------------------------------- /scripts/preview/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/6.png -------------------------------------------------------------------------------- /scripts/preview/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/7.png -------------------------------------------------------------------------------- /scripts/preview/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/8.png -------------------------------------------------------------------------------- /scripts/preview/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/9.png -------------------------------------------------------------------------------- /scripts/turbo-run/README.md: -------------------------------------------------------------------------------- 1 | # @vben/turbo-run 2 | 3 | turbo-run is a command line tool that allows you to run multiple commands in parallel. 4 | -------------------------------------------------------------------------------- /scripts/turbo-run/bin/turbo-run.mjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import('../dist/index.mjs'); 4 | -------------------------------------------------------------------------------- /scripts/turbo-run/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /scripts/turbo-run/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /scripts/vsh/README.md: -------------------------------------------------------------------------------- 1 | # @vben/vsh 2 | 3 | shell 脚本工具集合 4 | -------------------------------------------------------------------------------- /scripts/vsh/bin/vsh.mjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import('../dist/index.mjs'); 4 | -------------------------------------------------------------------------------- /scripts/vsh/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild'; 2 | 3 | export default defineBuildConfig({ 4 | clean: true, 5 | declaration: true, 6 | entries: ['src/index'], 7 | }); 8 | -------------------------------------------------------------------------------- /scripts/vsh/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@vben/tsconfig/node.json", 4 | "include": ["src"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /stylelint.config.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | extends: ['@vben/stylelint-config'], 3 | root: true, 4 | }; 5 | -------------------------------------------------------------------------------- /tea.yaml: -------------------------------------------------------------------------------- 1 | # https://tea.xyz/what-is-this-file 2 | --- 3 | version: 1.0.0 4 | codeOwners: 5 | - '0xB33cc732DFc15Cd39eF50Fb165c876E24417E48f' 6 | quorum: 1 7 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import Vue from '@vitejs/plugin-vue'; 2 | import VueJsx from '@vitejs/plugin-vue-jsx'; 3 | import { configDefaults, defineConfig } from 'vitest/config'; 4 | 5 | export default defineConfig({ 6 | plugins: [Vue(), VueJsx()], 7 | test: { 8 | environment: 'happy-dom', 9 | exclude: [...configDefaults.exclude, '**/e2e/**'], 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /vitest.workspace.ts: -------------------------------------------------------------------------------- 1 | import { defineWorkspace } from 'vitest/config'; 2 | 3 | export default defineWorkspace(['vitest.config.ts']); 4 | --------------------------------------------------------------------------------