@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,21 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Accordion } from '@cloud-ru/ds-accordion';
3
- import { memo, useCallback, useMemo, useState } from 'react';
4
- import { noop } from '../../../../../../../../utils/noop.js';
3
+ import { useCallback, useMemo, useState } from 'react';
5
4
  import { getNestedServiceGroupId, getSubCategoryId } from '../../../../../../utils/innerLink.js';
6
- import { GridServiceCard } from '../../../../../ServiceCard/index.js';
7
- import { useCardsContext } from '../../../../cardsContext.js';
5
+ import { DraggableServiceCard } from '../../../../../ServiceCard/index.js';
8
6
  import { TEST_IDS } from '../../../../constants.js';
9
7
  import baseGroupStyles from '../../styles.module.css';
10
8
  import styles from './styles.module.css';
11
9
  import { SubCategoryTitle } from './SubCategoryTitle.js';
12
- const TITLE_ONLY_EXPANDABLE = { value: true, onClick: noop };
13
- const SubCategoryBody = memo(function SubCategoryBody({ nestedGroupId, items, variant }) {
14
- const { isMobile, showDescription, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick } = useCardsContext();
15
- const cardFavoriteChange = favoriteIds ? onFavoriteChange : undefined;
16
- return (_jsx("div", { className: baseGroupStyles.groupBody, "data-subcategory-body": variant === 'expanded' ? 'expanded' : true, "data-mobile": isMobile || undefined, children: items.map(nestedService => (_jsx(GridServiceCard, { groupId: nestedGroupId, service: nestedService, isFavorite: favoriteIds?.has(nestedService.id), onFavoriteChange: cardFavoriteChange, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragEnabled: dragEnabled }, nestedGroupId + nestedService.id))) }));
17
- });
18
- function SubCategoryBase({ groupId, service, groupFavoritesEnabled }) {
10
+ const noop = () => { };
11
+ export function SubCategory({ groupId, service, showDescription, isMobile, dragDisabled, favorite, onServiceClick, groupFavoritesEnabled, }) {
19
12
  const subcategoryId = getSubCategoryId(groupId, service.id);
20
13
  const nestedGroupId = getNestedServiceGroupId(groupId, service.id);
21
14
  const nestedItems = useMemo(() => service.items?.filter(item => !item.hidden) ?? [], [service.items]);
@@ -29,17 +22,19 @@ function SubCategoryBase({ groupId, service, groupFavoritesEnabled }) {
29
22
  setIsExpanded(isExpanded ? undefined : subcategoryId);
30
23
  }
31
24
  }, [isExpanded, subcategoryId, isExpandableEnabled]);
32
- const expandable = useMemo(() => ({ value: Boolean(isExpanded), onClick: handleExpandedChange }), [isExpanded, handleExpandedChange]);
33
- const testId = `${TEST_IDS.subcategory}-${service.id}`;
34
- const title = (_jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: viewMode === 'group-title-only' ? TITLE_ONLY_EXPANDABLE : expandable, groupFavoritesEnabled: groupFavoritesEnabled }));
35
25
  // 'group-title-only' — только заголовок подкатегории, без раскрываемого тела и кнопки
36
26
  // переключения: карточка ведёт себя как обычная ссылка (см. isSubCategoryCard в utils/innerLink).
37
27
  if (viewMode === 'group-title-only') {
38
- return (_jsx("div", { className: styles.subcategory, "data-title-only": true, "data-test-id": testId, children: title }));
28
+ return (_jsx("div", { className: styles.subcategory, "data-title-only": true, "data-test-id": `${TEST_IDS.subcategory}-${service.id}`, children: _jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: { value: true, onClick: noop }, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }) }));
39
29
  }
40
30
  if (viewMode === 'expanded') {
41
- return (_jsxs("div", { className: styles.subcategory, "data-test-id": testId, children: [title, _jsx(SubCategoryBody, { nestedGroupId: nestedGroupId, items: nestedItems, variant: 'expanded' })] }));
31
+ return (_jsxs("div", { className: styles.subcategory, "data-test-id": `${TEST_IDS.subcategory}-${service.id}`, children: [_jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: {
32
+ value: Boolean(isExpanded),
33
+ onClick: handleExpandedChange,
34
+ }, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }), _jsx("div", { className: baseGroupStyles.groupBody, "data-subcategory-body": 'expanded', "data-mobile": isMobile || undefined, children: nestedItems.map(nestedService => (_jsx(DraggableServiceCard, { groupId: nestedGroupId, service: nestedService, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: dragDisabled }, nestedGroupId + nestedService.id))) })] }));
42
35
  }
43
- return (_jsx("div", { className: styles.subcategory, "data-test-id": testId, children: _jsx(Accordion, { selectionMode: 'single', expanded: isExpanded, onExpandedChange: handleExpandedChange, children: _jsx(Accordion.CollapseBlockTertiary, { id: subcategoryId, showChevron: false, className: styles.subcategoryAccordion, afterTitle: title, children: _jsx(SubCategoryBody, { nestedGroupId: nestedGroupId, items: nestedItems, variant: 'expandable' }) }) }) }));
36
+ return (_jsx("div", { className: styles.subcategory, "data-test-id": `${TEST_IDS.subcategory}-${service.id}`, children: _jsx(Accordion, { selectionMode: 'single', expanded: isExpanded, onExpandedChange: handleExpandedChange, children: _jsx(Accordion.CollapseBlockTertiary, { id: subcategoryId, showChevron: false, className: styles.subcategoryAccordion, afterTitle: _jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: {
37
+ value: Boolean(isExpanded),
38
+ onClick: handleExpandedChange,
39
+ }, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }), children: _jsx("div", { className: baseGroupStyles.groupBody, "data-subcategory-body": true, "data-mobile": isMobile || undefined, children: nestedItems.map(nestedService => (_jsx(DraggableServiceCard, { groupId: nestedGroupId, service: nestedService, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: dragDisabled }, nestedGroupId + nestedService.id))) }) }) }) }));
44
40
  }
45
- export const SubCategory = memo(SubCategoryBase);
@@ -1,10 +1,5 @@
1
- import { GridServiceCardProps } from '../../../../../ServiceCard/index.js';
1
+ import { DraggableServiceCardProps } from '../../../../../ServiceCard/index.js';
2
2
  export type SubCategoryTitleProps = {
3
- /** Id группы-предка. */
4
3
  groupId: string;
5
- /** Кнопка избранного показывается только если для группы избранное включено. */
6
- groupFavoritesEnabled?: boolean;
7
- } & Pick<GridServiceCardProps, 'expandable' | 'service'>;
8
- declare function SubCategoryTitleBase({ groupId, service, groupFavoritesEnabled, expandable }: SubCategoryTitleProps): import("react/jsx-runtime").JSX.Element;
9
- export declare const SubCategoryTitle: import("react").MemoExoticComponent<typeof SubCategoryTitleBase>;
10
- export {};
4
+ } & Pick<DraggableServiceCardProps, 'expandable' | 'service' | 'onServiceClick' | 'favorite' | 'showDescription' | 'isMobile' | 'dragDisabled'>;
5
+ export declare function SubCategoryTitle({ groupId, service, showDescription: showDescriptionProp, isMobile, dragDisabled, favorite, onServiceClick, expandable, }: SubCategoryTitleProps): import("react/jsx-runtime").JSX.Element;
@@ -3,62 +3,56 @@ import { Typography } from '@cloud-ru/ds-typography';
3
3
  import { CardActionsSurface, createCardActionsKeyDownHandler } from '@cloud-ru/ds-uikit-product-card-predefined';
4
4
  import { TitleClickable } from '@cloud-ru/ds-uikit-product-title-clickable';
5
5
  import { stopEventPropagation } from '@cloud-ru/ds-utils';
6
- import { memo, useCallback, useMemo, useRef } from 'react';
6
+ import { useRef } from 'react';
7
7
  import { getLinkEmblem } from '../../../../../../utils/index.js';
8
- import { GridServiceCard } from '../../../../../ServiceCard/index.js';
9
- import { useCardsContext } from '../../../../cardsContext.js';
8
+ import { DraggableServiceCard } from '../../../../../ServiceCard/index.js';
10
9
  import { TEST_IDS } from '../../../../constants.js';
11
10
  import styles from './styles.module.css';
12
- function SubCategoryTitleBase({ groupId, service, groupFavoritesEnabled, expandable }) {
13
- const { isMobile, showDescription: showDescriptionProp, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick, } = useCardsContext();
11
+ export function SubCategoryTitle({ groupId, service, showDescription: showDescriptionProp, isMobile, dragDisabled, favorite, onServiceClick, expandable, }) {
14
12
  const titleRef = useRef(null);
15
13
  const tooltipTriggerRef = useRef(null);
16
14
  const favoriteRef = useRef(null);
17
- const { id, description, icon } = service;
18
- const handleServiceClick = useCallback((event) => {
15
+ const handleServiceClick = (event) => {
19
16
  stopEventPropagation(event);
20
17
  onServiceClick?.(service, event);
21
- }, [onServiceClick, service]);
22
- const titleTestId = `${TEST_IDS.subcategoryTitle}-${id}`;
23
- const cardFavoriteChange = groupFavoritesEnabled && favoriteIds ? onFavoriteChange : undefined;
24
- const isFavorite = Boolean(favoriteIds?.has(id));
25
- const showDescription = showDescriptionProp && Boolean(description);
26
- const hasTooltip = !showDescription && Boolean(description);
27
- const handleKeyDown = useMemo(() => createCardActionsKeyDownHandler({
18
+ };
19
+ const titleTestId = `${TEST_IDS.subcategoryTitle}-${service.id}`;
20
+ const isFavorite = Boolean(favorite?.value.includes(service.id));
21
+ const showDescription = showDescriptionProp && Boolean(service.description);
22
+ const hasTooltip = !showDescription && service.description;
23
+ const handleKeyDown = createCardActionsKeyDownHandler({
28
24
  cardRef: titleRef,
29
25
  items: [
30
26
  hasTooltip ? { ref: tooltipTriggerRef } : null,
31
- cardFavoriteChange
27
+ favorite
32
28
  ? {
33
29
  ref: favoriteRef,
34
- onActivate: () => cardFavoriteChange(id)(!isFavorite),
30
+ onActivate: () => favorite.onChange(service.id)(!isFavorite),
35
31
  }
36
32
  : null,
37
33
  ],
38
- }), [hasTooltip, cardFavoriteChange, id, isFavorite]);
39
- const emblem = useMemo(() => getLinkEmblem({ icon }), [icon]);
34
+ });
40
35
  if (expandable?.value) {
41
- return (_jsxs("div", { className: styles.subcategoryTitle, "data-mobile": isMobile || undefined, children: [_jsxs("div", { className: styles.subcategoryTitleRow, onKeyDown: handleKeyDown, children: [_jsx(TitleClickable, { as: 'a', href: service.href, onClick: handleServiceClick, innerRef: titleRef, title: service.label, icon: emblem, className: styles.subcategoryTitleClickable, "data-test-id": titleTestId }), _jsx(CardActionsSurface, { className: styles.subcategoryTitleActions, actionsVisibility: 'always', actionsSize: isMobile ? 's' : 'm', tooltip: hasTooltip
36
+ return (_jsxs("div", { className: styles.subcategoryTitle, "data-mobile": isMobile || undefined, children: [_jsxs("div", { className: styles.subcategoryTitleRow, onKeyDown: handleKeyDown, children: [_jsx(TitleClickable, { as: 'a', href: service.href, onClick: handleServiceClick, innerRef: titleRef, title: service.label, icon: getLinkEmblem(service), className: styles.subcategoryTitleClickable, "data-test-id": titleTestId }), _jsx(CardActionsSurface, { className: styles.subcategoryTitleActions, actionsVisibility: 'always', actionsSize: isMobile ? 's' : 'm', tooltip: hasTooltip
42
37
  ? {
43
- tip: description,
38
+ tip: service.description,
44
39
  buttonRef: tooltipTriggerRef,
45
40
  trigger: isMobile ? 'click' : 'hoverAndFocusVisible',
46
41
  'data-test-id': `${titleTestId}-tooltip`,
47
42
  }
48
- : undefined, favorite: cardFavoriteChange
43
+ : undefined, favorite: favorite
49
44
  ? {
50
45
  enabled: true,
51
46
  checked: isFavorite,
52
- onChange: (checked) => cardFavoriteChange(id)(checked),
47
+ onChange: favorite.onChange(service.id),
53
48
  buttonRef: favoriteRef,
54
49
  'data-test-id': `${titleTestId}-favorite`,
55
50
  }
56
- : undefined })] }), showDescription && (_jsx(Typography, { as: 'p', variant: 'body', size: 's', className: styles.subcategoryDescription, "data-test-id": `${titleTestId}-description`, children: description }))] }));
51
+ : undefined })] }), showDescription && (_jsx(Typography, { as: 'p', variant: 'body', size: 's', className: styles.subcategoryDescription, "data-test-id": `${titleTestId}-description`, children: service.description }))] }));
57
52
  }
58
53
  return (
59
54
  // Карточка — ссылка `<a>`: клик по ней бы долетал до `onClick={toggleOpen}` заголовка
60
55
  // родительского CollapseBlockTertiary (см. TODO там) и лишний раз переключал аккордеон.
61
56
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
62
- _jsx("div", { className: styles.subcategoryTitleDraggable, onPointerDown: stopEventPropagation, onClick: stopEventPropagation, children: _jsx(GridServiceCard, { groupId: groupId, service: service, isFavorite: isFavorite, onFavoriteChange: cardFavoriteChange, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescriptionProp, dragEnabled: dragEnabled, expandable: expandable }) }));
57
+ _jsx("div", { className: styles.subcategoryTitleDraggable, onPointerDown: stopEventPropagation, onClick: stopEventPropagation, children: _jsx(DraggableServiceCard, { groupId: groupId, service: service, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescriptionProp, dragDisabled: dragDisabled, expandable: expandable }) }));
63
58
  }
64
- export const SubCategoryTitle = memo(SubCategoryTitleBase);
@@ -46,8 +46,6 @@
46
46
  }
47
47
 
48
48
  .group{
49
- content-visibility:auto;
50
- contain-intrinsic-size:auto var(--sn-primitive-dimension-128, 128px);
51
49
  position:relative;
52
50
  overflow-x:clip;
53
51
  display:flex;
@@ -58,14 +56,6 @@
58
56
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
59
57
  background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
60
58
  }
61
- .group[data-appear]{
62
- animation:group-appear 0.24s cubic-bezier(0.4, 0, 0.2, 1) backwards;
63
- }
64
- @media (prefers-reduced-motion: reduce){
65
- .group[data-appear]{
66
- animation:none;
67
- }
68
- }
69
59
  .group[data-drag-preview]{
70
60
  cursor:grabbing;
71
61
  }
@@ -243,11 +233,4 @@
243
233
 
244
234
  .skeletonService{
245
235
  padding:var(--sn-primitive-dimension-4, 4px);
246
- }
247
-
248
- @keyframes group-appear{
249
- from{
250
- transform:translate(calc(-1 * var(--sn-primitive-dimension-12, 12px)), var(--sn-primitive-dimension-4, 4px));
251
- opacity:0;
252
- }
253
236
  }
@@ -1,10 +1,8 @@
1
1
  import { arrayMove } from '@dnd-kit/sortable';
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  function mergeIdsPreservingOrder(prevIds, nextIds) {
4
- const nextIdSet = new Set(nextIds);
5
- const prevIdSet = new Set(prevIds);
6
- const kept = prevIds.filter(id => nextIdSet.has(id));
7
- const added = nextIds.filter(id => !prevIdSet.has(id));
4
+ const kept = prevIds.filter(id => nextIds.includes(id));
5
+ const added = nextIds.filter(id => !prevIds.includes(id));
8
6
  if (added.length === 0 && kept.length === prevIds.length) {
9
7
  return prevIds;
10
8
  }
@@ -1,16 +1,16 @@
1
1
  import { DragEndEvent } from '@dnd-kit/core';
2
- import { LinksGroup } from '../../../types.js';
3
- import { CardsContextValue } from '../cardsContext.js';
2
+ import { FavoriteProps, LinksGroup } from '../../../types.js';
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 {};
@@ -8,16 +8,16 @@ import { SortableGroupDragPreview } from '../helperComponents/SortableGroup/inde
8
8
  * DnD групп внутри активного сегмента: drag overlay группы поверх `useContentSegmentsSortable`.
9
9
  * Сервис-драг (карточка → избранное) сюда не попадает — фильтруется через `isServiceDragId`.
10
10
  */
11
- export function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favoriteIds, onFavoriteChange, }) {
11
+ export function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favorite, }) {
12
12
  const { setGroupDragOverlay } = useMainMenuDndOverlay();
13
13
  const handleDragStart = useCallback(({ active }) => {
14
14
  if (!isServiceDragId(active.id)) {
15
15
  const activeGroup = visibleGroups.find(({ id }) => id === String(active.id));
16
16
  if (activeGroup) {
17
- setGroupDragOverlay(_jsx(SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: resolveGroupBlockColor(activeGroup.blockColor, showGroupsColors), showDescription: showDescription, favoriteIds: activeGroup.favoritesEnabled ? favoriteIds : undefined, onFavoriteChange: onFavoriteChange, highlight: activeGroup.highlight }));
17
+ setGroupDragOverlay(_jsx(SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: resolveGroupBlockColor(activeGroup.blockColor, showGroupsColors), showDescription: showDescription, favorite: activeGroup.favoritesEnabled ? favorite : undefined, highlight: activeGroup.highlight }));
18
18
  }
19
19
  }
20
- }, [expandedIds, favoriteIds, onFavoriteChange, setGroupDragOverlay, showDescription, showGroupsColors, visibleGroups]);
20
+ }, [expandedIds, favorite, setGroupDragOverlay, showDescription, showGroupsColors, visibleGroups]);
21
21
  const handleDragEnd = useCallback((event) => {
22
22
  setGroupDragOverlay(null);
23
23
  if (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.js';
1
+ import { FavoriteProps, LinksGroup } from '../../types.js';
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;
@@ -2,16 +2,19 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button } from '@cloud-ru/ds-button';
3
3
  import { KebabSVG } from '@cloud-ru/ds-icons/interface/system';
4
4
  import { Droplist } from '@cloud-ru/ds-list';
5
+ import { Scroll } from '@cloud-ru/ds-scroll';
5
6
  import { SegmentControl, WIDTH } from '@cloud-ru/ds-segment-control';
6
- import { useEventHandler, useValueControl } from '@cloud-ru/ds-utils';
7
+ import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
8
+ import { useValueControl } from '@cloud-ru/ds-utils';
7
9
  import cn from 'classnames';
8
10
  import { useMemo } from 'react';
9
11
  import { headerLocale } from '../../../../locale/index.js';
10
12
  import { resolveInnerLinksByIds } from '../../utils/index.js';
11
- import { FavoritesDesktop, FavoritesItemsSkeleton, FavoritesMobile } from './components/index.js';
13
+ import { EmptyState, FavoritesItemsSkeleton, FavoritesSortable } from './components/index.js';
12
14
  import { FAVORITES_SEGMENT, FAVORITES_TEST_IDS } from './constants.js';
13
15
  import styles from './styles.module.css';
14
- export function Favorites({ favorite, servicesById, headerClassName, isMobile }) {
16
+ import { getCommonCardProps } from './utils.js';
17
+ export function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }) {
15
18
  const { t } = headerLocale.useTranslations();
16
19
  const loading = favorite.loading;
17
20
  const [segment, setSegment] = useValueControl({
@@ -23,23 +26,38 @@ export function Favorites({ favorite, servicesById, headerClassName, isMobile })
23
26
  { value: FAVORITES_SEGMENT.Favorites, label: t('favorite.title'), disabled: loading },
24
27
  { value: FAVORITES_SEGMENT.Recent, label: t('recent.title'), disabled: loading },
25
28
  ], [t, loading]);
26
- const favoriteItems = useMemo(() => resolveInnerLinksByIds(favorite.value, servicesById), [favorite.value, servicesById]);
27
- const recentItems = useMemo(() => resolveInnerLinksByIds(favorite.recentServices ?? [], servicesById), [favorite.recentServices, servicesById]);
29
+ const favoriteItems = useMemo(() => resolveInnerLinksByIds(favorite.value, allServiceGroups), [favorite.value, allServiceGroups]);
30
+ const recentItems = useMemo(() => resolveInnerLinksByIds(favorite.recentServices ?? [], allServiceGroups), [favorite.recentServices, allServiceGroups]);
28
31
  const resolvedSegment = segment ?? FAVORITES_SEGMENT.Favorites;
29
- // Стабильные по ссылке колбэки: иначе `memo` карточек и списков-по-сегменту ломается
30
- // при каждом рендере `Favorites` — см. `FavoritesReorderList`/`RecentList`/`FavoritesList`.
31
- const handleRecentServiceClick = useEventHandler((service) => (event) => {
32
+ const isFavoritesSegment = resolvedSegment === FAVORITES_SEGMENT.Favorites;
33
+ const isEmpty = (isFavoritesSegment ? favoriteItems : recentItems).length === 0;
34
+ const handleRecentServiceClick = (service) => (event) => {
32
35
  favorite.onRecentServiceClick?.(service.id, event);
33
36
  service.onClick(event);
34
- });
35
- const handleFavoriteServiceClick = useEventHandler((service) => (event) => {
37
+ };
38
+ const handleFavoriteServiceClick = (service) => (event) => {
36
39
  favorite.onFavoriteServiceClick?.(service.id, event);
37
40
  service.onClick(event);
38
- });
39
- /* Drag&drop реордер и приём карточек из сетки — только на desktop (требует
40
- <DndContext>-предка). На mobile нет reorder-жеста, добавление/удаление
41
- избранного идёт через звёздочку на карточке. Оба варианта сами решают по
42
- сегменту, что рендерить — вся карточко-строительная логика внутри них. */
43
- const content = isMobile ? (_jsx(FavoritesMobile, { favoriteIds: favorite.value, onFavoriteChange: favorite.onChange, favoriteItems: favoriteItems, recentItems: recentItems, segment: resolvedSegment, onFavoriteServiceClick: handleFavoriteServiceClick, onRecentServiceClick: handleRecentServiceClick })) : (_jsx(FavoritesDesktop, { favoriteIds: favorite.value, onFavoriteChange: favorite.onChange, favoriteItems: favoriteItems, recentItems: recentItems, segment: resolvedSegment, setSegment: setSegment, onFavoriteServiceClick: handleFavoriteServiceClick, onRecentServiceClick: handleRecentServiceClick }));
44
- return (_jsxs("div", { className: styles.root, "data-test-id": FAVORITES_TEST_IDS.root, children: [_jsxs("div", { className: cn(styles.header, headerClassName), "data-test-id": FAVORITES_TEST_IDS.header, children: [_jsx(SegmentControl, { size: 'm', width: WIDTH.Full, value: segment, onChange: setSegment, className: styles.segmentControl, "data-test-id": FAVORITES_TEST_IDS.segmentControl, items: segmentControlItems }), favorite.actions && (_jsx(Droplist, { size: 'm', ...favorite.actions, closeDroplistOnItemClick: true, children: _jsx(Button, { view: 'function', size: 'm', appearance: 'neutral', icon: _jsx(KebabSVG, { size: 24 }), "data-test-id": FAVORITES_TEST_IDS.settingsButton, disabled: loading }) }))] }), loading ? _jsx(FavoritesItemsSkeleton, {}) : content] }));
41
+ };
42
+ const recentCards = recentItems.map(service => (_jsx(CardServiceLight, { as: 'a', className: styles.card, actionsVisibility: isMobile ? 'always' : 'hover', favorite: {
43
+ enabled: true,
44
+ checked: favorite.value.includes(service.id),
45
+ onChange: favorite.onChange(service.id),
46
+ }, ...getCommonCardProps(service, handleRecentServiceClick(service)) }, service.id)));
47
+ const content = (() => {
48
+ if (loading) {
49
+ return _jsx(FavoritesItemsSkeleton, {});
50
+ }
51
+ /* Drag&drop реордер и приём карточек из сетки — только на desktop (требует
52
+ <DndContext>-предка). На mobile нет reorder-жеста, добавление/удаление
53
+ избранного идёт через звёздочку на карточке. */
54
+ return isMobile ? (_jsx("div", { className: styles.listScroll, children: _jsx(Scroll, { className: styles.listScrollInner, "data-mobile": isMobile || undefined, overflow: { x: 'hidden' }, children: _jsxs("div", { className: styles.list, "data-test-id": FAVORITES_TEST_IDS.list, children: [isEmpty && _jsx(EmptyState, { isFavoritesSegment: isFavoritesSegment, isMobile: true }), !isEmpty &&
55
+ isFavoritesSegment &&
56
+ favoriteItems.map(service => (_jsx(CardServiceLight, { as: 'a', className: styles.card, actionsVisibility: 'always', favorite: {
57
+ enabled: true,
58
+ checked: true,
59
+ onChange: favorite.onChange(service.id),
60
+ }, ...getCommonCardProps(service, handleFavoriteServiceClick(service)) }, service.id))), !isEmpty && !isFavoritesSegment && recentCards] }) }) })) : (_jsx(FavoritesSortable, { favorite: favorite, favoriteItems: favoriteItems, segment: resolvedSegment, setSegment: setSegment, isEmpty: isEmpty, recentCards: recentCards, onFavoriteServiceClick: handleFavoriteServiceClick }));
61
+ })();
62
+ return (_jsxs("div", { className: styles.root, "data-test-id": FAVORITES_TEST_IDS.root, children: [_jsxs("div", { className: cn(styles.header, headerClassName), "data-test-id": FAVORITES_TEST_IDS.header, children: [_jsx(SegmentControl, { size: 'm', width: WIDTH.Full, value: loading ? undefined : segment, onChange: setSegment, className: styles.segmentControl, "data-test-id": FAVORITES_TEST_IDS.segmentControl, items: segmentControlItems }), favorite.actions && (_jsx(Droplist, { size: 'm', ...favorite.actions, closeDroplistOnItemClick: true, children: _jsx(Button, { view: 'function', size: 'm', appearance: 'neutral', icon: _jsx(KebabSVG, { size: 24 }), "data-test-id": FAVORITES_TEST_IDS.settingsButton, disabled: loading }) }))] }), content] }));
45
63
  }
@@ -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 {};
@@ -1,13 +1,11 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Typography } from '@cloud-ru/ds-typography';
3
- import { memo } from 'react';
4
3
  import { headerLocale } from '../../../../../../locale/index.js';
5
4
  import { FAVORITES_TEST_IDS } from '../../constants.js';
6
5
  import { EmptyFavoriteSVG } from './EmptyFavoriteSVG.js';
7
6
  import { EmptyRecentSVG } from './EmptyRecentSVG.js';
8
7
  import styles from './styles.module.css';
9
- function EmptyStateBase({ isFavoritesSegment, isMobile }) {
8
+ export function EmptyState({ isFavoritesSegment, isMobile }) {
10
9
  const { t } = headerLocale.useTranslations();
11
10
  return (_jsx("div", { className: styles.emptyState, "data-test-id": FAVORITES_TEST_IDS.emptyState, children: isFavoritesSegment ? (_jsxs(_Fragment, { children: [_jsx(EmptyFavoriteSVG, { className: styles.emptyIcon }), _jsx(Typography, { variant: 'body', size: 's', className: styles.emptyText, children: isMobile ? t('favorite.emptyMobile') : t('favorite.emptyDesktop') })] })) : (_jsxs(_Fragment, { children: [_jsx(EmptyRecentSVG, { className: styles.emptyIcon }), _jsx(Typography, { variant: 'body', size: 's', className: styles.emptyText, children: t('recent.empty') })] })) }));
12
11
  }
13
- export const EmptyState = memo(EmptyStateBase);
@@ -0,0 +1,19 @@
1
+ import { MouseEvent, ReactNode } from 'react';
2
+ import { FavoriteProps, InnerLink } from '../../../types.js';
3
+ import { FavoritesSegment } from '../constants.js';
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,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';
3
+ import { DropTarget } from '@cloud-ru/ds-drag-and-drop';
4
+ import { Scroll } from '@cloud-ru/ds-scroll';
5
+ import { FAVORITES_SEGMENT, FAVORITES_TEST_IDS } from '../constants.js';
6
+ import { useFavoritesDnd } from '../hooks/useFavoritesDnd.js';
7
+ import styles from '../styles.module.css';
8
+ import { getCommonCardProps } from '../utils.js';
9
+ import { EmptyState } from './EmptyState/index.js';
10
+ import { SortableFavoriteCard } from './SortableFavoriteCard.js';
11
+ /**
12
+ * Desktop-обёртка тела списка: реордер drag&drop + приём карточек из общей
13
+ * сетки. Требует `<DndContext>`-предка, поэтому `useFavoritesDnd` вызывается
14
+ * только здесь — на mobile этот компонент не рендерится вовсе (см. `Favorites`).
15
+ */
16
+ export function FavoritesSortable({ favorite, favoriteItems, segment, setSegment, isEmpty, recentCards, onFavoriteServiceClick, }) {
17
+ const isFavoritesSegment = segment === FAVORITES_SEGMENT.Favorites;
18
+ const { setNodeRef, listEndRef, favoriteSortableIds, insertIndex, isInsertingToEnd, showDropOver, showInsertNew } = useFavoritesDnd({ favorite, favoriteItems, segment, setSegment });
19
+ return (_jsxs("div", { className: styles.listScroll, "data-insert-new": showInsertNew, children: [_jsx(DropTarget, { active: Boolean(showDropOver), className: styles.dropTarget, "aria-hidden": true }), _jsx(Scroll, { className: styles.listScrollInner, overflow: { x: 'hidden' }, children: _jsxs("div", { ref: setNodeRef, className: styles.list, "data-test-id": FAVORITES_TEST_IDS.list, children: [isEmpty && _jsx(EmptyState, { isFavoritesSegment: isFavoritesSegment }), !isEmpty && isFavoritesSegment && (_jsxs(SortableContext, { items: favoriteSortableIds, strategy: verticalListSortingStrategy, children: [favoriteItems.map((service, index) => (_jsx(SortableFavoriteCard, { serviceId: service.id, showInsertIndicatorBefore: insertIndex === index, showInsertIndicatorAfter: isInsertingToEnd && index === favoriteItems.length - 1, isFirst: index === 0, favorite: {
20
+ enabled: true,
21
+ checked: true,
22
+ onChange: favorite.onChange(service.id),
23
+ }, ...getCommonCardProps(service, onFavoriteServiceClick(service)) }, service.id))), _jsx("div", { ref: listEndRef, className: styles.listEnd, "aria-hidden": true })] })), !isEmpty && !isFavoritesSegment && recentCards] }) })] }));
24
+ }
@@ -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,10 +3,9 @@ import { useSortable } from '@dnd-kit/sortable';
3
3
  import { CSS } from '@dnd-kit/utilities';
4
4
  import { DRAG_MODE, DragGhost, DropIndicator, PLACEMENT } from '@cloud-ru/ds-drag-and-drop';
5
5
  import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
6
- import { memo } from 'react';
7
6
  import { getServiceFavoriteDragId } from '../../../utils/dnd/index.js';
8
7
  import styles from '../styles.module.css';
9
- function SortableFavoriteCardBase({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }) {
8
+ export function SortableFavoriteCard({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }) {
10
9
  const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
11
10
  id: getServiceFavoriteDragId(serviceId),
12
11
  });
@@ -21,4 +20,3 @@ function SortableFavoriteCardBase({ serviceId, className, showInsertIndicatorBef
21
20
  const { tabIndex, ...restAttributes } = attributes ?? {};
22
21
  return (_jsxs(DragGhost, { innerRef: setNodeRef, style: style, className: styles.sortableCard, dragging: isDragging, mode: DRAG_MODE.Dynamic, ...listeners, ...restAttributes, children: [showInsertIndicatorBefore && _jsx(DropIndicator, { placement: PLACEMENT.Before, atEdge: isFirst }), _jsx(CardServiceLight, { as: 'a', ...cardProps, className: className ?? styles.card, tabIndex: tabIndex }), showInsertIndicatorAfter && _jsx(DropIndicator, { placement: PLACEMENT.After, atEdge: true })] }));
23
22
  }
24
- export const SortableFavoriteCard = memo(SortableFavoriteCardBase);
@@ -1,5 +1,4 @@
1
1
  export * from './SortableFavoriteCard.js';
2
2
  export * from './EmptyState/index.js';
3
- export * from './FavoritesDesktop.js';
3
+ export * from './FavoritesSortable.js';
4
4
  export * from './FavoritesItemsSkeleton.js';
5
- export * from './FavoritesMobile.js';
@@ -1,5 +1,4 @@
1
1
  export * from './SortableFavoriteCard.js';
2
2
  export * from './EmptyState/index.js';
3
- export * from './FavoritesDesktop.js';
3
+ export * from './FavoritesSortable.js';
4
4
  export * from './FavoritesItemsSkeleton.js';
5
- export * from './FavoritesMobile.js';
@@ -0,0 +1,25 @@
1
+ import { FavoriteProps, InnerLink } from '../../../types.js';
2
+ import { FavoritesSegment } from '../constants.js';
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 {};