gitextract_2zakr5hl/ ├── .github/ │ └── workflows/ │ └── deploy.yml ├── .gitignore ├── LICENSE ├── README.md ├── cicd/ │ ├── Dockerfile │ ├── Jenkinsfile │ ├── hiauth.properties │ └── nginx.conf ├── docs/ │ ├── .postcssrc.json │ ├── .vitepress/ │ │ ├── config/ │ │ │ ├── en.ts │ │ │ ├── index.ts │ │ │ ├── shared.ts │ │ │ └── zh.ts │ │ └── theme/ │ │ ├── index.ts │ │ └── styles.css │ ├── en/ │ │ ├── guide/ │ │ │ ├── about-topic.md │ │ │ ├── backend.md │ │ │ ├── docker.md │ │ │ ├── frontend.md │ │ │ ├── hiauth-client.md │ │ │ ├── issue.md │ │ │ ├── k8s.md │ │ │ ├── quick-start.md │ │ │ ├── saas.md │ │ │ ├── sourcecode.md │ │ │ ├── test.md │ │ │ └── what-is-hiauth.md │ │ └── index.md │ ├── lunaria.config.json │ ├── package.json │ ├── public/ │ │ ├── hiauth-logo-large.psd │ │ └── pure.html │ └── zh/ │ ├── guide/ │ │ ├── about-topic.md │ │ ├── backend.md │ │ ├── docker.md │ │ ├── frontend.md │ │ ├── hiauth-client.md │ │ ├── issue.md │ │ ├── k8s.md │ │ ├── quick-start.md │ │ ├── saas.md │ │ ├── sourcecode.md │ │ ├── test.md │ │ └── what-is-hiauth.md │ └── index.md ├── example/ │ ├── demo/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── demo/ │ │ │ ├── DemoApplication.java │ │ │ └── IndexController.java │ │ └── resources/ │ │ └── application.yml │ ├── hiauth-client/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── hiauthclient/ │ │ │ ├── HiauthClientStarter.java │ │ │ ├── config/ │ │ │ │ └── WebMvcConfig.java │ │ │ └── controller/ │ │ │ ├── ApiController.java │ │ │ └── IndexController.java │ │ └── resources/ │ │ ├── application.yml │ │ ├── logback.xml │ │ ├── static/ │ │ │ └── css/ │ │ │ └── index.css │ │ └── templates/ │ │ ├── demo.html │ │ ├── index.html │ │ └── profile.html │ ├── hiauth-client-exp/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── client/ │ │ │ ├── ClientStarter.java │ │ │ ├── config/ │ │ │ │ ├── BeanConfig.java │ │ │ │ ├── SecurityConfig.java │ │ │ │ └── WebMvcConfig.java │ │ │ └── controller/ │ │ │ └── ClientController.java │ │ └── resources/ │ │ ├── application.yml │ │ ├── logback.xml │ │ └── templates/ │ │ └── index.html │ ├── hiauth-server-exp/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── server/ │ │ │ ├── ServerStarter.java │ │ │ ├── config/ │ │ │ │ ├── AuthServerConfig.java │ │ │ │ ├── BeanConfig.java │ │ │ │ ├── SecurityConfig.java │ │ │ │ └── WebMvcConfig.java │ │ │ ├── controller/ │ │ │ │ ├── IndexController.java │ │ │ │ └── LoginController.java │ │ │ ├── federation/ │ │ │ │ ├── FederatedIdentityAuthenticationSuccessHandler.java │ │ │ │ └── FederatedIdentityIdTokenCustomizer.java │ │ │ ├── mapper/ │ │ │ │ └── SimpleJdbcRegisteredClientRepository.java │ │ │ └── utils/ │ │ │ ├── jose/ │ │ │ │ ├── Jwks.java │ │ │ │ └── KeyGeneratorUtils.java │ │ │ └── package-info.java │ │ └── resources/ │ │ ├── application-hiauth.yml │ │ ├── application-redis.yml │ │ ├── application.yml │ │ ├── logback.xml │ │ └── templates/ │ │ └── index.html │ ├── himall/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── himall/ │ │ │ ├── HiMallStarter.java │ │ │ ├── config/ │ │ │ │ ├── SecurityConfig.java │ │ │ │ └── WebMvcConfig.java │ │ │ └── controller/ │ │ │ ├── AuthController.java │ │ │ └── IndexController.java │ │ └── resources/ │ │ ├── application.yml │ │ ├── logback.xml │ │ ├── static/ │ │ │ └── css/ │ │ │ └── index.css │ │ └── templates/ │ │ ├── demo.html │ │ ├── index.html │ │ └── profile.html │ ├── resource/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── resource/ │ │ │ ├── ResourceStarter.java │ │ │ ├── config/ │ │ │ │ ├── ResourceServerConfig.java │ │ │ │ └── auth/ │ │ │ │ ├── SimpleAccessDeniedHandler.java │ │ │ │ └── SimpleAuthenticationEntryPoint.java │ │ │ ├── controller/ │ │ │ │ ├── IndexController.java │ │ │ │ ├── ProfileController.java │ │ │ │ ├── UnpapiController.java │ │ │ │ └── UserController.java │ │ │ └── utils/ │ │ │ └── ResponseTools.java │ │ └── resources/ │ │ ├── application.yml │ │ └── logback.xml │ ├── spring-cloud/ │ │ ├── README.md │ │ ├── gateway/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── hiauth/ │ │ │ │ └── gateway/ │ │ │ │ ├── ApiController.java │ │ │ │ ├── GatewayStarter.java │ │ │ │ ├── IndexController.java │ │ │ │ └── SecurityConfig.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── logback.xml │ │ ├── ordersvc/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── hiauth/ │ │ │ │ └── gateway/ │ │ │ │ ├── IndexController.java │ │ │ │ └── OrderStarter.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── logback.xml │ │ └── pom.xml │ ├── spring-cloud-with-hiauth-client/ │ │ ├── README.md │ │ ├── gateway1/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── hiauth/ │ │ │ │ └── gateway/ │ │ │ │ ├── ApiController.java │ │ │ │ ├── GatewayStarter.java │ │ │ │ └── IndexController.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── logback.xml │ │ ├── ordersvc1/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── hiauth/ │ │ │ │ └── gateway/ │ │ │ │ ├── IndexController.java │ │ │ │ └── OrderStarter.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── logback.xml │ │ └── pom.xml │ └── wechat-login/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── cn/ │ │ └── hiauth/ │ │ └── wechatlogin/ │ │ ├── WechatLoginStarter.java │ │ ├── config/ │ │ │ ├── SecurityConfig.java │ │ │ ├── WebMvcConfig.java │ │ │ └── web/ │ │ │ ├── auth/ │ │ │ │ └── package-info.java │ │ │ └── security/ │ │ │ ├── phone/ │ │ │ │ ├── SmsCodeAuthenticationFilter.java │ │ │ │ ├── SmsCodeAuthenticationProvider.java │ │ │ │ └── SmsCodeAuthenticationToken.java │ │ │ └── wechat/ │ │ │ ├── QrCodeAuthenticationFilter.java │ │ │ ├── QrCodeAuthenticationProvider.java │ │ │ └── QrCodeAuthenticationToken.java │ │ ├── controller/ │ │ │ ├── AuthController.java │ │ │ └── IndexController.java │ │ ├── entity/ │ │ │ └── CustomUserDetails.java │ │ └── service/ │ │ └── CustomUserDetailsService.java │ └── resources/ │ ├── application.yml │ ├── logback.xml │ └── templates/ │ ├── home.html │ ├── index.html │ └── login.html ├── hiauth-client-starter/ │ ├── hiauth-client-commons/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── hiauth/ │ │ └── client/ │ │ ├── Authentication.java │ │ ├── Client.java │ │ ├── Constant.java │ │ ├── HiAuthToken.java │ │ ├── JwtUtils.java │ │ ├── SecurityCorp.java │ │ ├── SecurityService.java │ │ ├── SecurityUser.java │ │ ├── SessionContext.java │ │ ├── SessionContextHolder.java │ │ ├── TokenVo.java │ │ └── UserinfoVo.java │ ├── hiauth-client-resource-spring-boot-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── client/ │ │ │ └── resource/ │ │ │ ├── HiAuthClientResourceAutoConfig.java │ │ │ └── HiAuthClientResourceProperties.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring-configuration-metadata.json │ │ └── spring.factories │ ├── hiauth-client-session-spring-boot-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── client/ │ │ │ └── session/ │ │ │ ├── AuthFilter.java │ │ │ ├── HiAuthClientSessionAutoConfig.java │ │ │ ├── HiAuthClientSessionCacheConfig.java │ │ │ ├── HiAuthClientSessionController.java │ │ │ ├── HiAuthClientSessionProperties.java │ │ │ └── HiAuthClientSessionRunner.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring-configuration-metadata.json │ │ └── spring.factories │ ├── hiauth-client-spring-boot-starter/ │ │ ├── docs/ │ │ │ └── apisvc-oms.yml │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── client/ │ │ │ ├── AuthFilter.java │ │ │ ├── HiAuthCacheConfig.java │ │ │ ├── HiAuthClientAutoConfig.java │ │ │ ├── HiAuthClientController.java │ │ │ ├── HiAuthClientProperties.java │ │ │ ├── HiAuthClientProviderProperties.java │ │ │ ├── HiAuthClientRegistrationProperties.java │ │ │ ├── HiAuthClientRunner.java │ │ │ └── api/ │ │ │ ├── TokenVo.java │ │ │ └── UserPwdUpdateDto.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring-configuration-metadata.json │ │ └── spring.factories │ ├── hiauth-client-spring-cloud-gateway-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── client/ │ │ │ └── gateway/ │ │ │ ├── AuthGatewayFilterFactory.java │ │ │ ├── HiAuthClientGatewayAutoConfig.java │ │ │ ├── HiAuthClientGatewayController.java │ │ │ ├── HiAuthClientGatewayProperties.java │ │ │ ├── HiAuthClientGatewayRunner.java │ │ │ └── UserPwdUpdateDto.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring-configuration-metadata.json │ │ └── spring.factories │ └── pom.xml ├── hiauth-front/ │ ├── .browserslistrc │ ├── .changeset/ │ │ ├── README.md │ │ └── config.json │ ├── .commitlintrc.js │ ├── .dockerignore │ ├── .editorconfig │ ├── .gitattributes │ ├── .gitconfig │ ├── .gitignore │ ├── .gitpod.yml │ ├── .node-version │ ├── .npmrc │ ├── .prettierignore │ ├── .prettierrc.mjs │ ├── .stylelintignore │ ├── Dockerfile │ ├── LICENSE │ ├── README.ja-JP.md │ ├── README.md │ ├── README.zh-CN.md │ ├── apps/ │ │ ├── backend-mock/ │ │ │ ├── README.md │ │ │ ├── api/ │ │ │ │ ├── auth/ │ │ │ │ │ ├── codes.ts │ │ │ │ │ ├── login.post.ts │ │ │ │ │ ├── logout.post.ts │ │ │ │ │ └── refresh.post.ts │ │ │ │ ├── demo/ │ │ │ │ │ └── bigint.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 │ │ │ │ ├── upload.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/ │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── postcss.config.mjs │ │ │ ├── src/ │ │ │ │ ├── adapter/ │ │ │ │ │ ├── component/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── form.ts │ │ │ │ │ └── vxe-table.ts │ │ │ │ ├── api/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── auth.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── menu.ts │ │ │ │ │ │ └── user.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── request.ts │ │ │ │ ├── app.vue │ │ │ │ ├── bootstrap.ts │ │ │ │ ├── layouts/ │ │ │ │ │ ├── auth.vue │ │ │ │ │ ├── basic.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── locales/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── index.ts │ │ │ │ │ └── langs/ │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ ├── demos.json │ │ │ │ │ │ └── page.json │ │ │ │ │ └── zh-CN/ │ │ │ │ │ ├── demos.json │ │ │ │ │ └── page.json │ │ │ │ ├── main.ts │ │ │ │ ├── preferences.ts │ │ │ │ ├── router/ │ │ │ │ │ ├── access.ts │ │ │ │ │ ├── guard.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── routes/ │ │ │ │ │ ├── core.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── modules/ │ │ │ │ │ ├── dashboard.ts │ │ │ │ │ ├── demos.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/ │ │ │ │ └── antd/ │ │ │ │ └── index.vue │ │ │ ├── tailwind.config.mjs │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.mts │ │ ├── web-auth/ │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── postcss.config.mjs │ │ │ ├── src/ │ │ │ │ ├── adapter/ │ │ │ │ │ ├── component/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── form.ts │ │ │ │ │ └── vxe-table.ts │ │ │ │ ├── api/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── app.ts │ │ │ │ │ │ ├── appClient.ts │ │ │ │ │ │ ├── appResource.ts │ │ │ │ │ │ ├── auth.ts │ │ │ │ │ │ ├── common.ts │ │ │ │ │ │ ├── corp.ts │ │ │ │ │ │ ├── dep.ts │ │ │ │ │ │ ├── dict.ts │ │ │ │ │ │ ├── emp.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── menu.ts │ │ │ │ │ │ ├── role.ts │ │ │ │ │ │ └── user.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── request.ts │ │ │ │ ├── app.vue │ │ │ │ ├── bootstrap.ts │ │ │ │ ├── common/ │ │ │ │ │ ├── config.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── layouts/ │ │ │ │ │ ├── auth.vue │ │ │ │ │ ├── basic.vue │ │ │ │ │ ├── change-corp.vue │ │ │ │ │ ├── go-admin-space-button.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── locales/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── index.ts │ │ │ │ │ └── langs/ │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ ├── demos.json │ │ │ │ │ │ └── page.json │ │ │ │ │ └── zh-CN/ │ │ │ │ │ ├── demos.json │ │ │ │ │ └── page.json │ │ │ │ ├── main.ts │ │ │ │ ├── preferences.ts │ │ │ │ ├── router/ │ │ │ │ │ ├── access.ts │ │ │ │ │ ├── guard.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── routes/ │ │ │ │ │ ├── core.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── modules/ │ │ │ │ │ ├── adminSpace.ts │ │ │ │ │ ├── common.ts │ │ │ │ │ ├── corpSpace.ts │ │ │ │ │ └── dashboard.ts │ │ │ │ ├── store/ │ │ │ │ │ ├── auth.ts │ │ │ │ │ ├── content.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── utils/ │ │ │ │ │ └── rsa.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 │ │ │ │ ├── adminSpace/ │ │ │ │ │ ├── corpMgr/ │ │ │ │ │ │ ├── corp-drawer.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ └── userMgr/ │ │ │ │ │ ├── index.vue │ │ │ │ │ └── user-drawer.vue │ │ │ │ ├── common/ │ │ │ │ │ ├── appMgr/ │ │ │ │ │ │ ├── app-drawer.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ └── appResourceMgr/ │ │ │ │ │ ├── app-resource-drawer.vue │ │ │ │ │ └── index.vue │ │ │ │ ├── corpSpace/ │ │ │ │ │ ├── appClientMgr/ │ │ │ │ │ │ ├── app-client-add-modal.vue │ │ │ │ │ │ ├── app-client-drawer.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── depMgr/ │ │ │ │ │ │ ├── dep-drawer.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── empMgr/ │ │ │ │ │ │ ├── emp-drawer.vue │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── roleMgr/ │ │ │ │ │ │ ├── auth-modal.vue │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ └── role-drawer.vue │ │ │ │ │ └── sysMgr/ │ │ │ │ │ └── dictMgr/ │ │ │ │ │ ├── dict-drawer.vue │ │ │ │ │ └── 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 │ │ │ │ └── demos/ │ │ │ │ └── antd/ │ │ │ │ └── index.vue │ │ │ ├── tailwind.config.mjs │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.mts │ │ ├── web-ele/ │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── postcss.config.mjs │ │ │ ├── src/ │ │ │ │ ├── adapter/ │ │ │ │ │ ├── component/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── form.ts │ │ │ │ │ └── vxe-table.ts │ │ │ │ ├── api/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── auth.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── menu.ts │ │ │ │ │ │ └── user.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── request.ts │ │ │ │ ├── app.vue │ │ │ │ ├── bootstrap.ts │ │ │ │ ├── layouts/ │ │ │ │ │ ├── auth.vue │ │ │ │ │ ├── basic.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── locales/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── index.ts │ │ │ │ │ └── langs/ │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ ├── demos.json │ │ │ │ │ │ └── page.json │ │ │ │ │ └── zh-CN/ │ │ │ │ │ ├── demos.json │ │ │ │ │ └── page.json │ │ │ │ ├── main.ts │ │ │ │ ├── preferences.ts │ │ │ │ ├── router/ │ │ │ │ │ ├── access.ts │ │ │ │ │ ├── guard.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── routes/ │ │ │ │ │ ├── core.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── modules/ │ │ │ │ │ ├── dashboard.ts │ │ │ │ │ ├── demos.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/ │ │ │ │ ├── element/ │ │ │ │ │ └── index.vue │ │ │ │ └── form/ │ │ │ │ └── basic.vue │ │ │ ├── tailwind.config.mjs │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.mts │ │ └── web-naive/ │ │ ├── index.html │ │ ├── package.json │ │ ├── postcss.config.mjs │ │ ├── src/ │ │ │ ├── adapter/ │ │ │ │ ├── component/ │ │ │ │ │ └── index.ts │ │ │ │ ├── form.ts │ │ │ │ ├── naive.ts │ │ │ │ └── vxe-table.ts │ │ │ ├── api/ │ │ │ │ ├── core/ │ │ │ │ │ ├── auth.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── menu.ts │ │ │ │ │ └── user.ts │ │ │ │ ├── index.ts │ │ │ │ └── request.ts │ │ │ ├── app.vue │ │ │ ├── bootstrap.ts │ │ │ ├── layouts/ │ │ │ │ ├── auth.vue │ │ │ │ ├── basic.vue │ │ │ │ └── index.ts │ │ │ ├── locales/ │ │ │ │ ├── README.md │ │ │ │ ├── index.ts │ │ │ │ └── langs/ │ │ │ │ ├── en-US/ │ │ │ │ │ ├── demos.json │ │ │ │ │ └── page.json │ │ │ │ └── zh-CN/ │ │ │ │ ├── demos.json │ │ │ │ └── page.json │ │ │ ├── main.ts │ │ │ ├── preferences.ts │ │ │ ├── router/ │ │ │ │ ├── access.ts │ │ │ │ ├── guard.ts │ │ │ │ ├── index.ts │ │ │ │ └── routes/ │ │ │ │ ├── core.ts │ │ │ │ ├── index.ts │ │ │ │ └── modules/ │ │ │ │ ├── dashboard.ts │ │ │ │ ├── demos.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/ │ │ │ ├── form/ │ │ │ │ ├── basic.vue │ │ │ │ └── modal.vue │ │ │ ├── naive/ │ │ │ │ └── index.vue │ │ │ └── table/ │ │ │ └── index.vue │ │ ├── tailwind.config.mjs │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.mts │ ├── changlist.txt │ ├── cspell.json │ ├── deploy.yaml │ ├── 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-alert.md │ │ │ │ │ ├── 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-alert/ │ │ │ │ │ ├── alert/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── confirm/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ └── prompt/ │ │ │ │ │ └── index.vue │ │ │ │ ├── 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/ │ │ │ │ │ ├── auto-display/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── 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/ │ │ │ │ │ ├── animation-type/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── 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 │ │ │ └── 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/ │ │ │ │ │ │ │ ├── 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 │ │ │ │ │ │ │ ├── resources.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 │ │ │ │ │ │ ├── resources.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-scroll.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/ │ │ │ │ │ ├── alert/ │ │ │ │ │ │ ├── AlertBuilder.ts │ │ │ │ │ │ ├── alert.ts │ │ │ │ │ │ ├── alert.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── 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-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 │ │ │ │ │ ├── alert-dialog/ │ │ │ │ │ │ ├── AlertDialog.vue │ │ │ │ │ │ ├── AlertDialogAction.vue │ │ │ │ │ │ ├── AlertDialogCancel.vue │ │ │ │ │ │ ├── AlertDialogContent.vue │ │ │ │ │ │ ├── AlertDialogDescription.vue │ │ │ │ │ │ ├── AlertDialogOverlay.vue │ │ │ │ │ │ ├── AlertDialogTitle.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/ │ │ │ │ │ │ ├── Toggle.vue │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── toggle.ts │ │ │ │ │ ├── toggle-group/ │ │ │ │ │ │ ├── ToggleGroup.vue │ │ │ │ │ │ ├── ToggleGroupItem.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── tooltip/ │ │ │ │ │ │ ├── Tooltip.vue │ │ │ │ │ │ ├── TooltipContent.vue │ │ │ │ │ │ ├── TooltipProvider.vue │ │ │ │ │ │ ├── TooltipTrigger.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── tree/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── tree.vue │ │ │ │ │ └── types.ts │ │ │ │ ├── tailwind.config.mjs │ │ │ │ └── tsconfig.json │ │ │ └── tabs-ui/ │ │ │ ├── build.config.ts │ │ │ ├── package.json │ │ │ ├── postcss.config.mjs │ │ │ ├── src/ │ │ │ │ ├── components/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── tabs/ │ │ │ │ │ │ └── tabs.vue │ │ │ │ │ ├── tabs-chrome/ │ │ │ │ │ │ └── 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 │ │ │ │ │ │ │ ├── slider-translate-captcha/ │ │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ │ └── types.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-viewer/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ ├── style.scss │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── loading/ │ │ │ │ │ │ │ ├── directive.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── loading.vue │ │ │ │ │ │ │ └── spinner.vue │ │ │ │ │ │ ├── page/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── page.test.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── page.vue │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── resize/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── resize.vue │ │ │ │ │ │ ├── tippy/ │ │ │ │ │ │ │ ├── directive.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── tree/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── tree.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ └── ui/ │ │ │ │ │ ├── about/ │ │ │ │ │ │ ├── about.ts │ │ │ │ │ │ ├── about.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── authentication/ │ │ │ │ │ │ ├── auth-title.vue │ │ │ │ │ │ ├── code-login.vue │ │ │ │ │ │ ├── dingding-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 │ │ │ │ │ │ └── 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 │ │ │ │ │ │ │ ├── checkbox-item.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 │ │ │ │ │ ├── sse.test.ts │ │ │ │ │ ├── sse.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/ │ │ │ │ │ └── index.ts │ │ │ │ ├── icons/ │ │ │ │ │ └── empty-icon.vue │ │ │ │ ├── index.ts │ │ │ │ └── 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 │ │ │ │ │ ├── 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__/ │ │ │ │ │ ├── find-menu-by-path.test.ts │ │ │ │ │ ├── generate-menus.test.ts │ │ │ │ │ ├── generate-routes-frontend.test.ts │ │ │ │ │ └── merge-route-modules.test.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 │ │ │ │ ├── reset-routes.ts │ │ │ │ └── unmount-global-loading.ts │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── playground/ │ │ ├── __tests__/ │ │ │ └── e2e/ │ │ │ ├── auth-login.spec.ts │ │ │ └── common/ │ │ │ └── auth.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── postcss.config.mjs │ │ ├── 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 │ │ │ │ │ ├── json-bigint.ts │ │ │ │ │ ├── params.ts │ │ │ │ │ ├── status.ts │ │ │ │ │ ├── table.ts │ │ │ │ │ └── upload.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 │ │ │ │ │ ├── json-bigint/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── login-expired/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── menu-query/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── new-window/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── request-params-serializer/ │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── tabs/ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ └── tab-detail.vue │ │ │ │ │ ├── vue-query/ │ │ │ │ │ │ ├── concurrency-caching.vue │ │ │ │ │ │ ├── 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 │ │ │ │ │ └── slider-translate-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 │ │ │ │ │ └── scroll-to-error-test.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-workspace.yaml │ ├── scripts/ │ │ ├── clean.mjs │ │ ├── deploy/ │ │ │ ├── Dockerfile │ │ │ ├── build-local-docker-image.sh │ │ │ └── nginx.conf │ │ ├── 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 │ ├── stylelint.config.mjs │ ├── tea.yaml │ ├── turbo.json │ ├── vben-admin.code-workspace │ ├── vitest.config.ts │ └── vitest.workspace.ts ├── hiauth-server/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── hiauth/ │ │ │ └── server/ │ │ │ ├── ServerStarter.java │ │ │ ├── api/ │ │ │ │ ├── dto/ │ │ │ │ │ ├── KeywordPageUserDto.java │ │ │ │ │ ├── PageDepDto.java │ │ │ │ │ ├── PageEmpDto.java │ │ │ │ │ ├── PageRoleDto.java │ │ │ │ │ ├── RegisterDto.java │ │ │ │ │ ├── app/ │ │ │ │ │ │ ├── AppCreateDto.java │ │ │ │ │ │ ├── AppLimitDto.java │ │ │ │ │ │ ├── AppPageDto.java │ │ │ │ │ │ └── AppUpdateDto.java │ │ │ │ │ ├── appClient/ │ │ │ │ │ │ ├── AppClientCreateDto.java │ │ │ │ │ │ ├── AppClientDeleteDto.java │ │ │ │ │ │ ├── AppClientLimitDto.java │ │ │ │ │ │ ├── AppClientPageDto.java │ │ │ │ │ │ └── AppClientUpdateDto.java │ │ │ │ │ ├── appResource/ │ │ │ │ │ │ ├── AppResourceCreateDto.java │ │ │ │ │ │ ├── AppResourcePageDto.java │ │ │ │ │ │ ├── AppResourceUpdateDto.java │ │ │ │ │ │ └── FindAppResourceIdsByRoleAndAppDto.java │ │ │ │ │ ├── corp/ │ │ │ │ │ │ ├── CorpCreateDto.java │ │ │ │ │ │ ├── CorpPageDto.java │ │ │ │ │ │ └── CorpUpdateDto.java │ │ │ │ │ ├── dep/ │ │ │ │ │ │ ├── DepCreateDto.java │ │ │ │ │ │ ├── DepLimitDto.java │ │ │ │ │ │ ├── DepPageDto.java │ │ │ │ │ │ └── DepUpdateDto.java │ │ │ │ │ ├── dict/ │ │ │ │ │ │ ├── DictCreateDto.java │ │ │ │ │ │ ├── DictLimitDto.java │ │ │ │ │ │ ├── DictPageDto.java │ │ │ │ │ │ └── DictUpdateDto.java │ │ │ │ │ ├── emp/ │ │ │ │ │ │ ├── EmpCreateDto.java │ │ │ │ │ │ ├── EmpPageDto.java │ │ │ │ │ │ └── EmpUpdateDto.java │ │ │ │ │ ├── login/ │ │ │ │ │ │ ├── CaptchaVerifyDto.java │ │ │ │ │ │ ├── SmsCodeDto.java │ │ │ │ │ │ └── SmsCodeLoginDto.java │ │ │ │ │ ├── role/ │ │ │ │ │ │ ├── RoleAuthDto.java │ │ │ │ │ │ ├── RoleCreateDto.java │ │ │ │ │ │ ├── RoleLimitDto.java │ │ │ │ │ │ ├── RolePageDto.java │ │ │ │ │ │ └── RoleUpdateDto.java │ │ │ │ │ └── user/ │ │ │ │ │ ├── UserCreateDto.java │ │ │ │ │ ├── UserLimitDto.java │ │ │ │ │ ├── UserPageDto.java │ │ │ │ │ ├── UserPwdUpdateDto.java │ │ │ │ │ └── UserUpdateDto.java │ │ │ │ └── vo/ │ │ │ │ ├── CommonTreeNodeVo.java │ │ │ │ ├── CorpAppVo.java │ │ │ │ ├── CorpResourceTreeNodeVo.java │ │ │ │ ├── CorpVo.java │ │ │ │ ├── CurrentLoginUserVo.java │ │ │ │ ├── EmpVo.java │ │ │ │ ├── IndexCorpAppVo.java │ │ │ │ ├── SysMenuVo.java │ │ │ │ └── UserVo.java │ │ │ ├── config/ │ │ │ │ ├── AuthServerConfig.java │ │ │ │ ├── BeanConfig.java │ │ │ │ ├── DocConfig.java │ │ │ │ ├── SecurityConfig.java │ │ │ │ ├── WebMvcConfig.java │ │ │ │ ├── props/ │ │ │ │ │ ├── AppProperties.java │ │ │ │ │ └── WechatProperties.java │ │ │ │ ├── rest/ │ │ │ │ │ ├── ApiExceptionAdvice.java │ │ │ │ │ ├── ResourceAccessDeniedHandler.java │ │ │ │ │ ├── ResourceApi.java │ │ │ │ │ ├── ResourceAuthenticationEntryPoint.java │ │ │ │ │ └── security/ │ │ │ │ │ ├── ApiFilter.java │ │ │ │ │ ├── MySecurityUser.java │ │ │ │ │ └── ReadonlyFilter.java │ │ │ │ └── web/ │ │ │ │ ├── auth/ │ │ │ │ │ ├── AuthFailureHandler.java │ │ │ │ │ ├── AuthGrantedAuthority.java │ │ │ │ │ ├── AuthGrantedAuthorityDeserializer.java │ │ │ │ │ ├── AuthGrantedAuthorityMixin.java │ │ │ │ │ ├── AuthUser.java │ │ │ │ │ ├── AuthUserDeserializer.java │ │ │ │ │ ├── AuthUserMixin.java │ │ │ │ │ ├── CustomAuthUserAttrs.java │ │ │ │ │ ├── CustomAuthorizationResponseHandler.java │ │ │ │ │ ├── CustomJdbcRegisteredClientRepository.java │ │ │ │ │ ├── CustomOidcUserInfoMapper.java │ │ │ │ │ └── FederatedIdentityIdTokenCustomizer.java │ │ │ │ └── security/ │ │ │ │ ├── CaptchaFilter.java │ │ │ │ ├── CustomAuthenticationFailureHandler.java │ │ │ │ ├── CustomAuthenticationSuccessHandler.java │ │ │ │ ├── CustomLoginUrlAuthenticationEntryPoint.java │ │ │ │ ├── MultiAppHttpSessionRequestCache.java │ │ │ │ ├── MultiAuthUserService.java │ │ │ │ ├── MultiAuthenticationProvider.java │ │ │ │ ├── account/ │ │ │ │ │ ├── AccountAuthenticationFilter.java │ │ │ │ │ ├── AccountAuthenticationProvider.java │ │ │ │ │ └── AccountAuthenticationToken.java │ │ │ │ ├── phone/ │ │ │ │ │ ├── SmsCodeAuthenticationFilter.java │ │ │ │ │ ├── SmsCodeAuthenticationProvider.java │ │ │ │ │ └── SmsCodeAuthenticationToken.java │ │ │ │ └── wechat/ │ │ │ │ ├── QrCodeAuthenticationFilter.java │ │ │ │ ├── QrCodeAuthenticationProvider.java │ │ │ │ └── QrCodeAuthenticationToken.java │ │ │ ├── controller/ │ │ │ │ ├── AuthConsentController.java │ │ │ │ ├── IndexController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── OauthController.java │ │ │ │ ├── TestController.java │ │ │ │ ├── UnpController.java │ │ │ │ ├── adminspace/ │ │ │ │ │ ├── CorpMgrController.java │ │ │ │ │ └── UserMgrController.java │ │ │ │ ├── common/ │ │ │ │ │ ├── AppMgrController.java │ │ │ │ │ ├── AppResourceMgrController.java │ │ │ │ │ └── CommonController.java │ │ │ │ └── corpspace/ │ │ │ │ ├── AppClientMgrController.java │ │ │ │ ├── DepMgrController.java │ │ │ │ ├── DictMgrController.java │ │ │ │ ├── EmpMgrController.java │ │ │ │ └── RoleMgrController.java │ │ │ ├── entity/ │ │ │ │ ├── App.java │ │ │ │ ├── AppResource.java │ │ │ │ ├── AuthorizationConsent.java │ │ │ │ ├── Corp.java │ │ │ │ ├── CorpApp.java │ │ │ │ ├── CorpAppInfo.java │ │ │ │ ├── Department.java │ │ │ │ ├── Dict.java │ │ │ │ ├── Employee.java │ │ │ │ ├── File.java │ │ │ │ ├── Oauth2Authorization.java │ │ │ │ ├── Oauth2AuthorizationConsent.java │ │ │ │ ├── Oauth2RegisteredClient.java │ │ │ │ ├── Role.java │ │ │ │ ├── RoleAppResource.java │ │ │ │ ├── SysLog.java │ │ │ │ └── User.java │ │ │ ├── mapper/ │ │ │ │ ├── AppMapper.java │ │ │ │ ├── AppResourceMapper.java │ │ │ │ ├── CorpAppMapper.java │ │ │ │ ├── CorpMapper.java │ │ │ │ ├── DepartmentMapper.java │ │ │ │ ├── DictMapper.java │ │ │ │ ├── EmployeeMapper.java │ │ │ │ ├── FileMapper.java │ │ │ │ ├── Oauth2AuthorizationConsentMapper.java │ │ │ │ ├── Oauth2AuthorizationMapper.java │ │ │ │ ├── Oauth2RegisteredClientMapper.java │ │ │ │ ├── RoleAppResourceMapper.java │ │ │ │ ├── RoleMapper.java │ │ │ │ ├── SysLogMapper.java │ │ │ │ └── UserMapper.java │ │ │ ├── service/ │ │ │ │ ├── AppResourceService.java │ │ │ │ ├── AppService.java │ │ │ │ ├── CorpAppService.java │ │ │ │ ├── CorpService.java │ │ │ │ ├── DepartmentService.java │ │ │ │ ├── DictService.java │ │ │ │ ├── EmployeeService.java │ │ │ │ ├── FileService.java │ │ │ │ ├── Oauth2AuthorizationConsentService.java │ │ │ │ ├── Oauth2AuthorizationService.java │ │ │ │ ├── Oauth2RegisteredClientService.java │ │ │ │ ├── RoleService.java │ │ │ │ ├── SimpleSecurityService.java │ │ │ │ ├── SysLogService.java │ │ │ │ ├── UserService.java │ │ │ │ └── impl/ │ │ │ │ ├── AppResourceServiceImpl.java │ │ │ │ ├── AppServiceImpl.java │ │ │ │ ├── CorpAppServiceImpl.java │ │ │ │ ├── CorpServiceImpl.java │ │ │ │ ├── DepartmentServiceImpl.java │ │ │ │ ├── DictServiceImpl.java │ │ │ │ ├── EmployeeServiceImpl.java │ │ │ │ ├── FileServiceImpl.java │ │ │ │ ├── Oauth2AuthorizationConsentServiceImpl.java │ │ │ │ ├── Oauth2AuthorizationServiceImpl.java │ │ │ │ ├── Oauth2RegisteredClientServiceImpl.java │ │ │ │ ├── RoleServiceImpl.java │ │ │ │ ├── SysLogServiceImpl.java │ │ │ │ └── UserServiceImpl.java │ │ │ └── utils/ │ │ │ ├── AliyunSmsUtils.java │ │ │ ├── AppResourceUtils.java │ │ │ ├── Constant.java │ │ │ ├── DateTimeUtils.java │ │ │ ├── DepartmentUtils.java │ │ │ ├── Oauth2RegisteredClientUtils.java │ │ │ ├── RsaUtils.java │ │ │ ├── SmsUtils.java │ │ │ └── jose/ │ │ │ ├── Jwks.java │ │ │ └── KeyGeneratorUtils.java │ │ └── resources/ │ │ ├── application-common.yml │ │ ├── application-doc.yml │ │ ├── application-hiauth.yml │ │ ├── application-mybatis.yml │ │ ├── application-redis.yml │ │ ├── application.yml │ │ ├── logback.xml │ │ ├── mapper/ │ │ │ ├── AppMapper.xml │ │ │ ├── AppResourceMapper.xml │ │ │ ├── CorpAppMapper.xml │ │ │ ├── CorpMapper.xml │ │ │ ├── DepartmentMapper.xml │ │ │ ├── DictMapper.xml │ │ │ ├── EmployeeMapper.xml │ │ │ ├── FileMapper.xml │ │ │ ├── Oauth2AuthorizationConsentMapper.xml │ │ │ ├── Oauth2AuthorizationMapper.xml │ │ │ ├── Oauth2RegisteredClientMapper.xml │ │ │ ├── RoleMapper.xml │ │ │ ├── SysLogMapper.xml │ │ │ └── UserMapper.xml │ │ ├── static/ │ │ │ ├── bootstrap-5.3.0/ │ │ │ │ ├── css/ │ │ │ │ │ ├── bootstrap.min.css │ │ │ │ │ ├── bootstrap.min.css.map │ │ │ │ │ ├── bootstrap.rtl.min.css │ │ │ │ │ └── bootstrap.rtl.min.css.map │ │ │ │ └── js/ │ │ │ │ ├── bootstrap.bundle.min.js │ │ │ │ └── bootstrap.bundle.min.js.map │ │ │ ├── css/ │ │ │ │ ├── all.min.css │ │ │ │ ├── common.css │ │ │ │ ├── fontawesome.min.css │ │ │ │ ├── index.css │ │ │ │ ├── jquery.treetable.css │ │ │ │ ├── jquery.treetable.theme.default.css │ │ │ │ ├── login.css │ │ │ │ ├── login1.css │ │ │ │ ├── login2.css │ │ │ │ ├── login3.css │ │ │ │ ├── navbar.css │ │ │ │ └── user_me.css │ │ │ ├── fontawesome-5.15.4/ │ │ │ │ └── css/ │ │ │ │ ├── all.css │ │ │ │ ├── all.min.css │ │ │ │ ├── brands.css │ │ │ │ ├── brands.min.css │ │ │ │ ├── fontawesome.css │ │ │ │ ├── fontawesome.min.css │ │ │ │ ├── regular.css │ │ │ │ ├── regular.min.css │ │ │ │ ├── solid.css │ │ │ │ ├── solid.min.css │ │ │ │ ├── svg-with-js.css │ │ │ │ ├── svg-with-js.min.css │ │ │ │ ├── v4-shims.css │ │ │ │ └── v4-shims.min.css │ │ │ ├── img/ │ │ │ │ └── logo.psd │ │ │ └── js/ │ │ │ ├── depTree.js │ │ │ ├── jquery.min.js │ │ │ ├── jquery.treetable.js │ │ │ ├── jquery.validate.min.js │ │ │ ├── login.js │ │ │ ├── particle.js │ │ │ ├── sliderCaptcha.js │ │ │ └── wxLogin.js │ │ └── templates/ │ │ ├── common/ │ │ │ └── include.html │ │ ├── consent.html │ │ ├── consent_bak.html │ │ ├── error/ │ │ │ ├── 401.html │ │ │ ├── 403.html │ │ │ ├── 404.html │ │ │ ├── 500.html │ │ │ └── unconsent.html │ │ ├── index.html │ │ ├── login.html │ │ ├── login1.html │ │ ├── login2.html │ │ ├── login3.html │ │ ├── oauth/ │ │ │ ├── oauth_approval.html │ │ │ └── oauth_error.html │ │ ├── profile.html │ │ ├── setting.html │ │ └── user/ │ │ ├── detail.html │ │ ├── list.html │ │ ├── me.html │ │ └── user.html │ └── test/ │ └── java/ │ └── cn/ │ └── hiauth/ │ └── server/ │ ├── AuthServerTests.java │ ├── CustomJdbcRegisteredClientRepositoryTests.java │ ├── DefaultAuthorizationServerApplicationTests.java │ ├── DefaultAuthorizationServerConsentTests.java │ └── service/ │ ├── AppResourceServiceTests.java │ ├── AppServiceTests.java │ ├── CorpServiceTests.java │ ├── DepartmentServiceTests.java │ ├── DictServiceTests.java │ ├── EmployeeServiceTests.java │ ├── FileServiceTests.java │ ├── Oauth2AuthorizationConsentServiceTests.java │ ├── Oauth2AuthorizationServiceTests.java │ ├── Oauth2RegisteredClientServiceTests.java │ ├── RoleServiceTests.java │ ├── SysLogServiceTests.java │ └── UserServiceTests.java ├── other/ │ └── hiauth.sql └── pom.xml