@vc-shell/framework 1.1.0-alpha.3 → 1.1.0-alpha.4
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.
- package/core/composables/index.ts +18 -17
- package/core/composables/useDashboard/index.ts +19 -0
- package/core/composables/{useGlobalSearch.ts → useGlobalSearch/index.ts} +3 -5
- package/core/composables/useWidgets/index.ts +19 -18
- package/core/plugins/modularity/loader.ts +2 -1
- package/core/services/dashboard-service.ts +121 -0
- package/core/services/widget-service.ts +1 -4
- package/dist/core/composables/index.d.ts +1 -0
- package/dist/core/composables/index.d.ts.map +1 -1
- package/dist/core/composables/useDashboard/index.d.ts +5 -0
- package/dist/core/composables/useDashboard/index.d.ts.map +1 -0
- package/dist/core/composables/{useGlobalSearch.d.ts → useGlobalSearch/index.d.ts} +1 -1
- package/dist/core/composables/useGlobalSearch/index.d.ts.map +1 -0
- package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
- package/dist/core/services/dashboard-service.d.ts +33 -0
- package/dist/core/services/dashboard-service.d.ts.map +1 -0
- package/dist/core/services/widget-service.d.ts.map +1 -1
- package/dist/framework.js +235 -225
- package/dist/{index-Bu12RZTu.js → index-8LELHzw9.js} +1 -1
- package/dist/{index-Bwl2ND2Q.js → index-9lJxZE5w.js} +1 -1
- package/dist/{index-CJi-BbTb.js → index-B1YR_MYV.js} +1 -1
- package/dist/{index-BhdwVgUw.js → index-BA98L1jI.js} +1 -1
- package/dist/{index-NdrUF1u3.js → index-BAeTsi-X.js} +1 -1
- package/dist/{index-CbRqPQTw.js → index-BBYyHeYA.js} +1 -1
- package/dist/{index-CsaYfhir.js → index-BrUitdDo.js} +1 -1
- package/dist/{index-CZ_pj3nW.js → index-BuO5ByG9.js} +1 -1
- package/dist/{index-DFPb-jDP.js → index-CJ5I7vTn.js} +1 -1
- package/dist/{index-BdoAu2fz.js → index-CWKrD2Cd.js} +1 -1
- package/dist/{index-DVaMW7gL.js → index-Cf9Tz1ql.js} +1 -1
- package/dist/{index-B89uIUkS.js → index-CrxFDC2b.js} +1 -1
- package/dist/{index-BcQiBkO6.js → index-D1JchciU.js} +1 -1
- package/dist/{index-CEvuTGIu.js → index-DLtsQ_PJ.js} +31254 -31134
- package/dist/{index-COjjAS6v.js → index-DVljTjbf.js} +1 -1
- package/dist/{index-DjQ6Ffv8.js → index-RwX3kiZh.js} +28 -28
- package/dist/{index-S9Ht7s3i.js → index-xLYzNPa7.js} +1 -1
- package/dist/index.css +1 -1
- package/dist/injection-keys.d.ts +28 -0
- package/dist/injection-keys.d.ts.map +1 -1
- package/dist/shared/components/dashboard-widget-card/dashboard-widget-card.vue.d.ts +25 -0
- package/dist/shared/components/dashboard-widget-card/dashboard-widget-card.vue.d.ts.map +1 -0
- package/dist/shared/components/dashboard-widget-card/index.d.ts +2 -0
- package/dist/shared/components/dashboard-widget-card/index.d.ts.map +1 -0
- package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts +6 -0
- package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts.map +1 -0
- package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts +20 -0
- package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts.map +1 -0
- package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts +354 -0
- package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts.map +1 -0
- package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts +12 -0
- package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts.map +1 -0
- package/dist/shared/components/draggable-dashboard/index.d.ts +2 -0
- package/dist/shared/components/draggable-dashboard/index.d.ts.map +1 -0
- package/dist/shared/components/draggable-dashboard/types.d.ts +80 -0
- package/dist/shared/components/draggable-dashboard/types.d.ts.map +1 -0
- package/dist/shared/components/index.d.ts +2 -0
- package/dist/shared/components/index.d.ts.map +1 -1
- package/dist/shared/components/user-dropdown-button/_internal/user-info.vue.d.ts.map +1 -1
- package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
- package/dist/shared/composables/useMenuExpanded.d.ts +2 -0
- package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +0 -41
- package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts +1 -1
- package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts.map +1 -1
- package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -25
- package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
- package/dist/tailwind.config.d.ts +1 -81
- package/dist/tailwind.config.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts +169 -734
- package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +18 -2
- package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-card/index.d.ts +2 -0
- package/dist/ui/components/atoms/vc-card/index.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +12 -0
- package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts +2 -0
- package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts +18 -0
- package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts.map +1 -0
- package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts +18 -0
- package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts.map +1 -0
- package/dist/ui/components/atoms/vc-icon/icons/index.d.ts +2 -0
- package/dist/ui/components/atoms/vc-icon/icons/index.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts +2 -0
- package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts +0 -1
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue.d.ts +2 -1
- 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
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +13 -67
- package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +5 -65
- package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/{vc-table-header/vc-table-header.vue.d.ts → vc-table-columns-header/vc-table-columns-header.vue.d.ts} +1 -1
- 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 -0
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts +33 -3
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
- package/package.json +10 -5
- package/shared/components/dashboard-widget-card/dashboard-widget-card.vue +67 -0
- package/shared/components/dashboard-widget-card/index.ts +1 -0
- package/shared/components/draggable-dashboard/DraggableDashboard.vue +369 -0
- package/shared/components/draggable-dashboard/_internal/DashboardWidget.vue +133 -0
- package/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.ts +547 -0
- package/shared/components/draggable-dashboard/composables/useDashboardGrid.ts +250 -0
- package/shared/components/draggable-dashboard/index.ts +1 -0
- package/shared/components/draggable-dashboard/types.ts +91 -0
- package/shared/components/index.ts +2 -0
- package/shared/components/user-dropdown-button/_internal/user-info.vue +25 -12
- package/shared/components/user-dropdown-button/user-dropdown-button.vue +3 -3
- package/shared/composables/useMenuExpanded.ts +24 -0
- package/shared/modules/assets/components/assets-details/assets-details.vue +1 -1
- package/shared/modules/dynamic/components/fields/storybook/Button.stories.ts +186 -247
- package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +175 -176
- package/shared/modules/dynamic/components/fields/storybook/common/templates.ts +8 -8
- package/shared/modules/dynamic/pages/dynamic-blade-list.vue +153 -187
- package/tailwind.config.ts +127 -126
- package/ui/components/atoms/vc-button/vc-button.stories.ts +1 -16
- package/ui/components/atoms/vc-button/vc-button.vue +74 -63
- package/ui/components/atoms/vc-card/vc-card.stories.ts +102 -102
- package/ui/components/atoms/vc-card/vc-card.vue +164 -159
- package/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue +22 -0
- package/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue +16 -0
- package/ui/components/atoms/vc-icon/icons/index.ts +2 -0
- package/ui/components/molecules/vc-field/vc-field.vue +1 -1
- package/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.ts +12 -1
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarContent.vue +1 -2
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +1 -1
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue +0 -1
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +274 -112
- package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +81 -37
- package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +7 -5
- package/ui/components/organisms/vc-app/vc-app.vue +26 -15
- package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +5 -7
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/{vc-table-header/vc-table-header.vue → vc-table-columns-header/vc-table-columns-header.vue} +23 -21
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue +1 -0
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue +1 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue +12 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue +45 -2
- package/ui/components/organisms/vc-table/composables/useTableColumnReorder.ts +5 -5
- package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +1 -1
- package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +1 -0
- package/core/services/toolbarbus-service.ts +0 -34
- package/dist/core/composables/useGlobalSearch.d.ts.map +0 -1
- package/dist/core/services/toolbarbus-service.d.ts +0 -10
- package/dist/core/services/toolbarbus-service.d.ts.map +0 -1
- package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts +0 -5
- package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts.map +0 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-header/vc-table-header.vue.d.ts.map +0 -1
- package/ui/components/organisms/vc-app/composables/useToolbarSlots.ts +0 -37
|
@@ -31,23 +31,32 @@
|
|
|
31
31
|
/>
|
|
32
32
|
</div>
|
|
33
33
|
<div
|
|
34
|
-
v-if="expand"
|
|
35
|
-
class="vc-app-menu-
|
|
34
|
+
v-if="!expand && !icon"
|
|
35
|
+
class="vc-app-menu-link__icon-letters"
|
|
36
36
|
>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
{{ twoLettersTitle(title) }}
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<Transition name="opacity">
|
|
40
41
|
<div
|
|
41
|
-
v-
|
|
42
|
-
class="vc-app-menu-link__title
|
|
42
|
+
v-show="expand"
|
|
43
|
+
class="vc-app-menu-link__title"
|
|
43
44
|
>
|
|
44
|
-
<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
<div class="vc-app-menu-link__title-truncate">
|
|
46
|
+
{{ title }}
|
|
47
|
+
</div>
|
|
48
|
+
<div
|
|
49
|
+
v-if="(!!children?.length && expand) || false"
|
|
50
|
+
class="vc-app-menu-link__title-icon"
|
|
51
|
+
>
|
|
52
|
+
<VcIcon
|
|
53
|
+
class="vc-app-menu-item__title-icon"
|
|
54
|
+
:icon="isOpened ? ChevronUpIcon : ChevronDownIcon"
|
|
55
|
+
size="m"
|
|
56
|
+
></VcIcon>
|
|
57
|
+
</div>
|
|
49
58
|
</div>
|
|
50
|
-
</
|
|
59
|
+
</Transition>
|
|
51
60
|
</div>
|
|
52
61
|
</VcTooltip>
|
|
53
62
|
</div>
|
|
@@ -92,7 +101,7 @@
|
|
|
92
101
|
>
|
|
93
102
|
<div
|
|
94
103
|
v-if="nested.icon"
|
|
95
|
-
class="vc-app-menu-link__icon"
|
|
104
|
+
class="vc-app-menu-link__icon vc-app-menu-link__icon--child"
|
|
96
105
|
:class="{
|
|
97
106
|
'vc-app-menu-link__icon-collapsed': !expand,
|
|
98
107
|
}"
|
|
@@ -103,12 +112,23 @@
|
|
|
103
112
|
size="m"
|
|
104
113
|
/>
|
|
105
114
|
</div>
|
|
106
|
-
<
|
|
107
|
-
v-if="expand"
|
|
108
|
-
class="vc-app-menu-
|
|
115
|
+
<div
|
|
116
|
+
v-if="!expand && !nested.icon"
|
|
117
|
+
class="vc-app-menu-link__icon-letters"
|
|
109
118
|
>
|
|
110
|
-
{{ nested.title }}
|
|
111
|
-
</
|
|
119
|
+
{{ twoLettersTitle(nested.title) }}
|
|
120
|
+
</div>
|
|
121
|
+
<Transition name="opacity">
|
|
122
|
+
<p
|
|
123
|
+
v-show="expand"
|
|
124
|
+
class="vc-app-menu-link__child-item-title"
|
|
125
|
+
:class="{
|
|
126
|
+
'vc-app-menu-link__child-item-title--no-icon': !nested.icon,
|
|
127
|
+
}"
|
|
128
|
+
>
|
|
129
|
+
{{ nested.title }}
|
|
130
|
+
</p>
|
|
131
|
+
</Transition>
|
|
112
132
|
</div>
|
|
113
133
|
</div>
|
|
114
134
|
</router-link>
|
|
@@ -118,7 +138,7 @@
|
|
|
118
138
|
</template>
|
|
119
139
|
|
|
120
140
|
<script lang="ts" setup>
|
|
121
|
-
import { ref, watch, computed, onMounted } from "vue";
|
|
141
|
+
import { ref, watch, computed, onMounted, Component, MaybeRef, unref } from "vue";
|
|
122
142
|
import { MenuItem } from "./../../../../../../../../../core/types";
|
|
123
143
|
import { VcIcon } from "./../../../../../../../";
|
|
124
144
|
import { useRoute } from "vue-router";
|
|
@@ -128,7 +148,7 @@ import ChevronDownIcon from "./../../../../../../../atoms/vc-icon/icons/ChevronD
|
|
|
128
148
|
export interface Props {
|
|
129
149
|
children?: MenuItem[];
|
|
130
150
|
sticky?: boolean;
|
|
131
|
-
icon: string;
|
|
151
|
+
icon: string | Component;
|
|
132
152
|
title?: string;
|
|
133
153
|
url?: string;
|
|
134
154
|
expand?: boolean;
|
|
@@ -188,6 +208,15 @@ const isActive = (url: string) => {
|
|
|
188
208
|
}
|
|
189
209
|
};
|
|
190
210
|
|
|
211
|
+
const twoLettersTitle = (title: MaybeRef<string> | undefined) => {
|
|
212
|
+
// get first letters in title words and combine them. Two letters maximum
|
|
213
|
+
return unref(title)
|
|
214
|
+
?.split(" ")
|
|
215
|
+
.slice(0, 2)
|
|
216
|
+
.map((word) => word[0])
|
|
217
|
+
.join("");
|
|
218
|
+
};
|
|
219
|
+
|
|
191
220
|
onMounted(() => {
|
|
192
221
|
const storedState = localStorage.getItem(`vc_menu_${props.id}_isOpened`);
|
|
193
222
|
if (storedState) {
|
|
@@ -204,6 +233,7 @@ watch(isOpened, (newValue) => {
|
|
|
204
233
|
:root {
|
|
205
234
|
--app-menu-item-height: 38px;
|
|
206
235
|
--app-menu-item-icon-width: 16px;
|
|
236
|
+
--app-menu-item-icon-width-container: 23px;
|
|
207
237
|
--app-menu-item-icon-color: var(--neutrals-600);
|
|
208
238
|
--app-menu-item-icon-color-active: var(--primary-700);
|
|
209
239
|
--app-menu-item-background-color-hover: var(--neutrals-100);
|
|
@@ -218,6 +248,7 @@ watch(isOpened, (newValue) => {
|
|
|
218
248
|
|
|
219
249
|
.vc-app-menu-link {
|
|
220
250
|
@apply tw-cursor-pointer tw-w-full;
|
|
251
|
+
@apply tw-transition-transform tw-duration-[0] tw-ease-in-out #{!important};
|
|
221
252
|
|
|
222
253
|
&:hover .vc-app-menu-link__item:not(.vc-app-menu-link__item_active) {
|
|
223
254
|
@apply tw-bg-[var(--app-menu-item-background-color-hover)] tw-bg-opacity-50 tw-rounded;
|
|
@@ -238,14 +269,9 @@ watch(isOpened, (newValue) => {
|
|
|
238
269
|
&__item {
|
|
239
270
|
@apply tw-flex tw-items-center tw-w-full tw-h-[var(--app-menu-item-height)]
|
|
240
271
|
tw-border-none tw-flex-nowrap tw-box-border tw-cursor-pointer tw-relative
|
|
241
|
-
tw-uppercase tw-select-none tw-px-2;
|
|
272
|
+
tw-uppercase tw-select-none tw-px-2 tw-gap-4;
|
|
242
273
|
|
|
243
274
|
&_collapsed {
|
|
244
|
-
@apply tw-justify-center;
|
|
245
|
-
|
|
246
|
-
.vc-app-menu-link__title {
|
|
247
|
-
@apply tw-hidden;
|
|
248
|
-
}
|
|
249
275
|
}
|
|
250
276
|
|
|
251
277
|
&_active {
|
|
@@ -278,7 +304,15 @@ watch(isOpened, (newValue) => {
|
|
|
278
304
|
&__icon {
|
|
279
305
|
@apply tw-text-[color:var(--app-menu-item-icon-color)]
|
|
280
306
|
tw-overflow-hidden tw-flex
|
|
281
|
-
tw-justify-center tw-shrink-0 tw-transition-[color] tw-duration-200 tw-w-[var(--app-menu-item-icon-width)];
|
|
307
|
+
tw-justify-center tw-shrink-0 tw-transition-[color] tw-duration-200 tw-w-[var(--app-menu-item-icon-width-container)];
|
|
308
|
+
|
|
309
|
+
&--child {
|
|
310
|
+
// @apply tw-mr-5;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
&__icon-letters {
|
|
315
|
+
@apply tw-shrink-0 tw-w-[24px] tw-h-[24px] tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-xxs tw-leading-[10px] tw-font-extrabold tw-text-[var(--neutrals-500)] tw-border-[2px] tw-border-[var(--neutrals-500)];
|
|
282
316
|
}
|
|
283
317
|
|
|
284
318
|
&__title {
|
|
@@ -287,7 +321,7 @@ watch(isOpened, (newValue) => {
|
|
|
287
321
|
tw-font-normal
|
|
288
322
|
tw-leading-normal
|
|
289
323
|
tw-normal-case
|
|
290
|
-
|
|
324
|
+
|
|
291
325
|
[transition:color_0.2s_ease]
|
|
292
326
|
tw-opacity-100 tw-w-full tw-flex tw-justify-between tw-items-center;
|
|
293
327
|
}
|
|
@@ -301,11 +335,11 @@ watch(isOpened, (newValue) => {
|
|
|
301
335
|
}
|
|
302
336
|
|
|
303
337
|
&__title-icon {
|
|
304
|
-
@apply tw-ml-3
|
|
338
|
+
@apply tw-ml-3;
|
|
305
339
|
}
|
|
306
340
|
|
|
307
341
|
&__icon-content {
|
|
308
|
-
@apply tw-text-center;
|
|
342
|
+
@apply tw-text-center tw-text-[length:var(--app-menu-item-icon-width)];
|
|
309
343
|
}
|
|
310
344
|
|
|
311
345
|
&__child {
|
|
@@ -314,17 +348,17 @@ watch(isOpened, (newValue) => {
|
|
|
314
348
|
|
|
315
349
|
&__child-item {
|
|
316
350
|
@apply tw-cursor-pointer tw-min-w-0 tw-flex tw-h-[var(--app-menu-item-height)]
|
|
317
|
-
tw-items-center tw-transition-[padding] tw-duration-150 tw-w-
|
|
351
|
+
tw-items-center tw-transition-[padding] tw-duration-150 tw-w-full tw-py-2 tw-px-3
|
|
318
352
|
tw-text-[color:var(--app-menu-item-title-color)] tw-text-sm
|
|
319
353
|
hover:tw-bg-[var(--app-menu-item-background-color-hover)]
|
|
320
|
-
hover:tw-text-[color:var(--app-menu-item-title-color-active)];
|
|
354
|
+
hover:tw-text-[color:var(--app-menu-item-title-color-active)] tw-gap-5;
|
|
321
355
|
|
|
322
356
|
&_expanded {
|
|
323
|
-
@apply tw-pl-
|
|
357
|
+
@apply tw-pl-7 tw-w-full #{!important};
|
|
324
358
|
}
|
|
325
359
|
|
|
326
360
|
&_collapsed {
|
|
327
|
-
@apply tw-
|
|
361
|
+
@apply tw-pl-2;
|
|
328
362
|
}
|
|
329
363
|
|
|
330
364
|
&_active {
|
|
@@ -339,7 +373,7 @@ watch(isOpened, (newValue) => {
|
|
|
339
373
|
}
|
|
340
374
|
|
|
341
375
|
&__child-item-title {
|
|
342
|
-
@apply tw-truncate
|
|
376
|
+
@apply tw-truncate;
|
|
343
377
|
}
|
|
344
378
|
|
|
345
379
|
&__child-item-link {
|
|
@@ -355,7 +389,17 @@ watch(isOpened, (newValue) => {
|
|
|
355
389
|
}
|
|
356
390
|
|
|
357
391
|
&__icon-collapsed {
|
|
358
|
-
@apply tw-p-0;
|
|
392
|
+
@apply tw-p-0 tw-m-0;
|
|
359
393
|
}
|
|
360
394
|
}
|
|
395
|
+
|
|
396
|
+
.opacity-enter-active,
|
|
397
|
+
.opacity-leave-active {
|
|
398
|
+
transition: opacity 0.3s ease;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.opacity-enter-from,
|
|
402
|
+
.opacity-leave-to {
|
|
403
|
+
opacity: 0;
|
|
404
|
+
}
|
|
361
405
|
</style>
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
:class="{
|
|
6
6
|
'vc-app-menu--mobile': $isMobile.value,
|
|
7
7
|
'vc-app-menu--collapsed': $isDesktop.value && !isExpanded,
|
|
8
|
+
'vc-app-menu--hover-expanded': isHoverExpanded,
|
|
8
9
|
}"
|
|
9
10
|
>
|
|
10
11
|
<div
|
|
@@ -12,6 +13,7 @@
|
|
|
12
13
|
:class="{
|
|
13
14
|
'vc-app-menu__inner--desktop': $isDesktop.value,
|
|
14
15
|
'vc-app-menu__inner--collapsed': $isDesktop.value && !isExpanded,
|
|
16
|
+
'vc-app-menu__inner--hover-expanded': isHoverExpanded,
|
|
15
17
|
}"
|
|
16
18
|
>
|
|
17
19
|
<!-- Show scrollable area with menu items -->
|
|
@@ -32,8 +34,8 @@
|
|
|
32
34
|
:icon="item.groupIcon || item.icon"
|
|
33
35
|
:title="item.title as string"
|
|
34
36
|
:children="item.children"
|
|
35
|
-
:expand="$isDesktop.value ? isExpanded : true"
|
|
36
|
-
@click="handleMenuItemClick(
|
|
37
|
+
:expand="$isDesktop.value ? isExpanded || isHoverExpanded : true"
|
|
38
|
+
@click="handleMenuItemClick(item, $event)"
|
|
37
39
|
/>
|
|
38
40
|
</div>
|
|
39
41
|
</VcContainer>
|
|
@@ -77,7 +79,7 @@ const emit = defineEmits<Emits>();
|
|
|
77
79
|
|
|
78
80
|
const isMobile = inject("isMobile") as Ref<boolean>;
|
|
79
81
|
const { menuItems } = useMenuService();
|
|
80
|
-
const { isExpanded } = useMenuExpanded();
|
|
82
|
+
const { isExpanded, isHoverExpanded } = useMenuExpanded();
|
|
81
83
|
const { closeAll } = useAppMenuState();
|
|
82
84
|
|
|
83
85
|
const handleMenuItemClick = (item: MenuItem, nestedItem?: MenuItem) => {
|
|
@@ -105,8 +107,8 @@ const isMenuVisible = computed(() => {
|
|
|
105
107
|
--app-backdrop-overlay: rgb(from var(--app-backdrop-overlay-bg) r g b / 75%);
|
|
106
108
|
|
|
107
109
|
--app-backdrop-shadow-color: var(--additional-950);
|
|
108
|
-
--app-backdrop-shadow:
|
|
109
|
-
1px 1px 22px rgb(from var(--notification-dropdown-shadow-color) r g b / 7%);
|
|
110
|
+
--app-backdrop-shadow:
|
|
111
|
+
0 -6px 6px var(--additional-50), 1px 1px 22px rgb(from var(--notification-dropdown-shadow-color) r g b / 7%);
|
|
110
112
|
}
|
|
111
113
|
|
|
112
114
|
.vc-app-menu {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
:title="title"
|
|
22
22
|
:disable-menu="disableMenu"
|
|
23
23
|
@backlink:click="closeBlade(blades.length - 1)"
|
|
24
|
-
@logo:click="
|
|
24
|
+
@logo:click="operateLogoClick"
|
|
25
25
|
>
|
|
26
26
|
<template #app-switcher>
|
|
27
27
|
<slot name="app-switcher">
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
</slot>
|
|
33
33
|
</template>
|
|
34
34
|
|
|
35
|
-
<template
|
|
35
|
+
<!-- <template
|
|
36
36
|
v-if="$slots['logo:append']"
|
|
37
37
|
#logo:append
|
|
38
38
|
>
|
|
39
39
|
<slot name="logo:append"></slot>
|
|
40
|
-
</template>
|
|
40
|
+
</template> -->
|
|
41
41
|
|
|
42
42
|
<!-- Toolbar slot -->
|
|
43
43
|
<template #toolbar>
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
</template>
|
|
84
84
|
|
|
85
85
|
<script lang="ts" setup>
|
|
86
|
-
import { h, inject, provide, computed } from "vue";
|
|
86
|
+
import { h, inject, provide, computed, useAttrs } 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 {
|
|
@@ -96,9 +96,8 @@ import {
|
|
|
96
96
|
} from "./../../../../shared/components";
|
|
97
97
|
import { useNotifications, useUser } from "../../../../core/composables";
|
|
98
98
|
import { useRoute, useRouter } from "vue-router";
|
|
99
|
-
import { watchOnce
|
|
99
|
+
import { watchOnce } from "@vueuse/core";
|
|
100
100
|
import { MenuItem } from "../../../../core/types";
|
|
101
|
-
import { useToolbarSlots } from "./composables/useToolbarSlots";
|
|
102
101
|
import { useSettingsMenu, SettingsMenuKey } from "../../../../shared/composables/useSettingsMenu";
|
|
103
102
|
import { LanguageSelector } from "../../../../shared/components/language-selector";
|
|
104
103
|
import { ThemeSelector } from "../../../../shared/components/theme-selector";
|
|
@@ -106,6 +105,8 @@ import { ChangePasswordButton } from "../../../../shared/components/change-passw
|
|
|
106
105
|
import { LogoutButton } from "../../../../shared/components/logout-button";
|
|
107
106
|
import { useI18n } from "vue-i18n";
|
|
108
107
|
import { createGlobalSearch } from "../../../../core/composables/useGlobalSearch";
|
|
108
|
+
import { provideDashboardService } from "../../../../core/composables/useDashboard";
|
|
109
|
+
import { DynamicModulesKey } from "../../../../injection-keys";
|
|
109
110
|
|
|
110
111
|
export interface Props {
|
|
111
112
|
isReady: boolean;
|
|
@@ -116,8 +117,13 @@ export interface Props {
|
|
|
116
117
|
name?: string;
|
|
117
118
|
disableMenu?: boolean;
|
|
118
119
|
role?: string;
|
|
120
|
+
// кастомное поведение при клике на лого
|
|
119
121
|
}
|
|
120
122
|
|
|
123
|
+
const emit = defineEmits<{
|
|
124
|
+
(e: "logo-click", goToRoot: () => void): void;
|
|
125
|
+
}>();
|
|
126
|
+
|
|
121
127
|
defineOptions({
|
|
122
128
|
inheritAttrs: false,
|
|
123
129
|
});
|
|
@@ -125,20 +131,18 @@ defineOptions({
|
|
|
125
131
|
defineSlots<{
|
|
126
132
|
"app-switcher": void;
|
|
127
133
|
toolbar: void;
|
|
128
|
-
"
|
|
129
|
-
"toolbar:language-selector": void;
|
|
130
|
-
"toolbar:theme-selector": void;
|
|
131
|
-
"logo:append": void;
|
|
134
|
+
// "logo:append": void;
|
|
132
135
|
}>();
|
|
133
136
|
|
|
134
137
|
const props = defineProps<Props>();
|
|
135
138
|
|
|
139
|
+
const attrs = useAttrs();
|
|
140
|
+
|
|
136
141
|
console.debug("vc-app: Init vc-app");
|
|
137
142
|
|
|
138
143
|
const internalRoutes = inject("bladeRoutes") as BladeRoutesRecord[];
|
|
139
|
-
const dynamicModules = inject(
|
|
144
|
+
const dynamicModules = inject(DynamicModulesKey, undefined);
|
|
140
145
|
const router = useRouter();
|
|
141
|
-
createGlobalSearch();
|
|
142
146
|
|
|
143
147
|
const { openBlade, closeBlade, resolveBladeByName, blades, goToRoot } = useBladeNavigation();
|
|
144
148
|
const { appsList, switchApp, getApps } = useAppSwitcher();
|
|
@@ -146,9 +150,10 @@ const { appsList, switchApp, getApps } = useAppSwitcher();
|
|
|
146
150
|
const { loadFromHistory } = useNotifications();
|
|
147
151
|
const route = useRoute();
|
|
148
152
|
const { isAuthenticated } = useUser();
|
|
149
|
-
const routes = router.getRoutes();
|
|
150
153
|
|
|
151
|
-
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
const routes = router.getRoutes();
|
|
152
157
|
|
|
153
158
|
const settingsMenu = useSettingsMenu();
|
|
154
159
|
provide(SettingsMenuKey, settingsMenu);
|
|
@@ -203,6 +208,10 @@ const onMenuItemClick = function (item: MenuItem) {
|
|
|
203
208
|
}
|
|
204
209
|
};
|
|
205
210
|
|
|
211
|
+
const operateLogoClick = () => {
|
|
212
|
+
emit("logo-click", openRoot);
|
|
213
|
+
};
|
|
214
|
+
|
|
206
215
|
const openRoot = async () => {
|
|
207
216
|
const isPrevented = await closeBlade(1);
|
|
208
217
|
|
|
@@ -222,7 +231,9 @@ watchOnce(
|
|
|
222
231
|
);
|
|
223
232
|
|
|
224
233
|
provide("internalRoutes", internalRoutes);
|
|
225
|
-
provide(
|
|
234
|
+
provide(DynamicModulesKey, dynamicModules);
|
|
235
|
+
provideDashboardService();
|
|
236
|
+
createGlobalSearch();
|
|
226
237
|
</script>
|
|
227
238
|
|
|
228
239
|
<style lang="scss">
|
package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue
CHANGED
|
@@ -65,9 +65,6 @@
|
|
|
65
65
|
<script lang="ts" setup>
|
|
66
66
|
import VcTableFilter from "./../vc-table-filter/vc-table-filter.vue";
|
|
67
67
|
import { VcInput } from "./../../../../molecules";
|
|
68
|
-
import { inject, ref, watch, computed } from "vue";
|
|
69
|
-
import { useGlobalSearch } from "../../../../../../core/composables/useGlobalSearch";
|
|
70
|
-
import { useBladeNavigation } from "../../../../../../shared";
|
|
71
68
|
|
|
72
69
|
export interface Props {
|
|
73
70
|
searchValue?: string;
|
|
@@ -81,15 +78,16 @@ export interface Emits {
|
|
|
81
78
|
(event: "search:change", value: string): void;
|
|
82
79
|
}
|
|
83
80
|
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
defineProps<Props>();
|
|
82
|
+
defineEmits<Emits>();
|
|
86
83
|
</script>
|
|
87
84
|
|
|
88
85
|
<style lang="scss">
|
|
89
86
|
:root {
|
|
90
87
|
--table-base-header-border-color: var(--base-border-color, var(--neutrals-200));
|
|
91
88
|
--table-base-header-input-icon-color: var(--neutrals-300);
|
|
92
|
-
--table-base-header-padding:
|
|
89
|
+
--table-base-header-padding-horizontal: 12px;
|
|
90
|
+
--table-base-header-padding-vertical: 9px;
|
|
93
91
|
--table-base-header-mobile-padding: 30px;
|
|
94
92
|
}
|
|
95
93
|
|
|
@@ -102,7 +100,7 @@ const emit = defineEmits<Emits>();
|
|
|
102
100
|
}
|
|
103
101
|
|
|
104
102
|
&--desktop {
|
|
105
|
-
@apply tw-
|
|
103
|
+
@apply tw-px-[var(--table-base-header-padding-horizontal)] tw-py-[var(--table-base-header-padding-vertical)];
|
|
106
104
|
}
|
|
107
105
|
|
|
108
106
|
&__filter-mobile {
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
3
|
ref="headerRef"
|
|
4
|
-
class="vc-table-header"
|
|
4
|
+
class="vc-table-columns-header"
|
|
5
5
|
@mouseenter="$emit('headerMouseOver', true)"
|
|
6
6
|
@mouseleave="$emit('headerMouseOver', false)"
|
|
7
7
|
>
|
|
8
|
-
<div class="vc-table-header__row">
|
|
8
|
+
<div class="vc-table-columns-header__row">
|
|
9
9
|
<div
|
|
10
10
|
v-if="multiselect && items && items.length"
|
|
11
|
-
class="vc-table-header__checkbox"
|
|
11
|
+
class="vc-table-columns-header__checkbox"
|
|
12
12
|
>
|
|
13
|
-
<div class="vc-table-header__checkbox-content">
|
|
13
|
+
<div class="vc-table-columns-header__checkbox-content">
|
|
14
14
|
<VcCheckbox
|
|
15
15
|
:model-value="headerCheckbox"
|
|
16
16
|
size="m"
|
|
@@ -18,17 +18,17 @@
|
|
|
18
18
|
@click.stop
|
|
19
19
|
/>
|
|
20
20
|
</div>
|
|
21
|
-
<div class="vc-table-header__checkbox-resizer" />
|
|
21
|
+
<div class="vc-table-columns-header__checkbox-resizer" />
|
|
22
22
|
</div>
|
|
23
23
|
<div
|
|
24
24
|
v-for="(item, index) in filteredCols"
|
|
25
25
|
:id="item.id"
|
|
26
26
|
:key="item.id"
|
|
27
|
-
class="vc-table-header__cell"
|
|
27
|
+
class="vc-table-columns-header__cell"
|
|
28
28
|
:class="[
|
|
29
29
|
{
|
|
30
|
-
'vc-table-header__cell--sortable': item.sortable,
|
|
31
|
-
'vc-table-header__cell--last': index === filteredCols.length - 1,
|
|
30
|
+
'vc-table-columns-header__cell--sortable': item.sortable,
|
|
31
|
+
'vc-table-columns-header__cell--last': index === filteredCols.length - 1,
|
|
32
32
|
},
|
|
33
33
|
item.align ? tableAlignment[item.align] : '',
|
|
34
34
|
]"
|
|
@@ -40,18 +40,18 @@
|
|
|
40
40
|
@drop="reorderableColumns && onColumnHeaderDrop($event, item)"
|
|
41
41
|
@click="$emit('headerClick', item)"
|
|
42
42
|
>
|
|
43
|
-
<div class="vc-table-header__cell-content">
|
|
44
|
-
<div class="vc-table-header__cell-title">
|
|
43
|
+
<div class="vc-table-columns-header__cell-content">
|
|
44
|
+
<div class="vc-table-columns-header__cell-title">
|
|
45
45
|
<span
|
|
46
46
|
v-if="editing && item.rules?.required"
|
|
47
|
-
class="vc-table-header__cell-required"
|
|
47
|
+
class="vc-table-columns-header__cell-required"
|
|
48
48
|
>*</span
|
|
49
49
|
>
|
|
50
50
|
<slot :name="`header_${item.id}`">{{ item.title }}</slot>
|
|
51
51
|
</div>
|
|
52
52
|
<div
|
|
53
53
|
v-if="sortField === item.id"
|
|
54
|
-
class="vc-table-header__cell-sort-icon"
|
|
54
|
+
class="vc-table-columns-header__cell-sort-icon"
|
|
55
55
|
>
|
|
56
56
|
<VcIcon
|
|
57
57
|
size="xs"
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
</div>
|
|
61
61
|
<div
|
|
62
62
|
v-else
|
|
63
|
-
class="vc-table-header__cell-sort-icons"
|
|
63
|
+
class="vc-table-columns-header__cell-sort-icons"
|
|
64
64
|
>
|
|
65
65
|
<VcIcon
|
|
66
66
|
size="xs"
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
</div>
|
|
74
74
|
</div>
|
|
75
75
|
<div
|
|
76
|
-
class="vc-table-header__cell-resizer"
|
|
76
|
+
class="vc-table-columns-header__cell-resizer"
|
|
77
77
|
:class="{
|
|
78
|
-
'vc-table-header__cell-resizer--cursor': resizableColumns,
|
|
78
|
+
'vc-table-columns-header__cell-resizer--cursor': resizableColumns,
|
|
79
79
|
}"
|
|
80
80
|
@mousedown.stop="resizableColumns && handleMouseDown($event, item)"
|
|
81
81
|
/>
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
|
|
84
84
|
<div
|
|
85
85
|
v-if="isHeaderHover && expanded"
|
|
86
|
-
class="vc-table-header__column-switcher"
|
|
86
|
+
class="vc-table-columns-header__column-switcher"
|
|
87
87
|
>
|
|
88
88
|
<VcTableColumnSwitcher
|
|
89
89
|
:items="internalColumnsSorted"
|
|
@@ -96,18 +96,18 @@
|
|
|
96
96
|
|
|
97
97
|
<div
|
|
98
98
|
ref="resizer"
|
|
99
|
-
class="vc-table-header__resizer"
|
|
99
|
+
class="vc-table-columns-header__resizer"
|
|
100
100
|
/>
|
|
101
101
|
<div
|
|
102
102
|
ref="reorderRef"
|
|
103
|
-
class="vc-table-header__reorder-ref"
|
|
103
|
+
class="vc-table-columns-header__reorder-ref"
|
|
104
104
|
/>
|
|
105
105
|
</div>
|
|
106
106
|
</template>
|
|
107
107
|
|
|
108
108
|
<script lang="ts" setup generic="T extends TableItem | string">
|
|
109
109
|
import { toRefs, ref } from "vue";
|
|
110
|
-
import { VcCheckbox, VcIcon } from "
|
|
110
|
+
import { VcCheckbox, VcIcon } from "../../../../../..";
|
|
111
111
|
import VcTableColumnSwitcher from "../../../vc-table-column-switcher/vc-table-column-switcher.vue";
|
|
112
112
|
import type { ITableColumns, TableItem, TableColPartial } from "../../../../types";
|
|
113
113
|
import { useTableColumnReorder } from "../../../../composables/useTableColumnReorder";
|
|
@@ -168,9 +168,11 @@ const { resizer, handleMouseDown } = useTableColumnResize(internalColumns, () =>
|
|
|
168
168
|
<style lang="scss">
|
|
169
169
|
:root {
|
|
170
170
|
--table-header-height: 60px;
|
|
171
|
+
--table-header-border-color: var(--base-border-color, var(--neutrals-200));
|
|
171
172
|
}
|
|
172
173
|
|
|
173
|
-
.vc-table-header {
|
|
174
|
+
.vc-table-columns-header {
|
|
175
|
+
@apply tw-border-y tw-border-[color:var(--table-header-border-color)] tw-border-solid;
|
|
174
176
|
&__row {
|
|
175
177
|
@apply tw-flex tw-flex-row [box-shadow:var(--table-header-border)] tw-bg-[--table-header-bg];
|
|
176
178
|
}
|
|
@@ -194,7 +196,7 @@ const { resizer, handleMouseDown } = useTableColumnResize(internalColumns, () =>
|
|
|
194
196
|
@apply tw-cursor-pointer;
|
|
195
197
|
|
|
196
198
|
&:hover {
|
|
197
|
-
.vc-table-header__cell-sort-icons {
|
|
199
|
+
.vc-table-columns-header__cell-sort-icons {
|
|
198
200
|
@apply tw-visible;
|
|
199
201
|
}
|
|
200
202
|
}
|
package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue
CHANGED
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
|
|
90
90
|
<script lang="ts" setup generic="T extends TableItem | string">
|
|
91
91
|
import { toRefs, MaybeRef, useSlots } from "vue";
|
|
92
|
-
import VcTableHeader from "./_internal/vc-table-header/vc-table-header.vue";
|
|
92
|
+
import VcTableHeader from "./_internal/vc-table-columns-header/vc-table-columns-header.vue";
|
|
93
93
|
import VcTableSelectAllHeader from "./_internal/vc-table-select-all-header/vc-table-select-all-header.vue";
|
|
94
94
|
import VcTableBody from "./_internal/vc-table-body/vc-table-body.vue";
|
|
95
95
|
import type { ITableColumns, TableItem, TableColPartial, StatusImage } from "../../types";
|
|
@@ -23,6 +23,7 @@ import { VNode, computed, inject, Ref, h, useSlots } from "vue";
|
|
|
23
23
|
import { useGlobalSearch } from "../../../../../../core/composables/useGlobalSearch";
|
|
24
24
|
import { BladeInstance } from "../../../../../../injection-keys";
|
|
25
25
|
import VcTableBaseHeader from "../vc-table-base-header/vc-table-base-header.vue";
|
|
26
|
+
import { IBladeInstance } from "../../../../../../shared";
|
|
26
27
|
|
|
27
28
|
const props = defineProps<{
|
|
28
29
|
hasHeaderSlot: boolean;
|
|
@@ -44,7 +45,17 @@ defineSlots<{
|
|
|
44
45
|
header: (props: { header: VNode }) => VNode;
|
|
45
46
|
}>();
|
|
46
47
|
|
|
47
|
-
const blade = inject(
|
|
48
|
+
const blade = inject(
|
|
49
|
+
BladeInstance,
|
|
50
|
+
computed(
|
|
51
|
+
(): Partial<IBladeInstance> => ({
|
|
52
|
+
navigation: {
|
|
53
|
+
idx: 0,
|
|
54
|
+
instance: null,
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
),
|
|
58
|
+
);
|
|
48
59
|
const globalSearch = useGlobalSearch();
|
|
49
60
|
const isMobile = inject("isMobile") as Ref<boolean>;
|
|
50
61
|
const slots = useSlots();
|