@vc-shell/framework 1.1.0-alpha.2 → 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.
Files changed (162) hide show
  1. package/core/composables/index.ts +18 -17
  2. package/core/composables/useDashboard/index.ts +19 -0
  3. package/core/composables/{useGlobalSearch.ts → useGlobalSearch/index.ts} +3 -5
  4. package/core/composables/useWidgets/index.ts +19 -18
  5. package/core/plugins/modularity/loader.ts +2 -1
  6. package/core/services/dashboard-service.ts +121 -0
  7. package/core/services/widget-service.ts +1 -4
  8. package/dist/core/composables/index.d.ts +1 -0
  9. package/dist/core/composables/index.d.ts.map +1 -1
  10. package/dist/core/composables/useDashboard/index.d.ts +5 -0
  11. package/dist/core/composables/useDashboard/index.d.ts.map +1 -0
  12. package/dist/core/composables/{useGlobalSearch.d.ts → useGlobalSearch/index.d.ts} +1 -1
  13. package/dist/core/composables/useGlobalSearch/index.d.ts.map +1 -0
  14. package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
  15. package/dist/core/services/dashboard-service.d.ts +33 -0
  16. package/dist/core/services/dashboard-service.d.ts.map +1 -0
  17. package/dist/core/services/widget-service.d.ts.map +1 -1
  18. package/dist/framework.js +235 -225
  19. package/dist/{index-DkfZxmI7.js → index-8LELHzw9.js} +1 -1
  20. package/dist/{index-Dn54TX9M.js → index-9lJxZE5w.js} +1 -1
  21. package/dist/{index-BbLSuXfB.js → index-B1YR_MYV.js} +1 -1
  22. package/dist/{index-CUuop2Pm.js → index-BA98L1jI.js} +1 -1
  23. package/dist/{index-B7KsNz2e.js → index-BAeTsi-X.js} +1 -1
  24. package/dist/{index-q2J1GObW.js → index-BBYyHeYA.js} +1 -1
  25. package/dist/{index-DQXUkbse.js → index-BrUitdDo.js} +1 -1
  26. package/dist/{index-DY3kTJtR.js → index-BuO5ByG9.js} +1 -1
  27. package/dist/{index-DnpVJexS.js → index-CJ5I7vTn.js} +1 -1
  28. package/dist/{index-D8YubeMT.js → index-CWKrD2Cd.js} +1 -1
  29. package/dist/{index-D7HzlheD.js → index-Cf9Tz1ql.js} +1 -1
  30. package/dist/{index-h6Tp1RYq.js → index-CrxFDC2b.js} +1 -1
  31. package/dist/{index-D5mVNTjP.js → index-D1JchciU.js} +1 -1
  32. package/dist/{index-3eLJLrzP.js → index-DLtsQ_PJ.js} +31277 -31144
  33. package/dist/{index-Yc2AandF.js → index-DVljTjbf.js} +1 -1
  34. package/dist/{index-DdgLwPZH.js → index-RwX3kiZh.js} +28 -28
  35. package/dist/{index-lE5Ov0XL.js → index-xLYzNPa7.js} +1 -1
  36. package/dist/index.css +1 -1
  37. package/dist/injection-keys.d.ts +28 -0
  38. package/dist/injection-keys.d.ts.map +1 -1
  39. package/dist/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -1
  40. package/dist/shared/components/dashboard-widget-card/dashboard-widget-card.vue.d.ts +25 -0
  41. package/dist/shared/components/dashboard-widget-card/dashboard-widget-card.vue.d.ts.map +1 -0
  42. package/dist/shared/components/dashboard-widget-card/index.d.ts +2 -0
  43. package/dist/shared/components/dashboard-widget-card/index.d.ts.map +1 -0
  44. package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts +6 -0
  45. package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts.map +1 -0
  46. package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts +20 -0
  47. package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts.map +1 -0
  48. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts +354 -0
  49. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts.map +1 -0
  50. package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts +12 -0
  51. package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts.map +1 -0
  52. package/dist/shared/components/draggable-dashboard/index.d.ts +2 -0
  53. package/dist/shared/components/draggable-dashboard/index.d.ts.map +1 -0
  54. package/dist/shared/components/draggable-dashboard/types.d.ts +80 -0
  55. package/dist/shared/components/draggable-dashboard/types.d.ts.map +1 -0
  56. package/dist/shared/components/index.d.ts +2 -0
  57. package/dist/shared/components/index.d.ts.map +1 -1
  58. package/dist/shared/components/user-dropdown-button/_internal/user-info.vue.d.ts.map +1 -1
  59. package/dist/shared/components/user-dropdown-button/_internal/user-sidebar.vue.d.ts +1 -1
  60. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
  61. package/dist/shared/composables/useMenuExpanded.d.ts +2 -0
  62. package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
  63. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +0 -41
  64. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
  65. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  66. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts +1 -1
  67. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts.map +1 -1
  68. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -25
  69. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  70. package/dist/tailwind.config.d.ts +1 -81
  71. package/dist/tailwind.config.d.ts.map +1 -1
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts +169 -734
  74. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts.map +1 -1
  75. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +18 -2
  76. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
  77. package/dist/ui/components/atoms/vc-card/index.d.ts +2 -0
  78. package/dist/ui/components/atoms/vc-card/index.d.ts.map +1 -1
  79. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +12 -0
  80. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -1
  81. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts +2 -0
  82. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
  83. package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts +18 -0
  84. package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts.map +1 -0
  85. package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts +18 -0
  86. package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts.map +1 -0
  87. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts +2 -0
  88. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts.map +1 -1
  89. package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts +2 -0
  90. package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts.map +1 -1
  91. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue.d.ts.map +1 -1
  92. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts +0 -1
  93. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  94. 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
  95. 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
  96. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  97. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +13 -67
  98. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
  99. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +5 -65
  100. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  101. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
  102. 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
  103. 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
  104. package/dist/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue.d.ts.map +1 -1
  105. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts +33 -3
  106. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts.map +1 -1
  107. package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
  108. package/package.json +10 -5
  109. package/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue +1 -3
  110. package/shared/components/dashboard-widget-card/dashboard-widget-card.vue +67 -0
  111. package/shared/components/dashboard-widget-card/index.ts +1 -0
  112. package/shared/components/draggable-dashboard/DraggableDashboard.vue +369 -0
  113. package/shared/components/draggable-dashboard/_internal/DashboardWidget.vue +133 -0
  114. package/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.ts +547 -0
  115. package/shared/components/draggable-dashboard/composables/useDashboardGrid.ts +250 -0
  116. package/shared/components/draggable-dashboard/index.ts +1 -0
  117. package/shared/components/draggable-dashboard/types.ts +91 -0
  118. package/shared/components/index.ts +2 -0
  119. package/shared/components/user-dropdown-button/_internal/user-info.vue +25 -12
  120. package/shared/components/user-dropdown-button/user-dropdown-button.vue +3 -3
  121. package/shared/composables/useMenuExpanded.ts +24 -0
  122. package/shared/modules/assets/components/assets-details/assets-details.vue +1 -1
  123. package/shared/modules/dynamic/components/fields/storybook/Button.stories.ts +186 -247
  124. package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +175 -176
  125. package/shared/modules/dynamic/components/fields/storybook/common/templates.ts +8 -8
  126. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +153 -187
  127. package/tailwind.config.ts +127 -126
  128. package/ui/components/atoms/vc-button/vc-button.stories.ts +1 -16
  129. package/ui/components/atoms/vc-button/vc-button.vue +74 -63
  130. package/ui/components/atoms/vc-card/vc-card.stories.ts +102 -102
  131. package/ui/components/atoms/vc-card/vc-card.vue +164 -159
  132. package/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue +22 -0
  133. package/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue +16 -0
  134. package/ui/components/atoms/vc-icon/icons/index.ts +2 -0
  135. package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +1 -1
  136. package/ui/components/molecules/vc-field/vc-field.vue +1 -1
  137. package/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.ts +12 -1
  138. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarContent.vue +1 -2
  139. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +5 -2
  140. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue +0 -1
  141. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +275 -110
  142. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +81 -37
  143. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +7 -5
  144. package/ui/components/organisms/vc-app/vc-app.vue +30 -16
  145. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/desktop/vc-blade-toolbar-desktop.vue +1 -1
  146. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +5 -7
  147. 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
  148. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue +1 -0
  149. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue +1 -1
  150. package/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue +12 -1
  151. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue +45 -2
  152. package/ui/components/organisms/vc-table/composables/useTableColumnReorder.ts +5 -5
  153. package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +1 -1
  154. package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +1 -0
  155. package/core/services/toolbarbus-service.ts +0 -34
  156. package/dist/core/composables/useGlobalSearch.d.ts.map +0 -1
  157. package/dist/core/services/toolbarbus-service.d.ts +0 -10
  158. package/dist/core/services/toolbarbus-service.d.ts.map +0 -1
  159. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts +0 -5
  160. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts.map +0 -1
  161. 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
  162. package/ui/components/organisms/vc-app/composables/useToolbarSlots.ts +0 -37
@@ -18,7 +18,10 @@
18
18
  />
19
19
  </div>
20
20
 
21
- <div class="app-bar-header__logo-append">
21
+ <div
22
+ v-if="$slots['logo:append']"
23
+ class="app-bar-header__logo-append"
24
+ >
22
25
  <slot name="logo:append"></slot>
23
26
  </div>
24
27
 
@@ -125,7 +128,7 @@ const hasUnread = computed(() => {
125
128
  @apply tw-flex tw-flex-row tw-items-center tw-justify-between tw-px-[var(--app-bar-padding)] tw-h-[var(--app-bar-height)] tw-py-[var(--app-bar-header-padding-top)];
126
129
 
127
130
  &--collapsed {
128
- @apply tw-flex-col tw-items-center tw-justify-between tw-border-0 tw-gap-[10px] tw-h-[var(--app-bar-collapsed-height)];
131
+ @apply tw-flex-col tw-items-center tw-justify-between tw-border-0 tw-gap-[16px];
129
132
  }
130
133
 
131
134
  &--mobile {
@@ -27,7 +27,6 @@ defineEmits<{
27
27
  </script>
28
28
 
29
29
  <style lang="scss">
30
-
31
30
  .app-bar-overlay {
32
31
  @apply tw-w-auto tw-h-full tw-absolute tw-top-0 tw-right-0 tw-z-[11]
33
32
  tw-bg-[color:var(--app-bar-background)];
@@ -1,97 +1,131 @@
1
1
  <template>
2
+ <div
3
+ v-if="$isDesktop.value"
4
+ class="vc-app-bar--padding"
5
+ :class="{
6
+ 'vc-app-bar--padding-expanded': state.isSidebarExpanded,
7
+ }"
8
+ ></div>
2
9
  <div
3
10
  class="vc-app-bar"
4
11
  :class="{
5
12
  'vc-app-bar--mobile': $isMobile.value,
6
- 'vc-app-bar--collapsed': !state.isSidebarExpanded,
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,
7
17
  }"
18
+ @mouseenter="$isDesktop.value && !state.isSidebarExpanded && handleHoverExpand(true)"
19
+ @mouseleave="$isDesktop.value && !state.isSidebarExpanded && handleHoverExpand(false)"
8
20
  >
9
21
  <div
10
- v-if="!$isMobile.value"
11
- class="vc-app-bar__collapse-button"
12
- @click="toggleSidebar"
22
+ 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
+ }"
13
30
  >
14
- <div class="vc-app-bar__collapse-button-wrap">
15
- <VcIcon
16
- class="vc-app-bar__collapse-button-icon"
17
- :icon="ChevronLeftIcon"
18
- size="xs"
19
- />
31
+ <div
32
+ v-if="!$isMobile.value"
33
+ class="vc-app-bar__collapse-button"
34
+ @click="toggleSidebar"
35
+ >
36
+ <div class="vc-app-bar__collapse-button-wrap">
37
+ <Transition name="rotate">
38
+ <VcIcon
39
+ v-show="true"
40
+ class="vc-app-bar__collapse-button-icon"
41
+ :icon="ChevronLeftIcon"
42
+ size="xs"
43
+ :class="{ 'rotate-180': !state.isSidebarExpanded }"
44
+ />
45
+ </Transition>
46
+ </div>
20
47
  </div>
21
- </div>
22
48
 
23
- <div
24
- class="vc-app-bar__wrapper"
25
- :class="{ 'vc-app-bar__wrapper--mobile': $isMobile.value }"
26
- >
27
- <AppBarHeader
28
- :logo="logo"
29
- :expanded="state.isSidebarExpanded"
30
- @logo:click="$emit('logo:click')"
31
- @toggle-menu="toggleMenu"
32
- >
33
- <template #notifications>
34
- <slot name="notifications-dropdown" />
35
- </template>
36
- <template #logo:append>
37
- <slot name="logo:append"></slot>
38
- </template>
39
- </AppBarHeader>
40
-
41
- <AppBarOverlay
42
- v-if="shouldShowOverlay"
43
- :is-sidebar-mode="state.isMenuOpen"
44
- :expanded="state.isSidebarExpanded"
45
- >
46
- <component
47
- :is="overlayContent"
48
- v-bind="overlayProps"
49
- />
50
- </AppBarOverlay>
51
-
52
- <MenuSidebar
53
- v-if="state.isMenuOpen"
54
- :is-opened="state.isMenuOpen"
55
- :expanded="state.isSidebarExpanded"
56
- @update:is-opened="handleMenuClose"
49
+ <div
50
+ class="vc-app-bar__wrapper"
51
+ :class="{
52
+ 'vc-app-bar__wrapper--mobile': $isMobile.value,
53
+ 'vc-app-bar__wrapper--hover-collapsed': $isDesktop.value && !isHoverExpanded && !state.isSidebarExpanded,
54
+ }"
57
55
  >
58
- <template #toolbar>
59
- <slot name="notifications-dropdown" />
60
- <slot name="toolbar" />
61
- </template>
62
- <template #navmenu>
63
- <slot name="navmenu" />
64
- </template>
65
- <template #user-dropdown>
66
- <slot name="user-dropdown" />
67
- </template>
68
- <template #app-switcher>
69
- <slot name="app-switcher" />
70
- </template>
71
- <template #active-content>
72
- <div
73
- v-if="shouldShowInMenu"
74
- :class="['vc-app-bar__menu-dropdowns', { 'vc-app-bar__menu-dropdowns--mobile': $isMobile.value }]"
56
+ <AppBarHeader
57
+ :logo="logo"
58
+ :expanded="state.isSidebarExpanded || isHoverExpanded"
59
+ class="vc-app-bar__header"
60
+ :class="{
61
+ 'vc-app-bar__header--hover-expanded': $isDesktop.value && isHoverExpanded && !state.isSidebarExpanded,
62
+ 'vc-app-bar__header--collapsed': $isDesktop.value && !state.isSidebarExpanded && !isHoverExpanded,
63
+ }"
64
+ @logo:click="$emit('logo:click')"
65
+ @toggle-menu="toggleMenu"
66
+ >
67
+ <template #notifications>
68
+ <slot name="notifications-dropdown" />
69
+ </template>
70
+ </AppBarHeader>
71
+
72
+ <Transition name="overlay">
73
+ <AppBarOverlay
74
+ v-if="shouldShowOverlay"
75
+ :is-sidebar-mode="state.isMenuOpen"
76
+ :expanded="state.isSidebarExpanded"
75
77
  >
76
78
  <component
77
79
  :is="overlayContent"
78
- v-bind="overlayProps || {}"
80
+ v-bind="overlayProps"
79
81
  />
80
- </div>
81
- </template>
82
- </MenuSidebar>
83
-
84
- <AppBarContent
85
- v-if="$isDesktop.value"
86
- :expanded="state.isSidebarExpanded"
87
- >
88
- <template #navmenu>
89
- <slot name="navmenu" />
90
- </template>
91
- <template #user-dropdown>
92
- <slot name="user-dropdown" />
93
- </template>
94
- </AppBarContent>
82
+ </AppBarOverlay>
83
+ </Transition>
84
+
85
+ <MenuSidebar
86
+ v-if="state.isMenuOpen"
87
+ :is-opened="state.isMenuOpen"
88
+ :expanded="state.isSidebarExpanded"
89
+ @update:is-opened="handleMenuClose"
90
+ >
91
+ <template #toolbar>
92
+ <slot name="notifications-dropdown" />
93
+ <slot name="toolbar" />
94
+ </template>
95
+ <template #navmenu>
96
+ <slot name="navmenu" />
97
+ </template>
98
+ <template #user-dropdown>
99
+ <slot name="user-dropdown" />
100
+ </template>
101
+ <template #app-switcher>
102
+ <slot name="app-switcher" />
103
+ </template>
104
+ <template #active-content>
105
+ <div
106
+ v-if="shouldShowInMenu"
107
+ :class="['vc-app-bar__menu-dropdowns', { 'vc-app-bar__menu-dropdowns--mobile': $isMobile.value }]"
108
+ >
109
+ <component
110
+ :is="overlayContent"
111
+ v-bind="overlayProps || {}"
112
+ />
113
+ </div>
114
+ </template>
115
+ </MenuSidebar>
116
+
117
+ <AppBarContent
118
+ v-if="$isDesktop.value"
119
+ :expanded="state.isSidebarExpanded"
120
+ >
121
+ <template #navmenu>
122
+ <slot name="navmenu" />
123
+ </template>
124
+ <template #user-dropdown>
125
+ <slot name="user-dropdown" />
126
+ </template>
127
+ </AppBarContent>
128
+ </div>
95
129
  </div>
96
130
  </div>
97
131
  </template>
@@ -125,18 +159,22 @@ interface Slots {
125
159
  "app-switcher": () => void;
126
160
  navmenu: () => void;
127
161
  "user-dropdown": () => void;
128
- "logo:append": () => void;
129
162
  }
130
163
 
131
- defineProps<Props>();
164
+ const props = defineProps<Props>();
132
165
  defineEmits<Emits>();
133
166
  defineSlots<Slots>();
134
167
 
135
- const { state, toggleSidebar, toggleMenu: toggleMenuState, closeAll } = useAppMenuState();
168
+ const {
169
+ state,
170
+ toggleSidebar,
171
+ toggleMenu: toggleMenuState,
172
+ closeAll,
173
+ toggleHoverExpanded,
174
+ isHoverExpanded,
175
+ } = useAppMenuState();
136
176
  const { overlayContent, overlayProps, hideContent, isOverlayed } = useAppBarOverlay();
137
177
 
138
- const menuButtonRef = ref<HTMLElement | null>(null);
139
-
140
178
  // Provide appMenuState для дочерних компонентов
141
179
  provide("appMenuState", { closeAll });
142
180
 
@@ -154,9 +192,9 @@ const handleMenuClose = (value: boolean) => {
154
192
  }
155
193
  };
156
194
 
157
- const handleClickOutside = () => {
158
- closeAll();
159
- hideContent();
195
+ // Simple hover effect processing
196
+ const handleHoverExpand = (shouldExpand?: boolean) => {
197
+ toggleHoverExpanded(shouldExpand);
160
198
  };
161
199
 
162
200
  const shouldShowOverlay = computed(() => {
@@ -171,20 +209,21 @@ const shouldShowInMenu = computed(() => {
171
209
  <style lang="scss">
172
210
  :root {
173
211
  // Sizes
174
- --app-bar-height: 70px;
175
- --app-bar-collapsed-height: 94px;
212
+ --app-bar-height: 94px;
176
213
  --app-bar-mobile-height: 58px;
177
214
  --app-bar-width: 246px;
178
215
  --app-bar-mobile-width: 300px;
179
216
  --app-bar-collapsed-width: 76px;
180
217
  --app-bar-padding: 18px;
181
218
  --app-bar-padding-mobile: 28px;
219
+ --app-bar-shadow: 0 16px 10px 0 rgba(0, 0, 0, 0.14);
182
220
 
183
221
  // Logo
184
222
  --app-bar-logo-width: 125px;
185
223
  --app-bar-logo-height: 46px;
186
224
  --app-bar-logo-mobile-width: 46px;
187
225
  --app-bar-logo-mobile-height: 46px;
226
+
188
227
  // Collapse button
189
228
  --app-bar-collapse-button-width: 26px;
190
229
  --app-bar-collapse-button-height: 26px;
@@ -202,30 +241,111 @@ const shouldShowInMenu = computed(() => {
202
241
  --app-bar-burger: var(--primary-500);
203
242
 
204
243
  // Transition
205
- --app-bar-transition-duration: 0.1s;
206
- --app-bar-transition-timing-function: linear;
244
+ --app-bar-transition-duration: 200ms;
245
+ --app-bar-hover-transition-duration: 250ms;
246
+ --app-bar-hover-leave-duration: 400ms;
247
+ --app-bar-hover-transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
207
248
  }
208
249
 
209
250
  .vc-app-bar {
210
251
  @apply tw-relative tw-flex tw-flex-col;
211
- width: var(--app-bar-width);
252
+ // transition-property: width, transform, box-shadow;
253
+ // transition-timing-function: var(--app-bar-hover-transition-timing-function);
254
+ // transition-duration: var(--app-bar-hover-transition-duration);
212
255
  background-color: var(--app-bar-background);
213
- transition: width var(--app-bar-transition-duration) var(--app-bar-transition-timing-function);
256
+ // border-right: 1px solid var(--app-bar-border);
257
+
258
+ z-index: 10000;
259
+
260
+ &--desktop {
261
+ position: fixed;
262
+ top: 0;
263
+ left: 0;
264
+ bottom: 0;
265
+ width: var(--app-bar-width);
266
+ }
267
+
268
+ &--mobile {
269
+ @apply tw-w-full;
270
+ }
271
+
272
+ &--padding {
273
+ @apply tw-w-[var(--app-bar-collapsed-width)];
274
+ }
275
+
276
+ &--padding-expanded {
277
+ @apply tw-w-[var(--app-bar-width)];
278
+ }
279
+
280
+ &--collapsed {
281
+ width: var(--app-bar-collapsed-width);
282
+ transition:
283
+ width var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function),
284
+ transform var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
285
+
286
+ &:not(.vc-app-bar--hover-expanded) {
287
+ ~ .vc-app-content {
288
+ margin-left: var(--app-bar-collapsed-width);
289
+ transition: margin-left var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
290
+ }
291
+ }
292
+ }
293
+
294
+ &--hover-expanded {
295
+ width: var(--app-bar-width) !important;
296
+ transition-duration: var(--app-bar-hover-transition-duration);
297
+
298
+ .vc-app-bar__wrap {
299
+ width: var(--app-bar-width);
300
+ }
301
+ }
302
+
303
+ &--hover-collapsed {
304
+ transition-duration: var(--app-bar-hover-leave-duration);
305
+ }
306
+
307
+ &__wrap {
308
+ @apply tw-h-full tw-relative;
309
+ transition-property: width, transform, box-shadow;
310
+ transition-timing-function: var(--app-bar-hover-transition-timing-function);
311
+ transition-duration: var(--app-bar-hover-transition-duration);
312
+
313
+ &--desktop-collapsed {
314
+ width: var(--app-bar-collapsed-width);
315
+ }
316
+
317
+ &--desktop-expanded {
318
+ width: var(--app-bar-width);
319
+ }
320
+
321
+ &--hover-expanded {
322
+ @apply tw-fixed tw-top-0 tw-left-0 tw-h-full tw-z-[100];
323
+ width: var(--app-bar-width) !important;
324
+ box-shadow: var(--app-bar-shadow);
325
+ background-color: var(--app-bar-background);
326
+ transition-duration: var(--app-bar-hover-transition-duration);
327
+ }
328
+
329
+ &--hover-collapsed {
330
+ transition-duration: var(--app-bar-hover-leave-duration);
331
+ }
332
+ }
214
333
 
215
334
  &__collapse-button {
216
- @apply tw-absolute tw-right-[-16px] tw-top-[50%] tw-translate-y-[-50%] tw-flex tw-items-center tw-justify-center tw-cursor-pointer tw-opacity-0 tw-transition-opacity tw-duration-300 tw-z-[12];
335
+ @apply tw-absolute tw-right-[-13px] tw-top-[50%] tw-translate-y-[-50%] tw-flex tw-items-center tw-justify-center tw-cursor-pointer tw-z-[12];
217
336
  width: var(--app-bar-collapse-button-width);
218
337
  height: var(--app-bar-collapse-button-height);
219
338
  border-radius: var(--app-bar-collapse-button-border-radius);
220
339
  background-color: var(--app-bar-background);
221
340
  border: 1px solid var(--app-bar-border);
341
+ opacity: 0;
342
+ transition: opacity var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
222
343
 
223
344
  &-wrap {
224
345
  @apply tw-flex tw-items-center tw-justify-center;
225
346
  }
226
347
 
227
348
  &-icon {
228
- @apply tw-transition-transform tw-duration-300;
229
349
  color: var(--app-bar-button);
230
350
  }
231
351
  }
@@ -234,39 +354,84 @@ const shouldShowInMenu = computed(() => {
234
354
  @apply tw-opacity-100;
235
355
  }
236
356
 
237
- &--collapsed {
238
- width: var(--app-bar-collapsed-width);
239
-
240
- .vc-app-bar__collapse-button svg {
241
- @apply tw-rotate-180;
242
- }
243
- }
244
-
245
357
  &__logo {
246
358
  @apply tw-cursor-pointer tw-mx-2;
247
359
  max-width: var(--app-bar-logo-width);
248
360
  max-height: var(--app-bar-logo-height);
361
+ transition:
362
+ opacity var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function),
363
+ transform var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
249
364
  }
250
365
 
251
366
  &__title {
252
367
  @apply tw-font-medium;
253
368
  color: var(--app-bar-product-name);
254
- }
255
-
256
- &--mobile {
257
- @apply tw-w-full;
369
+ transition:
370
+ opacity var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function),
371
+ transform var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
258
372
  }
259
373
 
260
374
  &__wrapper {
261
375
  @apply tw-h-full tw-relative;
262
-
263
- // &--mobile {
264
- // height: var(--app-bar-mobile-height);
265
- // }
376
+ transition: opacity var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
266
377
  }
267
378
 
268
379
  &__menu-dropdowns {
269
380
  @apply tw-overflow-auto tw-max-h-[250px];
270
381
  }
382
+
383
+ &__header {
384
+ transition-property: all, width, transform;
385
+ transition-timing-function: var(--app-bar-hover-transition-timing-function);
386
+ transition-duration: var(--app-bar-hover-transition-duration);
387
+
388
+ &--collapsed {
389
+ @apply tw-w-[var(--app-bar-collapsed-width)];
390
+ }
391
+
392
+ &--hover-expanded {
393
+ @apply tw-w-[var(--app-bar-width)];
394
+ }
395
+
396
+ &--hover-collapsed {
397
+ transition-duration: var(--app-bar-hover-leave-duration);
398
+ }
399
+ }
400
+ }
401
+
402
+ .overlay-enter-active,
403
+ .overlay-leave-active,
404
+ .menu-enter-active,
405
+ .menu-leave-active {
406
+ transition:
407
+ opacity var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function),
408
+ transform var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
409
+ }
410
+
411
+ .overlay-enter-from,
412
+ .menu-enter-from {
413
+ opacity: 0;
414
+ transform: translateY(-10px);
415
+ }
416
+
417
+ .overlay-leave-to,
418
+ .menu-leave-to {
419
+ opacity: 0;
420
+ transform: translateY(10px);
421
+ }
422
+
423
+ .rotate-enter-active,
424
+ .rotate-leave-active {
425
+ transition: transform var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
426
+ }
427
+
428
+ .rotate-180 {
429
+ transform: rotate(180deg);
430
+ }
431
+
432
+ // Анимация контента
433
+ .vc-app-content {
434
+ margin-left: var(--app-bar-width);
435
+ transition: margin-left var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
271
436
  }
272
437
  </style>