@vc-shell/framework 1.0.290 → 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 (175) hide show
  1. package/CHANGELOG.md +9 -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 +27885 -27365
  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/user-dropdown-button.vue.d.ts.map +1 -1
  33. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  34. package/dist/shared/modules/dynamic/types/index.d.ts +3 -0
  35. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  36. package/dist/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue.d.ts +16 -3
  37. package/dist/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue.d.ts.map +1 -1
  38. package/dist/shared/pages/ChangePasswordPage/components/change-password/index.d.ts +7 -7
  39. package/dist/shared/pages/ChangePasswordPage/components/change-password/index.d.ts.map +1 -1
  40. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts +24 -3
  41. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
  42. package/dist/shared/pages/InvitePage/components/invite/index.d.ts +24 -1
  43. package/dist/shared/pages/InvitePage/components/invite/index.d.ts.map +1 -1
  44. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts +24 -3
  45. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
  46. package/dist/shared/pages/ResetPasswordPage/components/reset-password/index.d.ts +24 -1
  47. package/dist/shared/pages/ResetPasswordPage/components/reset-password/index.d.ts.map +1 -1
  48. package/dist/tailwind.config.d.ts +42 -15
  49. package/dist/tailwind.config.d.ts.map +1 -1
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  52. package/dist/ui/components/atoms/vc-link/vc-link.vue.d.ts.map +1 -1
  53. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
  54. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
  55. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -1
  56. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  57. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
  58. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  59. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts.map +1 -1
  60. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts.map +1 -1
  61. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  62. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  63. package/dist/ui/components/molecules/vc-slider/vc-slider.vue.d.ts.map +1 -1
  64. 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
  65. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  66. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +2 -0
  67. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
  68. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +2 -0
  69. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  70. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  71. 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
  72. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts.map +1 -1
  73. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
  74. package/dist/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue.d.ts.map +1 -1
  75. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts +1 -0
  76. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
  77. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  78. package/dist/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue.d.ts.map +1 -1
  79. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts +1 -0
  80. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  81. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue.d.ts.map +1 -1
  82. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +15 -0
  83. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  84. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +3 -0
  85. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  86. package/package.json +4 -4
  87. package/shared/components/app-bar-button/app-bar-button.vue +169 -0
  88. package/shared/components/app-bar-button/index.ts +1 -0
  89. package/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue +138 -38
  90. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +10 -1
  91. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +55 -30
  92. package/shared/components/change-password/change-password.vue +7 -1
  93. package/shared/components/common/popup/vc-popup-error.vue +1 -1
  94. package/shared/components/common/popup/vc-popup-warning.vue +1 -1
  95. package/shared/components/index.ts +3 -0
  96. package/shared/components/language-selector/language-selector.vue +55 -39
  97. package/shared/components/notification-dropdown/_internal/notification/notification.vue +7 -1
  98. package/shared/components/notification-dropdown/notification-dropdown.vue +96 -83
  99. package/shared/components/notification-template/notification-template.vue +66 -22
  100. package/shared/components/notifications/styles/index.scss +1 -0
  101. package/shared/components/sidebar/index.ts +1 -0
  102. package/shared/components/sidebar/sidebar.vue +96 -0
  103. package/shared/components/theme-selector/index.ts +1 -0
  104. package/shared/components/theme-selector/theme-selector.vue +95 -0
  105. package/shared/components/user-dropdown-button/user-dropdown-button.vue +139 -86
  106. package/shared/modules/assets/components/assets-details/assets-details.vue +9 -2
  107. package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +16 -6
  108. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +1 -1
  109. package/shared/modules/dynamic/helpers/nodeBuilder.ts +1 -1
  110. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +6 -2
  111. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +16 -2
  112. package/shared/modules/dynamic/types/index.ts +3 -0
  113. package/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue +14 -9
  114. package/shared/pages/InvitePage/components/invite/Invite.vue +59 -15
  115. package/shared/pages/LoginPage/components/login/Login.vue +78 -22
  116. package/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue +67 -15
  117. package/tailwind.config.ts +281 -15
  118. package/ui/components/atoms/vc-badge/vc-badge.vue +38 -23
  119. package/ui/components/atoms/vc-button/vc-button.vue +37 -34
  120. package/ui/components/atoms/vc-card/vc-card.vue +17 -11
  121. package/ui/components/atoms/vc-col/vc-col.vue +4 -6
  122. package/ui/components/atoms/vc-container/vc-container.vue +26 -8
  123. package/ui/components/atoms/vc-hint/vc-hint.vue +8 -2
  124. package/ui/components/atoms/vc-icon/vc-icon.vue +3 -3
  125. package/ui/components/atoms/vc-image/vc-image.vue +33 -9
  126. package/ui/components/atoms/vc-label/vc-label.vue +38 -9
  127. package/ui/components/atoms/vc-link/vc-link.vue +15 -8
  128. package/ui/components/atoms/vc-loading/vc-loading.vue +37 -8
  129. package/ui/components/atoms/vc-progress/vc-progress.vue +29 -21
  130. package/ui/components/atoms/vc-row/vc-row.vue +4 -2
  131. package/ui/components/atoms/vc-status/vc-status.vue +29 -20
  132. package/ui/components/atoms/vc-status-icon/vc-status-icon.vue +20 -3
  133. package/ui/components/atoms/vc-switch/vc-switch.vue +41 -17
  134. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +35 -9
  135. package/ui/components/atoms/vc-video/vc-video.vue +28 -6
  136. package/ui/components/atoms/vc-widget/vc-widget.vue +59 -28
  137. package/ui/components/molecules/vc-breadcrumbs/_internal/vc-breadcrumbs-item/vc-breadcrumbs-item.vue +29 -27
  138. package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +34 -11
  139. package/ui/components/molecules/vc-checkbox/vc-checkbox.vue +43 -21
  140. package/ui/components/molecules/vc-editor/vc-editor.vue +70 -32
  141. package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +32 -16
  142. package/ui/components/molecules/vc-field/vc-field.vue +36 -13
  143. package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +75 -25
  144. package/ui/components/molecules/vc-input/vc-input.vue +279 -218
  145. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +24 -2
  146. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +102 -64
  147. package/ui/components/molecules/vc-notification/vc-notification.vue +40 -15
  148. package/ui/components/molecules/vc-pagination/vc-pagination.vue +19 -15
  149. package/ui/components/molecules/vc-radio-button/vc-radio-button.vue +18 -23
  150. package/ui/components/molecules/vc-rating/vc-rating.vue +9 -5
  151. package/ui/components/molecules/vc-select/vc-select.vue +211 -65
  152. package/ui/components/molecules/vc-slider/vc-slider.vue +32 -13
  153. package/ui/components/molecules/vc-textarea/vc-textarea.vue +17 -12
  154. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +68 -14
  155. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +112 -122
  156. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +213 -96
  157. package/ui/components/organisms/vc-app/vc-app.vue +41 -15
  158. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +78 -30
  159. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +81 -59
  160. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +27 -13
  161. package/ui/components/organisms/vc-blade/vc-blade.vue +177 -46
  162. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue +40 -11
  163. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue +52 -18
  164. package/ui/components/organisms/vc-gallery/vc-gallery.vue +38 -6
  165. package/ui/components/organisms/vc-login-form/vc-login-form.vue +40 -14
  166. package/ui/components/organisms/vc-popup/vc-popup.vue +186 -44
  167. package/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue +25 -6
  168. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +48 -12
  169. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +130 -60
  170. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +55 -7
  171. package/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue +17 -5
  172. package/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue +38 -6
  173. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +111 -62
  174. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue +139 -46
  175. package/ui/components/organisms/vc-table/vc-table.vue +370 -128
@@ -1,54 +1,44 @@
1
1
  <template>
2
- <div
3
- v-on-click-outside="
4
- () => {
5
- isDropActive = false;
6
- }
7
- "
8
- class="tw-relative"
2
+ <AppBarButtonTemplate
9
3
  :title="$t('COMPONENTS.LANGUAGE_SELECTOR.TITLE')"
10
- @click.stop="isDropActive = !isDropActive"
4
+ icon="fas fa-globe"
5
+ position="bottom-end"
11
6
  >
12
- <div
13
- :class="[
14
- {
15
- 'tw-shadow-[0_-6px_6px_white,1px_1px_22px_rgba(126,142,157,0.2)] [clip-path:inset(0px_-20px_0px_-20px)] tw-bg-white tw-z-[10000]':
16
- isDropActive,
17
- },
18
- 'tw-relative tw-h-full tw-flex tw-items-center tw-justify-center tw-w-[var(--app-bar-button-width)] tw-border-l tw-border-solid tw-border-l-[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)]',
19
- ]"
20
- >
21
- <VcIcon
22
- icon="fas fa-globe"
23
- size="xl"
24
- ></VcIcon>
25
- </div>
26
- <div
27
- v-if="isDropActive"
28
- class="tw-absolute tw-right-0 tw-top-[var(--app-bar-height)] tw-bg-white tw-shadow-[0_-6px_6px_white,1px_1px_22px_rgba(126,142,157,0.2)] tw-w-min tw-z-[10000]"
29
- >
30
- <div
31
- v-for="(lang, i) in languageItems"
32
- :key="i"
33
- class="tw-p-3 tw-text-lg tw-text-black tw-border-l tw-border-solid tw-border-l-[#eef0f2] tw-border-b tw-border-b-[#eef0f2] tw-white tw-cursor-pointer hover:tw-bg-[#eff7fc]"
34
- @click="lang.hasOwnProperty('clickHandler') && lang.clickHandler(lang.lang)"
7
+ <template #dropdown-content="{ opened, toggle }">
8
+ <Sidebar
9
+ :is-expanded="$isMobile.value ? opened : false"
10
+ position="right"
11
+ render="mobile"
12
+ @close="toggle"
35
13
  >
36
- {{ lang.title }}
37
- </div>
38
- </div>
39
- </div>
14
+ <template #content>
15
+ <div
16
+ v-if="opened"
17
+ class="vc-language-selector__dropdown"
18
+ >
19
+ <div
20
+ v-for="(lang, i) in languageItems"
21
+ :key="i"
22
+ class="vc-language-selector__item"
23
+ @click="lang.hasOwnProperty('clickHandler') && lang.clickHandler(lang.lang)"
24
+ >
25
+ {{ lang.title }}
26
+ </div>
27
+ </div>
28
+ </template>
29
+ </Sidebar>
30
+ </template>
31
+ </AppBarButtonTemplate>
40
32
  </template>
41
33
 
42
34
  <script lang="ts" setup>
43
- import { VcIcon } from "./../../../ui/components";
44
- import { ref } from "vue";
45
- import { vOnClickOutside } from "@vueuse/components";
46
35
  import { useI18n } from "vue-i18n";
47
36
  import { useLanguages } from "../../../core/composables";
37
+ import { AppBarButtonTemplate } from "./../app-bar-button";
38
+ import { Sidebar } from "./../sidebar";
48
39
 
49
40
  const { availableLocales, getLocaleMessage } = useI18n({ useScope: "global" });
50
41
  const { setLocale } = useLanguages();
51
- const isDropActive = ref(false);
52
42
 
53
43
  const languageItems = availableLocales
54
44
  .map((locale: string) => ({
@@ -60,3 +50,29 @@ const languageItems = availableLocales
60
50
  }))
61
51
  .filter((item) => item.title);
62
52
  </script>
53
+
54
+ <style lang="scss">
55
+ :root {
56
+ --language-selector-bg-color: var(--additional-50);
57
+ --language-selector-text-color: var(--base-text-color, var(--neutrals-950));
58
+ --language-selector-border-color: var(--app-bar-divider-color);
59
+ --language-selector-hover-bg-color: var(--primary-50);
60
+ }
61
+
62
+ .vc-language-selector {
63
+ &__dropdown {
64
+ @apply tw-bg-[color:var(--language-selector-bg-color)] tw-w-full;
65
+ }
66
+
67
+ &__item {
68
+ @apply tw-p-3 tw-text-sm tw-text-[color:var(--language-selector-text-color)]
69
+ tw-border-l tw-border-solid tw-border-l-[var(--language-selector-border-color)]
70
+ tw-border-b tw-border-b-[var(--language-selector-border-color)] tw-w-full tw-cursor-pointer;
71
+ transition: background-color 0.2s;
72
+
73
+ &:hover {
74
+ background-color: var(--language-selector-hover-bg-color);
75
+ }
76
+ }
77
+ }
78
+ </style>
@@ -43,7 +43,7 @@ const props = defineProps<Props>();
43
43
  const emit = defineEmits<Emits>();
44
44
 
45
45
  const notificationStyle = computed(() => ({
46
- color: "#A9BCCD",
46
+ color: "var(--notification-icon-color)",
47
47
  icon: "fas fa-info",
48
48
  }));
49
49
 
@@ -58,3 +58,9 @@ function notificationTemplateRenderer() {
58
58
  );
59
59
  }
60
60
  </script>
61
+
62
+ <style lang="scss">
63
+ :root {
64
+ --notification-icon-color: var(--secondary-600);
65
+ }
66
+ </style>
@@ -1,114 +1,90 @@
1
1
  <template>
2
- <div
3
- v-on-click-outside="
4
- () => {
5
- isDropdownVisible = false;
6
- }
7
- "
8
- class="tw-relative tw-flex tw-items-center tw-h-full"
2
+ <AppBarButtonTemplate
9
3
  :title="$t('COMPONENTS.NOTIFICATION_DROPDOWN.TITLE')"
10
- @click.stop="toggleNotificationsDrop"
4
+ position="bottom-end"
5
+ @toggle="onOpen"
11
6
  >
12
- <div
13
- :class="[
14
- 'tw-relative tw-h-full tw-flex tw-items-center tw-justify-center tw-w-[var(--app-bar-button-width)] tw-border-l tw-border-solid tw-border-l-[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)]',
15
- {
16
- 'tw-shadow-[0_-6px_6px_white,1px_1px_22px_rgba(126,142,157,0.2)] [clip-path:inset(0px_-20px_0px_-20px)] tw-bg-white tw-z-[10001]':
17
- isDropdownVisible && !$isMobile.value,
18
- },
19
- ]"
20
- >
21
- <VcIcon
22
- icon="fas fa-bell"
23
- size="xl"
24
- ></VcIcon>
25
- <div
26
- :class="{
27
- 'tw-block tw-absolute tw-right-[12px] tw-top-[18px] tw-w-[7px] tw-h-[7px] tw-bg-[#ff4a4a] tw-rounded-full tw-z-[1]':
28
- isAccent,
29
- }"
30
- ></div>
31
- </div>
32
- <div
33
- v-if="$isMobile.value && isDropdownVisible"
34
- class="tw-fixed tw-left-0 tw-top-0 tw-right-0 tw-bottom-0 tw-z-[10000] tw-bg-[#808c99] tw-opacity-60"
35
- @click.stop="toggleNotificationsDrop"
36
- ></div>
37
- <div
38
- v-if="isDropdownVisible"
39
- class="tw-absolute tw-top-[var(--app-bar-height)] tw-z-[10000] tw-drop-shadow-[0px_4px_15px_rgba(43,67,84,0.15)] tw-bg-white tw-rounded-b-[6px] tw-w-[439px] tw-max-h-[350px] tw-min-h-[50px] tw-right-0 tw-overflow-hidden tw-flex tw-flex-col"
40
- :class="{
41
- 'tw-hidden !tw-fixed !tw-right-0 !tw-top-0 !tw-max-h-full !tw-max-w-[300px] !tw-w-full !tw-bottom-0 !tw-z-[10000] !tw-border-0':
42
- $isMobile.value,
43
- '!tw-flex': $isMobile.value && isDropdownVisible,
44
- }"
45
- >
46
- <div
47
- v-if="$isMobile.value"
48
- class="tw-text-[#319ed4] tw-flex tw-justify-end tw-items-center tw-p-4 tw-cursor-pointer"
49
- >
7
+ <template #button>
8
+ <div class="vc-notification-dropdown__button">
50
9
  <VcIcon
51
- icon="fas fa-times"
10
+ icon="fas fa-bell"
52
11
  size="xl"
53
- @click.stop="isDropdownVisible = false"
54
12
  ></VcIcon>
13
+ <div
14
+ :class="{
15
+ 'vc-notification-dropdown__accent': isAccent,
16
+ }"
17
+ ></div>
55
18
  </div>
56
- <VcContainer
57
- :no-padding="true"
58
- @click.stop
19
+ </template>
20
+
21
+ <template #dropdown-content="{ opened, toggle }">
22
+ <Sidebar
23
+ :is-expanded="$isMobile.value ? opened : false"
24
+ position="right"
25
+ render="mobile"
26
+ @close="toggle"
59
27
  >
60
- <VcCol v-if="notifications && notifications.length">
28
+ <template #content>
61
29
  <div
62
- v-for="item in notifications"
63
- :key="`notification_${item.id}`"
64
- class="tw-py-[18px] tw-px-[15px] tw-border-b tw-border-solid tw-border-b-[#e3e7ec] tw-cursor-pointer last-of-type:tw-border-b-0"
30
+ v-if="opened"
31
+ :class="[
32
+ 'vc-notification-dropdown__dropdown',
33
+ { 'vc-notification-dropdown__dropdown--mobile': $isMobile.value },
34
+ ]"
65
35
  >
66
- <NotificationItem
67
- :notification="item"
68
- :templates="notificationTemplates || []"
69
- @on-click="() => (isDropdownVisible = false)"
70
- />
36
+ <VcContainer
37
+ :no-padding="true"
38
+ @click.stop
39
+ >
40
+ <VcCol v-if="notifications && notifications.length">
41
+ <div
42
+ v-for="item in notifications"
43
+ :key="`notification_${item.id}`"
44
+ class="vc-notification-dropdown__item"
45
+ >
46
+ <NotificationItem
47
+ :notification="item"
48
+ :templates="notificationTemplates || []"
49
+ @on-click="toggle"
50
+ />
51
+ </div>
52
+ </VcCol>
53
+ <div
54
+ v-else
55
+ class="vc-notification-dropdown__empty"
56
+ >
57
+ {{ t("COMPONENTS.NOTIFICATION_DROPDOWN.EMPTY") }}
58
+ </div>
59
+ </VcContainer>
71
60
  </div>
72
- </VcCol>
73
- <div
74
- v-else
75
- class="tw-flex tw-justify-center tw-items-center tw-p-4"
76
- >
77
- {{ t("COMPONENTS.NOTIFICATION_DROPDOWN.EMPTY") }}
78
- </div>
79
- </VcContainer>
80
- </div>
81
- </div>
61
+ </template>
62
+ </Sidebar>
63
+ </template>
64
+ </AppBarButtonTemplate>
82
65
  </template>
83
66
 
84
67
  <script lang="ts" setup>
85
- import { ref, inject, computed } from "vue";
68
+ import { inject, computed } from "vue";
86
69
  import NotificationItem from "./_internal/notification/notification.vue";
87
70
  import { VcCol, VcContainer, VcIcon } from "../../../ui/components";
88
- import { vOnClickOutside } from "@vueuse/components";
89
71
  import { useI18n } from "vue-i18n";
90
72
  import { NotificationTemplateConstructor } from "../../../core/types";
91
73
  import { useNotifications } from "../../../core/composables";
74
+ import { AppBarButtonTemplate } from "./../app-bar-button";
75
+ import { Sidebar } from "./../sidebar";
92
76
 
93
77
  const notificationTemplates = inject<NotificationTemplateConstructor[]>("notificationTemplates");
94
78
 
95
79
  const { t } = useI18n({ useScope: "global" });
96
80
  const { notifications, markAllAsRead } = useNotifications();
97
81
 
98
- const isDropdownVisible = ref(false);
99
-
100
82
  const isAccent = computed(() => {
101
83
  return notifications.value.some((item) => item.isNew);
102
84
  });
103
85
 
104
- function toggleNotificationsDrop() {
105
- isDropdownVisible.value = !isDropdownVisible.value;
106
-
107
- onOpen();
108
- }
109
-
110
- function onOpen() {
111
- if (notifications.value.some((x) => x.isNew)) {
86
+ function onOpen(state: boolean) {
87
+ if (state && notifications.value.some((x) => x.isNew)) {
112
88
  markAllAsRead();
113
89
  }
114
90
  }
@@ -116,6 +92,43 @@ function onOpen() {
116
92
 
117
93
  <style lang="scss">
118
94
  :root {
119
- --notification-color-error: #f14e4e;
95
+ --notification-dropdown-border-color: var(--additional-50);
96
+ --notification-dropdown-bg-color: var(--additional-50);
97
+ --notification-dropdown-accent-color: var(--danger-500);
98
+ --notification-dropdown-button-width: var(--app-bar-button-width);
99
+ }
100
+
101
+ .vc-notification-dropdown {
102
+ &__accent {
103
+ @apply tw-block tw-absolute tw-right-[12px] tw-top-[18px] tw-w-[7px] tw-h-[7px] tw-bg-[--notification-dropdown-accent-color] tw-rounded-full tw-z-[1];
104
+ }
105
+
106
+ &__dropdown {
107
+ @apply tw-bg-[--notification-dropdown-bg-color] tw-rounded-b-[6px] tw-w-[439px]
108
+ tw-max-h-[350px] tw-min-h-[50px] tw-overflow-hidden tw-flex tw-flex-col;
109
+
110
+ &--mobile {
111
+ @apply tw-max-h-full tw-w-full;
112
+ display: flex !important;
113
+ }
114
+ }
115
+
116
+ &__button {
117
+ @apply tw-w-[var(--notification-dropdown-button-width)] tw-h-full tw-flex tw-items-center tw-justify-center tw-relative;
118
+ }
119
+
120
+ &__item {
121
+ @apply tw-py-[18px] tw-px-[15px] tw-border-b tw-border-solid
122
+ tw-border-b-[var(--notification-dropdown-border-color)] tw-cursor-pointer;
123
+ transition: background-color 0.2s;
124
+
125
+ &:last-of-type {
126
+ @apply tw-border-b-0;
127
+ }
128
+ }
129
+
130
+ &__empty {
131
+ @apply tw-flex tw-justify-center tw-items-center tw-p-4 tw-text-sm;
132
+ }
120
133
  }
121
134
  </style>
@@ -1,30 +1,33 @@
1
1
  <template>
2
- <div class="tw-flex flex-row tw-justify-between tw-grow tw-basis-0">
3
- <div class="tw-flex tw-items-center">
4
- <div
5
- class="tw-w-[41px] tw-h-[41px] tw-rounded-full tw-text-white tw-mr-4 tw-flex tw-items-center tw-justify-center tw-shrink-0"
6
- :style="{ 'background-color': color }"
7
- >
8
- <VcIcon
9
- :icon="icon"
10
- size="l"
11
- ></VcIcon>
12
- </div>
13
- <div>
14
- <p
15
- class="tw-text-[color:var(--basic-black-color)] tw-text-xl tw-leading-[19px] tw-font-bold tw-m-0 tw-mb-1 [word-break:break-word]"
16
- :class="{ 'tw-mr-4': $isDesktop.value }"
2
+ <div class="vc-notification-template">
3
+ <div class="vc-notification-template__container">
4
+ <div class="vc-notification-template__left">
5
+ <div
6
+ class="vc-notification-template__icon-container"
7
+ :style="{ 'background-color': color }"
17
8
  >
18
- {{ title }}
9
+ <VcIcon
10
+ :icon="icon"
11
+ size="l"
12
+ aria-label="Notification Icon"
13
+ ></VcIcon>
14
+ </div>
15
+ <div class="vc-notification-template__content">
16
+ <p
17
+ class="vc-notification-template__title"
18
+ :class="{ 'vc-notification-template__title--desktop': $isDesktop.value }"
19
+ >
20
+ {{ title }}
21
+ </p>
22
+ <slot></slot>
23
+ </div>
24
+ </div>
25
+ <div class="vc-notification-template__right">
26
+ <p class="vc-notification-template__time">
27
+ {{ pushTime }}
19
28
  </p>
20
- <slot></slot>
21
29
  </div>
22
30
  </div>
23
- <div class="tw-flex tw-shrink-0">
24
- <p class="tw-text-s tw-leading-[18px] tw-text-[#8e8e8e] tw-m-0">
25
- {{ pushTime }}
26
- </p>
27
- </div>
28
31
  </div>
29
32
  </template>
30
33
 
@@ -49,3 +52,44 @@ const pushTime = computed(() => {
49
52
  return moment(props.notification.created).locale(locale).format("L LT");
50
53
  });
51
54
  </script>
55
+
56
+ <style lang="scss">
57
+ :root {
58
+ --notification-template-icon-color: var(--additional-50);
59
+ --notification-template-text-color: var(--additional-950);
60
+ --notification-template-time-color: var(--neutrals-600);
61
+ }
62
+
63
+ .vc-notification-template {
64
+ &__container {
65
+ @apply tw-flex tw-flex-row tw-justify-between tw-grow tw-basis-0;
66
+ }
67
+
68
+ &__left {
69
+ @apply tw-flex tw-items-center;
70
+ }
71
+
72
+ &__icon-container {
73
+ @apply tw-w-[41px] tw-h-[41px] tw-rounded-full tw-text-[color:var(--notification-template-icon-color)]
74
+ tw-mr-4 tw-flex tw-items-center tw-justify-center tw-shrink-0;
75
+ }
76
+
77
+ &__title {
78
+ @apply tw-text-[color:var(--notification-template-text-color)] tw-text-lg tw-leading-[19px]
79
+ tw-font-bold tw-m-0 tw-mb-1;
80
+ word-break: break-word;
81
+
82
+ &--desktop {
83
+ @apply tw-mr-4;
84
+ }
85
+ }
86
+
87
+ &__right {
88
+ @apply tw-flex tw-shrink-0;
89
+ }
90
+
91
+ &__time {
92
+ @apply tw-text-sm tw-text-[color:var(--notification-template-time-color)] tw-m-0;
93
+ }
94
+ }
95
+ </style>
@@ -6,4 +6,5 @@
6
6
  display: flex;
7
7
  display: flex;
8
8
  flex-direction: column;
9
+ gap: 5px;
9
10
  }
@@ -0,0 +1 @@
1
+ export { default as Sidebar } from "./sidebar.vue";
@@ -0,0 +1,96 @@
1
+ <template>
2
+ <template v-if="isExpanded">
3
+ <div
4
+ v-if="isExpanded"
5
+ class="sidebar__overlay"
6
+ @click.stop="$emit('close')"
7
+ ></div>
8
+
9
+ <div
10
+ v-if="isExpanded"
11
+ :class="[
12
+ 'sidebar__dropdown',
13
+ {
14
+ 'sidebar__dropdown--mobile': $isMobile.value && render === 'mobile',
15
+ 'sidebar__dropdown--desktop': $isDesktop.value && render === 'desktop',
16
+ 'sidebar__dropdown--always': render === 'always',
17
+ 'sidebar__dropdown--left': position === 'left',
18
+ 'sidebar__dropdown--right': position === 'right',
19
+ },
20
+ ]"
21
+ >
22
+ <slot name="header">
23
+ <div class="sidebar__header">
24
+ <VcIcon
25
+ icon="fas fa-times"
26
+ size="xl"
27
+ @click.stop="$emit('close')"
28
+ ></VcIcon>
29
+ </div>
30
+ </slot>
31
+
32
+ <slot name="content"></slot>
33
+ </div>
34
+ </template>
35
+ <template v-else>
36
+ <slot name="content"></slot>
37
+ </template>
38
+ </template>
39
+
40
+ <script lang="ts" setup>
41
+ export interface Props {
42
+ position: "left" | "right";
43
+ render: "always" | "mobile" | "desktop";
44
+ isExpanded: boolean;
45
+ }
46
+
47
+ export interface Emits {
48
+ (event: "close"): void;
49
+ }
50
+
51
+ defineEmits<Emits>();
52
+
53
+ const props = withDefaults(defineProps<Props>(), {
54
+ position: "right",
55
+ render: "always",
56
+ });
57
+ </script>
58
+
59
+ <style lang="scss">
60
+ :root {
61
+ --sidebar-mobile-bg-color: var(--neutral-500);
62
+ --sidebar-dropdown-mobile-icon-color: var(--primary-500);
63
+ }
64
+
65
+ .sidebar {
66
+ @apply tw-relative;
67
+
68
+ &__overlay {
69
+ @apply tw-fixed tw-left-0 tw-top-0 tw-right-0 tw-bottom-0 tw-z-[10000]
70
+ tw-bg-[--sidebar-mobile-bg-color] tw-backdrop-blur-[3px];
71
+ }
72
+ &__header {
73
+ @apply tw-text-[color:var(--sidebar-dropdown-mobile-icon-color)] tw-flex tw-justify-end tw-items-center tw-p-4 tw-cursor-pointer;
74
+ }
75
+
76
+ &__dropdown {
77
+ @apply tw-absolute tw-top-[var(--app-bar-button-height)] tw-bg-[color:var(--app-bar-button-bg-color)] tw-z-[10000] tw-flex tw-flex-col;
78
+ box-shadow: var(--app-bar-button-shadow);
79
+
80
+ &--mobile,
81
+ &--always,
82
+ &--desktop {
83
+ @apply tw-hidden tw-fixed tw-top-0 tw-max-h-full tw-max-w-[300px] tw-w-full tw-bottom-0 tw-z-[10000] tw-border-0;
84
+ display: flex !important;
85
+ }
86
+
87
+ &--left {
88
+ @apply tw-left-0 tw-right-auto;
89
+ }
90
+
91
+ &--right {
92
+ @apply tw-right-0 tw-left-auto;
93
+ }
94
+ }
95
+ }
96
+ </style>
@@ -0,0 +1 @@
1
+ export { default as ThemeSelector } from "./theme-selector.vue";
@@ -0,0 +1,95 @@
1
+ <template>
2
+ <AppBarButtonTemplate
3
+ icon="fas fa-palette"
4
+ :title="themeText(current)"
5
+ >
6
+ <template #dropdown-content="{ opened, toggle }">
7
+ <Sidebar
8
+ :is-expanded="$isMobile.value ? opened : false"
9
+ position="right"
10
+ render="mobile"
11
+ @close="toggle"
12
+ >
13
+ <template #content>
14
+ <div
15
+ v-if="opened"
16
+ class="vc-theme-selector__dropdown"
17
+ >
18
+ <div
19
+ v-for="(theme, i) in themes"
20
+ :key="i"
21
+ class="vc-theme-selector__item"
22
+ :class="{ 'vc-theme-selector__item--active': theme === current }"
23
+ @click="
24
+ () => {
25
+ setTheme(theme);
26
+ toggle();
27
+ }
28
+ "
29
+ >
30
+ {{ themeText(theme) }}
31
+ </div>
32
+ </div>
33
+ </template>
34
+ </Sidebar>
35
+ </template>
36
+ </AppBarButtonTemplate>
37
+ </template>
38
+
39
+ <script lang="ts" setup>
40
+ import { AppBarButtonTemplate } from "./../app-bar-button";
41
+ import { Sidebar } from "./../sidebar";
42
+ import { useTheme } from "./../../../core/composables/useTheme";
43
+ import { watch, computed } from "vue";
44
+ import { notification } from "./../";
45
+ import * as _ from "lodash-es";
46
+ import { useI18n } from "vue-i18n";
47
+ import { createUnrefFn } from "@vueuse/core";
48
+
49
+ const { current, themes, setTheme } = useTheme();
50
+ const { t } = useI18n({ useScope: "global" });
51
+
52
+ watch(
53
+ () => current,
54
+ (newVal) => {
55
+ notification(themeText.value(newVal));
56
+ },
57
+ { deep: true },
58
+ );
59
+
60
+ const themeText = computed(() => {
61
+ return createUnrefFn((theme: string) => {
62
+ return _.capitalize(theme) + t("COMPONENTS.THEME_SELECTOR.THEME_CHANGED");
63
+ });
64
+ });
65
+ </script>
66
+
67
+ <style lang="scss">
68
+ :root {
69
+ --theme-selector-bg-color: var(--additional-50);
70
+ --theme-selector-text-color: var(--base-text-color, var(--neutrals-950));
71
+ --theme-selector-border-color: var(--app-bar-divider-color);
72
+ --theme-selector-hover-bg-color: var(--primary-50);
73
+ }
74
+
75
+ .vc-theme-selector {
76
+ &__dropdown {
77
+ @apply tw-bg-[color:var(--theme-selector-bg-color)] tw-w-full;
78
+ }
79
+
80
+ &__item {
81
+ @apply tw-p-3 tw-text-sm tw-text-[color:var(--theme-selector-text-color)]
82
+ tw-border-l tw-border-solid tw-border-l-[var(--theme-selector-border-color)]
83
+ tw-border-b tw-border-b-[var(--theme-selector-border-color)] tw-w-full tw-cursor-pointer;
84
+ transition: background-color 0.2s;
85
+
86
+ &:hover {
87
+ background-color: var(--theme-selector-hover-bg-color);
88
+ }
89
+
90
+ &--active {
91
+ @apply tw-bg-[color:var(--theme-selector-hover-bg-color)];
92
+ }
93
+ }
94
+ }
95
+ </style>