@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.
Files changed (156) 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-Bu12RZTu.js → index-8LELHzw9.js} +1 -1
  20. package/dist/{index-Bwl2ND2Q.js → index-9lJxZE5w.js} +1 -1
  21. package/dist/{index-CJi-BbTb.js → index-B1YR_MYV.js} +1 -1
  22. package/dist/{index-BhdwVgUw.js → index-BA98L1jI.js} +1 -1
  23. package/dist/{index-NdrUF1u3.js → index-BAeTsi-X.js} +1 -1
  24. package/dist/{index-CbRqPQTw.js → index-BBYyHeYA.js} +1 -1
  25. package/dist/{index-CsaYfhir.js → index-BrUitdDo.js} +1 -1
  26. package/dist/{index-CZ_pj3nW.js → index-BuO5ByG9.js} +1 -1
  27. package/dist/{index-DFPb-jDP.js → index-CJ5I7vTn.js} +1 -1
  28. package/dist/{index-BdoAu2fz.js → index-CWKrD2Cd.js} +1 -1
  29. package/dist/{index-DVaMW7gL.js → index-Cf9Tz1ql.js} +1 -1
  30. package/dist/{index-B89uIUkS.js → index-CrxFDC2b.js} +1 -1
  31. package/dist/{index-BcQiBkO6.js → index-D1JchciU.js} +1 -1
  32. package/dist/{index-CEvuTGIu.js → index-DLtsQ_PJ.js} +31254 -31134
  33. package/dist/{index-COjjAS6v.js → index-DVljTjbf.js} +1 -1
  34. package/dist/{index-DjQ6Ffv8.js → index-RwX3kiZh.js} +28 -28
  35. package/dist/{index-S9Ht7s3i.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/dashboard-widget-card/dashboard-widget-card.vue.d.ts +25 -0
  40. package/dist/shared/components/dashboard-widget-card/dashboard-widget-card.vue.d.ts.map +1 -0
  41. package/dist/shared/components/dashboard-widget-card/index.d.ts +2 -0
  42. package/dist/shared/components/dashboard-widget-card/index.d.ts.map +1 -0
  43. package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts +6 -0
  44. package/dist/shared/components/draggable-dashboard/DraggableDashboard.vue.d.ts.map +1 -0
  45. package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts +20 -0
  46. package/dist/shared/components/draggable-dashboard/_internal/DashboardWidget.vue.d.ts.map +1 -0
  47. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts +354 -0
  48. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts.map +1 -0
  49. package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts +12 -0
  50. package/dist/shared/components/draggable-dashboard/composables/useDashboardGrid.d.ts.map +1 -0
  51. package/dist/shared/components/draggable-dashboard/index.d.ts +2 -0
  52. package/dist/shared/components/draggable-dashboard/index.d.ts.map +1 -0
  53. package/dist/shared/components/draggable-dashboard/types.d.ts +80 -0
  54. package/dist/shared/components/draggable-dashboard/types.d.ts.map +1 -0
  55. package/dist/shared/components/index.d.ts +2 -0
  56. package/dist/shared/components/index.d.ts.map +1 -1
  57. package/dist/shared/components/user-dropdown-button/_internal/user-info.vue.d.ts.map +1 -1
  58. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
  59. package/dist/shared/composables/useMenuExpanded.d.ts +2 -0
  60. package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
  61. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +0 -41
  62. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
  63. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  64. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts +1 -1
  65. package/dist/shared/modules/dynamic/components/fields/storybook/common/templates.d.ts.map +1 -1
  66. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -25
  67. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  68. package/dist/tailwind.config.d.ts +1 -81
  69. package/dist/tailwind.config.d.ts.map +1 -1
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts +169 -734
  72. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts.map +1 -1
  73. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +18 -2
  74. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
  75. package/dist/ui/components/atoms/vc-card/index.d.ts +2 -0
  76. package/dist/ui/components/atoms/vc-card/index.d.ts.map +1 -1
  77. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +12 -0
  78. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -1
  79. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts +2 -0
  80. package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
  81. package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts +18 -0
  82. package/dist/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue.d.ts.map +1 -0
  83. package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts +18 -0
  84. package/dist/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue.d.ts.map +1 -0
  85. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts +2 -0
  86. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts.map +1 -1
  87. package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts +2 -0
  88. package/dist/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.d.ts.map +1 -1
  89. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts +0 -1
  90. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  91. 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
  92. 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
  93. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  94. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +13 -67
  95. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
  96. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +5 -65
  97. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  98. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
  99. 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
  100. 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
  101. package/dist/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue.d.ts.map +1 -1
  102. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts +33 -3
  103. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue.d.ts.map +1 -1
  104. package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
  105. package/package.json +10 -5
  106. package/shared/components/dashboard-widget-card/dashboard-widget-card.vue +67 -0
  107. package/shared/components/dashboard-widget-card/index.ts +1 -0
  108. package/shared/components/draggable-dashboard/DraggableDashboard.vue +369 -0
  109. package/shared/components/draggable-dashboard/_internal/DashboardWidget.vue +133 -0
  110. package/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.ts +547 -0
  111. package/shared/components/draggable-dashboard/composables/useDashboardGrid.ts +250 -0
  112. package/shared/components/draggable-dashboard/index.ts +1 -0
  113. package/shared/components/draggable-dashboard/types.ts +91 -0
  114. package/shared/components/index.ts +2 -0
  115. package/shared/components/user-dropdown-button/_internal/user-info.vue +25 -12
  116. package/shared/components/user-dropdown-button/user-dropdown-button.vue +3 -3
  117. package/shared/composables/useMenuExpanded.ts +24 -0
  118. package/shared/modules/assets/components/assets-details/assets-details.vue +1 -1
  119. package/shared/modules/dynamic/components/fields/storybook/Button.stories.ts +186 -247
  120. package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +175 -176
  121. package/shared/modules/dynamic/components/fields/storybook/common/templates.ts +8 -8
  122. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +153 -187
  123. package/tailwind.config.ts +127 -126
  124. package/ui/components/atoms/vc-button/vc-button.stories.ts +1 -16
  125. package/ui/components/atoms/vc-button/vc-button.vue +74 -63
  126. package/ui/components/atoms/vc-card/vc-card.stories.ts +102 -102
  127. package/ui/components/atoms/vc-card/vc-card.vue +164 -159
  128. package/ui/components/atoms/vc-icon/icons/GridDotsIcon.vue +22 -0
  129. package/ui/components/atoms/vc-icon/icons/ShoppingCardIcon.vue +16 -0
  130. package/ui/components/atoms/vc-icon/icons/index.ts +2 -0
  131. package/ui/components/molecules/vc-field/vc-field.vue +1 -1
  132. package/ui/components/organisms/vc-app/_internal/composables/useAppMenuState.ts +12 -1
  133. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarContent.vue +1 -2
  134. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +1 -1
  135. package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue +0 -1
  136. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +274 -112
  137. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +81 -37
  138. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +7 -5
  139. package/ui/components/organisms/vc-app/vc-app.vue +26 -15
  140. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +5 -7
  141. 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
  142. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-row/vc-table-row.vue +1 -0
  143. package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/vc-table-desktop-view.vue +1 -1
  144. package/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue +12 -1
  145. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-view/vc-table-mobile-view.vue +45 -2
  146. package/ui/components/organisms/vc-table/composables/useTableColumnReorder.ts +5 -5
  147. package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +1 -1
  148. package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +1 -0
  149. package/core/services/toolbarbus-service.ts +0 -34
  150. package/dist/core/composables/useGlobalSearch.d.ts.map +0 -1
  151. package/dist/core/services/toolbarbus-service.d.ts +0 -10
  152. package/dist/core/services/toolbarbus-service.d.ts.map +0 -1
  153. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts +0 -5
  154. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts.map +0 -1
  155. 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
  156. package/ui/components/organisms/vc-app/composables/useToolbarSlots.ts +0 -37
@@ -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,100 +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"
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
+ }"
32
55
  >
33
- <template #notifications>
34
- <slot name="notifications-dropdown" />
35
- </template>
36
- <template
37
- v-if="$slots['logo:append']"
38
- #logo:append
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"
39
66
  >
40
- <slot name="logo:append"></slot>
41
- </template>
42
- </AppBarHeader>
43
-
44
- <AppBarOverlay
45
- v-if="shouldShowOverlay"
46
- :is-sidebar-mode="state.isMenuOpen"
47
- :expanded="state.isSidebarExpanded"
48
- >
49
- <component
50
- :is="overlayContent"
51
- v-bind="overlayProps"
52
- />
53
- </AppBarOverlay>
54
-
55
- <MenuSidebar
56
- v-if="state.isMenuOpen"
57
- :is-opened="state.isMenuOpen"
58
- :expanded="state.isSidebarExpanded"
59
- @update:is-opened="handleMenuClose"
60
- >
61
- <template #toolbar>
62
- <slot name="notifications-dropdown" />
63
- <slot name="toolbar" />
64
- </template>
65
- <template #navmenu>
66
- <slot name="navmenu" />
67
- </template>
68
- <template #user-dropdown>
69
- <slot name="user-dropdown" />
70
- </template>
71
- <template #app-switcher>
72
- <slot name="app-switcher" />
73
- </template>
74
- <template #active-content>
75
- <div
76
- v-if="shouldShowInMenu"
77
- :class="['vc-app-bar__menu-dropdowns', { 'vc-app-bar__menu-dropdowns--mobile': $isMobile.value }]"
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"
78
77
  >
79
78
  <component
80
79
  :is="overlayContent"
81
- v-bind="overlayProps || {}"
80
+ v-bind="overlayProps"
82
81
  />
83
- </div>
84
- </template>
85
- </MenuSidebar>
86
-
87
- <AppBarContent
88
- v-if="$isDesktop.value"
89
- :expanded="state.isSidebarExpanded"
90
- >
91
- <template #navmenu>
92
- <slot name="navmenu" />
93
- </template>
94
- <template #user-dropdown>
95
- <slot name="user-dropdown" />
96
- </template>
97
- </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>
98
129
  </div>
99
130
  </div>
100
131
  </template>
@@ -128,18 +159,22 @@ interface Slots {
128
159
  "app-switcher": () => void;
129
160
  navmenu: () => void;
130
161
  "user-dropdown": () => void;
131
- "logo:append": () => void;
132
162
  }
133
163
 
134
- defineProps<Props>();
164
+ const props = defineProps<Props>();
135
165
  defineEmits<Emits>();
136
166
  defineSlots<Slots>();
137
167
 
138
- const { state, toggleSidebar, toggleMenu: toggleMenuState, closeAll } = useAppMenuState();
168
+ const {
169
+ state,
170
+ toggleSidebar,
171
+ toggleMenu: toggleMenuState,
172
+ closeAll,
173
+ toggleHoverExpanded,
174
+ isHoverExpanded,
175
+ } = useAppMenuState();
139
176
  const { overlayContent, overlayProps, hideContent, isOverlayed } = useAppBarOverlay();
140
177
 
141
- const menuButtonRef = ref<HTMLElement | null>(null);
142
-
143
178
  // Provide appMenuState для дочерних компонентов
144
179
  provide("appMenuState", { closeAll });
145
180
 
@@ -157,9 +192,9 @@ const handleMenuClose = (value: boolean) => {
157
192
  }
158
193
  };
159
194
 
160
- const handleClickOutside = () => {
161
- closeAll();
162
- hideContent();
195
+ // Simple hover effect processing
196
+ const handleHoverExpand = (shouldExpand?: boolean) => {
197
+ toggleHoverExpanded(shouldExpand);
163
198
  };
164
199
 
165
200
  const shouldShowOverlay = computed(() => {
@@ -174,20 +209,21 @@ const shouldShowInMenu = computed(() => {
174
209
  <style lang="scss">
175
210
  :root {
176
211
  // Sizes
177
- --app-bar-height: 70px;
178
- --app-bar-collapsed-height: 94px;
212
+ --app-bar-height: 94px;
179
213
  --app-bar-mobile-height: 58px;
180
214
  --app-bar-width: 246px;
181
215
  --app-bar-mobile-width: 300px;
182
216
  --app-bar-collapsed-width: 76px;
183
217
  --app-bar-padding: 18px;
184
218
  --app-bar-padding-mobile: 28px;
219
+ --app-bar-shadow: 0 16px 10px 0 rgba(0, 0, 0, 0.14);
185
220
 
186
221
  // Logo
187
222
  --app-bar-logo-width: 125px;
188
223
  --app-bar-logo-height: 46px;
189
224
  --app-bar-logo-mobile-width: 46px;
190
225
  --app-bar-logo-mobile-height: 46px;
226
+
191
227
  // Collapse button
192
228
  --app-bar-collapse-button-width: 26px;
193
229
  --app-bar-collapse-button-height: 26px;
@@ -205,30 +241,111 @@ const shouldShowInMenu = computed(() => {
205
241
  --app-bar-burger: var(--primary-500);
206
242
 
207
243
  // Transition
208
- --app-bar-transition-duration: 0.1s;
209
- --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);
210
248
  }
211
249
 
212
250
  .vc-app-bar {
213
251
  @apply tw-relative tw-flex tw-flex-col;
214
- 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);
215
255
  background-color: var(--app-bar-background);
216
- 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
+ }
217
333
 
218
334
  &__collapse-button {
219
- @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];
220
336
  width: var(--app-bar-collapse-button-width);
221
337
  height: var(--app-bar-collapse-button-height);
222
338
  border-radius: var(--app-bar-collapse-button-border-radius);
223
339
  background-color: var(--app-bar-background);
224
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);
225
343
 
226
344
  &-wrap {
227
345
  @apply tw-flex tw-items-center tw-justify-center;
228
346
  }
229
347
 
230
348
  &-icon {
231
- @apply tw-transition-transform tw-duration-300;
232
349
  color: var(--app-bar-button);
233
350
  }
234
351
  }
@@ -237,39 +354,84 @@ const shouldShowInMenu = computed(() => {
237
354
  @apply tw-opacity-100;
238
355
  }
239
356
 
240
- &--collapsed {
241
- width: var(--app-bar-collapsed-width);
242
-
243
- .vc-app-bar__collapse-button svg {
244
- @apply tw-rotate-180;
245
- }
246
- }
247
-
248
357
  &__logo {
249
358
  @apply tw-cursor-pointer tw-mx-2;
250
359
  max-width: var(--app-bar-logo-width);
251
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);
252
364
  }
253
365
 
254
366
  &__title {
255
367
  @apply tw-font-medium;
256
368
  color: var(--app-bar-product-name);
257
- }
258
-
259
- &--mobile {
260
- @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);
261
372
  }
262
373
 
263
374
  &__wrapper {
264
375
  @apply tw-h-full tw-relative;
265
-
266
- // &--mobile {
267
- // height: var(--app-bar-mobile-height);
268
- // }
376
+ transition: opacity var(--app-bar-hover-transition-duration) var(--app-bar-hover-transition-timing-function);
269
377
  }
270
378
 
271
379
  &__menu-dropdowns {
272
380
  @apply tw-overflow-auto tw-max-h-[250px];
273
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);
274
436
  }
275
437
  </style>