@nathapp/na-cli 1.0.1-rc.6 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/README.md +88 -20
  2. package/dist/index.js +36 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/templates/k8s-cert-manager/README.md +60 -0
  5. package/dist/templates/k8s-cert-manager/cloudflare-cert-manager-issuer.yaml +26 -0
  6. package/dist/templates/k8s-deployment/templates/_deployment.tpl +1 -1
  7. package/dist/templates/k8s-deployment/templates/_endpointslice.tpl +42 -0
  8. package/dist/templates/k8s-deployment/templates/_gateway.tpl +94 -0
  9. package/dist/templates/k8s-deployment/templates/_grpcroute.tpl +186 -0
  10. package/dist/templates/k8s-deployment/templates/_httproute.tpl +209 -0
  11. package/dist/templates/k8s-deployment/templates/_ingressroute.tpl +178 -0
  12. package/dist/templates/k8s-deployment/templates/_middleware.tpl +553 -0
  13. package/dist/templates/k8s-deployment/templates/_serverstransport.tpl +73 -0
  14. package/dist/templates/k8s-deployment/templates/_service.tpl +4 -1
  15. package/dist/templates/k8s-helm-chart/templates/endpointslice.yaml +1 -0
  16. package/dist/templates/k8s-helm-chart/templates/gateway.yaml +1 -0
  17. package/dist/templates/k8s-helm-chart/templates/grpcroute.yaml +1 -0
  18. package/dist/templates/k8s-helm-chart/templates/httproute.yaml +1 -0
  19. package/dist/templates/k8s-helm-chart/templates/ingressroute.yaml +1 -0
  20. package/dist/templates/k8s-helm-chart/templates/middleware.yaml +1 -0
  21. package/dist/templates/k8s-helm-chart/templates/serverstransport.yaml +1 -0
  22. package/dist/templates/k8s-helm-chart/values.yaml +3 -5
  23. package/dist/templates/nestjs-api/{.env → .env.local} +5 -0
  24. package/dist/templates/nestjs-api/.gitignore-rename +2 -1
  25. package/dist/templates/nestjs-api/Dockerfile +33 -13
  26. package/dist/templates/nestjs-api/package.json +49 -39
  27. package/dist/templates/nestjs-api/src/i18n/en_US/date.json +7 -0
  28. package/dist/templates/nestjs-api/src/i18n/en_US/validation.json +16 -0
  29. package/dist/templates/nestjs-api/src/i18n/zh_CN/date.json +7 -0
  30. package/dist/templates/nestjs-api/src/i18n/zh_CN/validation.json +16 -0
  31. package/dist/templates/nestjs-api/src/i18n/zh_TW/date.json +7 -0
  32. package/dist/templates/nestjs-api/src/i18n/zh_TW/validation.json +16 -0
  33. package/dist/templates/nestjs-api/test/jest-test.json +26 -0
  34. package/dist/templates/nestjs-library/.npmignore-rename +4 -0
  35. package/dist/templates/nestjs-library/package.json +8 -8
  36. package/dist/templates/ts-library/.npmignore-rename +4 -0
  37. package/dist/templates/turbo-nestjs-vuexy/README.md +3 -0
  38. package/dist/templates/turbo-nestjs-vuexy/package.json +49 -0
  39. package/dist/templates/turbo-nestjs-vuexy/packages/eslint-config/README.md +3 -0
  40. package/dist/templates/turbo-nestjs-vuexy/packages/eslint-config/library.js +43 -0
  41. package/dist/templates/turbo-nestjs-vuexy/packages/eslint-config/package.json +18 -0
  42. package/dist/templates/turbo-nestjs-vuexy/packages/eslint-config/vue.js +236 -0
  43. package/dist/templates/{ts-library/tsconfig.json → turbo-nestjs-vuexy/packages/typescript-config/base.json} +4 -6
  44. package/dist/templates/turbo-nestjs-vuexy/packages/typescript-config/nestjs.json +12 -0
  45. package/dist/templates/turbo-nestjs-vuexy/packages/typescript-config/package.json +9 -0
  46. package/dist/templates/turbo-nestjs-vuexy/packages/typescript-config/vue.json +82 -0
  47. package/dist/templates/turbo-nestjs-vuexy/turbo.json +24 -0
  48. package/dist/templates/vuexy-portal/.editorconfig +1 -0
  49. package/dist/templates/vuexy-portal/.eslintrc.cjs +237 -0
  50. package/dist/templates/vuexy-portal/.gitignore-rename +42 -0
  51. package/dist/templates/vuexy-portal/.stylelintrc.json +46 -0
  52. package/dist/templates/vuexy-portal/Dockerfile +43 -0
  53. package/dist/templates/vuexy-portal/README.md +35 -0
  54. package/dist/templates/vuexy-portal/auto-imports.d.ts +1131 -0
  55. package/dist/templates/vuexy-portal/components.d.ts +68 -0
  56. package/dist/templates/vuexy-portal/dev.Dockerfile +25 -0
  57. package/dist/templates/vuexy-portal/docker-compose.dev.yml +14 -0
  58. package/dist/templates/vuexy-portal/docker-compose.prod.yml +13 -0
  59. package/dist/templates/vuexy-portal/entrypoint.sh +6 -0
  60. package/dist/templates/vuexy-portal/env.d.ts +12 -0
  61. package/dist/templates/vuexy-portal/index.html +57 -0
  62. package/dist/templates/vuexy-portal/nginx.conf +14 -0
  63. package/dist/templates/vuexy-portal/package.json +140 -0
  64. package/dist/templates/vuexy-portal/pnpm-lock.yaml +7963 -0
  65. package/dist/templates/vuexy-portal/prod.Dockerfile +41 -0
  66. package/dist/templates/vuexy-portal/public/favicon.ico +0 -0
  67. package/dist/templates/vuexy-portal/public/images/avatars/avatar-1.png +0 -0
  68. package/dist/templates/vuexy-portal/public/images/avatars/avatar-2.png +0 -0
  69. package/dist/templates/vuexy-portal/public/images/svg/discord.svg +10 -0
  70. package/dist/templates/vuexy-portal/public/images/svg/gift.svg +8 -0
  71. package/dist/templates/vuexy-portal/public/images/svg/keyboard.svg +8 -0
  72. package/dist/templates/vuexy-portal/public/images/svg/laptop.svg +8 -0
  73. package/dist/templates/vuexy-portal/public/images/svg/lightbulb.svg +8 -0
  74. package/dist/templates/vuexy-portal/public/images/svg/rocket.svg +8 -0
  75. package/dist/templates/vuexy-portal/public/loader.css +79 -0
  76. package/dist/templates/vuexy-portal/public/mockServiceWorker.js +287 -0
  77. package/dist/templates/vuexy-portal/shims.d.ts +15 -0
  78. package/dist/templates/vuexy-portal/src/@core/components/AppBarSearch.vue +278 -0
  79. package/dist/templates/vuexy-portal/src/@core/components/AppDrawerHeaderSection.vue +30 -0
  80. package/dist/templates/vuexy-portal/src/@core/components/AppStepper.vue +371 -0
  81. package/dist/templates/vuexy-portal/src/@core/components/BuyNow.vue +92 -0
  82. package/dist/templates/vuexy-portal/src/@core/components/CardStatisticsVerticalSimple.vue +35 -0
  83. package/dist/templates/vuexy-portal/src/@core/components/CustomizerSection.vue +27 -0
  84. package/dist/templates/vuexy-portal/src/@core/components/DialogCloseBtn.vue +25 -0
  85. package/dist/templates/vuexy-portal/src/@core/components/DropZone.vue +135 -0
  86. package/dist/templates/vuexy-portal/src/@core/components/I18n.vue +48 -0
  87. package/dist/templates/vuexy-portal/src/@core/components/MoreBtn.vue +24 -0
  88. package/dist/templates/vuexy-portal/src/@core/components/Notifications.vue +245 -0
  89. package/dist/templates/vuexy-portal/src/@core/components/ProductDescriptionEditor.vue +198 -0
  90. package/dist/templates/vuexy-portal/src/@core/components/ScrollToTop.vue +41 -0
  91. package/dist/templates/vuexy-portal/src/@core/components/Shortcuts.vue +99 -0
  92. package/dist/templates/vuexy-portal/src/@core/components/TablePagination.vue +39 -0
  93. package/dist/templates/vuexy-portal/src/@core/components/TheCustomizer.vue +618 -0
  94. package/dist/templates/vuexy-portal/src/@core/components/ThemeSwitcher.vue +61 -0
  95. package/dist/templates/vuexy-portal/src/@core/components/TiptapEditor.vue +166 -0
  96. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/AppAutocomplete.vue +57 -0
  97. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/AppCombobox.vue +57 -0
  98. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/AppDateTimePicker.vue +543 -0
  99. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/AppSelect.vue +50 -0
  100. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/AppTextField.vue +78 -0
  101. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/AppTextarea.vue +50 -0
  102. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/CustomCheckboxes.vue +81 -0
  103. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/CustomCheckboxesWithIcon.vue +95 -0
  104. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/CustomCheckboxesWithImage.vue +93 -0
  105. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/CustomRadios.vue +81 -0
  106. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/CustomRadiosWithIcon.vue +88 -0
  107. package/dist/templates/vuexy-portal/src/@core/components/app-form-elements/CustomRadiosWithImage.vue +99 -0
  108. package/dist/templates/vuexy-portal/src/@core/components/cards/AppCardActions.vue +167 -0
  109. package/dist/templates/vuexy-portal/src/@core/components/cards/AppCardCode.vue +152 -0
  110. package/dist/templates/vuexy-portal/src/@core/components/cards/CardStatisticsHorizontal.vue +41 -0
  111. package/dist/templates/vuexy-portal/src/@core/components/cards/CardStatisticsVertical.vue +48 -0
  112. package/dist/templates/vuexy-portal/src/@core/scss/base/_components.scss +185 -0
  113. package/dist/templates/vuexy-portal/src/@core/scss/base/_dark.scss +16 -0
  114. package/dist/templates/vuexy-portal/src/@core/scss/base/_default-layout-w-horizontal-nav.scss +45 -0
  115. package/dist/templates/vuexy-portal/src/@core/scss/base/_default-layout-w-vertical-nav.scss +103 -0
  116. package/dist/templates/vuexy-portal/src/@core/scss/base/_default-layout.scss +16 -0
  117. package/dist/templates/vuexy-portal/src/@core/scss/base/_horizontal-nav.scss +194 -0
  118. package/dist/templates/vuexy-portal/src/@core/scss/base/_index.scss +48 -0
  119. package/dist/templates/vuexy-portal/src/@core/scss/base/_layouts.scss +63 -0
  120. package/dist/templates/vuexy-portal/src/@core/scss/base/_misc.scss +20 -0
  121. package/dist/templates/vuexy-portal/src/@core/scss/base/_mixins.scss +63 -0
  122. package/dist/templates/vuexy-portal/src/@core/scss/base/_route-transitions.scss +70 -0
  123. package/dist/templates/vuexy-portal/src/@core/scss/base/_utilities.scss +181 -0
  124. package/dist/templates/vuexy-portal/src/@core/scss/base/_utils.scss +90 -0
  125. package/dist/templates/vuexy-portal/src/@core/scss/base/_variables.scss +198 -0
  126. package/dist/templates/vuexy-portal/src/@core/scss/base/_vertical-nav.scss +255 -0
  127. package/dist/templates/vuexy-portal/src/@core/scss/base/libs/_perfect-scrollbar.scss +35 -0
  128. package/dist/templates/vuexy-portal/src/@core/scss/base/libs/vuetify/_index.scss +1 -0
  129. package/dist/templates/vuexy-portal/src/@core/scss/base/libs/vuetify/_overrides.scss +264 -0
  130. package/dist/templates/vuexy-portal/src/@core/scss/base/libs/vuetify/_variables.scss +62 -0
  131. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_default-layout-horizontal-nav.scss +27 -0
  132. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_default-layout-vertical-nav.scss +45 -0
  133. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_default-layout.scss +3 -0
  134. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_horizontal-nav.scss +98 -0
  135. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_index.scss +7 -0
  136. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_misc.scss +7 -0
  137. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_nav.scss +33 -0
  138. package/dist/templates/vuexy-portal/src/@core/scss/base/placeholders/_vertical-nav.scss +80 -0
  139. package/dist/templates/vuexy-portal/src/@core/scss/base/skins/_bordered.scss +72 -0
  140. package/dist/templates/vuexy-portal/src/@core/scss/base/skins/_index.scss +1 -0
  141. package/dist/templates/vuexy-portal/src/@core/scss/template/_default-layout-w-horizontal-nav.scss +9 -0
  142. package/dist/templates/vuexy-portal/src/@core/scss/template/_default-layout-w-vertical-nav.scss +20 -0
  143. package/dist/templates/vuexy-portal/src/@core/scss/template/_horizontal-nav.scss +40 -0
  144. package/dist/templates/vuexy-portal/src/@core/scss/template/_mixins.scss +6 -0
  145. package/dist/templates/vuexy-portal/src/@core/scss/template/_utilities.scss +49 -0
  146. package/dist/templates/vuexy-portal/src/@core/scss/template/_variables.scss +102 -0
  147. package/dist/templates/vuexy-portal/src/@core/scss/template/_vertical-nav.scss +47 -0
  148. package/dist/templates/vuexy-portal/src/@core/scss/template/index.scss +17 -0
  149. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/apex-chart.scss +108 -0
  150. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/full-calendar.scss +351 -0
  151. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/shepherd.scss +94 -0
  152. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/swiper.scss +5 -0
  153. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/_variables.scss +351 -0
  154. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_alert.scss +114 -0
  155. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_avatar.scss +27 -0
  156. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_badge.scss +25 -0
  157. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_button.scss +280 -0
  158. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_cards.scss +3 -0
  159. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_checkbox.scss +57 -0
  160. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_chip.scss +102 -0
  161. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_dialog.scss +27 -0
  162. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_expansion-panels.scss +106 -0
  163. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_field.scss +308 -0
  164. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_list.scss +30 -0
  165. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_menu.scss +35 -0
  166. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_otp-input.scss +17 -0
  167. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_pagination.scss +140 -0
  168. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_progress.scss +13 -0
  169. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_radio.scss +46 -0
  170. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_rating.scss +20 -0
  171. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_slider.scss +27 -0
  172. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_snackbar.scss +10 -0
  173. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_switch.scss +58 -0
  174. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_table.scss +48 -0
  175. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_tabs.scss +91 -0
  176. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_textarea.scss +9 -0
  177. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_timeline.scss +99 -0
  178. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/_tooltip.scss +6 -0
  179. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/components/index.scss +25 -0
  180. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/index.scss +3 -0
  181. package/dist/templates/vuexy-portal/src/@core/scss/template/libs/vuetify/overrides.scss +18 -0
  182. package/dist/templates/vuexy-portal/src/@core/scss/template/pages/misc.scss +20 -0
  183. package/dist/templates/vuexy-portal/src/@core/scss/template/pages/page-auth.scss +63 -0
  184. package/dist/templates/vuexy-portal/src/@core/scss/template/placeholders/_default-layout-horizontal-nav.scss +7 -0
  185. package/dist/templates/vuexy-portal/src/@core/scss/template/placeholders/_default-layout-vertical-nav.scss +8 -0
  186. package/dist/templates/vuexy-portal/src/@core/scss/template/placeholders/_horizontal-nav.scss +47 -0
  187. package/dist/templates/vuexy-portal/src/@core/scss/template/placeholders/_index.scss +6 -0
  188. package/dist/templates/vuexy-portal/src/@core/scss/template/placeholders/_misc.scss +3 -0
  189. package/dist/templates/vuexy-portal/src/@core/scss/template/placeholders/_nav.scss +27 -0
  190. package/dist/templates/vuexy-portal/src/@core/scss/template/placeholders/_vertical-nav.scss +35 -0
  191. package/dist/templates/vuexy-portal/src/@core/scss/template/skins/_bordered.scss +82 -0
  192. package/dist/templates/vuexy-portal/src/@core/scss/template/skins/_index.scss +1 -0
  193. package/dist/templates/vuexy-portal/src/@custom/assets/images/user-profile-header.png +0 -0
  194. package/dist/templates/vuexy-portal/src/@custom/components/ConfirmationDialog.vue +155 -0
  195. package/dist/templates/vuexy-portal/src/@layouts/components/HorizontalNav.vue +35 -0
  196. package/dist/templates/vuexy-portal/src/@layouts/components/HorizontalNavGroup.vue +110 -0
  197. package/dist/templates/vuexy-portal/src/@layouts/components/HorizontalNavLayout.vue +150 -0
  198. package/dist/templates/vuexy-portal/src/@layouts/components/HorizontalNavLink.vue +56 -0
  199. package/dist/templates/vuexy-portal/src/@layouts/components/HorizontalNavPopper.vue +175 -0
  200. package/dist/templates/vuexy-portal/src/@layouts/components/TransitionExpand.vue +92 -0
  201. package/dist/templates/vuexy-portal/src/@layouts/components/VNodeRenderer.tsx +17 -0
  202. package/dist/templates/vuexy-portal/src/@layouts/components/VerticalNav.vue +236 -0
  203. package/dist/templates/vuexy-portal/src/@layouts/components/VerticalNavGroup.vue +267 -0
  204. package/dist/templates/vuexy-portal/src/@layouts/components/VerticalNavLayout.vue +232 -0
  205. package/dist/templates/vuexy-portal/src/@layouts/components/VerticalNavLink.vue +68 -0
  206. package/dist/templates/vuexy-portal/src/@layouts/components/VerticalNavSectionTitle.vue +37 -0
  207. package/dist/templates/vuexy-portal/src/@layouts/styles/_classes.scss +3 -0
  208. package/dist/templates/vuexy-portal/src/@layouts/styles/_default-layout.scss +35 -0
  209. package/dist/templates/vuexy-portal/src/@layouts/styles/_global.scss +10 -0
  210. package/dist/templates/vuexy-portal/src/@layouts/styles/_mixins.scss +30 -0
  211. package/dist/templates/vuexy-portal/src/@layouts/styles/_placeholders.scss +53 -0
  212. package/dist/templates/vuexy-portal/src/@layouts/styles/_rtl.scss +7 -0
  213. package/dist/templates/vuexy-portal/src/@layouts/styles/_variables.scss +29 -0
  214. package/dist/templates/vuexy-portal/src/@layouts/styles/index.scss +3 -0
  215. package/dist/templates/vuexy-portal/src/App.vue +26 -0
  216. package/dist/templates/vuexy-portal/src/assets/images/avatars/avatar-1.png +0 -0
  217. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/border-light.svg +16 -0
  218. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/collapsed-light.svg +17 -0
  219. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/compact-light.svg +11 -0
  220. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/default-light.svg +17 -0
  221. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/horizontal-light.svg +12 -0
  222. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/ltr-light.svg +15 -0
  223. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/rtl-light.svg +15 -0
  224. package/dist/templates/vuexy-portal/src/assets/images/customizer-icons/wide-light.svg +11 -0
  225. package/dist/templates/vuexy-portal/src/assets/images/logo.svg +6 -0
  226. package/dist/templates/vuexy-portal/src/assets/images/misc/3d-safe-box-with-golden-dollar-coins.png +0 -0
  227. package/dist/templates/vuexy-portal/src/assets/images/misc/3d-space-rocket-with-smoke.png +0 -0
  228. package/dist/templates/vuexy-portal/src/assets/images/misc/dollar-coins-flying-pink-piggy-bank.png +0 -0
  229. package/dist/templates/vuexy-portal/src/assets/images/misc/fleet-car.png +0 -0
  230. package/dist/templates/vuexy-portal/src/assets/images/pages/misc-mask-dark.png +0 -0
  231. package/dist/templates/vuexy-portal/src/assets/images/pages/misc-mask-light.png +0 -0
  232. package/dist/templates/vuexy-portal/src/assets/images/svg/Card.svg +8 -0
  233. package/dist/templates/vuexy-portal/src/assets/images/svg/Check.svg +4 -0
  234. package/dist/templates/vuexy-portal/src/assets/images/svg/Diamond.svg +12 -0
  235. package/dist/templates/vuexy-portal/src/assets/images/svg/Suitcase.svg +4 -0
  236. package/dist/templates/vuexy-portal/src/assets/images/svg/Wallet.svg +10 -0
  237. package/dist/templates/vuexy-portal/src/assets/images/svg/address.svg +25 -0
  238. package/dist/templates/vuexy-portal/src/assets/images/svg/auth-v1-bottom-shape.svg +4 -0
  239. package/dist/templates/vuexy-portal/src/assets/images/svg/auth-v1-top-shape.svg +4 -0
  240. package/dist/templates/vuexy-portal/src/assets/images/svg/cart.svg +5 -0
  241. package/dist/templates/vuexy-portal/src/assets/images/svg/checkbox-checked.svg +4 -0
  242. package/dist/templates/vuexy-portal/src/assets/images/svg/checkbox-indeterminate.svg +4 -0
  243. package/dist/templates/vuexy-portal/src/assets/images/svg/checkbox-unchecked.svg +10 -0
  244. package/dist/templates/vuexy-portal/src/assets/images/svg/discord.svg +10 -0
  245. package/dist/templates/vuexy-portal/src/assets/images/svg/gift.svg +8 -0
  246. package/dist/templates/vuexy-portal/src/assets/images/svg/home.svg +5 -0
  247. package/dist/templates/vuexy-portal/src/assets/images/svg/keyboard.svg +4 -0
  248. package/dist/templates/vuexy-portal/src/assets/images/svg/laptop.svg +4 -0
  249. package/dist/templates/vuexy-portal/src/assets/images/svg/lightbulb.svg +8 -0
  250. package/dist/templates/vuexy-portal/src/assets/images/svg/office.svg +4 -0
  251. package/dist/templates/vuexy-portal/src/assets/images/svg/paper-send.svg +4 -0
  252. package/dist/templates/vuexy-portal/src/assets/images/svg/payment.svg +21 -0
  253. package/dist/templates/vuexy-portal/src/assets/images/svg/radio-checked.svg +3 -0
  254. package/dist/templates/vuexy-portal/src/assets/images/svg/radio-unchecked.svg +3 -0
  255. package/dist/templates/vuexy-portal/src/assets/images/svg/rocket.svg +4 -0
  256. package/dist/templates/vuexy-portal/src/assets/images/svg/trending.svg +14 -0
  257. package/dist/templates/vuexy-portal/src/assets/images/svg/user-info.svg +4 -0
  258. package/dist/templates/vuexy-portal/src/assets/images/svg/user.svg +6 -0
  259. package/dist/templates/vuexy-portal/src/assets/images/svg/wizard-account.svg +6 -0
  260. package/dist/templates/vuexy-portal/src/assets/images/svg/wizard-address.svg +18 -0
  261. package/dist/templates/vuexy-portal/src/assets/images/svg/wizard-personal.svg +6 -0
  262. package/dist/templates/vuexy-portal/src/assets/images/svg/wizard-social-link.svg +6 -0
  263. package/dist/templates/vuexy-portal/src/assets/images/svg/wizard-submit.svg +6 -0
  264. package/dist/templates/vuexy-portal/src/assets/styles/styles.scss +1 -0
  265. package/dist/templates/vuexy-portal/src/assets/styles/variables/_template.scss +6 -0
  266. package/dist/templates/vuexy-portal/src/assets/styles/variables/_vuetify.scss +7 -0
  267. package/dist/templates/vuexy-portal/src/components/AppLoadingIndicator.vue +63 -0
  268. package/dist/templates/vuexy-portal/src/components/AppPricing.vue +247 -0
  269. package/dist/templates/vuexy-portal/src/components/AppSearchHeader.vue +77 -0
  270. package/dist/templates/vuexy-portal/src/components/ErrorHeader.vue +40 -0
  271. package/dist/templates/vuexy-portal/src/components/dialogs/AddAuthenticatorAppDialog.vue +101 -0
  272. package/dist/templates/vuexy-portal/src/components/dialogs/AddEditAddressDialog.vue +238 -0
  273. package/dist/templates/vuexy-portal/src/components/dialogs/AddEditPermissionDialog.vue +93 -0
  274. package/dist/templates/vuexy-portal/src/components/dialogs/AddEditRoleDialog.vue +302 -0
  275. package/dist/templates/vuexy-portal/src/components/dialogs/AddPaymentMethodDialog.vue +120 -0
  276. package/dist/templates/vuexy-portal/src/components/dialogs/CardAddEditDialog.vue +153 -0
  277. package/dist/templates/vuexy-portal/src/components/dialogs/ConfirmDialog.vue +151 -0
  278. package/dist/templates/vuexy-portal/src/components/dialogs/CreateAppDialog.vue +459 -0
  279. package/dist/templates/vuexy-portal/src/components/dialogs/EnableOneTimePasswordDialog.vue +85 -0
  280. package/dist/templates/vuexy-portal/src/components/dialogs/PaymentProvidersDialog.vue +123 -0
  281. package/dist/templates/vuexy-portal/src/components/dialogs/PricingPlanDialog.vue +34 -0
  282. package/dist/templates/vuexy-portal/src/components/dialogs/ReferAndEarnDialog.vue +181 -0
  283. package/dist/templates/vuexy-portal/src/components/dialogs/ShareProjectDialog.vue +198 -0
  284. package/dist/templates/vuexy-portal/src/components/dialogs/TwoFactorAuthDialog.vue +120 -0
  285. package/dist/templates/vuexy-portal/src/components/dialogs/UserInfoEditDialog.vue +246 -0
  286. package/dist/templates/vuexy-portal/src/components/dialogs/UserUpgradePlanDialog.vue +101 -0
  287. package/dist/templates/vuexy-portal/src/layouts/blank.vue +42 -0
  288. package/dist/templates/vuexy-portal/src/layouts/components/DefaultLayoutWithHorizontalNav.vue +75 -0
  289. package/dist/templates/vuexy-portal/src/layouts/components/DefaultLayoutWithVerticalNav.vue +79 -0
  290. package/dist/templates/vuexy-portal/src/layouts/components/Footer.vue +17 -0
  291. package/dist/templates/vuexy-portal/src/layouts/components/NavSearchBar.vue +266 -0
  292. package/dist/templates/vuexy-portal/src/layouts/components/NavbarShortcuts.vue +45 -0
  293. package/dist/templates/vuexy-portal/src/layouts/components/NavbarThemeSwitcher.vue +22 -0
  294. package/dist/templates/vuexy-portal/src/layouts/components/UserProfile.vue +114 -0
  295. package/dist/templates/vuexy-portal/src/layouts/default.vue +30 -0
  296. package/dist/templates/vuexy-portal/src/pages/[...error].vue +46 -0
  297. package/dist/templates/vuexy-portal/src/pages/account-settings/[tab].vue +57 -0
  298. package/dist/templates/vuexy-portal/src/pages/index.vue +32 -0
  299. package/dist/templates/vuexy-portal/src/pages/login.vue +178 -0
  300. package/dist/templates/vuexy-portal/src/pages/not-authorized.vue +47 -0
  301. package/dist/templates/vuexy-portal/src/pages/second-page.vue +13 -0
  302. package/dist/templates/vuexy-portal/src/plugins/casl/shims-ability.d.ts +8 -0
  303. package/dist/templates/vuexy-portal/src/plugins/i18n/locales/en_US.json +88 -0
  304. package/dist/templates/vuexy-portal/src/plugins/i18n/locales/zh_CN.json +88 -0
  305. package/dist/templates/vuexy-portal/src/plugins/i18n/vue-i18n.d.ts +17 -0
  306. package/dist/templates/vuexy-portal/src/plugins/iconify/icons.css +21039 -0
  307. package/dist/templates/vuexy-portal/src/plugins/iconify/package.json +3 -0
  308. package/dist/templates/vuexy-portal/src/views/account-settings/AccountSettingsSecurity.vue +179 -0
  309. package/dist/templates/vuexy-portal/typed-router.d.ts +146 -0
  310. package/dist/utils/template.js +122 -47
  311. package/dist/utils/template.js.map +1 -1
  312. package/package.json +1 -1
  313. package/.gitlab-ci.yml +0 -143
  314. package/Makefile +0 -62
  315. package/dist/templates/db-schema/.gitlab-ci.yml +0 -139
  316. package/dist/templates/db-schema/Makefile +0 -885
  317. package/dist/templates/k8s-deployment/.gitlab-ci.yml +0 -128
  318. package/dist/templates/k8s-deployment/Makefile +0 -196
  319. package/dist/templates/k8s-deployment/resources/charts/mysql/charts/mysql-install/script/Makefile +0 -12
  320. package/dist/templates/k8s-deployment/resources/charts/redis/charts/redis-install/script/Makefile +0 -8
  321. package/dist/templates/k8s-deployment/services/charts/hooks/charts/pre-delete-rsc/script/Makefile +0 -49
  322. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-cypress/Makefile +0 -9
  323. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/script/Makefile +0 -14
  324. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/_t-0100-readiness-liveness.ts +0 -84
  325. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/hub.ts +0 -372
  326. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-contact.ts +0 -158
  327. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-contract.ts +0 -328
  328. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-kyc.ts +0 -304
  329. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-onboard-app.ts +0 -823
  330. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-onboard-web.ts +0 -493
  331. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-profile.ts +0 -277
  332. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/individual-whitelist.ts +0 -133
  333. package/dist/templates/k8s-deployment/services/charts/tests/charts/e2e-test-js/tests/t-0200-start.ts +0 -172
  334. package/dist/templates/mxw-base-api-express/.dockerignore +0 -2
  335. package/dist/templates/mxw-base-api-express/.env +0 -10
  336. package/dist/templates/mxw-base-api-express/.gitignore-rename +0 -3
  337. package/dist/templates/mxw-base-api-express/.gitlab-ci.yml +0 -174
  338. package/dist/templates/mxw-base-api-express/.nvmrc +0 -1
  339. package/dist/templates/mxw-base-api-express/Dockerfile +0 -14
  340. package/dist/templates/mxw-base-api-express/Makefile +0 -84
  341. package/dist/templates/mxw-base-api-express/README.md +0 -71
  342. package/dist/templates/mxw-base-api-express/package.json +0 -55
  343. package/dist/templates/mxw-base-api-express/src/app-service.test.ts +0 -94
  344. package/dist/templates/mxw-base-api-express/src/app-service.ts +0 -498
  345. package/dist/templates/mxw-base-api-express/src/auth/auth-user.test.ts +0 -215
  346. package/dist/templates/mxw-base-api-express/src/auth/auth-user.ts +0 -86
  347. package/dist/templates/mxw-base-api-express/src/auth/auth.ts +0 -81
  348. package/dist/templates/mxw-base-api-express/src/core-service.ts +0 -72
  349. package/dist/templates/mxw-base-api-express/src/crud.ts +0 -84
  350. package/dist/templates/mxw-base-api-express/src/http-handler.ts +0 -71
  351. package/dist/templates/mxw-base-api-express/src/server.ts +0 -54
  352. package/dist/templates/mxw-base-api-express/src/test.ts +0 -38
  353. package/dist/templates/mxw-base-api-express/src/utils/api-utilities.ts +0 -52
  354. package/dist/templates/mxw-base-api-express/src/utils/file-utilities.ts +0 -55
  355. package/dist/templates/mxw-base-api-express/tsconfig.json +0 -32
  356. package/dist/templates/nestjs-api/.dockerignore +0 -6
  357. package/dist/templates/nestjs-api/.gitlab-ci.yml +0 -174
  358. package/dist/templates/nestjs-api/.nvmrc +0 -1
  359. package/dist/templates/nestjs-api/.prettierrc +0 -4
  360. package/dist/templates/nestjs-api/Makefile +0 -95
  361. package/dist/templates/nestjs-api/nest-cli.json +0 -11
  362. package/dist/templates/nestjs-api/src/app.controller.spec.ts +0 -24
  363. package/dist/templates/nestjs-api/src/app.controller.ts +0 -27
  364. package/dist/templates/nestjs-api/src/app.module.ts +0 -49
  365. package/dist/templates/nestjs-api/src/app.service.ts +0 -27
  366. package/dist/templates/nestjs-api/src/main.ts +0 -26
  367. package/dist/templates/nestjs-api/test/app.e2e-spec.ts +0 -47
  368. package/dist/templates/nestjs-api/tsconfig.build.json +0 -4
  369. package/dist/templates/nestjs-api/tsconfig.json +0 -24
  370. package/dist/templates/nestjs-library/.eslintrc.js +0 -24
  371. package/dist/templates/nestjs-library/.gitlab-ci.yml +0 -138
  372. package/dist/templates/nestjs-library/.prettierrc +0 -6
  373. package/dist/templates/nestjs-library/Makefile +0 -60
  374. package/dist/templates/nestjs-library/index.ts +0 -1
  375. package/dist/templates/nestjs-library/lib/index.ts +0 -2
  376. package/dist/templates/nestjs-library/test/app/controller/hello.controller.ts +0 -7
  377. package/dist/templates/nestjs-library/tsconfig.build.json +0 -7
  378. package/dist/templates/nestjs-library/tsconfig.json +0 -18
  379. package/dist/templates/ts-library/.dockerignore +0 -2
  380. package/dist/templates/ts-library/.eslintrc.js +0 -24
  381. package/dist/templates/ts-library/.gitlab-ci.yml +0 -136
  382. package/dist/templates/ts-library/.prettierrc +0 -6
  383. package/dist/templates/ts-library/Makefile +0 -58
  384. package/dist/templates/ts-library/index.ts +0 -1
  385. package/dist/templates/ts-library/lib/index.ts +0 -1
  386. package/dist/templates/ts-library/lib/samples/index.ts +0 -5
  387. package/dist/templates/ts-library/lib/samples/samples-function.ts +0 -3
  388. package/dist/templates/ts-library/test/sample.e2e-spec.ts +0 -10
  389. package/dist/templates/ts-library/tsconfig.build.json +0 -4
  390. package/dist/utils/help.js +0 -8
  391. package/dist/utils/help.js.map +0 -1
  392. package/tsconfig.json +0 -24
  393. /package/dist/templates/{nestjs-api/.eslintrc.js → turbo-nestjs-vuexy/packages/eslint-config/nest.js} +0 -0
@@ -0,0 +1,92 @@
1
+ <!-- Thanks: https://markus.oberlehner.net/blog/transition-to-height-auto-with-vue/ -->
2
+
3
+ <script lang="ts">
4
+ import { Transition } from 'vue'
5
+
6
+ export default defineComponent({
7
+ name: 'TransitionExpand',
8
+ setup(_, { slots }) {
9
+ const onEnter = (element: HTMLElement) => {
10
+ const width = getComputedStyle(element).width
11
+
12
+ element.style.width = width
13
+ element.style.position = 'absolute'
14
+ element.style.visibility = 'hidden'
15
+ element.style.height = 'auto'
16
+
17
+ const height = getComputedStyle(element).height
18
+
19
+ element.style.width = ''
20
+ element.style.position = ''
21
+ element.style.visibility = ''
22
+ element.style.height = '0px'
23
+
24
+ // Force repaint to make sure the
25
+ // animation is triggered correctly.
26
+ // eslint-disable-next-line no-unused-expressions
27
+ getComputedStyle(element).height
28
+
29
+ // Trigger the animation.
30
+ // We use `requestAnimationFrame` because we need
31
+ // to make sure the browser has finished
32
+ // painting after setting the `height`
33
+ // to `0` in the line above.
34
+ requestAnimationFrame(() => {
35
+ element.style.height = height
36
+ })
37
+ }
38
+
39
+ const onAfterEnter = (element: HTMLElement) => {
40
+ element.style.height = 'auto'
41
+ }
42
+
43
+ const onLeave = (element: HTMLElement) => {
44
+ const height = getComputedStyle(element).height
45
+
46
+ element.style.height = height
47
+
48
+ // Force repaint to make sure the
49
+ // animation is triggered correctly.
50
+ // eslint-disable-next-line no-unused-expressions
51
+ getComputedStyle(element).height
52
+
53
+ requestAnimationFrame(() => {
54
+ element.style.height = '0px'
55
+ })
56
+ }
57
+
58
+ return () => h(
59
+ h(Transition),
60
+ {
61
+ name: 'expand',
62
+ onEnter,
63
+ onAfterEnter,
64
+ onLeave,
65
+ },
66
+ () => slots.default?.(),
67
+ )
68
+ },
69
+ })
70
+ </script>
71
+
72
+ <style>
73
+ .expand-enter-active,
74
+ .expand-leave-active {
75
+ overflow: hidden;
76
+ transition: block-size var(--expand-transition-duration, 0.25s) ease;
77
+ }
78
+
79
+ .expand-enter-from,
80
+ .expand-leave-to {
81
+ block-size: 0;
82
+ }
83
+ </style>
84
+
85
+ <style scoped>
86
+ * {
87
+ backface-visibility: hidden;
88
+ perspective: 1000px;
89
+ transform: translateZ(0);
90
+ will-change: block-size;
91
+ }
92
+ </style>
@@ -0,0 +1,17 @@
1
+ import type { PropType, VNode } from 'vue'
2
+
3
+ export const VNodeRenderer = defineComponent({
4
+ name: 'VNodeRenderer',
5
+ props: {
6
+ nodes: {
7
+ type: [Array, Object] as PropType<VNode | VNode[]>,
8
+ required: true,
9
+ },
10
+ },
11
+ setup(props) {
12
+ return () => props.nodes
13
+ },
14
+ })
15
+
16
+ // eslint-disable-next-line @typescript-eslint/no-redeclare
17
+ export type VNodeRenderer = InstanceType<typeof VNodeRenderer>
@@ -0,0 +1,236 @@
1
+ <script lang="ts" setup>
2
+ import type { Component } from 'vue'
3
+ import { PerfectScrollbar } from 'vue3-perfect-scrollbar'
4
+ import { VNodeRenderer } from './VNodeRenderer'
5
+ import { layoutConfig } from '@layouts'
6
+ import { VerticalNavGroup, VerticalNavLink, VerticalNavSectionTitle } from '@layouts/components'
7
+ import { useLayoutConfigStore } from '@layouts/stores/config'
8
+ import { injectionKeyIsVerticalNavHovered } from '@layouts/symbols'
9
+ import type { NavGroup, NavLink, NavSectionTitle, VerticalNavItems } from '@layouts/types'
10
+
11
+ interface Props {
12
+ tag?: string | Component
13
+ navItems: VerticalNavItems
14
+ isOverlayNavActive: boolean
15
+ toggleIsOverlayNavActive: (value: boolean) => void
16
+ }
17
+
18
+ const props = withDefaults(defineProps<Props>(), {
19
+ tag: 'aside',
20
+ })
21
+
22
+ const refNav = ref()
23
+
24
+ const isHovered = useElementHover(refNav)
25
+
26
+ provide(injectionKeyIsVerticalNavHovered, isHovered)
27
+
28
+ const configStore = useLayoutConfigStore()
29
+
30
+ const resolveNavItemComponent = (item: NavLink | NavSectionTitle | NavGroup): unknown => {
31
+ if ('heading' in item)
32
+ return VerticalNavSectionTitle
33
+ if ('children' in item)
34
+ return VerticalNavGroup
35
+
36
+ return VerticalNavLink
37
+ }
38
+
39
+ /*
40
+ ℹ️ Close overlay side when route is changed
41
+ Close overlay vertical nav when link is clicked
42
+ */
43
+ const route = useRoute()
44
+
45
+ watch(() => route.name, () => {
46
+ props.toggleIsOverlayNavActive(false)
47
+ })
48
+
49
+ const isVerticalNavScrolled = ref(false)
50
+ const updateIsVerticalNavScrolled = (val: boolean) => isVerticalNavScrolled.value = val
51
+
52
+ const handleNavScroll = (evt: Event) => {
53
+ isVerticalNavScrolled.value = (evt.target as HTMLElement).scrollTop > 0
54
+ }
55
+
56
+ const hideTitleAndIcon = configStore.isVerticalNavMini(isHovered)
57
+ </script>
58
+
59
+ <template>
60
+ <Component
61
+ :is="props.tag"
62
+ ref="refNav"
63
+ class="layout-vertical-nav"
64
+ :class="[
65
+ {
66
+ 'overlay-nav': configStore.isLessThanOverlayNavBreakpoint,
67
+ 'hovered': isHovered,
68
+ 'visible': isOverlayNavActive,
69
+ 'scrolled': isVerticalNavScrolled,
70
+ },
71
+ ]"
72
+ >
73
+ <!-- 👉 Header -->
74
+ <div class="nav-header">
75
+ <slot name="nav-header">
76
+ <RouterLink
77
+ to="/"
78
+ class="app-logo app-title-wrapper"
79
+ >
80
+ <VNodeRenderer :nodes="layoutConfig.app.logo" />
81
+
82
+ <Transition name="vertical-nav-app-title">
83
+ <h1
84
+ v-show="!hideTitleAndIcon"
85
+ class="app-logo-title"
86
+ >
87
+ {{ layoutConfig.app.title }}
88
+ </h1>
89
+ </Transition>
90
+ </RouterLink>
91
+ <!-- 👉 Vertical nav actions -->
92
+ <!-- Show toggle collapsible in >md and close button in <md -->
93
+ <Component
94
+ :is="layoutConfig.app.iconRenderer || 'div'"
95
+ v-show="configStore.isVerticalNavCollapsed"
96
+ class="header-action d-none nav-unpin"
97
+ :class="configStore.isVerticalNavCollapsed && 'd-lg-block'"
98
+ v-bind="layoutConfig.icons.verticalNavUnPinned"
99
+ @click="configStore.isVerticalNavCollapsed = !configStore.isVerticalNavCollapsed"
100
+ />
101
+ <Component
102
+ :is="layoutConfig.app.iconRenderer || 'div'"
103
+ v-show="!configStore.isVerticalNavCollapsed"
104
+ class="header-action d-none nav-pin"
105
+ :class="!configStore.isVerticalNavCollapsed && 'd-lg-block'"
106
+ v-bind="layoutConfig.icons.verticalNavPinned"
107
+ @click="configStore.isVerticalNavCollapsed = !configStore.isVerticalNavCollapsed"
108
+ />
109
+ <Component
110
+ :is="layoutConfig.app.iconRenderer || 'div'"
111
+ class="header-action d-lg-none"
112
+ v-bind="layoutConfig.icons.close"
113
+ @click="toggleIsOverlayNavActive(false)"
114
+ />
115
+ </slot>
116
+ </div>
117
+ <slot name="before-nav-items">
118
+ <div class="vertical-nav-items-shadow" />
119
+ </slot>
120
+ <slot
121
+ name="nav-items"
122
+ :update-is-vertical-nav-scrolled="updateIsVerticalNavScrolled"
123
+ >
124
+ <PerfectScrollbar
125
+ :key="configStore.isAppRTL"
126
+ tag="ul"
127
+ class="nav-items"
128
+ :options="{ wheelPropagation: false }"
129
+ @ps-scroll-y="handleNavScroll"
130
+ >
131
+ <Component
132
+ :is="resolveNavItemComponent(item)"
133
+ v-for="(item, index) in navItems"
134
+ :key="index"
135
+ :item="item"
136
+ />
137
+ </PerfectScrollbar>
138
+ </slot>
139
+ </Component>
140
+ </template>
141
+
142
+ <style lang="scss" scoped>
143
+ .app-logo {
144
+ display: flex;
145
+ align-items: center;
146
+ column-gap: 0.75rem;
147
+
148
+ .app-logo-title {
149
+ font-size: 1.375rem;
150
+ font-weight: 700;
151
+ letter-spacing: 0.25px;
152
+ line-height: 1.5rem;
153
+ text-transform: capitalize;
154
+ }
155
+ }
156
+ </style>
157
+
158
+ <style lang="scss">
159
+ @use "@configured-variables" as variables;
160
+ @use "@layouts/styles/mixins";
161
+
162
+ // 👉 Vertical Nav
163
+ .layout-vertical-nav {
164
+ position: fixed;
165
+ z-index: variables.$layout-vertical-nav-z-index;
166
+ display: flex;
167
+ flex-direction: column;
168
+ block-size: 100%;
169
+ inline-size: variables.$layout-vertical-nav-width;
170
+ inset-block-start: 0;
171
+ inset-inline-start: 0;
172
+ transition: inline-size 0.25s ease-in-out, box-shadow 0.25s ease-in-out;
173
+ will-change: transform, inline-size;
174
+
175
+ .nav-header {
176
+ display: flex;
177
+ align-items: center;
178
+
179
+ .header-action {
180
+ cursor: pointer;
181
+
182
+ @at-root {
183
+ #{variables.$selector-vertical-nav-mini} .nav-header .header-action {
184
+ &.nav-pin,
185
+ &.nav-unpin {
186
+ display: none !important;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+
193
+ .app-title-wrapper {
194
+ margin-inline-end: auto;
195
+ }
196
+
197
+ .nav-items {
198
+ block-size: 100%;
199
+
200
+ // ℹ️ We no loner needs this overflow styles as perfect scrollbar applies it
201
+ // overflow-x: hidden;
202
+
203
+ // // ℹ️ We used `overflow-y` instead of `overflow` to mitigate overflow x. Revert back if any issue found.
204
+ // overflow-y: auto;
205
+ }
206
+
207
+ .nav-item-title {
208
+ overflow: hidden;
209
+ margin-inline-end: auto;
210
+ text-overflow: ellipsis;
211
+ white-space: nowrap;
212
+ }
213
+
214
+ // 👉 Collapsed
215
+ .layout-vertical-nav-collapsed & {
216
+ &:not(.hovered) {
217
+ inline-size: variables.$layout-vertical-nav-collapsed-width;
218
+ }
219
+ }
220
+ }
221
+
222
+ // Small screen vertical nav transition
223
+ @media (max-width: 1279px) {
224
+ .layout-vertical-nav {
225
+ &:not(.visible) {
226
+ transform: translateX(-#{variables.$layout-vertical-nav-width});
227
+
228
+ @include mixins.rtl {
229
+ transform: translateX(variables.$layout-vertical-nav-width);
230
+ }
231
+ }
232
+
233
+ transition: transform 0.25s ease-in-out;
234
+ }
235
+ }
236
+ </style>
@@ -0,0 +1,267 @@
1
+ <script lang="ts" setup>
2
+ import { TransitionGroup } from 'vue'
3
+ import { layoutConfig } from '@layouts'
4
+ import { TransitionExpand, VerticalNavLink } from '@layouts/components'
5
+ import { canViewNavMenuGroup } from '@layouts/plugins/casl'
6
+ import { useLayoutConfigStore } from '@layouts/stores/config'
7
+ import { injectionKeyIsVerticalNavHovered } from '@layouts/symbols'
8
+ import type { NavGroup } from '@layouts/types'
9
+ import { getDynamicI18nProps, isNavGroupActive, openGroups } from '@layouts/utils'
10
+
11
+ defineOptions({
12
+ name: 'VerticalNavGroup',
13
+ })
14
+
15
+ const props = defineProps<{
16
+ item: NavGroup
17
+ }>()
18
+
19
+ const route = useRoute()
20
+ const router = useRouter()
21
+ const configStore = useLayoutConfigStore()
22
+ const hideTitleAndBadge = configStore.isVerticalNavMini()
23
+
24
+ /*
25
+ ℹ️ We provided default value `ref(false)` because inject will return `T | undefined`
26
+ Docs: https://vuejs.org/api/composition-api-dependency-injection.html#inject
27
+ */
28
+ const isVerticalNavHovered = inject(injectionKeyIsVerticalNavHovered, ref(false))
29
+
30
+ /*
31
+ ℹ️ We have to add watcher for `isVerticalNavCollapsed` to open & close the group when menu collapse state is changed
32
+ We can't rely on watcher for `isVerticalNavHovered` because nav menu can be collapsed via customizer (basically without entering mouse inside nav menu)
33
+ Hence, watcher for `isVerticalNavHovered` won't get triggered and there will no change in open state of nav group when menu is collapsed via customizer.
34
+ */
35
+ // watch(isVerticalNavCollapsed, value => {
36
+ // // If mouse in nav menu `isVerticalNavHovered` watcher will take care of open/close group
37
+ // if (isVerticalNavHovered.value)
38
+ // return
39
+
40
+ // isGroupOpen.value = value ? false : isGroupActive.value
41
+ // })
42
+
43
+ const isGroupActive = ref(false)
44
+ const isGroupOpen = ref(false)
45
+
46
+ /**
47
+ * Checks if any of children group is open or not.
48
+ * This is helpful in preventing closing inactive parent group when inactive child group is opened. (i.e. Do not close "Nav Levels" group if child "Nav Level 2.2" is opened/clicked)
49
+ *
50
+ * @param {NavGroup['children']} children - Nav group children
51
+ * @return {boolean} returns if any of children is open or not.
52
+ */
53
+ const isAnyChildOpen = (children: NavGroup['children']): boolean => {
54
+ return children.some(child => {
55
+ let result = openGroups.value.includes(child.title)
56
+
57
+ if ('children' in child)
58
+ result = isAnyChildOpen(child.children) || result
59
+
60
+ return result
61
+ })
62
+ }
63
+
64
+ const collapseChildren = (children: NavGroup['children']) => {
65
+ children.forEach(child => {
66
+ if ('children' in child)
67
+ collapseChildren(child.children)
68
+
69
+ openGroups.value = openGroups.value.filter(group => group !== child.title)
70
+ })
71
+ }
72
+
73
+ /*
74
+ Watch for route changes, more specifically route path. Do note that this won't trigger if route's query is updated.
75
+
76
+ updates isActive & isOpen based on active state of group.
77
+ */
78
+ watch(() => route.path, () => {
79
+ const isActive = isNavGroupActive(props.item.children, router)
80
+
81
+ // Don't open group if vertical nav is collapsed and window size is more than overlay nav breakpoint
82
+ isGroupOpen.value = isActive && !configStore.isVerticalNavMini(isVerticalNavHovered).value
83
+ isGroupActive.value = isActive
84
+ }, { immediate: true })
85
+
86
+ /*
87
+ Watch for isGroupOpen
88
+
89
+ 1. Find group index for adding/removing group from openGroups array
90
+ 2. update openGroups array for addition/removal of current group
91
+
92
+ We need `immediate: true` because without it initially opened group is not added in openGroups array
93
+ */
94
+ watch(isGroupOpen, (val: boolean) => {
95
+ // Find group index for adding/removing group from openGroups array
96
+ const grpIndex = openGroups.value.indexOf(props.item.title)
97
+
98
+ // update openGroups array for addition/removal of current group
99
+
100
+ // If group is opened => Add it to `openGroups` array
101
+ if (val && grpIndex === -1) {
102
+ openGroups.value.push(props.item.title)
103
+ }
104
+
105
+ // If group is closed remove itself and its children from the `openGroups`
106
+ else if (!val && grpIndex !== -1) {
107
+ openGroups.value.splice(grpIndex, 1)
108
+ collapseChildren(props.item.children)
109
+ }
110
+ }, { immediate: true })
111
+
112
+ /*
113
+ Watch for openGroups
114
+
115
+ It will help in making vertical nav adapting the behavior of accordion.
116
+ If we open multiple groups without navigating to any route we must close the inactive or temporarily opened groups.
117
+
118
+ 😵‍💫 Gotchas:
119
+ * If we open inactive group then it will auto close that group because we close groups based on active state.
120
+ Goal of this watcher is auto close groups which are not active when openGroups array is updated.
121
+ So, we have to find a way to do not close recently opened inactive group.
122
+ For this we will fetch recently added group in openGroups array and won't perform closing operation if recently added group is current group
123
+ */
124
+ watch(openGroups, val => {
125
+ // Prevent closing recently opened inactive group.
126
+ const lastOpenedGroup = val.at(-1)
127
+ if (lastOpenedGroup === props.item.title)
128
+ return
129
+
130
+ const isActive = isNavGroupActive(props.item.children, router)
131
+
132
+ // Goal of this watcher is to close inactive groups. So don't do anything for active groups.
133
+ if (isActive)
134
+ return
135
+
136
+ // We won't close group if any of child group is open in current group
137
+ if (isAnyChildOpen(props.item.children))
138
+ return
139
+
140
+ isGroupOpen.value = isActive
141
+ isGroupActive.value = isActive
142
+ }, { deep: true })
143
+
144
+ // ℹ️ Previously instead of below watcher we were using two individual watcher for `isVerticalNavHovered`, `isVerticalNavCollapsed` & `isLessThanOverlayNavBreakpoint`
145
+ watch(
146
+ configStore.isVerticalNavMini(isVerticalNavHovered),
147
+ val => {
148
+ isGroupOpen.value = val ? false : isGroupActive.value
149
+ },
150
+ )
151
+
152
+ // watch(isVerticalNavHovered, val => {
153
+ // // If menu is not collapsed ignore
154
+ // if (!(isVerticalNavCollapsed.value && !isLessThanOverlayNavBreakpoint.value(windowWidth.value)))
155
+ // return
156
+
157
+ // isGroupOpen.value = val ? isGroupActive.value : false
158
+ // })
159
+
160
+ /*
161
+ Update: We don't need this watcher any more because we have new watch isVerticalNavMini that includes this one
162
+ ℹ️ We need this watcher to
163
+ - Collapse the group when going to `lgAndUp` if vertical nav is collapsed (else block)
164
+ - Expand the group if it's active and screen is `mdAndDown`. Because in this screen vertical nav will be overlay nav
165
+ */
166
+ // watch(() => isLessThanOverlayNavBreakpoint.value(windowWidth.value), isLessThanOverlayNavBreakpoint_ => {
167
+ // // If window size is more than overlay nav breakpoint => expand group if its active
168
+ // if (isLessThanOverlayNavBreakpoint_) { isGroupOpen.value = isGroupActive.value }
169
+
170
+ // else {
171
+ // if (isVerticalNavCollapsed.value)
172
+ // isGroupOpen.value = false
173
+ // }
174
+ // })
175
+
176
+ const isMounted = useMounted()
177
+ </script>
178
+
179
+ <template>
180
+ <li
181
+ v-if="canViewNavMenuGroup(item)"
182
+ class="nav-group"
183
+ :class="[
184
+ {
185
+ active: isGroupActive,
186
+ open: isGroupOpen,
187
+ disabled: item.disable,
188
+ },
189
+ ]"
190
+ >
191
+ <div
192
+ class="nav-group-label"
193
+ @click="isGroupOpen = !isGroupOpen"
194
+ >
195
+ <Component
196
+ :is="layoutConfig.app.iconRenderer || 'div'"
197
+ v-bind="item.icon || layoutConfig.verticalNav.defaultNavItemIconProps"
198
+ class="nav-item-icon"
199
+ />
200
+ <!--
201
+ ℹ️ isMounted is workaround of nuxt's hydration issue:
202
+ https://github.com/vuejs/core/issues/6715
203
+ -->
204
+ <Component
205
+ :is="isMounted ? TransitionGroup : 'div'"
206
+ name="transition-slide-x"
207
+ v-bind="!isMounted ? { class: 'd-flex align-center flex-grow-1' } : undefined"
208
+ >
209
+ <!-- 👉 Title -->
210
+ <Component
211
+ :is=" layoutConfig.app.i18n.enable ? 'i18n-t' : 'span'"
212
+ v-bind="getDynamicI18nProps(item.title, 'span')"
213
+ v-show="!hideTitleAndBadge"
214
+ key="title"
215
+ class="nav-item-title"
216
+ >
217
+ {{ item.title }}
218
+ </Component>
219
+
220
+ <!-- 👉 Badge -->
221
+ <Component
222
+ :is="layoutConfig.app.i18n.enable ? 'i18n-t' : 'span'"
223
+ v-bind="getDynamicI18nProps(item.badgeContent, 'span')"
224
+ v-show="!hideTitleAndBadge"
225
+ v-if="item.badgeContent"
226
+ key="badge"
227
+ class="nav-item-badge"
228
+ :class="item.badgeClass"
229
+ >
230
+ {{ item.badgeContent }}
231
+ </Component>
232
+ <Component
233
+ :is="layoutConfig.app.iconRenderer || 'div'"
234
+ v-show="!hideTitleAndBadge"
235
+ v-bind="layoutConfig.icons.chevronRight"
236
+ key="arrow"
237
+ class="nav-group-arrow"
238
+ />
239
+ </Component>
240
+ </div>
241
+ <TransitionExpand>
242
+ <ul
243
+ v-show="isGroupOpen"
244
+ class="nav-group-children"
245
+ >
246
+ <Component
247
+ :is="'children' in child ? 'VerticalNavGroup' : VerticalNavLink"
248
+ v-for="child in item.children"
249
+ :key="child.title"
250
+ :item="child"
251
+ />
252
+ </ul>
253
+ </TransitionExpand>
254
+ </li>
255
+ </template>
256
+
257
+ <style lang="scss">
258
+ .layout-vertical-nav {
259
+ .nav-group {
260
+ &-label {
261
+ display: flex;
262
+ align-items: center;
263
+ cursor: pointer;
264
+ }
265
+ }
266
+ }
267
+ </style>