@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,16 +1,16 @@
1
1
  import { DragEndEvent } from '@dnd-kit/core';
2
- import { LinksGroup } from '../../../types';
3
- import { CardsContextValue } from '../cardsContext';
2
+ import { FavoriteProps, LinksGroup } from '../../../types';
4
3
  type UseSegmentDndProps = {
5
4
  visibleGroups: LinksGroup[];
6
5
  expandedIds: string[];
7
6
  onSortableDragEnd(event: DragEndEvent): void;
8
7
  showDescription: boolean;
9
8
  showGroupsColors?: boolean;
10
- } & Pick<CardsContextValue, 'favoriteIds' | 'onFavoriteChange'>;
9
+ favorite?: FavoriteProps;
10
+ };
11
11
  /**
12
12
  * DnD групп внутри активного сегмента: drag overlay группы поверх `useContentSegmentsSortable`.
13
13
  * Сервис-драг (карточка → избранное) сюда не попадает — фильтруется через `isServiceDragId`.
14
14
  */
15
- export declare function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favoriteIds, onFavoriteChange, }: UseSegmentDndProps): void;
15
+ export declare function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favorite, }: UseSegmentDndProps): void;
16
16
  export {};
@@ -11,16 +11,16 @@ const SortableGroup_1 = require("../helperComponents/SortableGroup");
11
11
  * DnD групп внутри активного сегмента: drag overlay группы поверх `useContentSegmentsSortable`.
12
12
  * Сервис-драг (карточка → избранное) сюда не попадает — фильтруется через `isServiceDragId`.
13
13
  */
14
- function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favoriteIds, onFavoriteChange, }) {
14
+ function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favorite, }) {
15
15
  const { setGroupDragOverlay } = (0, useMainMenuDnd_1.useMainMenuDndOverlay)();
16
16
  const handleDragStart = (0, react_1.useCallback)(({ active }) => {
17
17
  if (!(0, utils_1.isServiceDragId)(active.id)) {
18
18
  const activeGroup = visibleGroups.find(({ id }) => id === String(active.id));
19
19
  if (activeGroup) {
20
- setGroupDragOverlay((0, jsx_runtime_1.jsx)(SortableGroup_1.SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: (0, utils_1.resolveGroupBlockColor)(activeGroup.blockColor, showGroupsColors), showDescription: showDescription, favoriteIds: activeGroup.favoritesEnabled ? favoriteIds : undefined, onFavoriteChange: onFavoriteChange, highlight: activeGroup.highlight }));
20
+ setGroupDragOverlay((0, jsx_runtime_1.jsx)(SortableGroup_1.SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: (0, utils_1.resolveGroupBlockColor)(activeGroup.blockColor, showGroupsColors), showDescription: showDescription, favorite: activeGroup.favoritesEnabled ? favorite : undefined, highlight: activeGroup.highlight }));
21
21
  }
22
22
  }
23
- }, [expandedIds, favoriteIds, onFavoriteChange, setGroupDragOverlay, showDescription, showGroupsColors, visibleGroups]);
23
+ }, [expandedIds, favorite, setGroupDragOverlay, showDescription, showGroupsColors, visibleGroups]);
24
24
  const handleDragEnd = (0, react_1.useCallback)((event) => {
25
25
  setGroupDragOverlay(null);
26
26
  if ((0, utils_1.isServiceDragId)(event.active.id)) {
@@ -1,13 +1,3 @@
1
- .content{
2
- display:flex;
3
- flex-direction:column;
4
- gap:var(--sn-primitive-dimension-4, 4px);
5
- width:100%;
6
- min-width:0;
7
- }
8
- .content[data-mobile]{
9
- gap:var(--sn-primitive-dimension-8, 8px);
10
- }
11
1
  .content[data-empty]{
12
2
  height:100%;
13
3
  }
@@ -15,12 +5,6 @@
15
5
  flex:1 1 auto;
16
6
  }
17
7
 
18
- .top{
19
- display:flex;
20
- flex-direction:column;
21
- gap:inherit;
22
- }
23
-
24
8
  .noData{
25
9
  flex:1 1 auto;
26
10
  place-self:center center;
@@ -1,12 +1,12 @@
1
- import { FavoriteProps, InnerLink } from '../../types';
1
+ import { FavoriteProps, LinksGroup } from '../../types';
2
2
  export type FavoritesProps = {
3
3
  /** Список избранных сервисов */
4
4
  favorite: FavoriteProps;
5
- /** Сервисы каталога по id для разрешения id в карточки */
6
- servicesById: ReadonlyMap<string, InnerLink>;
5
+ /** Группы сервисов для разрешения id в карточки */
6
+ allServiceGroups: LinksGroup[];
7
7
  /** CSS-класс строки заголовка (segment + кнопка настроек) */
8
8
  headerClassName?: string;
9
9
  /** Флаг мобильной раскладки */
10
10
  isMobile?: boolean;
11
11
  };
12
- export declare function Favorites({ favorite, servicesById, headerClassName, isMobile }: FavoritesProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }: FavoritesProps): import("react/jsx-runtime").JSX.Element;
@@ -8,7 +8,9 @@ const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const button_1 = require("@cloud-ru/ds-button");
9
9
  const system_1 = require("@cloud-ru/ds-icons/interface/system");
10
10
  const list_1 = require("@cloud-ru/ds-list");
11
+ const scroll_1 = require("@cloud-ru/ds-scroll");
11
12
  const segment_control_1 = require("@cloud-ru/ds-segment-control");
13
+ const uikit_product_card_predefined_1 = require("@cloud-ru/ds-uikit-product-card-predefined");
12
14
  const utils_1 = require("@cloud-ru/ds-utils");
13
15
  const classnames_1 = __importDefault(require("classnames"));
14
16
  const react_1 = require("react");
@@ -17,7 +19,8 @@ const utils_2 = require("../../utils");
17
19
  const components_1 = require("./components");
18
20
  const constants_1 = require("./constants");
19
21
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
20
- function Favorites({ favorite, servicesById, headerClassName, isMobile }) {
22
+ const utils_3 = require("./utils");
23
+ function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }) {
21
24
  const { t } = locale_1.headerLocale.useTranslations();
22
25
  const loading = favorite.loading;
23
26
  const [segment, setSegment] = (0, utils_1.useValueControl)({
@@ -29,23 +32,38 @@ function Favorites({ favorite, servicesById, headerClassName, isMobile }) {
29
32
  { value: constants_1.FAVORITES_SEGMENT.Favorites, label: t('favorite.title'), disabled: loading },
30
33
  { value: constants_1.FAVORITES_SEGMENT.Recent, label: t('recent.title'), disabled: loading },
31
34
  ], [t, loading]);
32
- const favoriteItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.value, servicesById), [favorite.value, servicesById]);
33
- const recentItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.recentServices ?? [], servicesById), [favorite.recentServices, servicesById]);
35
+ const favoriteItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.value, allServiceGroups), [favorite.value, allServiceGroups]);
36
+ const recentItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.recentServices ?? [], allServiceGroups), [favorite.recentServices, allServiceGroups]);
34
37
  const resolvedSegment = segment ?? constants_1.FAVORITES_SEGMENT.Favorites;
35
- // Стабильные по ссылке колбэки: иначе `memo` карточек и списков-по-сегменту ломается
36
- // при каждом рендере `Favorites` — см. `FavoritesReorderList`/`RecentList`/`FavoritesList`.
37
- const handleRecentServiceClick = (0, utils_1.useEventHandler)((service) => (event) => {
38
+ const isFavoritesSegment = resolvedSegment === constants_1.FAVORITES_SEGMENT.Favorites;
39
+ const isEmpty = (isFavoritesSegment ? favoriteItems : recentItems).length === 0;
40
+ const handleRecentServiceClick = (service) => (event) => {
38
41
  favorite.onRecentServiceClick?.(service.id, event);
39
42
  service.onClick(event);
40
- });
41
- const handleFavoriteServiceClick = (0, utils_1.useEventHandler)((service) => (event) => {
43
+ };
44
+ const handleFavoriteServiceClick = (service) => (event) => {
42
45
  favorite.onFavoriteServiceClick?.(service.id, event);
43
46
  service.onClick(event);
44
- });
45
- /* Drag&drop реордер и приём карточек из сетки — только на desktop (требует
46
- <DndContext>-предка). На mobile нет reorder-жеста, добавление/удаление
47
- избранного идёт через звёздочку на карточке. Оба варианта сами решают по
48
- сегменту, что рендерить — вся карточко-строительная логика внутри них. */
49
- const content = isMobile ? ((0, jsx_runtime_1.jsx)(components_1.FavoritesMobile, { favoriteIds: favorite.value, onFavoriteChange: favorite.onChange, favoriteItems: favoriteItems, recentItems: recentItems, segment: resolvedSegment, onFavoriteServiceClick: handleFavoriteServiceClick, onRecentServiceClick: handleRecentServiceClick })) : ((0, jsx_runtime_1.jsx)(components_1.FavoritesDesktop, { favoriteIds: favorite.value, onFavoriteChange: favorite.onChange, favoriteItems: favoriteItems, recentItems: recentItems, segment: resolvedSegment, setSegment: setSegment, onFavoriteServiceClick: handleFavoriteServiceClick, onRecentServiceClick: handleRecentServiceClick }));
50
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.root, "data-test-id": constants_1.FAVORITES_TEST_IDS.root, children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.header, headerClassName), "data-test-id": constants_1.FAVORITES_TEST_IDS.header, children: [(0, jsx_runtime_1.jsx)(segment_control_1.SegmentControl, { size: 'm', width: segment_control_1.WIDTH.Full, value: segment, onChange: setSegment, className: styles_module_scss_1.default.segmentControl, "data-test-id": constants_1.FAVORITES_TEST_IDS.segmentControl, items: segmentControlItems }), favorite.actions && ((0, jsx_runtime_1.jsx)(list_1.Droplist, { size: 'm', ...favorite.actions, closeDroplistOnItemClick: true, children: (0, jsx_runtime_1.jsx)(button_1.Button, { view: 'function', size: 'm', appearance: 'neutral', icon: (0, jsx_runtime_1.jsx)(system_1.KebabSVG, { size: 24 }), "data-test-id": constants_1.FAVORITES_TEST_IDS.settingsButton, disabled: loading }) }))] }), loading ? (0, jsx_runtime_1.jsx)(components_1.FavoritesItemsSkeleton, {}) : content] }));
47
+ };
48
+ const recentCards = recentItems.map(service => ((0, jsx_runtime_1.jsx)(uikit_product_card_predefined_1.CardServiceLight, { as: 'a', className: styles_module_scss_1.default.card, actionsVisibility: isMobile ? 'always' : 'hover', favorite: {
49
+ enabled: true,
50
+ checked: favorite.value.includes(service.id),
51
+ onChange: favorite.onChange(service.id),
52
+ }, ...(0, utils_3.getCommonCardProps)(service, handleRecentServiceClick(service)) }, service.id)));
53
+ const content = (() => {
54
+ if (loading) {
55
+ return (0, jsx_runtime_1.jsx)(components_1.FavoritesItemsSkeleton, {});
56
+ }
57
+ /* Drag&drop реордер и приём карточек из сетки — только на desktop (требует
58
+ <DndContext>-предка). На mobile нет reorder-жеста, добавление/удаление
59
+ избранного идёт через звёздочку на карточке. */
60
+ return isMobile ? ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.listScroll, children: (0, jsx_runtime_1.jsx)(scroll_1.Scroll, { className: styles_module_scss_1.default.listScrollInner, "data-mobile": isMobile || undefined, overflow: { x: 'hidden' }, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.list, "data-test-id": constants_1.FAVORITES_TEST_IDS.list, children: [isEmpty && (0, jsx_runtime_1.jsx)(components_1.EmptyState, { isFavoritesSegment: isFavoritesSegment, isMobile: true }), !isEmpty &&
61
+ isFavoritesSegment &&
62
+ favoriteItems.map(service => ((0, jsx_runtime_1.jsx)(uikit_product_card_predefined_1.CardServiceLight, { as: 'a', className: styles_module_scss_1.default.card, actionsVisibility: 'always', favorite: {
63
+ enabled: true,
64
+ checked: true,
65
+ onChange: favorite.onChange(service.id),
66
+ }, ...(0, utils_3.getCommonCardProps)(service, handleFavoriteServiceClick(service)) }, service.id))), !isEmpty && !isFavoritesSegment && recentCards] }) }) })) : ((0, jsx_runtime_1.jsx)(components_1.FavoritesSortable, { favorite: favorite, favoriteItems: favoriteItems, segment: resolvedSegment, setSegment: setSegment, isEmpty: isEmpty, recentCards: recentCards, onFavoriteServiceClick: handleFavoriteServiceClick }));
67
+ })();
68
+ return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.root, "data-test-id": constants_1.FAVORITES_TEST_IDS.root, children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.header, headerClassName), "data-test-id": constants_1.FAVORITES_TEST_IDS.header, children: [(0, jsx_runtime_1.jsx)(segment_control_1.SegmentControl, { size: 'm', width: segment_control_1.WIDTH.Full, value: loading ? undefined : segment, onChange: setSegment, className: styles_module_scss_1.default.segmentControl, "data-test-id": constants_1.FAVORITES_TEST_IDS.segmentControl, items: segmentControlItems }), favorite.actions && ((0, jsx_runtime_1.jsx)(list_1.Droplist, { size: 'm', ...favorite.actions, closeDroplistOnItemClick: true, children: (0, jsx_runtime_1.jsx)(button_1.Button, { view: 'function', size: 'm', appearance: 'neutral', icon: (0, jsx_runtime_1.jsx)(system_1.KebabSVG, { size: 24 }), "data-test-id": constants_1.FAVORITES_TEST_IDS.settingsButton, disabled: loading }) }))] }), content] }));
51
69
  }
@@ -1,9 +1,6 @@
1
1
  type EmptyStateProps = {
2
- /** Пустое состояние сегмента «Избранное» (иначе — «Недавнее»). */
3
2
  isFavoritesSegment: boolean;
4
- /** Мобильная раскладка. */
5
3
  isMobile?: boolean;
6
4
  };
7
- declare function EmptyStateBase({ isFavoritesSegment, isMobile }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
8
- export declare const EmptyState: import("react").MemoExoticComponent<typeof EmptyStateBase>;
5
+ export declare function EmptyState({ isFavoritesSegment, isMobile }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
9
6
  export {};
@@ -3,17 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EmptyState = void 0;
6
+ exports.EmptyState = EmptyState;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const typography_1 = require("@cloud-ru/ds-typography");
9
- const react_1 = require("react");
10
9
  const locale_1 = require("../../../../../../locale");
11
10
  const constants_1 = require("../../constants");
12
11
  const EmptyFavoriteSVG_1 = require("./EmptyFavoriteSVG");
13
12
  const EmptyRecentSVG_1 = require("./EmptyRecentSVG");
14
13
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
15
- function EmptyStateBase({ isFavoritesSegment, isMobile }) {
14
+ function EmptyState({ isFavoritesSegment, isMobile }) {
16
15
  const { t } = locale_1.headerLocale.useTranslations();
17
16
  return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.emptyState, "data-test-id": constants_1.FAVORITES_TEST_IDS.emptyState, children: isFavoritesSegment ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(EmptyFavoriteSVG_1.EmptyFavoriteSVG, { className: styles_module_scss_1.default.emptyIcon }), (0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: 'body', size: 's', className: styles_module_scss_1.default.emptyText, children: isMobile ? t('favorite.emptyMobile') : t('favorite.emptyDesktop') })] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(EmptyRecentSVG_1.EmptyRecentSVG, { className: styles_module_scss_1.default.emptyIcon }), (0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: 'body', size: 's', className: styles_module_scss_1.default.emptyText, children: t('recent.empty') })] })) }));
18
17
  }
19
- exports.EmptyState = (0, react_1.memo)(EmptyStateBase);
@@ -0,0 +1,19 @@
1
+ import { MouseEvent, ReactNode } from 'react';
2
+ import { FavoriteProps, InnerLink } from '../../../types';
3
+ import { FavoritesSegment } from '../constants';
4
+ type FavoritesSortableProps = {
5
+ favorite: FavoriteProps;
6
+ favoriteItems: InnerLink[];
7
+ segment: FavoritesSegment;
8
+ setSegment(segment: FavoritesSegment): void;
9
+ isEmpty: boolean;
10
+ recentCards: ReactNode;
11
+ onFavoriteServiceClick(service: InnerLink): (event: MouseEvent<HTMLElement>) => void;
12
+ };
13
+ /**
14
+ * Desktop-обёртка тела списка: реордер drag&drop + приём карточек из общей
15
+ * сетки. Требует `<DndContext>`-предка, поэтому `useFavoritesDnd` вызывается
16
+ * только здесь — на mobile этот компонент не рендерится вовсе (см. `Favorites`).
17
+ */
18
+ export declare function FavoritesSortable({ favorite, favoriteItems, segment, setSegment, isEmpty, recentCards, onFavoriteServiceClick, }: FavoritesSortableProps): import("react/jsx-runtime").JSX.Element;
19
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FavoritesSortable = FavoritesSortable;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const sortable_1 = require("@dnd-kit/sortable");
9
+ const drag_and_drop_1 = require("@cloud-ru/ds-drag-and-drop");
10
+ const scroll_1 = require("@cloud-ru/ds-scroll");
11
+ const constants_1 = require("../constants");
12
+ const useFavoritesDnd_1 = require("../hooks/useFavoritesDnd");
13
+ const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
14
+ const utils_1 = require("../utils");
15
+ const EmptyState_1 = require("./EmptyState");
16
+ const SortableFavoriteCard_1 = require("./SortableFavoriteCard");
17
+ /**
18
+ * Desktop-обёртка тела списка: реордер drag&drop + приём карточек из общей
19
+ * сетки. Требует `<DndContext>`-предка, поэтому `useFavoritesDnd` вызывается
20
+ * только здесь — на mobile этот компонент не рендерится вовсе (см. `Favorites`).
21
+ */
22
+ function FavoritesSortable({ favorite, favoriteItems, segment, setSegment, isEmpty, recentCards, onFavoriteServiceClick, }) {
23
+ const isFavoritesSegment = segment === constants_1.FAVORITES_SEGMENT.Favorites;
24
+ const { setNodeRef, listEndRef, favoriteSortableIds, insertIndex, isInsertingToEnd, showDropOver, showInsertNew } = (0, useFavoritesDnd_1.useFavoritesDnd)({ favorite, favoriteItems, segment, setSegment });
25
+ return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.listScroll, "data-insert-new": showInsertNew, children: [(0, jsx_runtime_1.jsx)(drag_and_drop_1.DropTarget, { active: Boolean(showDropOver), className: styles_module_scss_1.default.dropTarget, "aria-hidden": true }), (0, jsx_runtime_1.jsx)(scroll_1.Scroll, { className: styles_module_scss_1.default.listScrollInner, overflow: { x: 'hidden' }, children: (0, jsx_runtime_1.jsxs)("div", { ref: setNodeRef, className: styles_module_scss_1.default.list, "data-test-id": constants_1.FAVORITES_TEST_IDS.list, children: [isEmpty && (0, jsx_runtime_1.jsx)(EmptyState_1.EmptyState, { isFavoritesSegment: isFavoritesSegment }), !isEmpty && isFavoritesSegment && ((0, jsx_runtime_1.jsxs)(sortable_1.SortableContext, { items: favoriteSortableIds, strategy: sortable_1.verticalListSortingStrategy, children: [favoriteItems.map((service, index) => ((0, jsx_runtime_1.jsx)(SortableFavoriteCard_1.SortableFavoriteCard, { serviceId: service.id, showInsertIndicatorBefore: insertIndex === index, showInsertIndicatorAfter: isInsertingToEnd && index === favoriteItems.length - 1, isFirst: index === 0, favorite: {
26
+ enabled: true,
27
+ checked: true,
28
+ onChange: favorite.onChange(service.id),
29
+ }, ...(0, utils_1.getCommonCardProps)(service, onFavoriteServiceClick(service)) }, service.id))), (0, jsx_runtime_1.jsx)("div", { ref: listEndRef, className: styles_module_scss_1.default.listEnd, "aria-hidden": true })] })), !isEmpty && !isFavoritesSegment && recentCards] }) })] }));
30
+ }
@@ -1,14 +1,8 @@
1
1
  import { CardServiceLightProps } from '@cloud-ru/ds-uikit-product-card-predefined';
2
2
  export type SortableFavoriteCardProps = {
3
- /** Id сервиса (используется для drag-идентификатора карточки). */
4
3
  serviceId: string;
5
- /** Показывать индикатор вставки перед карточкой (drag поверх избранного). */
6
4
  showInsertIndicatorBefore?: boolean;
7
- /** Показывать индикатор вставки после карточки (drag поверх избранного). */
8
5
  showInsertIndicatorAfter?: boolean;
9
- /** Карточка первая в списке — влияет на позиционирование индикатора вставки. */
10
6
  isFirst?: boolean;
11
7
  } & Pick<CardServiceLightProps<'a'>, 'href' | 'className' | 'tabIndex' | 'title' | 'onClick' | 'icon' | 'promoTag' | 'tooltip' | 'favorite' | 'expandable' | 'data-test-id'>;
12
- declare function SortableFavoriteCardBase({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }: SortableFavoriteCardProps): import("react/jsx-runtime").JSX.Element;
13
- export declare const SortableFavoriteCard: import("react").MemoExoticComponent<typeof SortableFavoriteCardBase>;
14
- export {};
8
+ export declare function SortableFavoriteCard({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }: SortableFavoriteCardProps): import("react/jsx-runtime").JSX.Element;
@@ -3,16 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SortableFavoriteCard = void 0;
6
+ exports.SortableFavoriteCard = SortableFavoriteCard;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const sortable_1 = require("@dnd-kit/sortable");
9
9
  const utilities_1 = require("@dnd-kit/utilities");
10
10
  const drag_and_drop_1 = require("@cloud-ru/ds-drag-and-drop");
11
11
  const uikit_product_card_predefined_1 = require("@cloud-ru/ds-uikit-product-card-predefined");
12
- const react_1 = require("react");
13
12
  const dnd_1 = require("../../../utils/dnd");
14
13
  const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
15
- function SortableFavoriteCardBase({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }) {
14
+ function SortableFavoriteCard({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }) {
16
15
  const { attributes, listeners, setNodeRef, transform, transition, isDragging } = (0, sortable_1.useSortable)({
17
16
  id: (0, dnd_1.getServiceFavoriteDragId)(serviceId),
18
17
  });
@@ -27,4 +26,3 @@ function SortableFavoriteCardBase({ serviceId, className, showInsertIndicatorBef
27
26
  const { tabIndex, ...restAttributes } = attributes ?? {};
28
27
  return ((0, jsx_runtime_1.jsxs)(drag_and_drop_1.DragGhost, { innerRef: setNodeRef, style: style, className: styles_module_scss_1.default.sortableCard, dragging: isDragging, mode: drag_and_drop_1.DRAG_MODE.Dynamic, ...listeners, ...restAttributes, children: [showInsertIndicatorBefore && (0, jsx_runtime_1.jsx)(drag_and_drop_1.DropIndicator, { placement: drag_and_drop_1.PLACEMENT.Before, atEdge: isFirst }), (0, jsx_runtime_1.jsx)(uikit_product_card_predefined_1.CardServiceLight, { as: 'a', ...cardProps, className: className ?? styles_module_scss_1.default.card, tabIndex: tabIndex }), showInsertIndicatorAfter && (0, jsx_runtime_1.jsx)(drag_and_drop_1.DropIndicator, { placement: drag_and_drop_1.PLACEMENT.After, atEdge: true })] }));
29
28
  }
30
- exports.SortableFavoriteCard = (0, react_1.memo)(SortableFavoriteCardBase);
@@ -1,5 +1,4 @@
1
1
  export * from './SortableFavoriteCard';
2
2
  export * from './EmptyState';
3
- export * from './FavoritesDesktop';
3
+ export * from './FavoritesSortable';
4
4
  export * from './FavoritesItemsSkeleton';
5
- export * from './FavoritesMobile';
@@ -16,6 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./SortableFavoriteCard"), exports);
18
18
  __exportStar(require("./EmptyState"), exports);
19
- __exportStar(require("./FavoritesDesktop"), exports);
19
+ __exportStar(require("./FavoritesSortable"), exports);
20
20
  __exportStar(require("./FavoritesItemsSkeleton"), exports);
21
- __exportStar(require("./FavoritesMobile"), exports);
@@ -0,0 +1,25 @@
1
+ import { FavoriteProps, InnerLink } from '../../../types';
2
+ import { FavoritesSegment } from '../constants';
3
+ type UseFavoritesDndParams = {
4
+ favorite: FavoriteProps;
5
+ favoriteItems: InnerLink[];
6
+ segment: FavoritesSegment;
7
+ setSegment(segment: FavoritesSegment): void;
8
+ };
9
+ /**
10
+ * Оркестрирует drag&drop избранного: приём карточек сервисов из общей сетки
11
+ * (droppable), реордер внутри списка (insert-индикатор) и drag-превью.
12
+ *
13
+ * Требует `<DndContext>`-предка (см. `MainMenuDndContext`) — доступно только
14
+ * на desktop-раскладке, на mobile избранное рендерится без drag&drop.
15
+ */
16
+ export declare function useFavoritesDnd({ favorite, favoriteItems, segment, setSegment }: UseFavoritesDndParams): {
17
+ setNodeRef: (element: HTMLElement | null) => void;
18
+ listEndRef: import("react").RefObject<HTMLDivElement>;
19
+ favoriteSortableIds: string[];
20
+ insertIndex: number | null;
21
+ isInsertingToEnd: boolean;
22
+ showDropOver: true | undefined;
23
+ showInsertNew: true | undefined;
24
+ };
25
+ export {};
@@ -1,37 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useFavoritesReorder = useFavoritesReorder;
3
+ exports.useFavoritesDnd = useFavoritesDnd;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const core_1 = require("@dnd-kit/core");
6
6
  const react_1 = require("react");
7
7
  const useMainMenuDnd_1 = require("../../../hooks/useMainMenuDnd");
8
8
  const utils_1 = require("../../../utils");
9
9
  const ServiceCard_1 = require("../../ServiceCard");
10
+ const constants_1 = require("../constants");
10
11
  const useFavoritesInsertIndicator_1 = require("./useFavoritesInsertIndicator");
11
12
  /**
12
- * Оркестрирует drag&drop сегмента «Избранное»: приём карточек сервисов из общей сетки
13
+ * Оркестрирует drag&drop избранного: приём карточек сервисов из общей сетки
13
14
  * (droppable), реордер внутри списка (insert-индикатор) и drag-превью.
14
15
  *
15
- * Монтируется только вместе с {@link FavoritesReorderList}, то есть пока активен сегмент
16
- * «Избранное» — переключение на этот сегмент при старте drag из каталога обеспечивает
17
- * {@link useFavoritesAutoSwitch}, смонтированный отдельно и постоянно. Из-за этого хук может
18
- * подключиться уже посреди drag (сегмент только что переключился) — начальное состояние в
19
- * этом случае читается из текущего активного drag через `useDndContext`, а не только из
20
- * будущих событий монитора.
21
- *
22
- * Требует `<DndContext>`-предка (см. `MainMenuDndContext`) — доступно только на desktop-раскладке,
23
- * на mobile избранное рендерится без drag&drop.
16
+ * Требует `<DndContext>`-предка (см. `MainMenuDndContext`) — доступно только
17
+ * на desktop-раскладке, на mobile избранное рендерится без drag&drop.
24
18
  */
25
- function useFavoritesReorder({ favoriteIds, favoriteItems }) {
19
+ function useFavoritesDnd({ favorite, favoriteItems, segment, setSegment }) {
26
20
  const { setGroupDragOverlay } = (0, useMainMenuDnd_1.useMainMenuDndOverlay)();
27
- const { active: activeOnMount } = (0, core_1.useDndContext)();
28
- const [activeFavoriteId, setActiveFavoriteId] = (0, react_1.useState)(() => activeOnMount && (0, utils_1.isServiceFavoriteDragId)(activeOnMount.id) ? (0, utils_1.parseServiceDragId)(activeOnMount.id) : null);
29
- const [isFavoriteReorderDrag, setIsFavoriteReorderDrag] = (0, react_1.useState)(() => Boolean(activeOnMount && (0, utils_1.isServiceFavoriteDragId)(activeOnMount.id)));
30
- const [isDraggingToFavorites, setDraggingToFavorites] = (0, react_1.useState)(() => Boolean(activeOnMount && (0, utils_1.isServiceSourceDragId)(activeOnMount.id)));
21
+ const [activeFavoriteId, setActiveFavoriteId] = (0, react_1.useState)(null);
22
+ const [isFavoriteReorderDrag, setIsFavoriteReorderDrag] = (0, react_1.useState)(false);
23
+ const [isDraggingToFavorites, setDraggingToFavorites] = (0, react_1.useState)(false);
31
24
  const listEndRef = (0, react_1.useRef)(null);
32
25
  const shouldScrollToEndRef = (0, react_1.useRef)(false);
33
- const favoriteSortableIds = (0, react_1.useMemo)(() => favoriteIds.map(utils_1.getServiceFavoriteDragId), [favoriteIds]);
34
- const insertIndex = (0, useFavoritesInsertIndicator_1.useFavoritesInsertIndicator)(favoriteIds);
26
+ const isFavoritesSegment = segment === constants_1.FAVORITES_SEGMENT.Favorites;
27
+ const favoriteSortableIds = (0, react_1.useMemo)(() => favorite.value.map(utils_1.getServiceFavoriteDragId), [favorite.value]);
28
+ const insertIndex = (0, useFavoritesInsertIndicator_1.useFavoritesInsertIndicator)(favorite.value);
35
29
  const isInsertingToEnd = favoriteItems.length > 0 && insertIndex === favoriteItems.length;
36
30
  const isInsertingNew = isDraggingToFavorites && !favoriteItems.length;
37
31
  const insertIndexRef = (0, react_1.useRef)(insertIndex);
@@ -40,11 +34,18 @@ function useFavoritesReorder({ favoriteIds, favoriteItems }) {
40
34
  const { setNodeRef, isOver } = (0, core_1.useDroppable)({
41
35
  id: utils_1.FAVORITES_DROP_ID,
42
36
  // Only needed for an empty list; with cards, card droppables own the hit-testing.
43
- disabled: isFavoriteReorderDrag || favoriteItems.length > 0,
37
+ disabled: !isFavoritesSegment || isFavoriteReorderDrag || favoriteItems.length > 0,
44
38
  });
45
39
  (0, core_1.useDndMonitor)({
46
40
  onDragStart({ active }) {
41
+ // Форсим сегмент только для карточки из каталога: избранное уже показывается на
42
+ // сегменте Favorites, и его же карточки только там и рендерятся — при реордере внутри
43
+ // списка `setSegment` вызывался бы с тем же значением. `useValueControl` не сравнивает
44
+ // значение с текущим и всё равно зовёт `onSegmentChange` — лишний колбэк на каждый drag.
47
45
  if ((0, utils_1.isServiceSourceDragId)(active.id)) {
46
+ if (segment !== constants_1.FAVORITES_SEGMENT.Favorites) {
47
+ setSegment(constants_1.FAVORITES_SEGMENT.Favorites);
48
+ }
48
49
  setDraggingToFavorites(true);
49
50
  }
50
51
  if ((0, utils_1.isServiceFavoriteDragId)(active.id)) {
@@ -53,7 +54,7 @@ function useFavoritesReorder({ favoriteIds, favoriteItems }) {
53
54
  }
54
55
  },
55
56
  onDragEnd() {
56
- shouldScrollToEndRef.current = isDraggingToFavorites && insertIndexRef.current === favoriteIds.length;
57
+ shouldScrollToEndRef.current = isDraggingToFavorites && insertIndexRef.current === favorite.value.length;
57
58
  setActiveFavoriteId(null);
58
59
  setIsFavoriteReorderDrag(false);
59
60
  setDraggingToFavorites(false);
@@ -82,7 +83,7 @@ function useFavoritesReorder({ favoriteIds, favoriteItems }) {
82
83
  listEndRef.current?.scrollIntoView({ block: 'nearest' });
83
84
  });
84
85
  return () => cancelAnimationFrame(frameId);
85
- }, [favoriteIds]);
86
+ }, [favorite.value]);
86
87
  const showDropOver = ((isOver || isDraggingToFavorites) && !isFavoriteReorderDrag) || undefined;
87
88
  const showInsertNew = (isInsertingNew && isOver) || undefined;
88
89
  return {
@@ -1,9 +1,7 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { MainMenuSettingsItem } from '../../types';
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';
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;
@@ -8,11 +8,11 @@ const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const divider_1 = require("@cloud-ru/ds-divider");
9
9
  const drawer_1 = require("@cloud-ru/ds-drawer");
10
10
  const scroll_1 = require("@cloud-ru/ds-scroll");
11
+ const utils_1 = require("@cloud-ru/ds-utils");
11
12
  const react_1 = require("react");
12
13
  const constants_1 = require("../../../../constants");
13
14
  const useMainMenuDnd_1 = require("../../hooks/useMainMenuDnd");
14
15
  const useMenuItems_1 = require("../../hooks/useMenuItems");
15
- const utils_1 = require("../../utils");
16
16
  const Content_1 = require("../Content");
17
17
  const Favorites_1 = require("../Favorites");
18
18
  const MenuBottom_1 = require("../MenuBottom");
@@ -21,7 +21,8 @@ const MountAnimation_1 = require("../MountAnimation");
21
21
  const Search_1 = require("../Search");
22
22
  const constants_2 = require("./constants");
23
23
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
24
- function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = constants_2.MENU_WIDTH_MAX, onWidthChangeEnd, draggerTooltip, loading, }) {
24
+ function MenuDesktop({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = constants_2.MENU_WIDTH_MAX, onWidthChangeEnd, draggerTooltip, loading, }) {
25
+ const [open = false, setOpen] = (0, utils_1.useValueControl)({ value: openProp, onChange: setOpenProp });
25
26
  const { scrollRef, searchRef, resultItems } = (0, useMenuItems_1.useMenuItems)({
26
27
  segments,
27
28
  search,
@@ -44,19 +45,18 @@ function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segm
44
45
  // сегменты используются, `loading` держит панель смонтированной на время ответа бэка — иначе
45
46
  // `Content` не успевает показать свой skeleton (он монтируется только когда данные уже пришли),
46
47
  // и между "ничего" и карточками на кадр проскакивает пустое состояние «нет данных».
47
- const isNeedRightBlock = (0, react_1.useMemo)(() => segments !== undefined && (loading || segments.some(segment => segment.items.length > 0)), [segments, loading]);
48
+ const isNeedRightBlock = segments !== undefined && (loading || segments.some(segment => segment.items.length > 0));
48
49
  const hasBottomItems = Boolean(settingItems?.length) || Boolean(leftBottom);
49
50
  const allServiceGroups = (0, react_1.useMemo)(() => segments?.flatMap(segment => segment.items) ?? [], [segments]);
50
- const servicesById = (0, react_1.useMemo)(() => (0, utils_1.buildServicesById)(allServiceGroups), [allServiceGroups]);
51
51
  const mainMenuDnd = (0, useMainMenuDnd_1.useMainMenuDnd)({
52
52
  favorite,
53
- servicesById,
53
+ groups: allServiceGroups,
54
54
  showDescription: preferences?.showDescription.value ?? false,
55
55
  });
56
56
  const handleCloseDrawer = (0, react_1.useCallback)(() => {
57
- setOpen?.(false);
57
+ setOpen(false);
58
58
  }, [setOpen]);
59
- const menu = ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menu, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuHeader, children: [(0, jsx_runtime_1.jsx)(MenuHeaderBrand_1.MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles_module_scss_1.default.menuHeaderBrand }), isNeedRightBlock && search && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), (0, jsx_runtime_1.jsx)(Search_1.Search, { ...search, ref: searchRef })] }))] }), (0, jsx_runtime_1.jsx)(divider_1.Divider, {}), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuBody, children: [(0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { className: styles_module_scss_1.default.left, "data-test-id": constants_1.TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.leftTop, children: leftTop }), isNeedRightBlock && favorite && (0, jsx_runtime_1.jsx)(Favorites_1.Favorites, { favorite: favorite, servicesById: servicesById }), hasBottomItems && (0, jsx_runtime_1.jsx)(MenuBottom_1.MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }), isNeedRightBlock && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(MountAnimation_1.MountAnimation, { type: 'fade-in', children: (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }) }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.right, "data-test-id": constants_1.TEST_IDS.mainMenu.right, children: (0, jsx_runtime_1.jsx)(scroll_1.Scroll, { paddingAbsolute: true, className: styles_module_scss_1.default.scroll, ref: scrollRef, barHideStrategy: 'never', overflow: { x: 'hidden' }, children: (0, jsx_runtime_1.jsx)(Content_1.Content, { className: styles_module_scss_1.default.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 }) }) })] }))] })] }));
59
+ const menu = ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menu, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuHeader, children: [(0, jsx_runtime_1.jsx)(MenuHeaderBrand_1.MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles_module_scss_1.default.menuHeaderBrand }), isNeedRightBlock && search && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), (0, jsx_runtime_1.jsx)(Search_1.Search, { ...search, ref: searchRef })] }))] }), (0, jsx_runtime_1.jsx)(divider_1.Divider, {}), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuBody, children: [(0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { className: styles_module_scss_1.default.left, "data-test-id": constants_1.TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.leftTop, children: leftTop }), isNeedRightBlock && favorite && (0, jsx_runtime_1.jsx)(Favorites_1.Favorites, { favorite: favorite, allServiceGroups: allServiceGroups }), hasBottomItems && (0, jsx_runtime_1.jsx)(MenuBottom_1.MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }), isNeedRightBlock && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(MountAnimation_1.MountAnimation, { type: 'fade-in', children: (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }) }), (0, jsx_runtime_1.jsx)(MountAnimation_1.MountAnimation, { type: 'fade-slide-up-right', className: styles_module_scss_1.default.right, "data-test-id": constants_1.TEST_IDS.mainMenu.right, children: (0, jsx_runtime_1.jsx)(scroll_1.Scroll, { paddingAbsolute: true, className: styles_module_scss_1.default.scroll, ref: scrollRef, barHideStrategy: 'never', overflow: { x: 'hidden' }, children: (0, jsx_runtime_1.jsx)(Content_1.Content, { className: styles_module_scss_1.default.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 }) }) })] }))] })] }));
60
60
  return ((0, jsx_runtime_1.jsx)(drawer_1.DrawerCustom, { open: open, onClose: handleCloseDrawer, width: isNeedRightBlock ? 'm' : 's', position: 'left', className: styles_module_scss_1.default.drawer, rootClassName: styles_module_scss_1.default.drawerRoot, "data-test-id": constants_1.TEST_IDS.mainMenu.drawer, "data-small": !isNeedRightBlock || undefined, disableMotions: true, showButtonClosed: false, resizable: isNeedRightBlock
61
61
  ? {
62
62
  min: constants_2.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';
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;
@@ -7,12 +7,12 @@ exports.MenuMobile = MenuMobile;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const divider_1 = require("@cloud-ru/ds-divider");
9
9
  const theme_1 = require("@cloud-ru/ds-theme");
10
+ const utils_1 = require("@cloud-ru/ds-utils");
10
11
  const react_1 = require("react");
11
12
  const constants_1 = require("../../../../constants");
12
13
  const mobileOverlays_1 = require("../../../../mobileOverlays");
13
14
  const useMainMenuDnd_1 = require("../../hooks/useMainMenuDnd");
14
15
  const useMenuItems_1 = require("../../hooks/useMenuItems");
15
- const utils_1 = require("../../utils");
16
16
  const Content_1 = require("../Content");
17
17
  const Favorites_1 = require("../Favorites");
18
18
  const MenuBottom_1 = require("../MenuBottom");
@@ -21,7 +21,8 @@ const MountAnimation_1 = require("../MountAnimation");
21
21
  const ScrollWithAnimatedStickyPanel_1 = require("../ScrollWithAnimatedStickyPanel");
22
22
  const Search_1 = require("../Search");
23
23
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
24
- function MenuMobile({ open = false, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }) {
24
+ function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }) {
25
+ const [open = false, setOpen] = (0, utils_1.useValueControl)({ value: openProp, onChange: setOpenProp });
25
26
  // `segments !== undefined` — сигнал «каталог вообще используется» (консьюмер без сегментов
26
27
  // никогда не передаёт проп, и `loading` в этом случае к правой панели не относится). Пока
27
28
  // сегменты используются, `loading` держит панель смонтированной на время ответа бэка — иначе
@@ -35,13 +36,13 @@ function MenuMobile({ open = false, setOpen, settingItems, platformGroups, segme
35
36
  search,
36
37
  platformGroups,
37
38
  });
38
- const servicesById = (0, react_1.useMemo)(() => (0, utils_1.buildServicesById)(segments?.flatMap(segment => segment.items)), [segments]);
39
+ const allServiceGroups = (0, react_1.useMemo)(() => segments?.flatMap(segment => segment.items) ?? [], [segments]);
39
40
  const handleClose = (0, react_1.useCallback)(() => {
40
- setOpen?.(false);
41
+ setOpen(false);
41
42
  }, [setOpen]);
42
43
  return (
43
44
  // Временная фиксация comfort (см. `HeaderLayout`): `MainMenu` используется и отдельно от
44
45
  // `HeaderLayout`, поэтому объявляем плотность здесь же. Обёртка провайдера layout-прозрачная
45
46
  // (`display: contents`) — меню рендерится порталом, лишний бокс в строке шапки не нужен.
46
- (0, jsx_runtime_1.jsx)(theme_1.ChildThemeProvider, { value: { density: theme_1.DENSITY.Comfort }, className: styles_module_scss_1.default.densityScope, children: (0, jsx_runtime_1.jsx)(mobileOverlays_1.MobileDrawerCustom, { open: open, onClose: handleClose, position: 'bottom', className: styles_module_scss_1.default.drawerMobile, swipeEnabled: false, "data-test-id": constants_1.TEST_IDS.mainMenu.drawerMobile, closeOnPopstate: true, snapPoints: constants_1.BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, disableMotions: true, children: (0, jsx_runtime_1.jsx)(ScrollWithAnimatedStickyPanel_1.ScrollWithAnimatedStickyPanel, { panel: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(MenuHeaderBrand_1.MenuHeaderBrand, { logo: logo, onClose: handleClose, className: styles_module_scss_1.default.menuHeader }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' })] }), children: (0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { className: styles_module_scss_1.default.scrollMobile, type: 'fade-slide-up', children: [leftTop, search && (0, jsx_runtime_1.jsx)(Search_1.Search, { ...search, ref: searchRef, isMobile: true }), !isSearching && favorite && (0, jsx_runtime_1.jsx)(Favorites_1.Favorites, { favorite: favorite, servicesById: servicesById, isMobile: true }), hasSegments && ((0, jsx_runtime_1.jsx)(useMainMenuDnd_1.MainMenuDndContext, { children: (0, jsx_runtime_1.jsx)(Content_1.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 && (0, jsx_runtime_1.jsx)(MenuBottom_1.MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }) }) }) }));
47
+ (0, jsx_runtime_1.jsx)(theme_1.ChildThemeProvider, { value: { density: theme_1.DENSITY.Comfort }, className: styles_module_scss_1.default.densityScope, children: (0, jsx_runtime_1.jsx)(mobileOverlays_1.MobileDrawerCustom, { open: open, onClose: handleClose, position: 'bottom', className: styles_module_scss_1.default.drawerMobile, swipeEnabled: false, "data-test-id": constants_1.TEST_IDS.mainMenu.drawerMobile, closeOnPopstate: true, snapPoints: constants_1.BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, disableMotions: true, children: (0, jsx_runtime_1.jsx)(ScrollWithAnimatedStickyPanel_1.ScrollWithAnimatedStickyPanel, { panel: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(MenuHeaderBrand_1.MenuHeaderBrand, { logo: logo, onClose: handleClose, className: styles_module_scss_1.default.menuHeader }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' })] }), children: (0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { className: styles_module_scss_1.default.scrollMobile, type: 'fade-slide-up', children: [leftTop && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.rightContent, children: leftTop }), search && (0, jsx_runtime_1.jsx)(Search_1.Search, { ...search, ref: searchRef, isMobile: true }), !isSearching && favorite && (0, jsx_runtime_1.jsx)(Favorites_1.Favorites, { favorite: favorite, allServiceGroups: allServiceGroups, isMobile: true }), hasSegments && ((0, jsx_runtime_1.jsx)(useMainMenuDnd_1.MainMenuDndContext, { children: (0, jsx_runtime_1.jsx)(Content_1.Content, { isMobile: true, className: styles_module_scss_1.default.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 && (0, jsx_runtime_1.jsx)(MenuBottom_1.MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }) }) }) }));
47
48
  }