@vc-shell/framework 1.0.38 → 1.0.40

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 (256) hide show
  1. package/core/api/index.ts +1 -0
  2. package/core/api/platform.ts +8332 -0
  3. package/core/composables/index.ts +8 -0
  4. package/core/composables/useAutosave/index.ts +57 -0
  5. package/core/composables/useFunctions/debounce.ts +18 -0
  6. package/core/composables/useFunctions/delay.ts +7 -0
  7. package/core/composables/useFunctions/index.ts +21 -0
  8. package/core/composables/useFunctions/once.ts +14 -0
  9. package/core/composables/useFunctions/sleep.ts +4 -0
  10. package/core/composables/useFunctions/throttle.ts +17 -0
  11. package/core/composables/useI18n/index.ts +28 -0
  12. package/core/composables/useLogger/index.ts +24 -0
  13. package/core/composables/useNotifications/index.ts +116 -0
  14. package/core/composables/usePermissions/index.ts +32 -0
  15. package/core/composables/useSettings/index.ts +62 -0
  16. package/core/composables/useUser/index.ts +266 -0
  17. package/core/directives/autofocus/index.ts +9 -0
  18. package/core/directives/click-outside/index.ts +21 -0
  19. package/core/directives/index.ts +4 -0
  20. package/core/directives/loading/index.ts +28 -0
  21. package/core/directives/permissions/index.ts +20 -0
  22. package/core/plugins/index.ts +1 -0
  23. package/core/plugins/validation/index.ts +2 -0
  24. package/core/plugins/validation/rules.ts +196 -0
  25. package/core/types/index.ts +92 -0
  26. package/core/utilities/camelToSnake.ts +7 -0
  27. package/core/utilities/index.ts +1 -0
  28. package/dist/core/composables/useNotifications/index.d.ts +1 -1
  29. package/dist/core/composables/useNotifications/index.d.ts.map +1 -1
  30. package/dist/core/composables/useSettings/index.d.ts +10 -1
  31. package/dist/core/composables/useSettings/index.d.ts.map +1 -1
  32. package/dist/core/composables/useUser/index.d.ts +2 -2
  33. package/dist/core/composables/useUser/index.d.ts.map +1 -1
  34. package/dist/core/plugins/validation/index.d.ts.map +1 -1
  35. package/dist/core/types/index.d.ts +1 -1
  36. package/dist/core/types/index.d.ts.map +1 -1
  37. package/dist/framework.js +72 -99
  38. package/dist/framework.js.map +1 -1
  39. package/dist/index.d.ts +3 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/shared/app-switcher/composables/useAppSwitcher/index.d.ts +1 -1
  42. package/dist/shared/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -1
  43. package/dist/shared/app-switcher/index.d.ts +2 -2
  44. package/dist/shared/app-switcher/index.d.ts.map +1 -1
  45. package/dist/shared/blade-navigation/composables/useBladeNavigation/index.d.ts +1 -1
  46. package/dist/shared/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  47. package/dist/shared/blade-navigation/types/index.d.ts +1 -1
  48. package/dist/shared/blade-navigation/types/index.d.ts.map +1 -1
  49. package/dist/style.css +1 -1
  50. package/dist/tsconfig.tsbuildinfo +1 -0
  51. package/dist/ui/components/atoms/vc-badge/index.d.ts +5 -0
  52. package/dist/ui/components/atoms/vc-badge/index.d.ts.map +1 -0
  53. package/dist/ui/components/atoms/vc-badge/vc-badge-model.d.ts +28 -0
  54. package/dist/ui/components/atoms/vc-badge/vc-badge-model.d.ts.map +1 -0
  55. package/dist/{components → ui/components}/atoms/vc-badge/vc-badge.stories.d.ts +0 -0
  56. package/dist/ui/components/atoms/vc-badge/vc-badge.stories.d.ts.map +1 -0
  57. package/dist/ui/components/atoms/vc-button/index.d.ts +5 -0
  58. package/dist/ui/components/atoms/vc-button/index.d.ts.map +1 -0
  59. package/dist/ui/components/atoms/vc-button/vc-button-model.d.ts +28 -0
  60. package/dist/ui/components/atoms/vc-button/vc-button-model.d.ts.map +1 -0
  61. package/dist/{components → ui/components}/atoms/vc-button/vc-button.stories.d.ts +0 -0
  62. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts.map +1 -0
  63. package/dist/{components → ui/components}/atoms/vc-checkbox/vc-checkbox.stories.d.ts +0 -0
  64. package/dist/ui/components/atoms/vc-checkbox/vc-checkbox.stories.d.ts.map +1 -0
  65. package/dist/{components → ui/components}/atoms/vc-container/vc-container.stories.d.ts +0 -0
  66. package/dist/ui/components/atoms/vc-container/vc-container.stories.d.ts.map +1 -0
  67. package/dist/{components → ui/components}/atoms/vc-hint/vc-hint.stories.d.ts +0 -0
  68. package/dist/ui/components/atoms/vc-hint/vc-hint.stories.d.ts.map +1 -0
  69. package/dist/{components → ui/components}/atoms/vc-icon/vc-icon.stories.d.ts +0 -0
  70. package/dist/ui/components/atoms/vc-icon/vc-icon.stories.d.ts.map +1 -0
  71. package/dist/{components → ui/components}/atoms/vc-image/vc-image.stories.d.ts +0 -0
  72. package/dist/ui/components/atoms/vc-image/vc-image.stories.d.ts.map +1 -0
  73. package/dist/{components → ui/components}/atoms/vc-label/vc-label.stories.d.ts +0 -0
  74. package/dist/ui/components/atoms/vc-label/vc-label.stories.d.ts.map +1 -0
  75. package/dist/{components → ui/components}/atoms/vc-link/vc-link.stories.d.ts +0 -0
  76. package/dist/ui/components/atoms/vc-link/vc-link.stories.d.ts.map +1 -0
  77. package/dist/{components → ui/components}/atoms/vc-progress/vc-progress.stories.d.ts +0 -0
  78. package/dist/ui/components/atoms/vc-progress/vc-progress.stories.d.ts.map +1 -0
  79. package/dist/{components → ui/components}/atoms/vc-status/vc-status.stories.d.ts +0 -0
  80. package/dist/ui/components/atoms/vc-status/vc-status.stories.d.ts.map +1 -0
  81. package/dist/{components → ui/components}/atoms/vc-switch/vc-switch.stories.d.ts +0 -0
  82. package/dist/ui/components/atoms/vc-switch/vc-switch.stories.d.ts.map +1 -0
  83. package/dist/{components → ui/components}/index.d.ts +4 -3
  84. package/dist/ui/components/index.d.ts.map +1 -0
  85. package/dist/{components → ui/components}/molecules/vc-breadcrumbs/vc-breadcrumbs.stories.d.ts +0 -0
  86. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.stories.d.ts.map +1 -0
  87. package/dist/{components → ui/components}/molecules/vc-form/vc-form.stories.d.ts +0 -0
  88. package/dist/ui/components/molecules/vc-form/vc-form.stories.d.ts.map +1 -0
  89. package/dist/ui/components/molecules/vc-input/index.d.ts +5 -0
  90. package/dist/ui/components/molecules/vc-input/index.d.ts.map +1 -0
  91. package/dist/ui/components/molecules/vc-input/vc-input-model.d.ts +140 -0
  92. package/dist/ui/components/molecules/vc-input/vc-input-model.d.ts.map +1 -0
  93. package/dist/ui/components/molecules/vc-input-currency/index.d.ts +5 -0
  94. package/dist/ui/components/molecules/vc-input-currency/index.d.ts.map +1 -0
  95. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency-model.d.ts +124 -0
  96. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency-model.d.ts.map +1 -0
  97. package/dist/{components → ui/components}/molecules/vc-pagination/vc-pagination.stories.d.ts +0 -0
  98. package/dist/ui/components/molecules/vc-pagination/vc-pagination.stories.d.ts.map +1 -0
  99. package/dist/{components → ui/components}/molecules/vc-rating/vc-rating.stories.d.ts +0 -0
  100. package/dist/ui/components/molecules/vc-rating/vc-rating.stories.d.ts.map +1 -0
  101. package/dist/ui/components/molecules/vc-select/index.d.ts +5 -0
  102. package/dist/ui/components/molecules/vc-select/index.d.ts.map +1 -0
  103. package/dist/ui/components/molecules/vc-select/vc-select-model.d.ts +207 -0
  104. package/dist/ui/components/molecules/vc-select/vc-select-model.d.ts.map +1 -0
  105. package/dist/{components → ui/components}/molecules/vc-textarea/vc-textarea.stories.d.ts +0 -0
  106. package/dist/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts.map +1 -0
  107. package/dist/{components → ui/components}/organisms/vc-app/vc-app.stories.d.ts +0 -0
  108. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -0
  109. package/dist/{components → ui/components}/organisms/vc-blade/vc-blade.stories.d.ts +0 -0
  110. package/dist/ui/components/organisms/vc-blade/vc-blade.stories.d.ts.map +1 -0
  111. package/dist/{components → ui/components}/organisms/vc-login-form/vc-login-form.stories.d.ts +0 -0
  112. package/dist/ui/components/organisms/vc-login-form/vc-login-form.stories.d.ts.map +1 -0
  113. package/dist/{components → ui/components}/organisms/vc-popup/vc-popup.stories.d.ts +0 -0
  114. package/dist/ui/components/organisms/vc-popup/vc-popup.stories.d.ts.map +1 -0
  115. package/dist/{components → ui/components}/organisms/vc-table/vc-table.stories.d.ts +0 -0
  116. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -0
  117. package/dist/ui/types/index.d.ts +13 -0
  118. package/dist/ui/types/index.d.ts.map +1 -0
  119. package/dist/ui/types/ts-helpers.d.ts +13 -0
  120. package/dist/ui/types/ts-helpers.d.ts.map +1 -0
  121. package/dist/vite.config.d.ts.map +1 -1
  122. package/package.json +30 -10
  123. package/shared/app-switcher/components/index.ts +1 -0
  124. package/shared/app-switcher/components/vc-app-switcher/vc-app-switcher.vue +90 -0
  125. package/shared/app-switcher/composables/index.ts +1 -0
  126. package/shared/app-switcher/composables/useAppSwitcher/index.ts +54 -0
  127. package/shared/app-switcher/index.ts +14 -0
  128. package/shared/assets/components/assets-details/assets-details.vue +138 -0
  129. package/shared/assets/components/index.ts +1 -0
  130. package/shared/assets/index.ts +19 -0
  131. package/shared/assets/locales/en.json +29 -0
  132. package/shared/assets/locales/index.ts +2 -0
  133. package/shared/blade-navigation/components/index.ts +1 -0
  134. package/shared/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +84 -0
  135. package/shared/blade-navigation/composables/index.ts +1 -0
  136. package/shared/blade-navigation/composables/useBladeNavigation/index.ts +216 -0
  137. package/shared/blade-navigation/index.ts +15 -0
  138. package/shared/blade-navigation/types/index.ts +52 -0
  139. package/shared/index.ts +16 -0
  140. package/tailwind.config.js +4 -3
  141. package/ui/components/atoms/vc-badge/index.ts +7 -0
  142. package/ui/components/atoms/vc-badge/vc-badge-model.ts +30 -0
  143. package/ui/components/atoms/vc-badge/vc-badge.stories.ts +27 -0
  144. package/ui/components/atoms/vc-badge/vc-badge.vue +57 -0
  145. package/ui/components/atoms/vc-button/index.ts +7 -0
  146. package/ui/components/atoms/vc-button/vc-button-model.ts +30 -0
  147. package/ui/components/atoms/vc-button/vc-button.stories.ts +34 -0
  148. package/ui/components/atoms/vc-button/vc-button.vue +219 -0
  149. package/ui/components/atoms/vc-card/vc-card.vue +137 -0
  150. package/ui/components/atoms/vc-checkbox/vc-checkbox.stories.ts +25 -0
  151. package/ui/components/atoms/vc-checkbox/vc-checkbox.vue +130 -0
  152. package/ui/components/atoms/vc-col/vc-col.vue +22 -0
  153. package/ui/components/atoms/vc-container/vc-container.stories.ts +31 -0
  154. package/ui/components/atoms/vc-container/vc-container.vue +222 -0
  155. package/ui/components/atoms/vc-hint/vc-hint.stories.ts +23 -0
  156. package/ui/components/atoms/vc-hint/vc-hint.vue +11 -0
  157. package/ui/components/atoms/vc-icon/vc-icon.stories.ts +32 -0
  158. package/ui/components/atoms/vc-icon/vc-icon.vue +36 -0
  159. package/ui/components/atoms/vc-image/vc-image.stories.ts +40 -0
  160. package/ui/components/atoms/vc-image/vc-image.vue +122 -0
  161. package/ui/components/atoms/vc-info-row/vc-info-row.vue +42 -0
  162. package/ui/components/atoms/vc-label/vc-label.stories.ts +23 -0
  163. package/ui/components/atoms/vc-label/vc-label.vue +49 -0
  164. package/ui/components/atoms/vc-link/vc-link.stories.ts +30 -0
  165. package/ui/components/atoms/vc-link/vc-link.vue +46 -0
  166. package/ui/components/atoms/vc-loading/vc-loading.vue +33 -0
  167. package/ui/components/atoms/vc-progress/vc-progress.stories.ts +25 -0
  168. package/ui/components/atoms/vc-progress/vc-progress.vue +65 -0
  169. package/ui/components/atoms/vc-row/vc-row.vue +13 -0
  170. package/ui/components/atoms/vc-status/vc-status.stories.ts +26 -0
  171. package/ui/components/atoms/vc-status/vc-status.vue +78 -0
  172. package/ui/components/atoms/vc-status-icon/vc-status-icon.vue +21 -0
  173. package/ui/components/atoms/vc-switch/vc-switch.stories.ts +27 -0
  174. package/ui/components/atoms/vc-switch/vc-switch.vue +100 -0
  175. package/ui/components/atoms/vc-widget/vc-widget.vue +85 -0
  176. package/ui/components/index.ts +44 -0
  177. package/ui/components/molecules/vc-breadcrumbs/_internal/vc-breadcrumbs-item/vc-breadcrumbs-item.vue +103 -0
  178. package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.stories.ts +39 -0
  179. package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +21 -0
  180. package/ui/components/molecules/vc-currency-input/vc-input.vue +436 -0
  181. package/ui/components/molecules/vc-editor/vc-editor.vue +117 -0
  182. package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +134 -0
  183. package/ui/components/molecules/vc-form/vc-form.stories.ts +23 -0
  184. package/ui/components/molecules/vc-form/vc-form.vue +5 -0
  185. package/ui/components/molecules/vc-input/index.ts +8 -0
  186. package/ui/components/molecules/vc-input/vc-input-model.ts +150 -0
  187. package/ui/components/molecules/vc-input/vc-input.vue +324 -0
  188. package/ui/components/molecules/vc-input-currency/index.ts +8 -0
  189. package/ui/components/molecules/vc-input-currency/vc-input-currency-model.ts +128 -0
  190. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +86 -0
  191. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +447 -0
  192. package/ui/components/molecules/vc-notification/vc-notification.vue +101 -0
  193. package/ui/components/molecules/vc-pagination/vc-pagination.stories.ts +23 -0
  194. package/ui/components/molecules/vc-pagination/vc-pagination.vue +169 -0
  195. package/ui/components/molecules/vc-rating/vc-rating.stories.ts +23 -0
  196. package/ui/components/molecules/vc-rating/vc-rating.vue +77 -0
  197. package/ui/components/molecules/vc-select/index.ts +7 -0
  198. package/ui/components/molecules/vc-select/vc-select-model.ts +216 -0
  199. package/ui/components/molecules/vc-select/vc-select.vue +727 -0
  200. package/ui/components/molecules/vc-slider/vc-slider.vue +106 -0
  201. package/ui/components/molecules/vc-textarea/vc-textarea.stories.ts +23 -0
  202. package/ui/components/molecules/vc-textarea/vc-textarea.vue +155 -0
  203. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +150 -0
  204. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +148 -0
  205. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue +157 -0
  206. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +110 -0
  207. package/ui/components/organisms/vc-app/vc-app.stories.ts +75 -0
  208. package/ui/components/organisms/vc-app/vc-app.vue +169 -0
  209. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +126 -0
  210. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +223 -0
  211. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +67 -0
  212. package/ui/components/organisms/vc-blade/vc-blade.stories.ts +46 -0
  213. package/ui/components/organisms/vc-blade/vc-blade.vue +87 -0
  214. package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +426 -0
  215. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue +123 -0
  216. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue +93 -0
  217. package/ui/components/organisms/vc-gallery/vc-gallery.vue +186 -0
  218. package/ui/components/organisms/vc-login-form/vc-login-form.stories.ts +55 -0
  219. package/ui/components/organisms/vc-login-form/vc-login-form.vue +48 -0
  220. package/ui/components/organisms/vc-popup/vc-popup.stories.ts +23 -0
  221. package/ui/components/organisms/vc-popup/vc-popup.vue +97 -0
  222. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +113 -0
  223. package/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue +29 -0
  224. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +152 -0
  225. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue +272 -0
  226. package/ui/components/organisms/vc-table/vc-table.stories.ts +99 -0
  227. package/ui/components/organisms/vc-table/vc-table.vue +638 -0
  228. package/ui/types/index.ts +38 -0
  229. package/ui/types/ts-helpers.ts +46 -0
  230. package/dist/components/atoms/vc-badge/vc-badge.stories.d.ts.map +0 -1
  231. package/dist/components/atoms/vc-button/vc-button.stories.d.ts.map +0 -1
  232. package/dist/components/atoms/vc-checkbox/vc-checkbox.stories.d.ts.map +0 -1
  233. package/dist/components/atoms/vc-container/vc-container.stories.d.ts.map +0 -1
  234. package/dist/components/atoms/vc-hint/vc-hint.stories.d.ts.map +0 -1
  235. package/dist/components/atoms/vc-icon/vc-icon.stories.d.ts.map +0 -1
  236. package/dist/components/atoms/vc-image/vc-image.stories.d.ts.map +0 -1
  237. package/dist/components/atoms/vc-label/vc-label.stories.d.ts.map +0 -1
  238. package/dist/components/atoms/vc-link/vc-link.stories.d.ts.map +0 -1
  239. package/dist/components/atoms/vc-progress/vc-progress.stories.d.ts.map +0 -1
  240. package/dist/components/atoms/vc-status/vc-status.stories.d.ts.map +0 -1
  241. package/dist/components/atoms/vc-switch/vc-switch.stories.d.ts.map +0 -1
  242. package/dist/components/index.d.ts.map +0 -1
  243. package/dist/components/molecules/vc-breadcrumbs/vc-breadcrumbs.stories.d.ts.map +0 -1
  244. package/dist/components/molecules/vc-form/vc-form.stories.d.ts.map +0 -1
  245. package/dist/components/molecules/vc-input/vc-input.stories.d.ts +0 -7
  246. package/dist/components/molecules/vc-input/vc-input.stories.d.ts.map +0 -1
  247. package/dist/components/molecules/vc-pagination/vc-pagination.stories.d.ts.map +0 -1
  248. package/dist/components/molecules/vc-rating/vc-rating.stories.d.ts.map +0 -1
  249. package/dist/components/molecules/vc-select/vc-select.stories.d.ts +0 -7
  250. package/dist/components/molecules/vc-select/vc-select.stories.d.ts.map +0 -1
  251. package/dist/components/molecules/vc-textarea/vc-textarea.stories.d.ts.map +0 -1
  252. package/dist/components/organisms/vc-app/vc-app.stories.d.ts.map +0 -1
  253. package/dist/components/organisms/vc-blade/vc-blade.stories.d.ts.map +0 -1
  254. package/dist/components/organisms/vc-login-form/vc-login-form.stories.d.ts.map +0 -1
  255. package/dist/components/organisms/vc-popup/vc-popup.stories.d.ts.map +0 -1
  256. package/dist/components/organisms/vc-table/vc-table.stories.d.ts.map +0 -1
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <div class="vc-slider tw-relative">
3
+ <swiper-component
4
+ :class="[
5
+ 'vc-slider__swiper',
6
+ {
7
+ 'tw-overflow-visible': overflow,
8
+ 'tw-px-[40px]': navigation,
9
+ },
10
+ ]"
11
+ :space-between="spaceBetweenSlides"
12
+ :navigation="buttonsList"
13
+ :slidesPerView="slidesPerView"
14
+ :resizeObserver="true"
15
+ >
16
+ <swiper-slide v-for="(slide, i) in slides" :key="i">
17
+ <slot :slide="slide"></slot>
18
+ </swiper-slide>
19
+ </swiper-component>
20
+ <!-- Navigation buttons-->
21
+ <div v-show="navigation">
22
+ <div class="vc-slider__prev tw-left-0">
23
+ <slot name="prevBtn">
24
+ <div class="vc-slider__btn">
25
+ <VcIcon icon="fas fa-chevron-left"></VcIcon>
26
+ </div>
27
+ </slot>
28
+ </div>
29
+ <div class="vc-slider__next tw-right-0">
30
+ <slot name="nextBtn">
31
+ <div class="vc-slider__btn">
32
+ <VcIcon icon="fas fa-chevron-right"></VcIcon>
33
+ </div>
34
+ </slot>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </template>
39
+
40
+ <script lang="ts" setup>
41
+ import { computed } from "vue";
42
+ import { Swiper as SwiperComponent, SwiperSlide } from "swiper/vue";
43
+ import SwiperCore, { Navigation } from "swiper";
44
+ import "swiper/swiper-bundle.min.css";
45
+ import "swiper/swiper.min.css";
46
+ import "swiper/components/navigation/navigation.min.css";
47
+ SwiperCore.use([Navigation]);
48
+
49
+ defineProps({
50
+ slides: {
51
+ type: Array,
52
+ default: () => [],
53
+ },
54
+
55
+ navigation: {
56
+ type: Boolean,
57
+ default: false,
58
+ },
59
+
60
+ overflow: {
61
+ type: Boolean,
62
+ default: false,
63
+ },
64
+
65
+ slidesPerView: {
66
+ type: String,
67
+ default: "auto",
68
+ },
69
+
70
+ spaceBetweenSlides: {
71
+ type: Number,
72
+ default: 10,
73
+ },
74
+ });
75
+
76
+ const buttonsList = computed(() => ({
77
+ nextEl: ".vc-slider__next",
78
+ prevEl: ".vc-slider__prev",
79
+ }));
80
+ </script>
81
+
82
+ <style lang="scss" scoped>
83
+ .vc-slider {
84
+ &__swiper {
85
+ .swiper-slide {
86
+ @apply tw-w-auto;
87
+ }
88
+ }
89
+
90
+ &__next,
91
+ &__prev {
92
+ @apply tw-absolute tw-top-2/4 -tw-translate-y-2/4 tw-z-[2];
93
+
94
+ &.swiper-button-disabled .vc-slider__btn {
95
+ @apply tw-text-[#999999];
96
+ }
97
+ }
98
+
99
+ &__btn {
100
+ @apply tw-bg-white tw-border tw-border-solid tw-border-[#eaecf2]
101
+ tw-box-border tw-rounded-[3px]
102
+ tw-flex tw-items-center tw-justify-center
103
+ tw-text-[#43b0e6] tw-w-[30px] tw-h-[30px];
104
+ }
105
+ }
106
+ </style>
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Textarea component.
3
+ * @author Iurii A Taranov <me@flanker72.ru>
4
+ */
5
+ import { Story } from "@storybook/vue3";
6
+ import VcTextarea from "./vc-textarea.vue";
7
+
8
+ export default {
9
+ title: "atoms/vc-textarea",
10
+ component: VcTextarea,
11
+ };
12
+
13
+ const Template: Story = (args) => ({
14
+ components: { VcTextarea },
15
+ setup() {
16
+ return { args };
17
+ },
18
+ template: '<vc-textarea v-bind="args"></vc-textarea>',
19
+ });
20
+
21
+ export const Textarea = Template.bind({});
22
+ Textarea.storyName = "vc-textarea";
23
+ Textarea.args = {};
@@ -0,0 +1,155 @@
1
+ <template>
2
+ <div
3
+ class="vc-textarea"
4
+ :class="{
5
+ 'vc-textarea_error': errorMessage,
6
+ 'vc-textarea_disabled': disabled,
7
+ }"
8
+ >
9
+ <!-- Textarea label -->
10
+ <VcLabel v-if="label" class="tw-mb-2" :required="isRequired">
11
+ <span>{{ label }}</span>
12
+ <template v-if="tooltip" v-slot:tooltip>
13
+ <span v-html="tooltip"></span>
14
+ </template>
15
+ </VcLabel>
16
+
17
+ <!-- Textarea field -->
18
+ <div class="vc-textarea__field-wrapper">
19
+ <textarea
20
+ class="vc-textarea__field"
21
+ :placeholder="placeholder"
22
+ :value="modelValue"
23
+ :disabled="disabled"
24
+ @input="onInput"
25
+ :maxlength="maxchars"
26
+ ></textarea>
27
+ </div>
28
+
29
+ <slot v-if="errorMessage" name="error">
30
+ <VcHint class="vc-textarea__error">
31
+ {{ errorMessage }}
32
+ </VcHint>
33
+ </slot>
34
+ </div>
35
+ </template>
36
+
37
+ <script lang="ts" setup>
38
+ import { watch } from "vue";
39
+ import { VcLabel } from "@/ui/components";
40
+
41
+ const props = defineProps({
42
+ placeholder: {
43
+ type: String,
44
+ default: "",
45
+ },
46
+
47
+ modelValue: {
48
+ type: String,
49
+ default: undefined,
50
+ },
51
+
52
+ isRequired: {
53
+ type: Boolean,
54
+ default: false,
55
+ },
56
+
57
+ disabled: {
58
+ type: Boolean,
59
+ default: false,
60
+ },
61
+
62
+ label: {
63
+ type: String,
64
+ default: undefined,
65
+ },
66
+
67
+ tooltip: {
68
+ type: String,
69
+ default: undefined,
70
+ },
71
+
72
+ name: {
73
+ type: String,
74
+ default: "Field",
75
+ },
76
+
77
+ maxchars: {
78
+ type: String,
79
+ default: "1024",
80
+ },
81
+
82
+ errorMessage: {
83
+ type: String,
84
+ default: undefined,
85
+ },
86
+ });
87
+
88
+ const emit = defineEmits(["update:modelValue"]);
89
+
90
+ watch(
91
+ () => props.modelValue,
92
+ (value) => {
93
+ emit("update:modelValue", value);
94
+ }
95
+ );
96
+
97
+ // Handle input event to propertly validate value and emit changes
98
+ function onInput(e: InputEvent) {
99
+ const newValue = (e.target as HTMLInputElement).value;
100
+ emit("update:modelValue", newValue);
101
+ }
102
+ </script>
103
+
104
+ <style lang="scss">
105
+ :root {
106
+ --textarea-height: 120px;
107
+ --textarea-border-color: #d3dbe9;
108
+ --textarea-border-color-error: #f14e4e;
109
+ --textarea-border-radius: 3px;
110
+ --textarea-background-color: #ffffff;
111
+ --textarea-placeholder-color: #a5a5a5;
112
+ }
113
+
114
+ .vc-textarea {
115
+ &__field-wrapper {
116
+ @apply tw-border tw-border-solid
117
+ tw-border-[color:var(--textarea-border-color)]
118
+ tw-rounded-[var(--textarea-border-radius)]
119
+ tw-box-border
120
+ tw-bg-[color:var(--textarea-background-color)] tw-flex tw-items-stretch;
121
+ }
122
+
123
+ &_error &__field-wrapper {
124
+ @apply tw-border tw-border-solid tw-border-[color:var(--textarea-border-color-error)];
125
+ }
126
+
127
+ &__error {
128
+ @apply tw-text-[color:var(--textarea-border-color-error)] tw-mt-1 #{!important};
129
+ }
130
+
131
+ &__field {
132
+ @apply tw-w-full tw-resize-y tw-box-border tw-border-none tw-outline-none
133
+ tw-min-h-[var(--textarea-height)]
134
+ placeholder:tw-text-[color:var(--textarea-placeholder-color)]
135
+ tw-px-3 tw-py-2;
136
+
137
+ &::-webkit-input-placeholder {
138
+ @apply tw-text-[color:var(--textarea-placeholder-color)];
139
+ }
140
+
141
+ &::-moz-placeholder {
142
+ @apply tw-text-[color:var(--textarea-placeholder-color)];
143
+ }
144
+
145
+ &::-ms-placeholder {
146
+ @apply tw-text-[color:var(--textarea-placeholder-color)];
147
+ }
148
+ }
149
+
150
+ &_disabled &__field-wrapper,
151
+ &_disabled &__field {
152
+ @apply tw-bg-[#fafafa] tw-text-[#424242];
153
+ }
154
+ }
155
+ </style>
@@ -0,0 +1,150 @@
1
+ <template>
2
+ <div
3
+ class="tw-relative tw-flex tw-items-center tw-content-between tw-h-[var(--app-bar-height)] tw-bg-[color:var(--app-bar-background-color)] tw-pl-4"
4
+ >
5
+ <slot name="appSwitcher"></slot>
6
+ <!-- Logo container for mobile devices -->
7
+ <template v-if="$isMobile.value">
8
+ <!-- Show logo on mobile dashboard -->
9
+ <img
10
+ v-if="blades.length === 0"
11
+ class="h-3/6 tw-cursor-pointer"
12
+ alt="logo"
13
+ :src="logo"
14
+ @click="$emit('logo:click')"
15
+ />
16
+
17
+ <!-- Show blades name when at least one blade is opened -->
18
+ <div
19
+ v-else-if="blades.length === 1"
20
+ class="tw-overflow-ellipsis tw-overflow-hidden tw-whitespace-nowrap tw-text-2xl tw-leading-header"
21
+ >
22
+ {{ blades[0].title }}
23
+ </div>
24
+
25
+ <!-- Show back link when more than one blade is opened -->
26
+ <VcLink v-else @click="$emit('backlink:click')">
27
+ <VcIcon icon="fas fa-chevron-left" size="s"></VcIcon>
28
+ <span class="tw-ml-2 tw-text-lg">{{ $t("Back") }}</span>
29
+ </VcLink>
30
+ </template>
31
+
32
+ <!-- Logo container for desktop devices -->
33
+ <template v-else>
34
+ <img
35
+ class="tw-h-3/6 tw-cursor-pointer"
36
+ :src="logo"
37
+ alt="logo"
38
+ @click="$emit('logo:click')"
39
+ />
40
+ <div
41
+ class="tw-text-[color:var(--app-bar-version-color)] tw-text-xs tw-ml-[30px]"
42
+ @click="$emit('version:click')"
43
+ >
44
+ {{ version }}
45
+ </div>
46
+ </template>
47
+
48
+ <!-- Product name slot -->
49
+ <div
50
+ class="tw-text-[color:var(--app-bar-product-name-color)] tw-text-[length:var(--app-bar-product-name-size)] tw-font-medium tw-ml-[30px]"
51
+ v-if="title"
52
+ >
53
+ {{ title }}
54
+ </div>
55
+
56
+ <!-- Additional spacer -->
57
+ <div class="tw-grow tw-basis-0 tw-basis-0"></div>
58
+
59
+ <!-- Toolbar container -->
60
+ <div class="tw-flex tw-h-full tw-box-border">
61
+ <template v-for="(item, index) in buttons" :key="index">
62
+ <template v-if="item.isVisible === undefined || item.isVisible">
63
+ <!-- Draw custom component is it is passed -->
64
+ <component
65
+ v-if="item.component"
66
+ :is="item.component"
67
+ v-bind="item.bladeOptions"
68
+ :isAccent="item.isAccent"
69
+ ></component>
70
+
71
+ <!-- Otherwise draw default toolbar button -->
72
+ <div
73
+ v-else
74
+ class="tw-relative tw-flex tw-items-center tw-justify-center tw-w-[var(--app-bar-button-width)] tw-border-l tw-border-solid tw-border-[color:var(--app-bar-button-border-color)] tw-cursor-pointer tw-text-[color: var(--app-bar-button-color)] tw-bg-[color:var(--app-bar-button-background-color)] tw-transition-[color] tw-duration-200 hover:tw-text-[color:var(--app-bar-button-color-hover)] hover:tw-bg-[color:var(--app-bar-button-background-color-hover)]"
75
+ :class="{ 'vc-app-bar__button_accent': item.isAccent }"
76
+ :title="item.title"
77
+ @click="$emit('button:click', item)"
78
+ >
79
+ <VcIcon
80
+ :icon="typeof item.icon === 'function' ? item.icon() : item.icon"
81
+ size="xl"
82
+ ></VcIcon>
83
+ </div>
84
+ </template>
85
+ </template>
86
+ </div>
87
+
88
+ <!-- Show menu toggler on mobile devices -->
89
+ <div
90
+ v-if="$isMobile.value"
91
+ class="tw-text-[#319ed4] tw-w-[var(--app-bar-button-width)] tw-flex tw-items-center tw-justify-center tw-h-full tw-box-border tw-cursor-pointer"
92
+ @click="$emit('menubutton:click')"
93
+ >
94
+ <VcIcon icon="fas fa-bars"></VcIcon>
95
+ </div>
96
+ </div>
97
+ </template>
98
+
99
+ <script lang="ts" setup>
100
+ import { VcIcon } from "@/ui/components";
101
+ import { IBladeToolbar } from "@/core/types";
102
+ import { IBladeElement } from "@/shared";
103
+
104
+ export interface Props {
105
+ logo: string;
106
+ version: string;
107
+ blades: IBladeElement[];
108
+ buttons: IBladeToolbar[];
109
+ title?: string;
110
+ }
111
+
112
+ withDefaults(defineProps<Props>(), {
113
+ logo: "",
114
+ version: "",
115
+ blades: () => [],
116
+ buttons: () => [],
117
+ });
118
+
119
+ defineEmits([
120
+ "logo:click",
121
+ "backlink:click",
122
+ "version:click",
123
+ "toolbarbutton:click",
124
+ "menubutton:click",
125
+ ]);
126
+ </script>
127
+
128
+ <style lang="scss">
129
+ :root {
130
+ --app-bar-height: 60px;
131
+ --app-bar-background-color: #ffffff;
132
+ --app-bar-button-width: 50px;
133
+ --app-bar-button-border-color: var(--app-bar-background-color);
134
+ --app-bar-button-color: #7e8e9d;
135
+ --app-bar-button-background-color: var(--app-bar-background-color);
136
+ --app-bar-button-color-hover: #34414f;
137
+ --app-bar-button-background-color-hover: var(--app-bar-background-color);
138
+ --app-bar-version-color: #838d9a;
139
+ --app-bar-product-name-color: #34414f;
140
+ --app-bar-product-name-size: 20px;
141
+ }
142
+
143
+ .vc-app-bar {
144
+ &__button {
145
+ &_accent:before {
146
+ @apply tw-content-[""] tw-block tw-absolute tw-right-3 tw-top-[18px] tw-w-[7px] tw-h-[7px] tw-bg-[#ff4a4a] tw-rounded-full tw-z-[1];
147
+ }
148
+ }
149
+ }
150
+ </style>
@@ -0,0 +1,148 @@
1
+ <template>
2
+ <div
3
+ class="vc-app-menu-item"
4
+ :class="[
5
+ { 'vc-app-menu-item_active': isActive && !children.length },
6
+ { 'vc-app-menu-item_no-hover': children.length },
7
+ ]"
8
+ @click="$emit('onClick')"
9
+ >
10
+ <div
11
+ class="vc-app-menu-item__handler"
12
+ :class="{ 'vc-app-menu-item__handler_enabled': !sticky }"
13
+ >
14
+ <VcIcon icon="fas fa-ellipsis-v" size="m" />
15
+ </div>
16
+ <div v-if="icon" class="vc-app-menu-item__icon">
17
+ <VcIcon :icon="icon" size="m" />
18
+ </div>
19
+ <div class="vc-app-menu-item__title">
20
+ {{ title }}
21
+ <VcIcon
22
+ class="vc-app-menu-item__title-icon"
23
+ icon="fas fa-chevron-down"
24
+ size="xs"
25
+ v-if="children.length"
26
+ ></VcIcon>
27
+ </div>
28
+ </div>
29
+ </template>
30
+ <script lang="ts" setup>
31
+ import { ExtendedComponent } from "@/shared";
32
+
33
+ export interface Props {
34
+ isActive?: boolean;
35
+ children?: ExtendedComponent;
36
+ sticky?: boolean;
37
+ icon: string;
38
+ title: string;
39
+ }
40
+
41
+ export interface Emits {
42
+ (event: "onClick"): void;
43
+ }
44
+
45
+ withDefaults(defineProps<Props>(), {
46
+ isActive: false,
47
+ children: () => ({}),
48
+ sticky: true,
49
+ icon: "",
50
+ title: "",
51
+ });
52
+
53
+ defineEmits<Emits>();
54
+ </script>
55
+
56
+ <style lang="scss">
57
+ :root {
58
+ --app-menu-item-height: 38px;
59
+ --app-menu-item-icon-width: 20px;
60
+ --app-menu-item-icon-color: #337599;
61
+ --app-menu-item-icon-color-active: #ffffff;
62
+ --app-menu-item-handler-width: 10px;
63
+ --app-menu-item-background-color-hover: #337599;
64
+ --app-menu-item-hover-radius: 4px;
65
+ --app-menu-item-title-color: #465769;
66
+ --app-menu-item-title-color-active: #ffffff;
67
+ --app-menu-item-handler-color: #bdd1df;
68
+ }
69
+
70
+ .vc-app-menu-item {
71
+ @apply tw-flex tw-items-center tw-w-full tw-h-[var(--app-menu-item-height)]
72
+ tw-border-none
73
+ tw-flex-nowrap tw-box-border tw-cursor-pointer tw-relative tw-uppercase;
74
+
75
+ &_active {
76
+ @apply tw-bg-[color:var(--app-menu-item-background-color-hover)]
77
+ tw-rounded-[var(--app-menu-item-hover-radius)]
78
+ before:tw-opacity-100;
79
+ }
80
+
81
+ &__handler {
82
+ @apply tw-w-[var(--app-menu-item-handler-width)]
83
+ tw-text-[color:var(--app-menu-item-handler-color)]
84
+ tw-text-center tw-invisible tw-shrink-0;
85
+
86
+ &_enabled {
87
+ @apply tw-cursor-move;
88
+ }
89
+ }
90
+
91
+ &__icon {
92
+ @apply tw-w-[var(--app-menu-item-icon-width)]
93
+ tw-text-[color:var(--app-menu-item-icon-color)]
94
+ tw-overflow-hidden tw-flex
95
+ tw-justify-center tw-shrink-0 tw-transition-[color] tw-duration-200;
96
+ }
97
+
98
+ &_active &__icon {
99
+ @apply tw-text-[color:var(--app-menu-item-icon-color-active)];
100
+ }
101
+
102
+ &__title {
103
+ @apply tw-truncate
104
+ tw-text-lg
105
+ tw-font-medium
106
+ tw-px-3
107
+ tw-text-[color:var(--app-menu-item-title-color)]
108
+ [transition:color_0.2s_ease] [transition:opacity_0.1s_ease]
109
+ tw-opacity-100 tw-w-full;
110
+ }
111
+
112
+ &__title-icon {
113
+ @apply tw-text-[color:var(--app-menu-item-icon-color)] tw-ml-3;
114
+ }
115
+
116
+ &_active &__title {
117
+ @apply tw-text-[color:var(--app-menu-item-title-color-active)]
118
+ tw-font-bold;
119
+ }
120
+
121
+ &_active &__title-icon {
122
+ @apply tw-text-[color:var(--app-menu-item-icon-color-active)];
123
+ }
124
+
125
+ &:hover {
126
+ @apply tw-bg-[color:var(--app-menu-item-background-color-hover)]
127
+ tw-rounded-[var(--app-menu-item-hover-radius)];
128
+ }
129
+
130
+ &:hover &__title {
131
+ @apply tw-text-[color:var(--app-menu-item-title-color-active)];
132
+ }
133
+
134
+ &:hover &__icon {
135
+ @apply tw-text-[color:var(--app-menu-item-icon-color-active)];
136
+ }
137
+
138
+ &:hover &__title-icon {
139
+ @apply tw-text-[color:var(--app-menu-item-icon-color-active)];
140
+ }
141
+
142
+ &:hover &__handler {
143
+ &_enabled {
144
+ @apply tw-invisible;
145
+ }
146
+ }
147
+ }
148
+ </style>