@vc-shell/framework 1.1.0-alpha.6 → 1.1.0-alpha.7

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 (73) hide show
  1. package/core/composables/useGlobalSearch/index.ts +4 -4
  2. package/core/constants/index.ts +2 -0
  3. package/core/plugins/modularity/index.ts +1 -1
  4. package/core/services/menu-service.ts +292 -28
  5. package/core/types/index.ts +13 -0
  6. package/dist/core/composables/useGlobalSearch/index.d.ts +2 -2
  7. package/dist/core/constants/index.d.ts +1 -0
  8. package/dist/core/constants/index.d.ts.map +1 -1
  9. package/dist/core/services/menu-service.d.ts +36 -3
  10. package/dist/core/services/menu-service.d.ts.map +1 -1
  11. package/dist/core/types/index.d.ts +13 -0
  12. package/dist/core/types/index.d.ts.map +1 -1
  13. package/dist/framework.js +198 -197
  14. package/dist/{index-LjqdX6jw.js → index-4fNoXD3u.js} +1 -1
  15. package/dist/{index-CyuFXG83.js → index-7YHBATKO.js} +1 -1
  16. package/dist/{index-D1rpRTKf.js → index-7gQRbSrG.js} +1 -1
  17. package/dist/{index-B-nvqNbp.js → index-B1NfXGpu.js} +1 -1
  18. package/dist/{index-DZAq0B3U.js → index-B42ra4oQ.js} +21078 -21001
  19. package/dist/{index-EDF1MDtU.js → index-Bixm_Atu.js} +1 -1
  20. package/dist/{index-DvGVm1rK.js → index-C9NLyptv.js} +1 -1
  21. package/dist/{index-C7P-aBjd.js → index-CPjPhNQr.js} +1 -1
  22. package/dist/{index-CfyFpaKq.js → index-CR62_U0-.js} +1 -1
  23. package/dist/{index-DLxTAT7x.js → index-DHUS6fMi.js} +1 -1
  24. package/dist/{index-BXlxP2d2.js → index-DKMXMXmO.js} +1 -1
  25. package/dist/{index-Ci23AX3j.js → index-DxhPupsj.js} +1 -1
  26. package/dist/{index-DtkJ7xTB.js → index-DyDl-e3b.js} +1 -1
  27. package/dist/{index-DOVhosAY.js → index-IdAZC2W6.js} +1 -1
  28. package/dist/{index-BQF2-UMe.js → index-QiYxGOfR.js} +1 -1
  29. package/dist/{index-CO_2IshF.js → index-qjW_Kc_I.js} +1 -1
  30. package/dist/{index-3ySdd-mG.js → index-tHx2asQS.js} +1 -1
  31. package/dist/index.css +1 -1
  32. package/dist/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.d.ts.map +1 -1
  33. package/dist/shared/components/notification-dropdown/notification-dropdown.vue.d.ts.map +1 -1
  34. package/dist/shared/components/sidebar/sidebar.vue.d.ts.map +1 -1
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  37. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue.d.ts.map +1 -1
  38. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue.d.ts.map +1 -1
  39. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  40. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  41. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  42. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts.map +1 -1
  43. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  44. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
  45. package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue.d.ts.map +1 -1
  46. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  47. package/dist/ui/composables/useVisibleElements.d.ts.map +1 -1
  48. package/package.json +4 -4
  49. package/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.ts +2 -2
  50. package/shared/components/blade-navigation/types/index.ts +117 -117
  51. package/shared/components/draggable-dashboard/DraggableDashboard.vue +2 -5
  52. package/shared/components/draggable-dashboard/_internal/DashboardWidget.vue +16 -32
  53. package/shared/components/notification-dropdown/notification-dropdown.vue +11 -1
  54. package/shared/components/sidebar/sidebar.vue +36 -34
  55. package/shared/pages/LoginPage/components/login/Login.vue +0 -2
  56. package/ui/components/atoms/vc-badge/vc-badge.vue +26 -10
  57. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +2 -2
  58. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +31 -2
  59. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue +15 -13
  60. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +26 -15
  61. package/ui/components/organisms/vc-app/vc-app.vue +14 -2
  62. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +4 -5
  63. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue +2 -2
  64. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/mobile/vc-blade-toolbar-mobile.vue +1 -1
  65. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +0 -3
  66. package/ui/components/organisms/vc-blade/vc-blade.vue +7 -2
  67. package/ui/components/organisms/vc-login-form/vc-login-form.vue +99 -99
  68. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +5 -5
  69. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue +1 -0
  70. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +40 -28
  71. package/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue +1 -1
  72. package/ui/components/organisms/vc-table/vc-table.vue +5 -4
  73. package/ui/composables/useVisibleElements.ts +2 -0
@@ -154,7 +154,6 @@
154
154
  <VcHint
155
155
  v-if="!signInResult.succeeded"
156
156
  class="vc-login-page__error-hint"
157
- style="color: #f14e4e"
158
157
  >
159
158
  <!-- TODO: stylizing-->
160
159
  {{ signInResult.error }}
@@ -162,7 +161,6 @@
162
161
  <VcHint
163
162
  v-if="!requestPassResult.succeeded"
164
163
  class="vc-login-page__error-hint"
165
- style="color: #f14e4e"
166
164
  >
167
165
  <!-- TODO: stylizing-->
168
166
  {{ requestPassResult.error }}
@@ -17,6 +17,8 @@
17
17
  'vc-badge__badge--active': active,
18
18
  'vc-badge__badge--clickable': clickable,
19
19
  'vc-badge__badge--disabled': disabled,
20
+ 'vc-badge__badge--content-long': String(content).length > 1,
21
+ 'vc-badge__badge--content-very-long': String(content).length > 2,
20
22
  }"
21
23
  @click="onClick"
22
24
  >
@@ -78,11 +80,8 @@ function onClick(): void {
78
80
  --badge-border-color-active: var(--primary-300);
79
81
  --badge-border-color-disabled: var(--primary-200);
80
82
 
81
- --badge-width-small: 16px;
82
- --badge-width-medium: 16px;
83
-
84
- --badge-padding-small: 0px 4px;
85
- --badge-padding-medium: 0 4px;
83
+ --badge-size-small: 17px;
84
+ --badge-size-medium: 20px;
86
85
 
87
86
  --badge-distance-top-small: -8px;
88
87
  --badge-distance-right-small: -10px;
@@ -97,12 +96,11 @@ $sizes: small, medium;
97
96
  .vc-badge {
98
97
  &--#{$size} {
99
98
  .vc-badge__badge {
100
- min-width: var(--badge-width-#{$size});
101
- padding: var(--badge-padding-#{$size});
99
+ height: var(--badge-size-#{$size});
100
+ min-width: var(--badge-size-#{$size});
102
101
  top: var(--badge-distance-top-#{$size});
103
102
  right: var(--badge-distance-right-#{$size});
104
- width: 100%;
105
- @apply tw-text-xs tw-leading-snug;
103
+ @apply tw-text-xxs tw-leading-snug;
106
104
  }
107
105
  }
108
106
  }
@@ -113,7 +111,25 @@ $sizes: small, medium;
113
111
  }
114
112
 
115
113
  .vc-badge__badge {
116
- @apply tw-absolute tw-inline-flex tw-justify-center tw-items-center tw-text-center tw-indent-0 tw-rounded-full tw-font-semibold tw-text-xxs tw-bg-[color:var(--badge-background-color)] tw-text-[color:var(--badge-text-color)] tw-border tw-border-solid tw-border-[color:var(--badge-border-color)] tw-transition tw-duration-200;
114
+ @apply tw-absolute tw-inline-flex tw-justify-center tw-items-center tw-text-center tw-indent-0 tw-rounded-full tw-font-semibold tw-bg-[color:var(--badge-background-color)] tw-text-[color:var(--badge-text-color)] tw-border tw-border-solid tw-border-[color:var(--badge-border-color)] tw-transition tw-duration-200;
115
+ aspect-ratio: 1 / 1;
116
+ box-sizing: border-box;
117
+ white-space: nowrap;
118
+ line-height: 1;
119
+ display: flex;
120
+ justify-content: center;
121
+ align-items: center;
122
+ }
123
+
124
+ .vc-badge__badge--content-long {
125
+ aspect-ratio: auto;
126
+ }
127
+
128
+ .vc-badge__badge--content-very-long {
129
+ aspect-ratio: auto;
130
+ max-width: 40px;
131
+ text-overflow: ellipsis;
132
+ overflow: hidden;
117
133
  }
118
134
 
119
135
  .vc-badge__badge--active {
@@ -27,7 +27,7 @@
27
27
 
28
28
  <script lang="ts" setup>
29
29
  import { useFloating, shift, Placement, offset as floatingOffset } from "@floating-ui/vue";
30
- import { getCurrentInstance, ref } from "vue";
30
+ import { getCurrentInstance, ref, computed } from "vue";
31
31
 
32
32
  export interface Props {
33
33
  placement?: Placement;
@@ -59,7 +59,7 @@ const target = ref(null);
59
59
  let showTimeout: NodeJS.Timeout | null = null;
60
60
 
61
61
  const instance = getCurrentInstance();
62
- const appContainer = instance?.appContext.app._container.id;
62
+ const appContainer = computed(() => instance?.appContext.app._container?.id);
63
63
 
64
64
  const { floatingStyles } = useFloating(tooltipCompRef, tooltipRef, {
65
65
  placement: props.placement,
@@ -45,7 +45,9 @@
45
45
  text
46
46
  :icon="SearchIcon"
47
47
  icon-size="l"
48
- @click="globalSearch.toggleSearch(currentBladeId)"
48
+ class="app-bar-header__actions-button"
49
+ :class="{ 'app-bar-header__actions-button--active': isSearchVisible }"
50
+ @click="globalSearch.toggleSearch(bladeId)"
49
51
  />
50
52
  </div>
51
53
  <slot name="notifications" />
@@ -74,11 +76,12 @@
74
76
  <script lang="ts" setup>
75
77
  import { VcIcon } from "../../../../../";
76
78
  import { MenuBurgerIcon, SearchIcon } from "../../../../../atoms/vc-icon/icons";
77
- import { computed, Ref, ref, watchEffect } from "vue";
79
+ import { computed, Ref, ref, watch, watchEffect } from "vue";
78
80
  import { useNotifications } from "../../../../../../../core/composables";
79
81
  import { watchDebounced } from "@vueuse/core";
80
82
  import { useBladeNavigation } from "./../../../../../../../shared";
81
83
  import { useGlobalSearch } from "../../../../../../../core/composables/useGlobalSearch";
84
+ import { FALLBACK_BLADE_ID } from "../../../../../../../core/constants";
82
85
 
83
86
  defineProps<{
84
87
  logo?: string;
@@ -99,6 +102,17 @@ const { notifications } = useNotifications();
99
102
  const { blades, currentBladeNavigationData } = useBladeNavigation();
100
103
  const globalSearch = useGlobalSearch();
101
104
 
105
+ watch(
106
+ () => globalSearch.isSearchVisible.value,
107
+ (value) => {
108
+ console.log(value);
109
+ },
110
+ );
111
+
112
+ const bladeId = computed(() => {
113
+ return blades.value[blades.value.length - 1]?.type.name || FALLBACK_BLADE_ID;
114
+ });
115
+
102
116
  const viewTitle = ref("");
103
117
  const currentBladeId = ref(0);
104
118
 
@@ -115,6 +129,10 @@ watchEffect(
115
129
  const hasUnread = computed(() => {
116
130
  return notifications.value.some((item) => item.isNew);
117
131
  });
132
+
133
+ const isSearchVisible = computed(() => {
134
+ return globalSearch.isSearchVisible.value[bladeId.value];
135
+ });
118
136
  </script>
119
137
 
120
138
  <style lang="scss">
@@ -122,6 +140,9 @@ const hasUnread = computed(() => {
122
140
  --app-bar-header-padding-top: 18px;
123
141
  --app-bar-header-blade-title: var(--neutrals-950);
124
142
  --app-bar-accent-color: var(--danger-500);
143
+
144
+ --app-bar-header-actions-button-color: var(--neutrals-500);
145
+ --app-bar-header-actions-button-active-color: var(--primary-500);
125
146
  }
126
147
 
127
148
  .app-bar-header {
@@ -174,5 +195,13 @@ const hasUnread = computed(() => {
174
195
  &__logo-append {
175
196
  @apply tw-flex tw-items-center;
176
197
  }
198
+
199
+ &__actions-button {
200
+ @apply tw-cursor-pointer tw-text-[var(--app-bar-header-actions-button-color)] #{!important};
201
+
202
+ &--active {
203
+ @apply tw-text-[var(--app-bar-header-actions-button-active-color)] #{!important};
204
+ }
205
+ }
177
206
  }
178
207
  </style>
@@ -1,18 +1,20 @@
1
1
  <template>
2
- <div
3
- class="app-bar-overlay"
4
- :class="{
5
- 'app-bar-overlay--mobile': $isMobile.value,
6
- 'app-bar-overlay--desktop': $isDesktop.value,
7
- 'app-bar-overlay--sidebar': isSidebarMode,
8
- 'app-bar-overlay--standalone-mobile': $isMobile.value && !isSidebarMode,
9
- 'app-bar-overlay--collapsed': !expanded && !$isMobile.value,
10
- }"
11
- >
12
- <div class="app-bar-overlay__content app-bar-overlay__dropdowns">
13
- <slot />
2
+ <Teleport to="body">
3
+ <div
4
+ class="app-bar-overlay"
5
+ :class="{
6
+ 'app-bar-overlay--mobile': $isMobile.value,
7
+ 'app-bar-overlay--desktop': $isDesktop.value,
8
+ 'app-bar-overlay--sidebar': isSidebarMode,
9
+ 'app-bar-overlay--standalone-mobile': $isMobile.value && !isSidebarMode,
10
+ 'app-bar-overlay--collapsed': !expanded && !$isMobile.value,
11
+ }"
12
+ >
13
+ <div class="app-bar-overlay__content app-bar-overlay__dropdowns">
14
+ <slot />
15
+ </div>
14
16
  </div>
15
- </div>
17
+ </Teleport>
16
18
  </template>
17
19
 
18
20
  <script lang="ts" setup>
@@ -8,25 +8,13 @@
8
8
  ></div>
9
9
  <div
10
10
  class="vc-app-bar"
11
- :class="{
12
- 'vc-app-bar--mobile': $isMobile.value,
13
- 'vc-app-bar--desktop': $isDesktop.value,
14
- 'vc-app-bar--collapsed': !state.isSidebarExpanded && $isDesktop.value,
15
- 'vc-app-bar--hover-expanded': $isDesktop.value && isHoverExpanded,
16
- 'vc-app-bar--hover-collapsed': $isDesktop.value && !state.isSidebarExpanded && !isHoverExpanded,
17
- }"
11
+ :class="appBarClasses"
18
12
  @mouseenter="$isDesktop.value && !state.isSidebarExpanded && handleHoverExpand(true)"
19
13
  @mouseleave="$isDesktop.value && !state.isSidebarExpanded && handleHoverExpand(false)"
20
14
  >
21
15
  <div
22
16
  class="vc-app-bar__wrap"
23
- :class="{
24
- 'vc-app-bar__wrap--mobile-expanded': $isMobile.value && state.isSidebarExpanded,
25
- 'vc-app-bar__wrap--desktop-collapsed': $isDesktop.value && !state.isSidebarExpanded,
26
- 'vc-app-bar__wrap--desktop-expanded': $isDesktop.value && state.isSidebarExpanded,
27
- 'vc-app-bar__wrap--hover-expanded': $isDesktop.value && isHoverExpanded && !state.isSidebarExpanded,
28
- 'vc-app-bar__wrap--hover-collapsed': $isDesktop.value && !isHoverExpanded && !state.isSidebarExpanded,
29
- }"
17
+ :class="wrapClasses"
30
18
  >
31
19
  <div
32
20
  v-if="!$isMobile.value"
@@ -139,7 +127,7 @@ import AppBarHeader from "./_internal/AppBarHeader.vue";
139
127
  import AppBarOverlay from "./_internal/AppBarOverlay.vue";
140
128
  import MenuSidebar from "./_internal/MenuSidebar.vue";
141
129
  import AppBarContent from "./_internal/AppBarContent.vue";
142
- import { ref, computed, provide } from "vue";
130
+ import { ref, computed, provide, inject } from "vue";
143
131
  import { vOnClickOutside } from "@vueuse/components";
144
132
 
145
133
  export interface Props {
@@ -175,6 +163,9 @@ const {
175
163
  } = useAppMenuState();
176
164
  const { overlayContent, overlayProps, hideContent, isOverlayed } = useAppBarOverlay();
177
165
 
166
+ const isMobile = inject("isMobile", ref(false));
167
+ const isDesktop = inject("isDesktop", ref(true));
168
+
178
169
  // Provide appMenuState для дочерних компонентов
179
170
  provide("appMenuState", { closeAll });
180
171
 
@@ -204,6 +195,26 @@ const shouldShowOverlay = computed(() => {
204
195
  const shouldShowInMenu = computed(() => {
205
196
  return overlayContent.value && !isOverlayed.value && state.value.isMenuOpen;
206
197
  });
198
+
199
+ const appBarClasses = computed(() => {
200
+ return {
201
+ "vc-app-bar--mobile": isMobile.value,
202
+ "vc-app-bar--desktop": isDesktop.value,
203
+ "vc-app-bar--collapsed": !state.value.isSidebarExpanded && isDesktop.value,
204
+ "vc-app-bar--hover-expanded": isDesktop.value && isHoverExpanded.value,
205
+ "vc-app-bar--hover-collapsed": isDesktop.value && !state.value.isSidebarExpanded && !isHoverExpanded.value,
206
+ };
207
+ });
208
+
209
+ const wrapClasses = computed(() => {
210
+ return {
211
+ "vc-app-bar__wrap--mobile-expanded": isMobile.value && state.value.isSidebarExpanded,
212
+ "vc-app-bar__wrap--desktop-collapsed": isDesktop.value && !state.value.isSidebarExpanded,
213
+ "vc-app-bar__wrap--desktop-expanded": isDesktop.value && state.value.isSidebarExpanded,
214
+ "vc-app-bar__wrap--hover-expanded": isDesktop.value && isHoverExpanded.value && !state.value.isSidebarExpanded,
215
+ "vc-app-bar__wrap--hover-collapsed": isDesktop.value && !isHoverExpanded.value && !state.value.isSidebarExpanded,
216
+ };
217
+ });
207
218
  </script>
208
219
 
209
220
  <style lang="scss">
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <VcLoading
3
- v-if="!isReady"
3
+ v-if="!isAppReady"
4
4
  active
5
5
  class="vc-app__loader"
6
6
  />
@@ -83,7 +83,7 @@
83
83
  </template>
84
84
 
85
85
  <script lang="ts" setup>
86
- import { h, inject, provide, computed, useAttrs } from "vue";
86
+ import { h, inject, provide, computed, useAttrs, watch, toRef, ref, onBeforeUnmount, onUnmounted } from "vue";
87
87
  import VcAppBar from "./_internal/vc-app-bar/vc-app-bar.vue";
88
88
  import VcAppMenu from "./_internal/vc-app-menu/vc-app-menu.vue";
89
89
  import {
@@ -142,6 +142,9 @@ console.debug("vc-app: Init vc-app");
142
142
 
143
143
  const internalRoutes = inject("bladeRoutes") as BladeRoutesRecord[];
144
144
  const dynamicModules = inject(DynamicModulesKey, undefined);
145
+
146
+ const isAppReady = ref(props.isReady);
147
+
145
148
  const router = useRouter();
146
149
 
147
150
  const { openBlade, closeBlade, resolveBladeByName, blades, goToRoot } = useBladeNavigation();
@@ -221,6 +224,7 @@ const openRoot = async () => {
221
224
  watchOnce(
222
225
  () => props.isReady,
223
226
  async (newVal) => {
227
+ isAppReady.value = newVal;
224
228
  if (isAuthenticated.value && newVal) {
225
229
  await loadFromHistory();
226
230
  await getApps();
@@ -228,11 +232,19 @@ watchOnce(
228
232
  },
229
233
  );
230
234
 
235
+ watch(isAuthenticated, (newVal) => {
236
+ isAppReady.value = newVal;
237
+ });
238
+
231
239
  provide("internalRoutes", internalRoutes);
232
240
  provide(DynamicModulesKey, dynamicModules);
233
241
  provideDashboardService();
234
242
  provideMenuService();
235
243
  createGlobalSearch();
244
+
245
+ onUnmounted(() => {
246
+ isAppReady.value = false;
247
+ });
236
248
  </script>
237
249
 
238
250
  <style lang="scss">
@@ -111,12 +111,11 @@
111
111
 
112
112
  <script lang="ts" setup>
113
113
  import { VcIcon } from "./../../../../";
114
- import { ComputedRef, computed, inject, ref } from "vue";
114
+ import { computed, inject, ref } from "vue";
115
115
  import { useFloating, shift } from "@floating-ui/vue";
116
116
  import { CrossSignIcon, AppWindowIcon } from "../../../../atoms/vc-icon/icons";
117
117
  import { BladeInstance } from "../../../../../../injection-keys";
118
- import { Breadcrumbs } from "./../../../../../../ui/types";
119
- import VertDotsIcon from "../../../../atoms/vc-icon/icons/VertDotsIcon.vue";
118
+ import { FALLBACK_BLADE_ID } from "../../../../../../core/constants";
120
119
 
121
120
  export interface Props {
122
121
  closable?: boolean;
@@ -132,7 +131,7 @@ const emit = defineEmits(["close", "expand", "collapse"]);
132
131
  const blade = inject(
133
132
  BladeInstance,
134
133
  computed(() => ({
135
- id: "fallback-blade-id",
134
+ id: FALLBACK_BLADE_ID,
136
135
  error: undefined,
137
136
  expandable: false,
138
137
  maximized: false,
@@ -219,7 +218,7 @@ function onClose(): void {
219
218
  }
220
219
 
221
220
  &__status {
222
- @apply tw-block tw-w-2 tw-h-2 tw-rounded-full tw-z-[1] tw-mr-[14px];
221
+ @apply tw-block tw-w-2 tw-h-2 tw-rounded-full tw-z-[1] tw-mr-[10px];
223
222
  }
224
223
 
225
224
  &__status-container {
@@ -78,7 +78,7 @@ const titleClassName = computed(() => {
78
78
  @apply tw-w-9 tw-h-9 tw-bg-[var(--blade-toolbar-circle-button-bg-color)] tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-[var(--blade-toolbar-circle-button-text-color)];
79
79
 
80
80
  &--main {
81
- @apply tw-flex tw-w-auto tw-bg-[var(--blade-toolbar-circle-button-main-bg-color)] tw-ml-2;
81
+ @apply tw-flex tw-w-auto tw-bg-[var(--blade-toolbar-circle-button-main-bg-color)];
82
82
  }
83
83
 
84
84
  &--main-expanded {
@@ -95,7 +95,7 @@ const titleClassName = computed(() => {
95
95
  }
96
96
 
97
97
  &--main {
98
- @apply tw-px-2;
98
+ @apply tw-px-4;
99
99
  }
100
100
  }
101
101
  </style>
@@ -115,7 +115,7 @@ function handleItemClick(item: IBladeToolbar) {
115
115
  }
116
116
 
117
117
  &__menu {
118
- @apply tw-fixed tw-bottom-[167px] tw-right-[33px] tw-z-[60] tw-flex tw-flex-col tw-gap-2 tw-items-end;
118
+ @apply tw-fixed tw-bottom-[167px] tw-right-[33px] tw-z-[60] tw-flex tw-flex-col tw-gap-2 tw-items-end tw-px-2;
119
119
  }
120
120
  }
121
121
 
@@ -1,6 +1,5 @@
1
1
  <template>
2
2
  <div
3
- v-if="isToolbarVisible"
4
3
  class="vc-blade-toolbar"
5
4
  :class="{
6
5
  'vc-blade-toolbar--mobile': $isMobile.value,
@@ -44,8 +43,6 @@ const visibleItems = computed(() => {
44
43
  (item) => hasAccess(item.permissions) && (item.isVisible === undefined || item.isVisible) && !item.disabled,
45
44
  );
46
45
  });
47
-
48
- const isToolbarVisible = computed(() => visibleItems.value.length > 0);
49
46
  </script>
50
47
 
51
48
  <style lang="scss">
@@ -136,6 +136,7 @@ import vcPopupError from "../../../../shared/components/common/popup/vc-popup-er
136
136
  import { BladeInstance, BLADE_BACK_BUTTON } from "../../../../injection-keys";
137
137
  import { default as VcWidgetContainer } from "./_internal/vc-blade-widget-container/vc-widget-container.vue";
138
138
  import VertDotsIcon from "../../atoms/vc-icon/icons/VertDotsIcon.vue";
139
+ import { FALLBACK_BLADE_ID } from "../../../../core/constants";
139
140
 
140
141
  export interface Props {
141
142
  icon?: string;
@@ -205,7 +206,7 @@ const emit = defineEmits<Emits>();
205
206
  const blade = inject(
206
207
  BladeInstance,
207
208
  computed(() => ({
208
- id: "fallback-blade-id",
209
+ id: FALLBACK_BLADE_ID,
209
210
  error: undefined,
210
211
  expandable: false,
211
212
  maximized: false,
@@ -356,7 +357,7 @@ const { open } = usePopup({
356
357
  }
357
358
 
358
359
  &__breadcrumbs {
359
- @apply tw-mr-3;
360
+ @apply tw-mr-[10px];
360
361
 
361
362
  &-button {
362
363
  @apply tw-text-[color:var(--blade-header-breadcrumbs-button-color)] tw-cursor-pointer hover:tw-text-[color:var(--blade-header-breadcrumbs-button-color-hover)] #{!important};
@@ -430,6 +431,10 @@ const { open } = usePopup({
430
431
  @apply tw-hidden;
431
432
  }
432
433
  }
434
+
435
+ &__breadcrumbs-button {
436
+ @apply tw-p-0 #{!important};
437
+ }
433
438
  }
434
439
 
435
440
  .vc-app_mobile .vc-blade {
@@ -1,99 +1,99 @@
1
- <template>
2
- <div
3
- class="vc-login-form__container"
4
- :style="backgroundImageHandler"
5
- >
6
- <div
7
- class="vc-login-form__logo"
8
- :style="logoImageHandler"
9
- ></div>
10
- <div class="vc-login-form__box">
11
- <div class="vc-login-form__header">
12
- {{ title }}
13
- </div>
14
- <div class="vc-login-form__content">
15
- <slot></slot>
16
- </div>
17
- </div>
18
- <div class="vc-login-form__version">
19
- {{ version }}
20
- </div>
21
- </div>
22
- </template>
23
-
24
- <script lang="ts" setup>
25
- import { computed } from "vue";
26
- import { useRouter } from "vue-router";
27
-
28
- export interface Props {
29
- logo?: string;
30
- background?: string;
31
- title?: string;
32
- }
33
-
34
- const props = withDefaults(defineProps<Props>(), {
35
- title: "Login",
36
- });
37
-
38
- defineSlots<{
39
- default: void;
40
- }>();
41
-
42
- const router = useRouter();
43
-
44
- const backgroundImageHandler = computed(() => {
45
- if (props.background) {
46
- return `background: url(${CSS.escape(props.background)}) center / cover no-repeat`;
47
- }
48
- return undefined;
49
- });
50
-
51
- const logoImageHandler = computed(() => {
52
- if (props.logo) {
53
- return `background: url(${CSS.escape(props.logo)}) center / contain no-repeat`;
54
- }
55
- return undefined;
56
- });
57
-
58
- const version = router.currentRoute.value.meta?.appVersion;
59
-
60
- console.debug("Init vc-login-form");
61
- </script>
62
-
63
- <style lang="scss">
64
- :root {
65
- --login-version-color: var(--neutrals-400);
66
- --login-header-bg-color: var(--secondary-700);
67
- --login-box-shadow-color: var(--additional-950);
68
- --login-box-shadow: rgb(from var(--login-box-shadow-color) r g b / 5%);
69
- --login-bg-color: var(--additional-50);
70
- --login-title-color: var(--additional-50);
71
- --login-title-bg: var(--secondary-700);
72
- }
73
-
74
- .vc-login-form {
75
- &__container {
76
- @apply tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center;
77
- }
78
-
79
- &__logo {
80
- @apply tw-h-20 tw-w-[516px] tw-max-w-[90%] tw-mb-12 -tw-mt-24;
81
- }
82
-
83
- &__box {
84
- @apply tw-w-[516px] tw-max-w-[90%] tw-bg-[var(--login-bg-color)] tw-rounded-md tw-overflow-hidden [box-shadow:var(--login-box-shadow)];
85
- }
86
-
87
- &__header {
88
- @apply tw-uppercase tw-text-[var(--login-title-color)] tw-bg-[var(--login-title-bg)] tw-h-12 tw-px-7 tw-text-lg tw-flex tw-items-center;
89
- }
90
-
91
- &__content {
92
- @apply tw-pt-4 tw-px-7 tw-pb-6;
93
- }
94
-
95
- &__version {
96
- @apply tw-absolute tw-bottom-0.5 tw-left-[93px] tw-text-[var(--login-version-color)] tw-text-xs tw-mt-auto tw-self-center tw-p-1;
97
- }
98
- }
99
- </style>
1
+ <template>
2
+ <div
3
+ class="vc-login-form__container"
4
+ :style="backgroundImageHandler"
5
+ >
6
+ <div
7
+ class="vc-login-form__logo"
8
+ :style="logoImageHandler"
9
+ ></div>
10
+ <div class="vc-login-form__box">
11
+ <div class="vc-login-form__header">
12
+ {{ title }}
13
+ </div>
14
+ <div class="vc-login-form__content">
15
+ <slot></slot>
16
+ </div>
17
+ </div>
18
+ <div class="vc-login-form__version">
19
+ {{ version }}
20
+ </div>
21
+ </div>
22
+ </template>
23
+
24
+ <script lang="ts" setup>
25
+ import { computed } from "vue";
26
+ import { useRouter } from "vue-router";
27
+
28
+ export interface Props {
29
+ logo?: string;
30
+ background?: string;
31
+ title?: string;
32
+ }
33
+
34
+ const props = withDefaults(defineProps<Props>(), {
35
+ title: "Login",
36
+ });
37
+
38
+ defineSlots<{
39
+ default: void;
40
+ }>();
41
+
42
+ const router = useRouter();
43
+
44
+ const backgroundImageHandler = computed(() => {
45
+ if (props.background) {
46
+ return `background: url(${CSS.escape(props.background)}) center / cover no-repeat`;
47
+ }
48
+ return undefined;
49
+ });
50
+
51
+ const logoImageHandler = computed(() => {
52
+ if (props.logo) {
53
+ return `background: url(${CSS.escape(props.logo)}) center / contain no-repeat`;
54
+ }
55
+ return undefined;
56
+ });
57
+
58
+ const version = router.currentRoute.value.meta?.appVersion;
59
+
60
+ console.debug("Init vc-login-form");
61
+ </script>
62
+
63
+ <style lang="scss">
64
+ :root {
65
+ --login-version-color: var(--neutrals-400);
66
+ --login-header-bg-color: var(--secondary-700);
67
+ --login-box-shadow-color: var(--additional-950);
68
+ --login-box-shadow: rgb(from var(--login-box-shadow-color) r g b / 5%);
69
+ --login-bg-color: var(--additional-50);
70
+ --login-title-color: var(--additional-50);
71
+ --login-title-bg: var(--secondary-700);
72
+ }
73
+
74
+ .vc-login-form {
75
+ &__container {
76
+ @apply tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center;
77
+ }
78
+
79
+ &__logo {
80
+ @apply tw-h-20 tw-w-[516px] tw-max-w-[90%] tw-mb-12 -tw-mt-24;
81
+ }
82
+
83
+ &__box {
84
+ @apply tw-w-[516px] tw-max-w-[90%] tw-bg-[var(--login-bg-color)] tw-rounded-md tw-overflow-hidden [box-shadow:var(--login-box-shadow)];
85
+ }
86
+
87
+ &__header {
88
+ @apply tw-uppercase tw-text-[var(--login-title-color)] tw-bg-[var(--login-title-bg)] tw-h-12 tw-px-7 tw-text-lg tw-flex tw-items-center;
89
+ }
90
+
91
+ &__content {
92
+ @apply tw-pt-4 tw-px-7 tw-pb-6;
93
+ }
94
+
95
+ &__version {
96
+ @apply tw-absolute tw-bottom-0.5 tw-left-[93px] tw-text-[var(--login-version-color)] tw-text-xs tw-mt-auto tw-self-center tw-p-1;
97
+ }
98
+ }
99
+ </style>