@cloud-ru/ds-uikit-product-header 1.5.2-preview-b174c2b1.0 → 1.5.2

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 (219) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +91 -91
  3. package/dist/cjs/components/HeaderButton/HeaderButton.d.ts +0 -1
  4. package/dist/cjs/components/HeaderLayout/HeaderLayout.d.ts +0 -6
  5. package/dist/cjs/components/Logo/Logo.d.ts +0 -7
  6. package/dist/cjs/components/MainMenu/MainMenu.js +6 -9
  7. package/dist/cjs/components/MainMenu/helperComponents/Content/Content.d.ts +0 -6
  8. package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +11 -35
  9. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.d.ts +0 -9
  10. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -23
  11. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +10 -38
  12. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -7
  13. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
  14. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +0 -2
  15. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
  16. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +4 -6
  17. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.d.ts +0 -1
  18. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -9
  19. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +12 -17
  20. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -8
  21. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +18 -24
  22. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +0 -17
  23. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
  24. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
  25. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
  26. package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
  27. package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
  28. package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.js +33 -15
  29. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.d.ts +1 -4
  30. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.js +2 -4
  31. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.d.ts +19 -0
  32. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.js +30 -0
  33. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.d.ts +1 -7
  34. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.js +2 -4
  35. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/index.d.ts +1 -2
  36. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/index.js +1 -2
  37. package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesDnd.d.ts +25 -0
  38. package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.js → useFavoritesDnd.js} +22 -21
  39. package/dist/cjs/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +0 -2
  40. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
  41. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
  42. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +5 -0
  43. package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +0 -3
  44. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
  45. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +6 -5
  46. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/styles.module.css +7 -0
  47. package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
  48. package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
  49. package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -30
  50. package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +21 -30
  51. package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/styles.module.css +1 -6
  52. package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -6
  53. package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +6 -4
  54. package/dist/cjs/components/MainMenu/hooks/useMenuItems.js +7 -12
  55. package/dist/cjs/components/MainMenu/types.d.ts +1 -31
  56. package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
  57. package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -21
  58. package/dist/cjs/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
  59. package/dist/cjs/components/MainMenu/utils/flatLinksGroups.js +0 -5
  60. package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
  61. package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
  62. package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +0 -2
  63. package/dist/cjs/components/UserMenu/UserMenu.d.ts +0 -13
  64. package/dist/cjs/components/UserMenu/types.d.ts +0 -7
  65. package/dist/cjs/style.css +13 -39
  66. package/dist/esm/components/HeaderButton/HeaderButton.d.ts +0 -1
  67. package/dist/esm/components/HeaderLayout/HeaderLayout.d.ts +0 -6
  68. package/dist/esm/components/Logo/Logo.d.ts +0 -7
  69. package/dist/esm/components/MainMenu/MainMenu.js +7 -10
  70. package/dist/esm/components/MainMenu/helperComponents/Content/Content.d.ts +0 -6
  71. package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +13 -37
  72. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.d.ts +0 -9
  73. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -23
  74. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +9 -37
  75. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -7
  76. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
  77. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +0 -2
  78. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
  79. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +3 -5
  80. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.d.ts +0 -1
  81. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -9
  82. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +13 -18
  83. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -8
  84. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +19 -25
  85. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +0 -17
  86. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
  87. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
  88. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
  89. package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
  90. package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
  91. package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.js +35 -17
  92. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.d.ts +1 -4
  93. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.js +1 -3
  94. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.d.ts +19 -0
  95. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.js +24 -0
  96. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.d.ts +1 -7
  97. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.js +1 -3
  98. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/index.d.ts +1 -2
  99. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/index.js +1 -2
  100. package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesDnd.d.ts +25 -0
  101. package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.js → useFavoritesDnd.js} +22 -21
  102. package/dist/esm/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +0 -2
  103. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
  104. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
  105. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +5 -0
  106. package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +0 -3
  107. package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
  108. package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +6 -5
  109. package/dist/esm/components/MainMenu/helperComponents/MenuMobile/styles.module.css +7 -0
  110. package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
  111. package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
  112. package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -30
  113. package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +20 -30
  114. package/dist/esm/components/MainMenu/helperComponents/ServiceCard/styles.module.css +1 -6
  115. package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -6
  116. package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +8 -6
  117. package/dist/esm/components/MainMenu/hooks/useMenuItems.js +8 -13
  118. package/dist/esm/components/MainMenu/types.d.ts +1 -31
  119. package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
  120. package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -20
  121. package/dist/esm/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
  122. package/dist/esm/components/MainMenu/utils/flatLinksGroups.js +0 -4
  123. package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
  124. package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
  125. package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +0 -2
  126. package/dist/esm/components/UserMenu/UserMenu.d.ts +0 -13
  127. package/dist/esm/components/UserMenu/types.d.ts +0 -7
  128. package/dist/esm/style.css +13 -39
  129. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  130. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  131. package/package.json +28 -28
  132. package/src/components/HeaderButton/HeaderButton.tsx +0 -1
  133. package/src/components/HeaderLayout/HeaderLayout.tsx +0 -6
  134. package/src/components/Logo/Logo.tsx +0 -7
  135. package/src/components/MainMenu/MainMenu.tsx +6 -11
  136. package/src/components/MainMenu/helperComponents/Content/Content.tsx +59 -104
  137. package/src/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.tsx +0 -9
  138. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.tsx +47 -106
  139. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.tsx +30 -20
  140. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.tsx +0 -2
  141. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +6 -11
  142. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.tsx +0 -1
  143. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.tsx +87 -72
  144. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.tsx +48 -65
  145. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +0 -27
  146. package/src/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.ts +2 -4
  147. package/src/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.tsx +7 -8
  148. package/src/components/MainMenu/helperComponents/Content/styles.module.scss +0 -19
  149. package/src/components/MainMenu/helperComponents/Favorites/Favorites.tsx +82 -43
  150. package/src/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.tsx +1 -6
  151. package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.tsx +78 -0
  152. package/src/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.tsx +1 -8
  153. package/src/components/MainMenu/helperComponents/Favorites/components/index.ts +1 -2
  154. package/src/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.tsx → useFavoritesDnd.tsx} +30 -32
  155. package/src/components/MainMenu/helperComponents/MenuBottom/MenuBottom.tsx +0 -2
  156. package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +11 -17
  157. package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +6 -0
  158. package/src/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.tsx +0 -3
  159. package/src/components/MainMenu/helperComponents/MenuMobile/MenuMobile.tsx +10 -7
  160. package/src/components/MainMenu/helperComponents/MenuMobile/styles.module.scss +7 -0
  161. package/src/components/MainMenu/helperComponents/MountAnimation/MountAnimation.tsx +1 -5
  162. package/src/components/MainMenu/helperComponents/ServiceCard/ServiceCard.tsx +41 -92
  163. package/src/components/MainMenu/helperComponents/ServiceCard/styles.module.scss +1 -7
  164. package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +12 -9
  165. package/src/components/MainMenu/hooks/useMenuItems.tsx +10 -34
  166. package/src/components/MainMenu/types.ts +1 -31
  167. package/src/components/MainMenu/utils/filterLinksGroupsFuzzy.ts +8 -29
  168. package/src/components/MainMenu/utils/flatLinksGroups.ts +0 -5
  169. package/src/components/MainMenu/utils/resolveInnerLinksByIds.ts +6 -3
  170. package/src/components/PathBreadcrumbs/PathBreadcrumbs.tsx +0 -2
  171. package/src/components/UserMenu/UserMenu.tsx +0 -13
  172. package/src/components/UserMenu/types.ts +0 -7
  173. package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
  174. package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.js +0 -17
  175. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
  176. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -39
  177. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.d.ts +0 -35
  178. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.js +0 -27
  179. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesList.d.ts +0 -21
  180. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesList.js +0 -31
  181. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.d.ts +0 -28
  182. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.js +0 -20
  183. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.d.ts +0 -24
  184. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.js +0 -36
  185. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/RecentList.d.ts +0 -24
  186. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/RecentList.js +0 -30
  187. package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.d.ts +0 -16
  188. package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.js +0 -28
  189. package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesReorder.d.ts +0 -30
  190. package/dist/cjs/utils/noop.d.ts +0 -1
  191. package/dist/cjs/utils/noop.js +0 -5
  192. package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
  193. package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.js +0 -13
  194. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
  195. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -35
  196. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.d.ts +0 -35
  197. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.js +0 -24
  198. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesList.d.ts +0 -21
  199. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesList.js +0 -25
  200. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.d.ts +0 -28
  201. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.js +0 -17
  202. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.d.ts +0 -24
  203. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.js +0 -30
  204. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/RecentList.d.ts +0 -24
  205. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/RecentList.js +0 -24
  206. package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.d.ts +0 -16
  207. package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.js +0 -25
  208. package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesReorder.d.ts +0 -30
  209. package/dist/esm/utils/noop.d.ts +0 -1
  210. package/dist/esm/utils/noop.js +0 -1
  211. package/src/components/MainMenu/helperComponents/Content/cardsContext.ts +0 -36
  212. package/src/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.ts +0 -46
  213. package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.tsx +0 -71
  214. package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesList.tsx +0 -59
  215. package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.tsx +0 -60
  216. package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.tsx +0 -75
  217. package/src/components/MainMenu/helperComponents/Favorites/components/RecentList.tsx +0 -62
  218. package/src/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.ts +0 -32
  219. package/src/utils/noop.ts +0 -1
@@ -1,34 +1,28 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useDndContext, useDndMonitor, useDroppable } from '@dnd-kit/core';
2
+ import { useDndMonitor, useDroppable } from '@dnd-kit/core';
3
3
  import { useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useMainMenuDndOverlay } from '../../../hooks/useMainMenuDnd.js';
5
5
  import { FAVORITES_DROP_ID, getServiceFavoriteDragId, isServiceFavoriteDragId, isServiceSourceDragId, parseServiceDragId, } from '../../../utils/index.js';
6
6
  import { ServiceCard } from '../../ServiceCard/index.js';
7
+ import { FAVORITES_SEGMENT } from '../constants.js';
7
8
  import { useFavoritesInsertIndicator } from './useFavoritesInsertIndicator.js';
8
9
  /**
9
- * Оркестрирует drag&drop сегмента «Избранное»: приём карточек сервисов из общей сетки
10
+ * Оркестрирует drag&drop избранного: приём карточек сервисов из общей сетки
10
11
  * (droppable), реордер внутри списка (insert-индикатор) и drag-превью.
11
12
  *
12
- * Монтируется только вместе с {@link FavoritesReorderList}, то есть пока активен сегмент
13
- * «Избранное» — переключение на этот сегмент при старте drag из каталога обеспечивает
14
- * {@link useFavoritesAutoSwitch}, смонтированный отдельно и постоянно. Из-за этого хук может
15
- * подключиться уже посреди drag (сегмент только что переключился) — начальное состояние в
16
- * этом случае читается из текущего активного drag через `useDndContext`, а не только из
17
- * будущих событий монитора.
18
- *
19
- * Требует `<DndContext>`-предка (см. `MainMenuDndContext`) — доступно только на desktop-раскладке,
20
- * на mobile избранное рендерится без drag&drop.
13
+ * Требует `<DndContext>`-предка (см. `MainMenuDndContext`) — доступно только
14
+ * на desktop-раскладке, на mobile избранное рендерится без drag&drop.
21
15
  */
22
- export function useFavoritesReorder({ favoriteIds, favoriteItems }) {
16
+ export function useFavoritesDnd({ favorite, favoriteItems, segment, setSegment }) {
23
17
  const { setGroupDragOverlay } = useMainMenuDndOverlay();
24
- const { active: activeOnMount } = useDndContext();
25
- const [activeFavoriteId, setActiveFavoriteId] = useState(() => activeOnMount && isServiceFavoriteDragId(activeOnMount.id) ? parseServiceDragId(activeOnMount.id) : null);
26
- const [isFavoriteReorderDrag, setIsFavoriteReorderDrag] = useState(() => Boolean(activeOnMount && isServiceFavoriteDragId(activeOnMount.id)));
27
- const [isDraggingToFavorites, setDraggingToFavorites] = useState(() => Boolean(activeOnMount && isServiceSourceDragId(activeOnMount.id)));
18
+ const [activeFavoriteId, setActiveFavoriteId] = useState(null);
19
+ const [isFavoriteReorderDrag, setIsFavoriteReorderDrag] = useState(false);
20
+ const [isDraggingToFavorites, setDraggingToFavorites] = useState(false);
28
21
  const listEndRef = useRef(null);
29
22
  const shouldScrollToEndRef = useRef(false);
30
- const favoriteSortableIds = useMemo(() => favoriteIds.map(getServiceFavoriteDragId), [favoriteIds]);
31
- const insertIndex = useFavoritesInsertIndicator(favoriteIds);
23
+ const isFavoritesSegment = segment === FAVORITES_SEGMENT.Favorites;
24
+ const favoriteSortableIds = useMemo(() => favorite.value.map(getServiceFavoriteDragId), [favorite.value]);
25
+ const insertIndex = useFavoritesInsertIndicator(favorite.value);
32
26
  const isInsertingToEnd = favoriteItems.length > 0 && insertIndex === favoriteItems.length;
33
27
  const isInsertingNew = isDraggingToFavorites && !favoriteItems.length;
34
28
  const insertIndexRef = useRef(insertIndex);
@@ -37,11 +31,18 @@ export function useFavoritesReorder({ favoriteIds, favoriteItems }) {
37
31
  const { setNodeRef, isOver } = useDroppable({
38
32
  id: FAVORITES_DROP_ID,
39
33
  // Only needed for an empty list; with cards, card droppables own the hit-testing.
40
- disabled: isFavoriteReorderDrag || favoriteItems.length > 0,
34
+ disabled: !isFavoritesSegment || isFavoriteReorderDrag || favoriteItems.length > 0,
41
35
  });
42
36
  useDndMonitor({
43
37
  onDragStart({ active }) {
38
+ // Форсим сегмент только для карточки из каталога: избранное уже показывается на
39
+ // сегменте Favorites, и его же карточки только там и рендерятся — при реордере внутри
40
+ // списка `setSegment` вызывался бы с тем же значением. `useValueControl` не сравнивает
41
+ // значение с текущим и всё равно зовёт `onSegmentChange` — лишний колбэк на каждый drag.
44
42
  if (isServiceSourceDragId(active.id)) {
43
+ if (segment !== FAVORITES_SEGMENT.Favorites) {
44
+ setSegment(FAVORITES_SEGMENT.Favorites);
45
+ }
45
46
  setDraggingToFavorites(true);
46
47
  }
47
48
  if (isServiceFavoriteDragId(active.id)) {
@@ -50,7 +51,7 @@ export function useFavoritesReorder({ favoriteIds, favoriteItems }) {
50
51
  }
51
52
  },
52
53
  onDragEnd() {
53
- shouldScrollToEndRef.current = isDraggingToFavorites && insertIndexRef.current === favoriteIds.length;
54
+ shouldScrollToEndRef.current = isDraggingToFavorites && insertIndexRef.current === favorite.value.length;
54
55
  setActiveFavoriteId(null);
55
56
  setIsFavoriteReorderDrag(false);
56
57
  setDraggingToFavorites(false);
@@ -79,7 +80,7 @@ export function useFavoritesReorder({ favoriteIds, favoriteItems }) {
79
80
  listEndRef.current?.scrollIntoView({ block: 'nearest' });
80
81
  });
81
82
  return () => cancelAnimationFrame(frameId);
82
- }, [favoriteIds]);
83
+ }, [favorite.value]);
83
84
  const showDropOver = ((isOver || isDraggingToFavorites) && !isFavoriteReorderDrag) || undefined;
84
85
  const showInsertNew = (isInsertingNew && isOver) || undefined;
85
86
  return {
@@ -1,9 +1,7 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { MainMenuSettingsItem } from '../../types.js';
3
3
  type MenuBottomProps = {
4
- /** Пункты настроек, отображаемые в нижней части меню. */
5
4
  settingItems?: MainMenuSettingsItem[];
6
- /** Слот под пунктами настроек. */
7
5
  leftBottom: ReactNode;
8
6
  };
9
7
  export declare function MenuBottom({ settingItems, leftBottom }: MenuBottomProps): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import { MainMenuProps } from '../../types.js';
2
- export declare function MenuDesktop({ open, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function MenuDesktop({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
@@ -2,11 +2,11 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import { Divider } from '@cloud-ru/ds-divider';
3
3
  import { DrawerCustom } from '@cloud-ru/ds-drawer';
4
4
  import { Scroll } from '@cloud-ru/ds-scroll';
5
+ import { useValueControl } from '@cloud-ru/ds-utils';
5
6
  import { useCallback, useEffect, useMemo } from 'react';
6
7
  import { TEST_IDS } from '../../../../constants.js';
7
8
  import { MainMenuDndContext, useMainMenuDnd } from '../../hooks/useMainMenuDnd.js';
8
9
  import { useMenuItems } from '../../hooks/useMenuItems.js';
9
- import { buildServicesById } from '../../utils/index.js';
10
10
  import { Content } from '../Content/index.js';
11
11
  import { Favorites } from '../Favorites/index.js';
12
12
  import { MenuBottom } from '../MenuBottom/index.js';
@@ -15,7 +15,8 @@ import { MountAnimation } from '../MountAnimation/index.js';
15
15
  import { Search } from '../Search/index.js';
16
16
  import { MENU_WIDTH_MAX, MENU_WIDTH_MIN } from './constants.js';
17
17
  import styles from './styles.module.css';
18
- export function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = MENU_WIDTH_MAX, onWidthChangeEnd, draggerTooltip, loading, }) {
18
+ export function MenuDesktop({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = MENU_WIDTH_MAX, onWidthChangeEnd, draggerTooltip, loading, }) {
19
+ const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
19
20
  const { scrollRef, searchRef, resultItems } = useMenuItems({
20
21
  segments,
21
22
  search,
@@ -38,19 +39,18 @@ export function MenuDesktop({ open = false, setOpen, settingItems, platformGroup
38
39
  // сегменты используются, `loading` держит панель смонтированной на время ответа бэка — иначе
39
40
  // `Content` не успевает показать свой skeleton (он монтируется только когда данные уже пришли),
40
41
  // и между "ничего" и карточками на кадр проскакивает пустое состояние «нет данных».
41
- const isNeedRightBlock = useMemo(() => segments !== undefined && (loading || segments.some(segment => segment.items.length > 0)), [segments, loading]);
42
+ const isNeedRightBlock = segments !== undefined && (loading || segments.some(segment => segment.items.length > 0));
42
43
  const hasBottomItems = Boolean(settingItems?.length) || Boolean(leftBottom);
43
44
  const allServiceGroups = useMemo(() => segments?.flatMap(segment => segment.items) ?? [], [segments]);
44
- const servicesById = useMemo(() => buildServicesById(allServiceGroups), [allServiceGroups]);
45
45
  const mainMenuDnd = useMainMenuDnd({
46
46
  favorite,
47
- servicesById,
47
+ groups: allServiceGroups,
48
48
  showDescription: preferences?.showDescription.value ?? false,
49
49
  });
50
50
  const handleCloseDrawer = useCallback(() => {
51
- setOpen?.(false);
51
+ setOpen(false);
52
52
  }, [setOpen]);
53
- const menu = (_jsxs("div", { className: styles.menu, children: [_jsxs("div", { className: styles.menuHeader, children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles.menuHeaderBrand }), isNeedRightBlock && search && (_jsxs(_Fragment, { children: [_jsx(Divider, { orientation: 'vertical' }), _jsx(Search, { ...search, ref: searchRef })] }))] }), _jsx(Divider, {}), _jsxs("div", { className: styles.menuBody, children: [_jsxs(MountAnimation, { className: styles.left, "data-test-id": TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && _jsx("div", { className: styles.leftTop, children: leftTop }), isNeedRightBlock && favorite && _jsx(Favorites, { favorite: favorite, servicesById: servicesById }), hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }), isNeedRightBlock && (_jsxs(_Fragment, { children: [_jsx(MountAnimation, { type: 'fade-in', children: _jsx(Divider, { orientation: 'vertical' }) }), _jsx("div", { className: styles.right, "data-test-id": TEST_IDS.mainMenu.right, children: _jsx(Scroll, { paddingAbsolute: true, className: styles.scroll, ref: scrollRef, barHideStrategy: 'never', overflow: { x: 'hidden' }, children: _jsx(Content, { className: styles.rightContent, searchValue: search?.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, preferences: preferences, loading: loading }) }) })] }))] })] }));
53
+ const menu = (_jsxs("div", { className: styles.menu, children: [_jsxs("div", { className: styles.menuHeader, children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles.menuHeaderBrand }), isNeedRightBlock && search && (_jsxs(_Fragment, { children: [_jsx(Divider, { orientation: 'vertical' }), _jsx(Search, { ...search, ref: searchRef })] }))] }), _jsx(Divider, {}), _jsxs("div", { className: styles.menuBody, children: [_jsxs(MountAnimation, { className: styles.left, "data-test-id": TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && _jsx("div", { className: styles.leftTop, children: leftTop }), isNeedRightBlock && favorite && _jsx(Favorites, { favorite: favorite, allServiceGroups: allServiceGroups }), hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }), isNeedRightBlock && (_jsxs(_Fragment, { children: [_jsx(MountAnimation, { type: 'fade-in', children: _jsx(Divider, { orientation: 'vertical' }) }), _jsx(MountAnimation, { type: 'fade-slide-up-right', className: styles.right, "data-test-id": TEST_IDS.mainMenu.right, children: _jsx(Scroll, { paddingAbsolute: true, className: styles.scroll, ref: scrollRef, barHideStrategy: 'never', overflow: { x: 'hidden' }, children: _jsx(Content, { className: styles.rightContent, searchValue: search?.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, preferences: preferences, loading: loading }) }) })] }))] })] }));
54
54
  return (_jsx(DrawerCustom, { open: open, onClose: handleCloseDrawer, width: isNeedRightBlock ? 'm' : 's', position: 'left', className: styles.drawer, rootClassName: styles.drawerRoot, "data-test-id": TEST_IDS.mainMenu.drawer, "data-small": !isNeedRightBlock || undefined, disableMotions: true, showButtonClosed: false, resizable: isNeedRightBlock
55
55
  ? {
56
56
  min: MENU_WIDTH_MIN,
@@ -53,6 +53,11 @@
53
53
  .rightContent{
54
54
  container-type:inline-size;
55
55
  overflow-x:clip;
56
+ display:flex;
57
+ flex-direction:column;
58
+ gap:var(--sn-primitive-dimension-4, 4px);
59
+ width:100%;
60
+ min-width:0;
56
61
  padding:var(--sn-primitive-dimension-16, 16px);
57
62
  }
58
63
 
@@ -1,10 +1,7 @@
1
1
  import { ReactNode } from 'react';
2
2
  export type MenuHeaderBrandProps = {
3
- /** Логотип в шапке меню. */
4
3
  logo?: ReactNode;
5
- /** Колбэк клика по кнопке закрытия меню. */
6
4
  onClose(): void;
7
- /** CSS-класс корневого элемента. */
8
5
  className?: string;
9
6
  };
10
7
  export declare function MenuHeaderBrand({ logo, onClose, className }: MenuHeaderBrandProps): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import { MainMenuProps } from '../../types.js';
2
- export declare function MenuMobile({ open, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Divider } from '@cloud-ru/ds-divider';
3
3
  import { ChildThemeProvider, DENSITY } from '@cloud-ru/ds-theme';
4
+ import { useValueControl } from '@cloud-ru/ds-utils';
4
5
  import { useCallback, useMemo } from 'react';
5
6
  import { BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, TEST_IDS } from '../../../../constants.js';
6
7
  import { MobileDrawerCustom } from '../../../../mobileOverlays.js';
7
8
  import { MainMenuDndContext } from '../../hooks/useMainMenuDnd.js';
8
9
  import { useMenuItems } from '../../hooks/useMenuItems.js';
9
- import { buildServicesById } from '../../utils/index.js';
10
10
  import { Content } from '../Content/index.js';
11
11
  import { Favorites } from '../Favorites/index.js';
12
12
  import { MenuBottom } from '../MenuBottom/index.js';
@@ -15,7 +15,8 @@ import { MountAnimation } from '../MountAnimation/index.js';
15
15
  import { ScrollWithAnimatedStickyPanel } from '../ScrollWithAnimatedStickyPanel/index.js';
16
16
  import { Search } from '../Search/index.js';
17
17
  import styles from './styles.module.css';
18
- export function MenuMobile({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }) {
18
+ export function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }) {
19
+ const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
19
20
  // `segments !== undefined` — сигнал «каталог вообще используется» (консьюмер без сегментов
20
21
  // никогда не передаёт проп, и `loading` в этом случае к правой панели не относится). Пока
21
22
  // сегменты используются, `loading` держит панель смонтированной на время ответа бэка — иначе
@@ -29,13 +30,13 @@ export function MenuMobile({ open = false, setOpen, settingItems, platformGroups
29
30
  search,
30
31
  platformGroups,
31
32
  });
32
- const servicesById = useMemo(() => buildServicesById(segments?.flatMap(segment => segment.items)), [segments]);
33
+ const allServiceGroups = useMemo(() => segments?.flatMap(segment => segment.items) ?? [], [segments]);
33
34
  const handleClose = useCallback(() => {
34
- setOpen?.(false);
35
+ setOpen(false);
35
36
  }, [setOpen]);
36
37
  return (
37
38
  // Временная фиксация comfort (см. `HeaderLayout`): `MainMenu` используется и отдельно от
38
39
  // `HeaderLayout`, поэтому объявляем плотность здесь же. Обёртка провайдера layout-прозрачная
39
40
  // (`display: contents`) — меню рендерится порталом, лишний бокс в строке шапки не нужен.
40
- _jsx(ChildThemeProvider, { value: { density: DENSITY.Comfort }, className: styles.densityScope, children: _jsx(MobileDrawerCustom, { open: open, onClose: handleClose, position: 'bottom', className: styles.drawerMobile, swipeEnabled: false, "data-test-id": TEST_IDS.mainMenu.drawerMobile, closeOnPopstate: true, snapPoints: BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, disableMotions: true, children: _jsx(ScrollWithAnimatedStickyPanel, { panel: _jsxs(_Fragment, { children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleClose, className: styles.menuHeader }), _jsx(Divider, { orientation: 'horizontal' })] }), children: _jsxs(MountAnimation, { className: styles.scrollMobile, type: 'fade-slide-up', children: [leftTop, search && _jsx(Search, { ...search, ref: searchRef, isMobile: true }), !isSearching && favorite && _jsx(Favorites, { favorite: favorite, servicesById: servicesById, isMobile: true }), hasSegments && (_jsx(MainMenuDndContext, { children: _jsx(Content, { isMobile: true, searchValue: search && search.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, loading: loading }) })), !isSearching && hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }) }) }) }));
41
+ _jsx(ChildThemeProvider, { value: { density: DENSITY.Comfort }, className: styles.densityScope, children: _jsx(MobileDrawerCustom, { open: open, onClose: handleClose, position: 'bottom', className: styles.drawerMobile, swipeEnabled: false, "data-test-id": TEST_IDS.mainMenu.drawerMobile, closeOnPopstate: true, snapPoints: BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, disableMotions: true, children: _jsx(ScrollWithAnimatedStickyPanel, { panel: _jsxs(_Fragment, { children: [_jsx(MenuHeaderBrand, { logo: logo, onClose: handleClose, className: styles.menuHeader }), _jsx(Divider, { orientation: 'horizontal' })] }), children: _jsxs(MountAnimation, { className: styles.scrollMobile, type: 'fade-slide-up', children: [leftTop && _jsx("div", { className: styles.rightContent, children: leftTop }), search && _jsx(Search, { ...search, ref: searchRef, isMobile: true }), !isSearching && favorite && _jsx(Favorites, { favorite: favorite, allServiceGroups: allServiceGroups, isMobile: true }), hasSegments && (_jsx(MainMenuDndContext, { children: _jsx(Content, { isMobile: true, className: styles.rightContent, searchValue: search && search.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, loading: loading }) })), !isSearching && hasBottomItems && _jsx(MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }) }) }) }));
41
42
  }
@@ -7,6 +7,13 @@
7
7
  padding:0 var(--sn-primitive-dimension-4, 4px);
8
8
  }
9
9
 
10
+ .rightContent{
11
+ display:flex;
12
+ flex-direction:column;
13
+ gap:var(--sn-primitive-dimension-8, 8px);
14
+ min-width:0;
15
+ }
16
+
10
17
  .drawerMobile{
11
18
  background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3))) !important;
12
19
  }
@@ -4,4 +4,4 @@ export type MountAnimationProps = PropsWithChildren<WithSupportProps<{
4
4
  type?: 'fade-slide-up' | 'fade-slide-up-right' | 'slide-right' | 'fade-in';
5
5
  className?: string;
6
6
  }>>;
7
- export declare function MountAnimation({ children, type, className, ...props }: MountAnimationProps): string | number | boolean | Iterable<import("react").ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
7
+ export declare function MountAnimation({ children, type, className, ...props }: MountAnimationProps): import("react/jsx-runtime").JSX.Element;
@@ -2,9 +2,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { extractSupportProps } from '@cloud-ru/ds-utils';
3
3
  import cn from 'classnames';
4
4
  import styles from './styles.module.css';
5
- export function MountAnimation({ children, type, className, ...props }) {
6
- if (type === undefined) {
7
- return children;
8
- }
5
+ export function MountAnimation({ children, type = 'slide-right', className, ...props }) {
9
6
  return (_jsx("div", { className: cn(styles.wrapper, className), ...extractSupportProps(props), "data-animation-type": type, children: children }));
10
7
  }
@@ -1,43 +1,19 @@
1
- import { CardNavigationProps } from '@cloud-ru/ds-uikit-product-card-predefined';
1
+ import { CardServiceLightProps } from '@cloud-ru/ds-uikit-product-card-predefined';
2
2
  import { MouseEvent } from 'react';
3
3
  import { FavoriteProps, InnerLink } from '../../types.js';
4
4
  export type ServiceCardProps = {
5
- /** Карточка сервиса. */
6
5
  service: InnerLink;
7
- /** В избранном ли сервис. Учитывается только вместе с `onFavoriteChange`. */
8
- isFavorite?: boolean;
9
- /**
10
- * Переключение избранного (стабильная по ссылке функция). Не передано — кнопка избранного
11
- * не показывается.
12
- */
13
- onFavoriteChange?: FavoriteProps['onChange'];
14
- /** Мобильная раскладка. */
6
+ favorite?: FavoriteProps;
15
7
  isMobile?: boolean;
16
- /** Колбэк клика по карточке. */
17
8
  onServiceClick?(service: InnerLink, event: MouseEvent<HTMLElement>): void;
18
- /** Показывать описание сервиса вместо тултипа. */
19
9
  showDescription: boolean;
20
- /** CSS-класс корневого элемента. */
21
10
  className?: string;
22
- /** `tabIndex` корневого элемента. */
23
11
  tabIndex?: number;
24
- /** Карточка рендерится как превью в `DragOverlay` (без тултипа и описания). */
25
12
  dragPreview?: boolean;
26
- } & Pick<CardNavigationProps, 'expandable'>;
27
- declare function ServiceCardBase({ service, isFavorite, onFavoriteChange, isMobile, onServiceClick, showDescription, className, tabIndex, dragPreview, expandable, }: ServiceCardProps): import("react/jsx-runtime").JSX.Element;
28
- export declare const ServiceCard: import("react").MemoExoticComponent<typeof ServiceCardBase>;
13
+ } & Pick<CardServiceLightProps, 'expandable'>;
14
+ export declare function ServiceCard({ service, favorite, isMobile, onServiceClick, showDescription, className, tabIndex, dragPreview, expandable, }: ServiceCardProps): import("react/jsx-runtime").JSX.Element;
29
15
  export type DraggableServiceCardProps = ServiceCardProps & {
30
16
  groupId: string;
17
+ dragDisabled?: boolean;
31
18
  };
32
- declare function DraggableServiceCardBase({ groupId, service, isFavorite, ...props }: DraggableServiceCardProps): import("react/jsx-runtime").JSX.Element;
33
- export declare const DraggableServiceCard: import("react").MemoExoticComponent<typeof DraggableServiceCardBase>;
34
- export type GridServiceCardProps = DraggableServiceCardProps & {
35
- /**
36
- * Карточку можно перетаскивать. Иначе рендерится без `useDraggable`: на mobile, при поиске и
37
- * без избранного сотни карточек не регистрируются в `DndContext` впустую.
38
- */
39
- dragEnabled?: boolean;
40
- };
41
- declare function GridServiceCardBase({ dragEnabled, groupId, ...props }: GridServiceCardProps): import("react/jsx-runtime").JSX.Element;
42
- export declare const GridServiceCard: import("react").MemoExoticComponent<typeof GridServiceCardBase>;
43
- export {};
19
+ export declare function DraggableServiceCard({ groupId, service, favorite, dragDisabled, ...props }: DraggableServiceCardProps): import("react/jsx-runtime").JSX.Element;
@@ -1,31 +1,27 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useDraggable } from '@dnd-kit/core';
3
3
  import { DRAG_MODE, DragGhost, DragPreview } from '@cloud-ru/ds-drag-and-drop';
4
- import { CardNavigation } from '@cloud-ru/ds-uikit-product-card-predefined';
4
+ import { CardServiceInfo, CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
5
5
  import cn from 'classnames';
6
- import { memo, useCallback, useMemo } from 'react';
7
6
  import { getLinkEmblem, getServiceSourceDragId } from '../../utils/index.js';
8
7
  import styles from './styles.module.css';
9
- function ServiceCardBase({ service, isFavorite = false, onFavoriteChange, isMobile, onServiceClick, showDescription, className, tabIndex, dragPreview, expandable, }) {
10
- const { id, disabled, favoritesEnabled = true, description, icon } = service;
11
- const handleFavoriteChange = useCallback((checked) => onFavoriteChange?.(id)(checked), [id, onFavoriteChange]);
12
- const favoriteProps = useMemo(() => !dragPreview && onFavoriteChange
8
+ export function ServiceCard({ service, favorite, isMobile, onServiceClick, showDescription, className, tabIndex, dragPreview, expandable, }) {
9
+ const isInFavorites = favorite?.value.includes(service.id) ?? false;
10
+ const isFavoriteEnabled = service.favoritesEnabled ?? true;
11
+ const favoriteProps = !dragPreview && favorite
13
12
  ? {
14
- checked: isFavorite,
15
- onChange: handleFavoriteChange,
16
- enabled: !disabled && favoritesEnabled,
13
+ checked: isInFavorites,
14
+ onChange: favorite.onChange(service.id),
15
+ enabled: !service.disabled && isFavoriteEnabled,
17
16
  }
18
- : undefined, [dragPreview, onFavoriteChange, isFavorite, handleFavoriteChange, disabled, favoritesEnabled]);
19
- const handleClick = useCallback((event) => onServiceClick?.(service, event), [onServiceClick, service]);
20
- const emblem = useMemo(() => getLinkEmblem({ icon }), [icon]);
21
- const tooltip = useMemo(() => (!dragPreview && description ? { tip: description } : undefined), [dragPreview, description]);
17
+ : undefined;
22
18
  const commonProps = {
23
19
  as: 'a',
24
20
  title: service.label,
25
- icon: emblem,
26
- 'data-test-id': `header__drawer-menu__link-${id}`,
21
+ icon: getLinkEmblem(service),
22
+ 'data-test-id': `header__drawer-menu__link-${service.id}`,
27
23
  href: service.href,
28
- onClick: handleClick,
24
+ onClick: (event) => onServiceClick?.(service, event),
29
25
  favorite: favoriteProps,
30
26
  actionsVisibility: isMobile ? 'always' : 'hover',
31
27
  promoTag: service.badge,
@@ -33,26 +29,20 @@ function ServiceCardBase({ service, isFavorite = false, onFavoriteChange, isMobi
33
29
  tabIndex,
34
30
  expandable,
35
31
  };
36
- // Один компонент на оба вида: переключение описания обновляет проп, а не пересоздаёт карточку.
37
- const card = (_jsx(CardNavigation, { ...commonProps, description: showDescription ? (description ?? '') : undefined, actionsSize: isMobile ? 's' : 'm', tooltip: showDescription ? undefined : tooltip }));
32
+ const card = showDescription ? (_jsx(CardServiceInfo, { ...commonProps, description: service.description ?? '', actionsSize: isMobile ? 's' : 'm' })) : (_jsx(CardServiceLight, { ...commonProps, tooltip: !dragPreview && service.description
33
+ ? {
34
+ tip: service.description,
35
+ }
36
+ : undefined }));
38
37
  return dragPreview ? _jsx(DragPreview, { className: styles.dragCardPreview, children: card }) : card;
39
38
  }
40
- export const ServiceCard = memo(ServiceCardBase);
41
- function DraggableServiceCardBase({ groupId, service, isFavorite, ...props }) {
39
+ export function DraggableServiceCard({ groupId, service, favorite, dragDisabled, ...props }) {
42
40
  const isFavoriteEnabled = service.favoritesEnabled ?? true;
43
- const disabled = service.disabled || isFavorite || !isFavoriteEnabled;
41
+ const disabled = dragDisabled || service.disabled || favorite?.value.includes(service.id) || !isFavoriteEnabled;
44
42
  const { attributes, listeners, setNodeRef, isDragging } = useDraggable({
45
43
  id: getServiceSourceDragId(groupId, service.id),
46
44
  disabled,
47
45
  });
48
46
  const { tabIndex, ...restAttributes } = attributes ?? {};
49
- return (_jsx(DragGhost, { innerRef: setNodeRef, className: styles.draggableCard, dragging: isDragging, mode: DRAG_MODE.Static, ...listeners, ...restAttributes, children: _jsx(ServiceCard, { service: service, isFavorite: isFavorite, ...props, tabIndex: tabIndex }) }));
50
- }
51
- export const DraggableServiceCard = memo(DraggableServiceCardBase);
52
- function GridServiceCardBase({ dragEnabled, groupId, ...props }) {
53
- if (dragEnabled) {
54
- return _jsx(DraggableServiceCard, { groupId: groupId, ...props });
55
- }
56
- return (_jsx("div", { className: styles.staticCard, children: _jsx(ServiceCard, { ...props }) }));
47
+ return (_jsx(DragGhost, { innerRef: setNodeRef, className: styles.draggableCard, dragging: isDragging, mode: DRAG_MODE.Static, ...listeners, ...restAttributes, children: _jsx(ServiceCard, { service: service, favorite: favorite, ...props, tabIndex: tabIndex }) }));
57
48
  }
58
- export const GridServiceCard = memo(GridServiceCardBase);
@@ -7,12 +7,7 @@
7
7
  border-radius:var(--sn-density-radius-3xs, var(--sn-platform-comfort-radius-3xs, var(--sn-primitive-dimension-2, 2px)));
8
8
  }
9
9
 
10
- .draggableCard,
11
- .staticCard{
10
+ .draggableCard{
12
11
  display:flex;
13
12
  min-width:0;
14
- }
15
-
16
- .staticCard{
17
- position:relative;
18
13
  }
@@ -1,19 +1,17 @@
1
1
  import { DragCancelEvent, DragEndEvent, DragStartEvent, Modifier } from '@dnd-kit/core';
2
2
  import { ReactNode } from 'react';
3
- import { FavoriteProps, InnerLink } from '../types.js';
3
+ import { FavoriteProps, LinksGroup } from '../types.js';
4
4
  type MainMenuDndOverlayContextValue = {
5
5
  setGroupDragOverlay(overlay: ReactNode): void;
6
6
  };
7
7
  export declare function useMainMenuDndOverlay(): MainMenuDndOverlayContextValue;
8
8
  type UseMainMenuDndProps = {
9
- /** Избранное. Без пропа DnD карточек в избранное отключён. */
10
9
  favorite?: FavoriteProps;
11
- /** Все сервисы каталога по id (для резолва при DnD в избранное). */
12
- servicesById: ReadonlyMap<string, InnerLink>;
13
- /** Показывать описания сервисов в превью карточки при перетаскивании. */
10
+ /** Все группы карточек из сегментов (для резолва сервисов при DnD в избранное). */
11
+ groups: LinksGroup[];
14
12
  showDescription: boolean;
15
13
  };
16
- export declare function useMainMenuDnd({ favorite, servicesById, showDescription }: UseMainMenuDndProps): {
14
+ export declare function useMainMenuDnd({ favorite, groups, showDescription }: UseMainMenuDndProps): {
17
15
  sensors: import("@dnd-kit/core").SensorDescriptor<import("@dnd-kit/core").SensorOptions>[];
18
16
  modifiers: Modifier[];
19
17
  collisionDetection: import("@dnd-kit/core").CollisionDetection;
@@ -1,19 +1,18 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
2
+ import { DndContext, DragOverlay, KeyboardSensor, MeasuringStrategy, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
3
3
  import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
4
4
  import { sortableKeyboardCoordinates } from '@dnd-kit/sortable';
5
5
  import { usePortalContext } from '@cloud-ru/ds-portal-context';
6
6
  import { createContext, useCallback, useContext, useMemo, useState } from 'react';
7
7
  import { createPortal } from 'react-dom';
8
8
  import { ServiceCard } from '../helperComponents/ServiceCard/index.js';
9
- import { favoriteListCollisionDetection, getDragReferenceY, isServiceDragId, isServiceSourceDragId, parseServiceDragId, resolveFavoriteOrderOnDragEnd, } from '../utils/index.js';
9
+ import { favoriteListCollisionDetection, flatLinksGroups, getDragReferenceY, isServiceDragId, isServiceSourceDragId, parseServiceDragId, resolveFavoriteOrderOnDragEnd, } from '../utils/index.js';
10
10
  const restrictGroupDragToVerticalAxis = args => {
11
11
  if (args.active?.id != null && isServiceSourceDragId(args.active.id)) {
12
12
  return args.transform;
13
13
  }
14
14
  return restrictToVerticalAxis(args);
15
15
  };
16
- const MODIFIERS = [restrictGroupDragToVerticalAxis];
17
16
  const MainMenuDndOverlayContext = createContext(null);
18
17
  export function useMainMenuDndOverlay() {
19
18
  const context = useContext(MainMenuDndOverlayContext);
@@ -21,9 +20,10 @@ export function useMainMenuDndOverlay() {
21
20
  setGroupDragOverlay: () => { },
22
21
  });
23
22
  }
24
- export function useMainMenuDnd({ favorite, servicesById, showDescription }) {
23
+ export function useMainMenuDnd({ favorite, groups, showDescription }) {
25
24
  const [activeServiceId, setActiveServiceId] = useState(null);
26
25
  const [groupDragOverlay, setGroupDragOverlay] = useState(null);
26
+ const servicesById = useMemo(() => new Map(flatLinksGroups(groups).map(service => [service.id, service])), [groups]);
27
27
  const activeService = activeServiceId ? servicesById.get(activeServiceId) : undefined;
28
28
  const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }));
29
29
  const handleDragStart = useCallback(({ active }) => {
@@ -71,7 +71,7 @@ export function useMainMenuDnd({ favorite, servicesById, showDescription }) {
71
71
  }), []);
72
72
  return {
73
73
  sensors,
74
- modifiers: MODIFIERS,
74
+ modifiers: [restrictGroupDragToVerticalAxis],
75
75
  collisionDetection: favoriteListCollisionDetection,
76
76
  onDragStart: handleDragStart,
77
77
  onDragEnd: handleDragEnd,
@@ -89,5 +89,7 @@ export function MainMenuDndContext({ children, sensors, modifiers, collisionDete
89
89
  // (панель начинается не с 0), оверлей визуально уезжает ровно на эту величину. Портал
90
90
  // в тот же корень, что использует сам Drawer, выносит оверлей из-под этого предка.
91
91
  const dragOverlayNode = _jsx(DragOverlay, { dropAnimation: null, children: dragOverlay });
92
- return (_jsx(MainMenuDndOverlayContext.Provider, { value: overlayContextValue ?? null, children: _jsxs(DndContext, { sensors: sensors, collisionDetection: collisionDetection, onDragStart: onDragStart, onDragEnd: onDragEnd, onDragCancel: onDragCancel, modifiers: modifiers, children: [children, portalContextRef.current ? createPortal(dragOverlayNode, portalContextRef.current) : dragOverlayNode] }) }));
92
+ return (_jsx(MainMenuDndOverlayContext.Provider, { value: overlayContextValue ?? null, children: _jsxs(DndContext, { sensors: sensors, collisionDetection: collisionDetection, onDragStart: onDragStart, onDragEnd: onDragEnd, onDragCancel: onDragCancel, modifiers: modifiers, measuring: {
93
+ droppable: { strategy: MeasuringStrategy.Always },
94
+ }, children: [children, portalContextRef.current ? createPortal(dragOverlayNode, portalContextRef.current) : dragOverlayNode] }) }));
93
95
  }
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useMemo, useRef } from 'react';
2
- import { createLinksGroupsSearcher, dedupeSearchGroups, getLinksGroupVisibleItemsCount, pinGroupToBottom, } from '../utils/index.js';
2
+ import { dedupeSearchGroups, filterLinksGroupsFuzzy, getLinksGroupVisibleItemsCount, pinGroupToBottom } from '../utils/index.js';
3
3
  function getVisibleGroups(items) {
4
4
  return items.filter(group => getLinksGroupVisibleItemsCount(group) > 0);
5
5
  }
@@ -9,25 +9,20 @@ export function useMenuItems({ search, segments, platformGroups = [] }) {
9
9
  const scrollRef = useRef(null);
10
10
  const regularSegments = useMemo(() => segments?.filter(segment => !segment.pinBottomOnSearch) ?? [], [segments]);
11
11
  const pinnedSegments = useMemo(() => segments?.filter(segment => segment.pinBottomOnSearch) ?? [], [segments]);
12
- const isSearching = Boolean(searchValue);
13
- // Индексы строятся при первом вводе и живут, пока поиск активен и каталог не сменился: индексация
14
- // не зависит от строки поиска, поэтому пересоздавать `Fuse` на каждый символ не нужно. Пока поиска
15
- // нет, индексы не строятся — открытие меню их не оплачивает.
16
- const regularSearchers = useMemo(() => isSearching ? regularSegments.map(segment => createLinksGroupsSearcher(getVisibleGroups(segment.items))) : [], [isSearching, regularSegments]);
17
- const pinnedSearchers = useMemo(() => isSearching ? pinnedSegments.map(segment => createLinksGroupsSearcher(getVisibleGroups(segment.items))) : [], [isSearching, pinnedSegments]);
18
- const platformSearcher = useMemo(() => (isSearching && platformGroups.length > 0 ? createLinksGroupsSearcher(platformGroups) : undefined), [isSearching, platformGroups]);
19
12
  const regularGroups = useMemo(() => regularSegments.flatMap(segment => getVisibleGroups(segment.items)), [regularSegments]);
20
- const pinnedGroupIds = useMemo(() => pinnedSegments.flatMap(segment => getVisibleGroups(segment.items)).map(({ id }) => id), [pinnedSegments]);
13
+ const pinnedGroups = useMemo(() => pinnedSegments.flatMap(segment => getVisibleGroups(segment.items)), [pinnedSegments]);
21
14
  const resultItems = useMemo(() => {
22
15
  if (!searchValue) {
23
16
  return regularGroups;
24
17
  }
25
- const regularResults = regularSearchers.flatMap(search => search(searchValue));
26
- const platformResults = platformSearcher ? platformSearcher(searchValue) : [];
27
- const pinnedResults = pinnedSearchers.flatMap(search => search(searchValue));
18
+ const searchIn = (groups) => filterLinksGroupsFuzzy(searchValue, groups);
19
+ const regularResults = regularSegments.flatMap(segment => searchIn(getVisibleGroups(segment.items)));
20
+ const platformResults = platformGroups.length > 0 ? searchIn(platformGroups) : [];
21
+ const pinnedResults = pinnedSegments.flatMap(segment => searchIn(getVisibleGroups(segment.items)));
28
22
  const combined = dedupeSearchGroups([...regularResults, ...platformResults, ...pinnedResults]);
23
+ const pinnedGroupIds = pinnedGroups.map(({ id }) => id);
29
24
  return pinnedGroupIds.length > 0 ? pinGroupToBottom(combined, pinnedGroupIds) : combined;
30
- }, [searchValue, regularGroups, regularSearchers, platformSearcher, pinnedSearchers, pinnedGroupIds]);
25
+ }, [searchValue, regularSegments, regularGroups, platformGroups, pinnedSegments, pinnedGroups]);
31
26
  useEffect(() => {
32
27
  if (searchValue && !resultItems.length) {
33
28
  onSearchNoResult?.(searchValue);