@vc-shell/framework 1.0.289 → 1.0.291

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 (178) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/core/composables/index.ts +1 -0
  3. package/core/composables/useTheme/index.ts +60 -0
  4. package/core/directives/loading/styles.css +6 -1
  5. package/dist/core/composables/index.d.ts +1 -0
  6. package/dist/core/composables/index.d.ts.map +1 -1
  7. package/dist/core/composables/useTheme/index.d.ts +11 -0
  8. package/dist/core/composables/useTheme/index.d.ts.map +1 -0
  9. package/dist/framework.js +27889 -27362
  10. package/dist/index.css +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/locales/en.json +6 -0
  13. package/dist/shared/components/app-bar-button/app-bar-button.vue.d.ts +56 -0
  14. package/dist/shared/components/app-bar-button/app-bar-button.vue.d.ts.map +1 -0
  15. package/dist/shared/components/app-bar-button/index.d.ts +2 -0
  16. package/dist/shared/components/app-bar-button/index.d.ts.map +1 -0
  17. package/dist/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -1
  18. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  19. package/dist/shared/components/index.d.ts +3 -0
  20. package/dist/shared/components/index.d.ts.map +1 -1
  21. package/dist/shared/components/language-selector/language-selector.vue.d.ts.map +1 -1
  22. package/dist/shared/components/notification-dropdown/notification-dropdown.vue.d.ts.map +1 -1
  23. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
  24. package/dist/shared/components/sidebar/index.d.ts +2 -0
  25. package/dist/shared/components/sidebar/index.d.ts.map +1 -0
  26. package/dist/shared/components/sidebar/sidebar.vue.d.ts +49 -0
  27. package/dist/shared/components/sidebar/sidebar.vue.d.ts.map +1 -0
  28. package/dist/shared/components/theme-selector/index.d.ts +2 -0
  29. package/dist/shared/components/theme-selector/index.d.ts.map +1 -0
  30. package/dist/shared/components/theme-selector/theme-selector.vue.d.ts +3 -0
  31. package/dist/shared/components/theme-selector/theme-selector.vue.d.ts.map +1 -0
  32. package/dist/shared/components/user-dropdown-button/index.d.ts +6 -0
  33. package/dist/shared/components/user-dropdown-button/index.d.ts.map +1 -1
  34. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts +1 -0
  35. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
  36. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  37. package/dist/shared/modules/dynamic/types/index.d.ts +3 -0
  38. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  39. package/dist/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue.d.ts +16 -3
  40. package/dist/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue.d.ts.map +1 -1
  41. package/dist/shared/pages/ChangePasswordPage/components/change-password/index.d.ts +7 -7
  42. package/dist/shared/pages/ChangePasswordPage/components/change-password/index.d.ts.map +1 -1
  43. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts +24 -3
  44. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
  45. package/dist/shared/pages/InvitePage/components/invite/index.d.ts +24 -1
  46. package/dist/shared/pages/InvitePage/components/invite/index.d.ts.map +1 -1
  47. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts +24 -3
  48. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
  49. package/dist/shared/pages/ResetPasswordPage/components/reset-password/index.d.ts +24 -1
  50. package/dist/shared/pages/ResetPasswordPage/components/reset-password/index.d.ts.map +1 -1
  51. package/dist/tailwind.config.d.ts +42 -15
  52. package/dist/tailwind.config.d.ts.map +1 -1
  53. package/dist/tsconfig.tsbuildinfo +1 -1
  54. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  55. package/dist/ui/components/atoms/vc-link/vc-link.vue.d.ts.map +1 -1
  56. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
  57. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
  58. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -1
  59. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  60. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
  61. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  62. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts.map +1 -1
  63. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts.map +1 -1
  64. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  65. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  66. package/dist/ui/components/molecules/vc-slider/vc-slider.vue.d.ts.map +1 -1
  67. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue.d.ts.map +1 -1
  68. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  69. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +26 -0
  70. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
  71. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +26 -0
  72. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  73. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  74. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
  75. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts.map +1 -1
  76. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
  77. package/dist/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue.d.ts.map +1 -1
  78. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts +1 -0
  79. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
  80. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  81. package/dist/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue.d.ts.map +1 -1
  82. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts +1 -0
  83. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  84. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue.d.ts.map +1 -1
  85. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +15 -0
  86. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  87. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +3 -0
  88. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  89. package/package.json +4 -4
  90. package/shared/components/app-bar-button/app-bar-button.vue +169 -0
  91. package/shared/components/app-bar-button/index.ts +1 -0
  92. package/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue +138 -38
  93. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +10 -1
  94. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +55 -30
  95. package/shared/components/change-password/change-password.vue +7 -1
  96. package/shared/components/common/popup/vc-popup-error.vue +1 -1
  97. package/shared/components/common/popup/vc-popup-warning.vue +1 -1
  98. package/shared/components/index.ts +3 -0
  99. package/shared/components/language-selector/language-selector.vue +55 -39
  100. package/shared/components/notification-dropdown/_internal/notification/notification.vue +7 -1
  101. package/shared/components/notification-dropdown/notification-dropdown.vue +96 -83
  102. package/shared/components/notification-template/notification-template.vue +66 -22
  103. package/shared/components/notifications/styles/index.scss +1 -0
  104. package/shared/components/sidebar/index.ts +1 -0
  105. package/shared/components/sidebar/sidebar.vue +96 -0
  106. package/shared/components/theme-selector/index.ts +1 -0
  107. package/shared/components/theme-selector/theme-selector.vue +95 -0
  108. package/shared/components/user-dropdown-button/user-dropdown-button.vue +155 -86
  109. package/shared/modules/assets/components/assets-details/assets-details.vue +9 -2
  110. package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +16 -6
  111. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +1 -1
  112. package/shared/modules/dynamic/helpers/nodeBuilder.ts +1 -1
  113. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +6 -2
  114. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +16 -2
  115. package/shared/modules/dynamic/types/index.ts +3 -0
  116. package/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue +14 -9
  117. package/shared/pages/InvitePage/components/invite/Invite.vue +59 -15
  118. package/shared/pages/LoginPage/components/login/Login.vue +78 -22
  119. package/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue +67 -15
  120. package/tailwind.config.ts +281 -15
  121. package/ui/components/atoms/vc-badge/vc-badge.vue +38 -23
  122. package/ui/components/atoms/vc-button/vc-button.vue +37 -34
  123. package/ui/components/atoms/vc-card/vc-card.vue +17 -11
  124. package/ui/components/atoms/vc-col/vc-col.vue +4 -6
  125. package/ui/components/atoms/vc-container/vc-container.vue +26 -8
  126. package/ui/components/atoms/vc-hint/vc-hint.vue +8 -2
  127. package/ui/components/atoms/vc-icon/vc-icon.vue +3 -3
  128. package/ui/components/atoms/vc-image/vc-image.vue +33 -9
  129. package/ui/components/atoms/vc-label/vc-label.vue +38 -9
  130. package/ui/components/atoms/vc-link/vc-link.vue +15 -8
  131. package/ui/components/atoms/vc-loading/vc-loading.vue +37 -8
  132. package/ui/components/atoms/vc-progress/vc-progress.vue +29 -21
  133. package/ui/components/atoms/vc-row/vc-row.vue +4 -2
  134. package/ui/components/atoms/vc-status/vc-status.vue +29 -20
  135. package/ui/components/atoms/vc-status-icon/vc-status-icon.vue +20 -3
  136. package/ui/components/atoms/vc-switch/vc-switch.vue +41 -17
  137. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +35 -9
  138. package/ui/components/atoms/vc-video/vc-video.vue +28 -6
  139. package/ui/components/atoms/vc-widget/vc-widget.vue +59 -28
  140. package/ui/components/molecules/vc-breadcrumbs/_internal/vc-breadcrumbs-item/vc-breadcrumbs-item.vue +29 -27
  141. package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +34 -11
  142. package/ui/components/molecules/vc-checkbox/vc-checkbox.vue +43 -21
  143. package/ui/components/molecules/vc-editor/vc-editor.vue +70 -32
  144. package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +32 -16
  145. package/ui/components/molecules/vc-field/vc-field.vue +36 -13
  146. package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +75 -25
  147. package/ui/components/molecules/vc-input/vc-input.vue +279 -218
  148. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +24 -2
  149. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +102 -64
  150. package/ui/components/molecules/vc-notification/vc-notification.vue +40 -15
  151. package/ui/components/molecules/vc-pagination/vc-pagination.vue +19 -15
  152. package/ui/components/molecules/vc-radio-button/vc-radio-button.vue +18 -23
  153. package/ui/components/molecules/vc-rating/vc-rating.vue +9 -5
  154. package/ui/components/molecules/vc-select/vc-select.vue +211 -65
  155. package/ui/components/molecules/vc-slider/vc-slider.vue +32 -13
  156. package/ui/components/molecules/vc-textarea/vc-textarea.vue +17 -12
  157. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +68 -14
  158. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +112 -122
  159. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +213 -96
  160. package/ui/components/organisms/vc-app/vc-app.vue +41 -15
  161. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +78 -30
  162. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +81 -59
  163. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +27 -13
  164. package/ui/components/organisms/vc-blade/vc-blade.vue +177 -46
  165. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue +40 -11
  166. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue +52 -18
  167. package/ui/components/organisms/vc-gallery/vc-gallery.vue +38 -6
  168. package/ui/components/organisms/vc-login-form/vc-login-form.vue +40 -14
  169. package/ui/components/organisms/vc-popup/vc-popup.vue +186 -44
  170. package/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue +25 -6
  171. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +48 -12
  172. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +130 -60
  173. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +55 -7
  174. package/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue +17 -5
  175. package/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue +38 -6
  176. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +111 -62
  177. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue +139 -46
  178. package/ui/components/organisms/vc-table/vc-table.vue +370 -128
@@ -1,105 +1,118 @@
1
1
  <template>
2
- <div
3
- v-if="isMenuVisible"
4
- class="vc-app-menu tw-relative tw-w-[var(--app-menu-width)] [transition:width_300ms_cubic-bezier(0.2,0,0,1)_0s] tw-pt-[22px] -tw-mr-[8px]"
5
- :class="{
6
- 'vc-app-menu_mobile tw-hidden !tw-fixed !tw-left-0 !tw-top-0 !tw-w-full !tw-bottom-0 !tw-z-[9999]':
7
- $isMobile.value,
8
- '!tw-block': isMobileVisible,
9
- '!tw-w-[var(--app-menu-width-collapse)]': $isDesktop.value && !isExpanded,
10
- }"
11
- @mouseenter="!isExpanded && expandOverHandler(true)"
12
- @mouseover="!isExpanded && expandOverHandler(true)"
13
- @mouseleave="expandOverHandler(false)"
2
+ <Sidebar
3
+ :is-expanded="$isMobile.value ? isMobileVisible : false"
4
+ render="mobile"
5
+ @close="() => (isMobileVisible = false)"
14
6
  >
15
- <!-- Show backdrop overlay on mobile devices -->
16
- <div
17
- v-if="$isMobile.value"
18
- class="tw-absolute tw-left-0 tw-top-0 tw-right-0 tw-bottom-0 tw-z-[9998] tw-bg-[#808c99] tw-opacity-60"
19
- @click="isMobileVisible = false"
20
- ></div>
21
- <div
22
- class="!tw-absolute vc-app-menu__inner tw-flex tw-flex-col tw-h-full [transition:width_150ms_cubic-bezier(0.2,0,0,1)_0s] tw-z-[1001] tw-top-0 tw-bottom-0 tw-bg-[color:var(--app-background)]"
23
- :class="{
24
- 'tw-left-0 tw-pt-[22px]': $isDesktop.value,
25
- '!tw-w-[var(--app-menu-width-collapse)]': $isDesktop.value && !isExpanded && !isExpandedOver,
26
- 'tw-w-[var(--app-menu-width)]': $isDesktop.value && (isExpanded || isExpandedOver),
27
- }"
28
- >
29
- <!-- Show menu close handler on mobile devices -->
7
+ <template #content>
30
8
  <div
31
- v-if="$isMobile.value"
32
- class="tw-text-[#319ed4] tw-flex tw-justify-end tw-items-center tw-p-4 tw-cursor-pointer"
9
+ v-if="isMenuVisible"
10
+ class="vc-app-menu"
11
+ :class="{
12
+ 'vc-app-menu--mobile': $isMobile.value,
13
+ 'vc-app-menu--block': isMobileVisible,
14
+ 'vc-app-menu--collapsed': $isDesktop.value && !isExpanded,
15
+ }"
16
+ @mouseenter="!isExpanded && expandOverHandler(true)"
17
+ @mouseover="!isExpanded && expandOverHandler(true)"
18
+ @mouseleave="expandOverHandler(false)"
33
19
  >
34
- <button @click="isMobileVisible = false">
35
- <VcIcon
36
- icon="fas fa-times"
37
- size="xl"
38
- ></VcIcon>
39
- </button>
40
- </div>
20
+ <!-- Show backdrop overlay on mobile devices -->
21
+ <!-- <div
22
+ v-if="$isMobile.value"
23
+ class="vc-app-menu__backdrop"
24
+ @click="isMobileVisible = false"
25
+ ></div> -->
41
26
 
42
- <div
43
- v-if="$isDesktop.value"
44
- class="tw-pl-[19px] tw-pb-2"
45
- >
46
- <button
47
- class="tw-flex tw-items-center tw-p-[10px] tw-rounded tw-text-[color:var(--app-menu-burger-color)] hover:tw-bg-[color:var(--app-menu-burger-background-color)]"
48
- @click="toggleMenu"
27
+ <div
28
+ class="vc-app-menu__inner"
29
+ :class="{
30
+ 'vc-app-menu__inner--desktop': $isDesktop.value,
31
+ 'vc-app-menu__inner--collapsed': $isDesktop.value && !isExpanded && !isExpandedOver,
32
+ 'vc-app-menu__inner--expanded': $isDesktop.value && (isExpanded || isExpandedOver),
33
+ }"
49
34
  >
50
- <VcIcon
51
- icon="fas fa-bars"
52
- size="xl"
53
- ></VcIcon>
54
- </button>
55
- </div>
35
+ <!-- Show menu close handler on mobile devices -->
36
+ <!-- <div
37
+ v-if="$isMobile.value"
38
+ class="vc-app-menu__close-handler"
39
+ >
40
+ <button
41
+ class="vc-app-menu__close-button"
42
+ @click="isMobileVisible = false"
43
+ >
44
+ <VcIcon
45
+ icon="fas fa-times"
46
+ size="xl"
47
+ ></VcIcon>
48
+ </button>
49
+ </div> -->
56
50
 
57
- <!-- Show scrollable area with menu items -->
58
- <VcContainer
59
- :no-padding="true"
60
- class="tw-grow tw-basis-0"
61
- >
62
- <div class="tw-gap-[5px] tw-flex tw-flex-col tw-h-full">
63
51
  <div
64
- v-if="$slots['mobile']"
65
- class="tw-px-[19px]"
52
+ v-if="$isDesktop.value"
53
+ class="vc-app-menu__burger-container"
66
54
  >
67
- <slot
68
- v-if="!$isDesktop.value"
69
- name="mobile"
70
- ></slot>
55
+ <button
56
+ class="vc-app-menu__burger-button"
57
+ @click="toggleMenu"
58
+ >
59
+ <VcIcon
60
+ icon="fas fa-bars"
61
+ size="xl"
62
+ ></VcIcon>
63
+ </button>
71
64
  </div>
72
65
 
73
- <VcAppMenuItem
74
- v-for="item in menuItems"
75
- :id="item.id"
76
- :key="item?.id"
77
- :data-test-id="item?.routeId"
78
- :is-visible="
79
- $hasAccess(item.permissions!) && (item.children?.some((child) => $hasAccess(child.permissions!)) ?? true)
80
- "
81
- :url="item.url"
82
- :icon="item.groupIcon || item.icon"
83
- :title="item.title as string"
84
- :children="item.children"
85
- :expand="$isDesktop.value ? isExpanded || isExpandedOver : true"
86
- @click="
87
- (event) => {
88
- $emit('item:click', event ? event : item);
89
- isMobileVisible = false;
90
- }
91
- "
92
- />
66
+ <!-- Show scrollable area with menu items -->
67
+ <VcContainer
68
+ :no-padding="true"
69
+ class="vc-app-menu__container"
70
+ >
71
+ <div class="vc-app-menu__menu-items">
72
+ <div
73
+ v-if="$slots['mobile']"
74
+ class="vc-app-menu__mobile-slot"
75
+ >
76
+ <slot
77
+ v-if="!$isDesktop.value"
78
+ name="mobile"
79
+ ></slot>
80
+ </div>
81
+
82
+ <VcAppMenuItem
83
+ v-for="item in menuItems"
84
+ :id="item.id"
85
+ :key="item?.id"
86
+ :data-test-id="item?.routeId"
87
+ :is-visible="
88
+ $hasAccess(item.permissions!) &&
89
+ (item.children?.some((child) => $hasAccess(child.permissions!)) ?? true)
90
+ "
91
+ :url="item.url"
92
+ :icon="item.groupIcon || item.icon"
93
+ :title="item.title as string"
94
+ :children="item.children"
95
+ :expand="$isDesktop.value ? isExpanded || isExpandedOver : true"
96
+ @click="
97
+ (event) => {
98
+ $emit('item:click', event ? event : item);
99
+ isMobileVisible = false;
100
+ }
101
+ "
102
+ />
103
+ </div>
104
+ </VcContainer>
105
+
106
+ <div
107
+ class="vc-app-menu__version"
108
+ @click="$emit('version:click')"
109
+ >
110
+ {{ version }}
111
+ </div>
93
112
  </div>
94
- </VcContainer>
95
- <div
96
- class="tw-text-[color:var(--app-menu-version-color)] tw-text-xs tw-mt-auto tw-self-start tw-py-1 tw-pl-[22px]"
97
- @click="$emit('version:click')"
98
- >
99
- {{ version }}
100
113
  </div>
101
- </div>
102
- </div>
114
+ </template>
115
+ </Sidebar>
103
116
  </template>
104
117
 
105
118
  <script lang="ts" setup>
@@ -109,6 +122,7 @@ import { VcContainer, VcIcon } from "./../../../../";
109
122
  import { useMenuService } from "../../../../../../core/composables";
110
123
  import { MenuItem } from "../../../../../../core/types";
111
124
  import { useLocalStorage } from "@vueuse/core";
125
+ import { Sidebar } from "../../../../../../shared/components";
112
126
 
113
127
  export interface Props {
114
128
  version: string;
@@ -167,19 +181,122 @@ defineExpose({
167
181
  :root {
168
182
  --app-menu-width: 230px;
169
183
  --app-menu-width-collapse: 70px;
170
- --app-menu-background-color: #ffffff;
171
- --app-menu-version-color: #838d9a;
184
+ --app-menu-background: var(--app-background, var(--primary-50));
185
+ --app-menu-background-color: var(--additional-50);
186
+ --app-menu-version-color: var(--neutrals-400);
187
+
188
+ --app-menu-close-color: var(--app-menu-burger-color, var(--primary-500));
189
+ --app-menu-burger-color: var(--primary-500);
190
+
191
+ --app-backdrop-overlay-bg: var(--additional-50);
192
+ --app-backdrop-overlay: rgb(from var(--app-backdrop-overlay-bg) r g b / 75%);
172
193
 
173
- --app-menu-burger-background-color: rgba(255, 255, 255, 0.5);
174
- --app-menu-burger-color: #319ed4;
194
+ --app-backdrop-shadow-color: var(--additional-950);
195
+ --app-backdrop-shadow: 0 -6px 6px var(--additional-50),
196
+ 1px 1px 22px rgb(from var(--notification-dropdown-shadow-color) r g b / 7%);
175
197
  }
176
198
 
177
199
  .vc-app-menu {
178
- ::-webkit-scrollbar {
200
+ @apply tw-relative tw-w-[var(--app-menu-width)] tw-pt-6 -tw-mr-2 [transition:width_300ms_cubic-bezier(0.2,0,0,1)_0s];
201
+
202
+ &.vc-app-menu--mobile {
203
+ @apply tw-hidden tw-h-full tw-w-full #{!important};
204
+ }
205
+
206
+ &.vc-app-menu--block {
207
+ @apply tw-block #{!important};
208
+ }
209
+
210
+ &.vc-app-menu--collapsed {
211
+ width: var(--app-menu-width-collapse) !important;
212
+ }
213
+
214
+ &.vc-app-menu--expanded {
215
+ @apply tw-w-[var(--app-menu-width)];
216
+ }
217
+
218
+ &__backdrop {
219
+ @apply tw-absolute tw-left-0 tw-top-0 tw-right-0 tw-bottom-0 tw-z-[9998] tw-bg-[color:var(--app-backdrop-overlay)] tw-backdrop-blur-[3px];
220
+ }
221
+
222
+ &__inner {
223
+ @apply tw-flex tw-flex-col tw-h-full tw-z-[1001] tw-top-0 tw-bottom-0 tw-bg-[color:var(--app-menu-background)] [transition:width_150ms_cubic-bezier(0.2,0,0,1)_0s];
224
+ @apply tw-absolute #{!important};
225
+
226
+ &--desktop {
227
+ @apply tw-left-0 tw-pt-6;
228
+ }
229
+
230
+ &--collapsed {
231
+ @apply tw-w-[var(--app-menu-width-collapse)] #{!important};
232
+ }
233
+
234
+ &--expanded {
235
+ @apply tw-w-[var(--app-menu-width)];
236
+ }
237
+ }
238
+
239
+ &__close-handler {
240
+ @apply tw-text-[color:var(--app-menu-close-color)] tw-flex tw-justify-end tw-items-center tw-p-4 tw-cursor-pointer;
241
+ }
242
+
243
+ &__close-button {
244
+ }
245
+
246
+ &__burger-container {
247
+ @apply tw-pl-5 tw-pb-2;
248
+ }
249
+
250
+ &__burger-button {
251
+ @apply tw-flex tw-items-center tw-p-2.5 tw-rounded tw-text-[color:var(--app-menu-burger-color)];
252
+ }
253
+
254
+ &__container {
255
+ @apply tw-grow tw-basis-0;
256
+ }
257
+
258
+ &__menu-items {
259
+ @apply tw-gap-1 tw-flex tw-flex-col tw-h-full;
260
+ }
261
+
262
+ &__mobile-slot {
263
+ @apply tw-px-5;
264
+ }
265
+
266
+ &__version {
267
+ @apply tw-text-[color:var(--app-menu-version-color)] tw-text-xs tw-mt-auto tw-self-start tw-py-1 tw-pl-5;
268
+ }
269
+
270
+ &--mobile .vc-app-menu__inner {
271
+ @apply tw-bg-[color:var(--app-menu-background-color)] tw-w-full;
272
+ }
273
+
274
+ &::-webkit-scrollbar {
179
275
  display: none;
180
276
  }
181
- &_mobile &__inner {
182
- @apply tw-absolute tw-z-[9999] tw-right-0 tw-top-0 tw-bottom-0 tw-w-[300px] tw-max-w-[60%] tw-bg-[color:var(--app-menu-background-color)];
277
+
278
+ & .vc-app-menu__blade-title {
279
+ @apply tw-overflow-ellipsis tw-overflow-hidden tw-whitespace-nowrap tw-text-2xl tw-font-semibold tw-ml-2 tw-leading-snug;
280
+ }
281
+
282
+ &__backlink {
283
+ @apply tw-ml-3;
284
+ }
285
+
286
+ &__backlink-text {
287
+ @apply tw-ml-2 tw-text-lg;
288
+ }
289
+
290
+ &__spacer {
291
+ @apply tw-grow tw-basis-0;
292
+ }
293
+
294
+ &__toolbar {
295
+ @apply tw-flex tw-h-full tw-box-border;
296
+ }
297
+
298
+ &__menu-toggler {
299
+ @apply tw-text-[color:var(--app-bar-burger-color)] tw-w-12 tw-flex tw-items-center tw-justify-center tw-h-full tw-box-border tw-cursor-pointer;
183
300
  }
184
301
  }
185
302
  </style>
@@ -6,17 +6,14 @@
6
6
  />
7
7
  <div
8
8
  v-else
9
- class="vc-app tw-flex tw-flex-col tw-w-full tw-h-full tw-box-border tw-m-0 tw-overflow-hidden tw-text-base"
10
- :class="[
11
- {
12
- 'vc-app_touch': $isTouch,
13
- 'vc-app_mobile': $isMobile.value,
14
- },
15
- ]"
9
+ class="vc-app"
10
+ :class="{
11
+ 'vc-app_mobile': $isMobile.value,
12
+ }"
16
13
  >
17
14
  <!-- Init application top bar -->
18
15
  <VcAppBar
19
- class="tw-shrink-0"
16
+ class="vc-app__app-bar"
20
17
  :logo="logo"
21
18
  :title="title"
22
19
  :disable-menu="disableMenu"
@@ -41,12 +38,16 @@
41
38
  LanguageSelector,
42
39
  UserDropdownButton,
43
40
  NotificationDropdown,
41
+ ThemeSelector,
44
42
  }"
45
43
  >
46
44
  <slot
47
45
  v-if="$slots['toolbar:prepend']"
48
46
  name="toolbar:prepend"
49
47
  ></slot>
48
+ <slot name="toolbar:theme-selector">
49
+ <ThemeSelector />
50
+ </slot>
50
51
  <slot name="toolbar:language-selector">
51
52
  <LanguageSelector
52
53
  v-if="$isDesktop.value ? $isDesktop.value : $isMobile.value ? route.path === '/' : false"
@@ -70,24 +71,28 @@
70
71
  </template>
71
72
  </VcAppBar>
72
73
 
73
- <div class="tw-overflow-hidden tw-flex tw-grow tw-basis-0">
74
+ <div class="vc-app__main-content">
74
75
  <!-- Init main menu -->
75
76
  <VcAppMenu
76
77
  v-if="!disableMenu"
77
78
  ref="menu"
78
- class="tw-shrink-0"
79
+ class="vc-app__app-menu"
79
80
  :version="version"
80
81
  @item:click="onMenuItemClick"
81
82
  >
82
83
  <template #mobile>
83
- <UserDropdownButton class="tw-p-0 tw-mb-2 tw-w-full tw-h-auto" />
84
+ <UserDropdownButton
85
+ class="vc-app__user-dropdown-button"
86
+ :avatar-url="avatar"
87
+ :role="role"
88
+ />
84
89
  </template>
85
90
  </VcAppMenu>
86
91
 
87
92
  <!-- Blade navigation -->
88
93
  <div
89
94
  v-if="isAuthenticated"
90
- class="vc-app__workspace tw-px-2 tw-w-full tw-overflow-hidden !tw-flex tw-grow tw-basis-0 tw-relative"
95
+ class="vc-app__workspace"
91
96
  >
92
97
  <slot name="blade-navigation">
93
98
  <VcBladeNavigation />
@@ -112,6 +117,7 @@ import {
112
117
  useBladeNavigation,
113
118
  NotificationDropdown,
114
119
  BladeRoutesRecord,
120
+ ThemeSelector,
115
121
  } from "./../../../../shared/components";
116
122
  import { useNotifications, useUser } from "../../../../core/composables";
117
123
  import { useRoute, useRouter } from "vue-router";
@@ -144,6 +150,7 @@ defineSlots<{
144
150
  "toolbar:notifications-dropdown": void;
145
151
  "toolbar:user-dropdown": (props: { userDropdown: typeof UserDropdownButton }) => void;
146
152
  "blade-navigation": void;
153
+ "toolbar:theme-selector": void;
147
154
  }>();
148
155
 
149
156
  const props = defineProps<Props>();
@@ -210,20 +217,39 @@ provide("$dynamicModules", dynamicModules);
210
217
 
211
218
  <style lang="scss">
212
219
  :root {
213
- --app-background: #eff2fa;
220
+ --app-background: var(--secondary-200);
214
221
  }
215
222
 
216
223
  .vc-app {
224
+ @apply tw-flex tw-flex-col tw-w-full tw-h-full tw-box-border tw-m-0 tw-overflow-hidden tw-text-base;
217
225
  background: var(--app-background);
218
226
 
227
+ &__loader {
228
+ background: var(--app-background);
229
+ }
230
+
231
+ &__app-bar {
232
+ @apply tw-shrink-0;
233
+ }
234
+
235
+ &__app-menu {
236
+ @apply tw-shrink-0;
237
+ }
238
+
239
+ &__main-content {
240
+ @apply tw-overflow-hidden tw-flex tw-grow tw-basis-0;
241
+ }
242
+
219
243
  &__workspace {
244
+ @apply tw-px-2 tw-w-full tw-overflow-hidden tw-flex tw-grow tw-basis-0 tw-relative;
245
+
220
246
  .vc-app_mobile & {
221
247
  @apply tw-p-0;
222
248
  }
223
249
  }
224
250
 
225
- &__loader {
226
- background: var(--app-background);
251
+ &__user-dropdown-button {
252
+ @apply tw-p-0 tw-mb-2 tw-w-full tw-h-auto;
227
253
  }
228
254
  }
229
255
  </style>
@@ -1,15 +1,13 @@
1
1
  <template>
2
- <div
3
- class="tw-shrink-0 tw-h-[var(--blade-header-height)] tw-bg-[color:var(--blade-header-background-color)] tw-flex tw-items-center tw-py-0 tw-px-4 tw-border-solid tw-border-b tw-border-b-[color:#eaedf3]"
4
- >
2
+ <div class="vc-blade-header">
5
3
  <div
6
4
  v-if="typeof modified !== 'undefined'"
7
5
  ref="tooltipIconRef"
8
6
  :class="{
9
- '!tw-bg-[color:var(--blade-not-edited)]': !modified,
10
- '!tw-bg-[color:var(--blade-edited)]': modified,
7
+ 'vc-blade-header__status-not-edited': !modified,
8
+ 'vc-blade-header__status-edited': modified,
11
9
  }"
12
- class="tw-block tw-w-[7px] tw-h-[7px] tw-rounded-full tw-z-[1] tw-mr-2"
10
+ class="vc-blade-header__status"
13
11
  @mouseenter="tooltipVisible = true"
14
12
  @mouseleave="tooltipVisible = false"
15
13
  >
@@ -18,7 +16,7 @@
18
16
  v-if="tooltipVisible"
19
17
  ref="tooltipRef"
20
18
  :style="floatingStyles"
21
- class="tw-absolute tw-z-10 tw-bg-white tw-border tw-border-solid tw-border-[color:#eef0f2] tw-shadow-[1px_1px_8px_rgba(126,142,157,0.25)] tw-rounded-[3px] tw-text-[color:#8e9daa] tw-font-normal tw-py-1 tw-px-2 tw-ml-4"
19
+ class="vc-blade-header__tooltip"
22
20
  >
23
21
  {{
24
22
  modified
@@ -31,26 +29,24 @@
31
29
 
32
30
  <div
33
31
  v-if="icon"
34
- class="tw-text-[color:var(--blade-header-icon-color)] tw-mr-3"
32
+ class="vc-blade-header__icon"
35
33
  >
36
34
  <VcIcon
37
35
  :icon="icon"
38
36
  size="xxl"
39
- ></VcIcon>
37
+ />
40
38
  </div>
41
39
 
42
- <div class="tw-overflow-hidden tw-grow tw-basis-0">
40
+ <div class="vc-blade-header__content">
43
41
  <div
44
- class="tw-text-[color:var(--blade-header-title-color)] tw-text-lg/[23px] tw-truncate"
45
- :class="{
46
- '!tw-text-[length:var(--blade-header-title-font-size)] tw-font-medium': !subtitle,
47
- }"
42
+ class="vc-blade-header__title"
43
+ :class="{ 'vc-blade-header__title-no-subtitle': !subtitle }"
48
44
  >
49
45
  {{ title }}
50
46
  </div>
51
47
  <div
52
48
  v-if="subtitle"
53
- class="tw-text-[color:var(--blade-header-subtitle-color)] tw-text-xs tw-mt-1"
49
+ class="vc-blade-header__subtitle"
54
50
  >
55
51
  {{ subtitle }}
56
52
  </div>
@@ -62,36 +58,36 @@
62
58
 
63
59
  <div
64
60
  v-if="!$isMobile.value"
65
- class="tw-flex tw-items-center"
61
+ class="vc-blade-header__controls"
66
62
  >
67
63
  <template v-if="expandable">
68
64
  <div
69
65
  v-if="maximized"
70
- class="tw-text-[color:var(--blade-header-button-color)] tw-ml-4 tw-cursor-pointer hover:tw-text-[color:var(--blade-header-button-color-hover)]"
66
+ class="vc-blade-header__button"
71
67
  @click="onCollapse"
72
68
  >
73
69
  <VcIcon
74
70
  icon="fas fa-window-minimize"
75
71
  size="s"
76
- ></VcIcon>
72
+ />
77
73
  </div>
78
74
  <div
79
75
  v-else
80
- class="tw-text-[color:var(--blade-header-button-color)] tw-ml-4 tw-cursor-pointer hover:tw-text-[color:var(--blade-header-button-color-hover)]"
76
+ class="vc-blade-header__button"
81
77
  @click="onExpand"
82
78
  >
83
79
  <VcIcon
84
80
  icon="fas fa-window-maximize"
85
81
  size="s"
86
- ></VcIcon>
82
+ />
87
83
  </div>
88
84
  </template>
89
85
  <div
90
86
  v-if="closable"
91
- class="tw-text-[color:var(--blade-header-button-color)] tw-ml-4 tw-cursor-pointer hover:tw-text-[color:var(--blade-header-button-color-hover)]"
87
+ class="vc-blade-header__button"
92
88
  @click="onClose"
93
89
  >
94
- <VcIcon icon="fas fa-times"></VcIcon>
90
+ <VcIcon icon="fas fa-times" />
95
91
  </div>
96
92
  </div>
97
93
  </div>
@@ -145,20 +141,72 @@ function onClose(): void {
145
141
  <style lang="scss">
146
142
  :root {
147
143
  --blade-header-height: 50px;
148
- --blade-header-background-color: #ffffff;
144
+ --blade-header-background-color: var(--additional-50);
149
145
 
150
- --blade-header-button-color: #a1c0d4;
151
- --blade-header-button-color-hover: #7ea8c4;
146
+ --blade-header-button-color: var(--secondary-500);
147
+ --blade-header-button-color-hover: var(--secondary-600);
152
148
 
153
- --blade-header-icon-color: #a1c0d4;
149
+ --blade-header-icon-color: var(--secondary-500);
154
150
 
155
151
  --blade-header-title-font-size: 19px;
156
- --blade-header-title-color: #2e3d4e;
152
+ --blade-header-title-color: var(--base-text-color, var(--neutrals-950));
157
153
 
158
- --blade-header-subtitle-color: #a1c0d4;
154
+ --blade-header-subtitle-color: var(--secondary-500);
159
155
 
160
- --blade-not-edited: #87b563;
156
+ --blade-not-edited: var(--success-400);
157
+ --blade-edited: var(--warning-500);
158
+ --blade-header-border-color: var(--base-border-color, var(--neutrals-200));
161
159
 
162
- --blade-edited: #f89406;
160
+ --blade-tooltip-background: var(--additional-50);
161
+ --blade-tooltip-border: var(--base-border-color, var(--neutrals-200));
162
+ --blade-tooltip-text: var(--neutrals-600);
163
+ }
164
+
165
+ .vc-blade-header {
166
+ @apply tw-shrink-0 tw-h-[var(--blade-header-height)] tw-bg-[color:var(--blade-header-background-color)] tw-flex tw-items-center tw-py-0 tw-px-4 tw-border-solid tw-border-b tw-border-b-[color:var(--blade-header-border-color)];
167
+
168
+ &__status {
169
+ @apply tw-block tw-w-2 tw-h-2 tw-rounded-full tw-z-[1] tw-mr-2;
170
+ }
171
+
172
+ &__status-not-edited {
173
+ @apply tw-bg-[color:var(--blade-not-edited)] #{!important};
174
+ }
175
+
176
+ &__status-edited {
177
+ @apply tw-bg-[color:var(--blade-edited)] #{!important};
178
+ }
179
+
180
+ &__tooltip {
181
+ @apply tw-absolute tw-z-10 tw-bg-[color:var(--blade-tooltip-background)] tw-border tw-border-solid tw-border-[color:var(--blade-tooltip-border)] tw-shadow-[1px_1px_8px_rgba(126,142,157,0.25)] tw-rounded-[3px] tw-text-[color:var(--blade-tooltip-text)] tw-font-normal tw-py-1 tw-px-2 tw-ml-4;
182
+ }
183
+
184
+ &__icon {
185
+ @apply tw-text-[color:var(--blade-header-icon-color)] tw-mr-3;
186
+ }
187
+
188
+ &__content {
189
+ @apply tw-overflow-hidden tw-grow tw-basis-0;
190
+ }
191
+
192
+ &__title {
193
+ @apply tw-text-[color:var(--blade-header-title-color)] tw-text-lg/[23px] tw-truncate;
194
+ }
195
+
196
+ &__title-no-subtitle {
197
+ @apply tw-text-[length:var(--blade-header-title-font-size)] tw-font-medium #{!important};
198
+ }
199
+
200
+ &__subtitle {
201
+ @apply tw-text-[color:var(--blade-header-subtitle-color)] tw-text-xs tw-mt-1;
202
+ }
203
+
204
+ &__controls {
205
+ @apply tw-flex tw-items-center;
206
+ }
207
+
208
+ &__button {
209
+ @apply tw-text-[color:var(--blade-header-button-color)] tw-ml-4 tw-cursor-pointer hover:tw-text-[color:var(--blade-header-button-color-hover)];
210
+ }
163
211
  }
164
212
  </style>