@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
@@ -320,8 +320,6 @@
320
320
  }
321
321
 
322
322
  .group{
323
- content-visibility:auto;
324
- contain-intrinsic-size:auto var(--sn-primitive-dimension-128, 128px);
325
323
  position:relative;
326
324
  overflow-x:clip;
327
325
  display:flex;
@@ -332,14 +330,6 @@
332
330
  border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
333
331
  background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
334
332
  }
335
- .group[data-appear]{
336
- animation:group-appear 0.24s cubic-bezier(0.4, 0, 0.2, 1) backwards;
337
- }
338
- @media (prefers-reduced-motion: reduce){
339
- .group[data-appear]{
340
- animation:none;
341
- }
342
- }
343
333
  .group[data-drag-preview]{
344
334
  cursor:grabbing;
345
335
  }
@@ -518,23 +508,6 @@
518
508
  .skeletonService{
519
509
  padding:var(--sn-primitive-dimension-4, 4px);
520
510
  }
521
-
522
- @keyframes group-appear{
523
- from{
524
- transform:translate(calc(-1 * var(--sn-primitive-dimension-12, 12px)), var(--sn-primitive-dimension-4, 4px));
525
- opacity:0;
526
- }
527
- }
528
- .content{
529
- display:flex;
530
- flex-direction:column;
531
- gap:var(--sn-primitive-dimension-4, 4px);
532
- width:100%;
533
- min-width:0;
534
- }
535
- .content[data-mobile]{
536
- gap:var(--sn-primitive-dimension-8, 8px);
537
- }
538
511
  .content[data-empty]{
539
512
  height:100%;
540
513
  }
@@ -542,12 +515,6 @@
542
515
  flex:1 1 auto;
543
516
  }
544
517
 
545
- .top{
546
- display:flex;
547
- flex-direction:column;
548
- gap:inherit;
549
- }
550
-
551
518
  .noData{
552
519
  flex:1 1 auto;
553
520
  place-self:center center;
@@ -735,6 +702,11 @@
735
702
  .rightContent{
736
703
  container-type:inline-size;
737
704
  overflow-x:clip;
705
+ display:flex;
706
+ flex-direction:column;
707
+ gap:var(--sn-primitive-dimension-4, 4px);
708
+ width:100%;
709
+ min-width:0;
738
710
  padding:var(--sn-primitive-dimension-16, 16px);
739
711
  }
740
712
 
@@ -786,6 +758,13 @@
786
758
  padding:0 var(--sn-primitive-dimension-4, 4px);
787
759
  }
788
760
 
761
+ .rightContent{
762
+ display:flex;
763
+ flex-direction:column;
764
+ gap:var(--sn-primitive-dimension-8, 8px);
765
+ min-width:0;
766
+ }
767
+
789
768
  .drawerMobile{
790
769
  background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3))) !important;
791
770
  }
@@ -887,15 +866,10 @@
887
866
  border-radius:var(--sn-density-radius-3xs, var(--sn-platform-comfort-radius-3xs, var(--sn-primitive-dimension-2, 2px)));
888
867
  }
889
868
 
890
- .draggableCard,
891
- .staticCard{
869
+ .draggableCard{
892
870
  display:flex;
893
871
  min-width:0;
894
872
  }
895
-
896
- .staticCard{
897
- position:relative;
898
- }
899
873
  .breadcrumbs{
900
874
  display:flex;
901
875
  align-items:center;
@@ -4,7 +4,6 @@ import { ElementType } from 'react';
4
4
  export type HeaderButtonProps<T extends ElementType = 'button'> = Omit<ButtonProps<T>, 'size' | 'appearance' | 'view'> & {
5
5
  /** Настройки тултипа. `placement` и `disableSpanWrapper` зафиксированы под анатомию хедера */
6
6
  tooltip?: Omit<TooltipProps, 'placement'>;
7
- /** Мобильная раскладка — тултип не показывается (на mobile нет hover). */
8
7
  isMobile?: boolean;
9
8
  };
10
9
  /**
@@ -1,17 +1,11 @@
1
1
  import { WithSupportProps } from '@cloud-ru/ds-utils';
2
2
  import { ReactNode } from 'react';
3
3
  export type HeaderLayoutProps = WithSupportProps<{
4
- /** CSS-класс корневого элемента. */
5
4
  className?: string;
6
- /** Слот главного меню (слева, после логотипа). */
7
5
  menu?: ReactNode;
8
- /** Слот логотипа (крайний левый). */
9
6
  logo?: ReactNode;
10
- /** Слот селектора (например, выбор облака/организации), после меню. */
11
7
  select?: ReactNode;
12
- /** Слот хлебных крошек. На mobile переносится под основную строку хедера. */
13
8
  breadcrumbs?: ReactNode;
14
- /** Слот тулбара — правая часть хедера. */
15
9
  toolbar?: ReactNode;
16
10
  }>;
17
11
  export declare function HeaderLayout({ menu, logo, select, breadcrumbs, toolbar, className, ...rest }: HeaderLayoutProps): import("react/jsx-runtime").JSX.Element;
@@ -3,19 +3,12 @@ import { WithSupportProps } from '@cloud-ru/ds-utils';
3
3
  import { MouseEventHandler } from 'react';
4
4
  import { HeaderLogoMode } from './constants.js';
5
5
  export type LogoProps = WithSupportProps<{
6
- /** Флаг загрузки — логотип показывается в состоянии загрузки кнопки. */
7
6
  loading?: boolean;
8
- /** Путь до кастомного изображения логотипа. Без пропа (или при ошибке загрузки) — дефолтная иконка. */
9
7
  path?: string;
10
- /** Режим окружения — отображается промо-тегом рядом с дефолтной иконкой (не для `'prod'`). */
11
8
  mode?: HeaderLogoMode;
12
- /** Ссылка логотипа. */
13
9
  href: string;
14
- /** Колбэк клика по логотипу. */
15
10
  onClick?: MouseEventHandler<HTMLAnchorElement>;
16
- /** CSS-класс корневого элемента. */
17
11
  className?: string;
18
- /** Настройки тултипа логотипа. */
19
12
  tooltip?: TooltipProps;
20
13
  }>;
21
14
  export declare function Logo({ path, loading, mode, href, onClick, className, tooltip, ...rest }: LogoProps): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { MainMenuSVG } from '@cloud-ru/ds-icons/interface/product';
3
3
  import { useValueControl } from '@cloud-ru/ds-utils';
4
- import { useCallback, useEffect } from 'react';
4
+ import { useEffect } from 'react';
5
5
  import { TEST_IDS } from '../../constants.js';
6
6
  import { useMobileLayout } from '../../hooks/useMobileLayout.js';
7
7
  import { headerLocale } from '../../locale/index.js';
@@ -11,16 +11,13 @@ import { MenuMobile } from './helperComponents/MenuMobile/index.js';
11
11
  export function MainMenu({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, logo, leftTop, leftBottom, rightTop, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, disabled, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }) {
12
12
  const { t } = headerLocale.useTranslations();
13
13
  const [open = false, setOpen] = useValueControl({ value: openProp, onChange: setOpenProp });
14
- const searchValue = search?.value;
15
- const onSearchChange = search?.onChange;
16
14
  useEffect(() => {
17
- if (!open && searchValue)
18
- onSearchChange?.('');
19
- }, [open, searchValue, onSearchChange]);
20
- const handleOpen = useCallback(() => {
21
- setOpen(true);
22
- }, [setOpen]);
15
+ if (!open && search?.value)
16
+ search?.onChange('');
17
+ }, [open, search]);
23
18
  const isMobile = useMobileLayout();
24
19
  const MenuComponent = isMobile ? MenuMobile : MenuDesktop;
25
- return (_jsxs(_Fragment, { children: [_jsx(HeaderButton, { tooltip: open ? undefined : { tip: t('services') }, isMobile: isMobile, disabled: disabled, icon: _jsx(MainMenuSVG, {}), onClick: handleOpen, "data-test-id": TEST_IDS.mainMenu.drawerButton }), _jsx(MenuComponent, { settingItems: settingItems, segments: segments, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, platformGroups: platformGroups, search: search, logo: logo, leftTop: leftTop, leftBottom: leftBottom, rightTop: rightTop, favorite: favorite, open: open, setOpen: setOpen, preferences: preferences, defaultWidth: defaultWidth, onWidthChangeEnd: onWidthChangeEnd, draggerTooltip: draggerTooltip, loading: loading })] }));
20
+ return (_jsxs(_Fragment, { children: [_jsx(HeaderButton, { tooltip: open ? undefined : { tip: t('services') }, isMobile: isMobile, disabled: disabled, icon: _jsx(MainMenuSVG, {}), onClick: () => {
21
+ setOpen(true);
22
+ }, "data-test-id": TEST_IDS.mainMenu.drawerButton }), _jsx(MenuComponent, { settingItems: settingItems, segments: segments, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, platformGroups: platformGroups, search: search, logo: logo, leftTop: leftTop, leftBottom: leftBottom, rightTop: rightTop, favorite: favorite, open: open, setOpen: setOpen, preferences: preferences, defaultWidth: defaultWidth, onWidthChangeEnd: onWidthChangeEnd, draggerTooltip: draggerTooltip, loading: loading })] }));
26
23
  }
@@ -40,7 +40,6 @@ export type ContentProps = {
40
40
  * Колбэк клика по карточке сервиса в сегменте.
41
41
  */
42
42
  onSegmentServiceClick?(service: InnerLink, e?: MouseEvent<HTMLElement>): void;
43
- /** Избранное. Без пропа группа-предок карточек драга из избранного не активируется. */
44
43
  favorite?: FavoriteProps;
45
44
  /**
46
45
  * Настройки меню (модалка по кнопке в тулбаре): описания карточек, цвета групп.
@@ -48,17 +47,12 @@ export type ContentProps = {
48
47
  * Не передано — кнопка настроек в тулбаре не отображается.
49
48
  */
50
49
  preferences?: MainMenuPreferencesProps;
51
- /** Текущее значение поисковой строки — переключает контент между каталогом и результатами поиска. */
52
50
  searchValue?: string;
53
- /** Слот поисковой строки — рендерится над контентом. */
54
51
  search?: ReactNode;
55
52
  /** Слот над тулбаром правой колонки (например, баннеры) */
56
53
  rightTop?: ReactNode;
57
- /** Слот под сеткой карточек. */
58
54
  footer?: ReactNode;
59
- /** Мобильная раскладка. */
60
55
  isMobile?: boolean;
61
- /** CSS-класс корневого элемента. */
62
56
  className?: string;
63
57
  /** Флаг загрузки данных */
64
58
  loading?: boolean;
@@ -1,22 +1,18 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';
3
3
  import { Accordion } from '@cloud-ru/ds-accordion';
4
4
  import { CrossSVG, SearchSVG } from '@cloud-ru/ds-icons/interface/system';
5
5
  import { InfoBlock } from '@cloud-ru/ds-info-block';
6
- import { useEventHandler, useValueControl } from '@cloud-ru/ds-utils';
6
+ import { useValueControl } from '@cloud-ru/ds-utils';
7
7
  import cn from 'classnames';
8
8
  import { useCallback, useDeferredValue, useMemo } from 'react';
9
9
  import { headerLocale } from '../../../../locale/index.js';
10
- import { noop } from '../../../../utils/noop.js';
11
10
  import { shouldBeOpenedInNewTab } from '../../../../utils/shouldBeOpenedInNewTab.js';
12
11
  import { getLinksGroupVisibleItemsCount, resolveGroupBlockColor } from '../../utils/index.js';
13
- import { MountAnimation } from '../MountAnimation/index.js';
14
- import { CardsContext } from './cardsContext.js';
15
12
  import { TEST_IDS } from './constants.js';
16
13
  import { ContentToolbar } from './helperComponents/ContentToolbar/index.js';
17
14
  import { SortableGroup, SortableGroupSkeleton } from './helperComponents/SortableGroup/index.js';
18
15
  import { useContentSegmentsSortable } from './hooks/useContentSegmentsSortable.js';
19
- import { useProgressiveCount } from './hooks/useProgressiveCount.js';
20
16
  import { useSegmentDnd } from './hooks/useSegmentDnd.js';
21
17
  import styles from './styles.module.css';
22
18
  export function Content({ searchValue, search, rightTop, segments, searchGroups = [], segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, className, footer, favorite, isMobile, preferences, loading, }) {
@@ -31,8 +27,7 @@ export function Content({ searchValue, search, rightTop, segments, searchGroups
31
27
  });
32
28
  const isSearching = Boolean(searchValue);
33
29
  const enableServiceDrag = Boolean(favorite) && !isMobile && !isSearching;
34
- // Ссылки на обработчики стабильны: иначе `memo` карточек ломается при каждом рендере потребителя.
35
- const handleLinkClick = useEventHandler((service, e) => {
30
+ const handleLinkClick = useCallback((service, e) => {
36
31
  if (service.disabled) {
37
32
  e?.preventDefault();
38
33
  return;
@@ -42,11 +37,7 @@ export function Content({ searchValue, search, rightTop, segments, searchGroups
42
37
  }
43
38
  onSegmentServiceClick?.(service, e);
44
39
  service.onClick?.(e);
45
- });
46
- const handleFavoriteChange = useEventHandler((productId) => (favorite ? favorite.onChange(productId) : noop));
47
- const favoriteValue = favorite?.value;
48
- const favoriteIds = useMemo(() => (favoriteValue ? new Set(favoriteValue) : undefined), [favoriteValue]);
49
- const showGroupsColors = preferences?.showGroupsColors?.value;
40
+ }, [onSegmentServiceClick]);
50
41
  const { orderedGroups, expandedIds, onExpandedChange, handleDragEnd: handleSortableDragEnd, } = useContentSegmentsSortable({
51
42
  segments,
52
43
  activeSegmentId: segmentId,
@@ -64,50 +55,35 @@ export function Content({ searchValue, search, rightTop, segments, searchGroups
64
55
  expandedIds,
65
56
  onSortableDragEnd: handleSortableDragEnd,
66
57
  showDescription,
67
- showGroupsColors,
68
- favoriteIds,
69
- onFavoriteChange: handleFavoriteChange,
58
+ showGroupsColors: preferences?.showGroupsColors?.value,
59
+ favorite,
70
60
  });
71
- // Первый экран монтируется сразу, остальные группы дорисовываются порциями (см. `useProgressiveCount`).
72
- const renderedGroupsCount = useProgressiveCount(visibleGroups.length, `${segmentId}|${isSearching}`, !loading);
73
- const renderedGroups = useMemo(() => (renderedGroupsCount < visibleGroups.length ? visibleGroups.slice(0, renderedGroupsCount) : visibleGroups), [visibleGroups, renderedGroupsCount]);
74
- const expandedIdsSet = useMemo(() => new Set(expandedIds), [expandedIds]);
75
- const visibleGroupIds = useMemo(() => visibleGroups.map(({ id }) => id), [visibleGroups]);
76
- const allGroupsExpanded = visibleGroups.length > 0 && visibleGroupIds.every(id => expandedIdsSet.has(id));
61
+ const allGroupsExpanded = visibleGroups.length > 0 && visibleGroups.every(({ id }) => expandedIds.includes(id));
77
62
  const handleToggleAllGroupsExpanded = useCallback(() => {
63
+ const visibleIds = visibleGroups.map(({ id }) => id);
78
64
  if (allGroupsExpanded) {
79
- const visibleIdsSet = new Set(visibleGroupIds);
80
- onExpandedChange(expandedIds.filter(id => !visibleIdsSet.has(id)));
65
+ onExpandedChange(expandedIds.filter(id => !visibleIds.includes(id)));
81
66
  return;
82
67
  }
83
- onExpandedChange([...new Set([...expandedIds, ...visibleGroupIds])]);
84
- }, [allGroupsExpanded, expandedIds, onExpandedChange, visibleGroupIds]);
85
- const cardsContext = useMemo(() => ({
86
- showDescription,
87
- isMobile,
88
- dragEnabled: enableServiceDrag,
89
- favoriteIds,
90
- onFavoriteChange: favoriteIds ? handleFavoriteChange : undefined,
91
- onServiceClick: handleLinkClick,
92
- }), [showDescription, isMobile, enableServiceDrag, favoriteIds, handleFavoriteChange, handleLinkClick]);
68
+ onExpandedChange([...new Set([...expandedIds, ...visibleIds])]);
69
+ }, [allGroupsExpanded, expandedIds, onExpandedChange, visibleGroups]);
93
70
  const segmentItems = useMemo(() => segments?.map(segment => ({
94
71
  value: segment.id,
95
72
  label: segment.label,
96
73
  icon: segment.icon,
97
74
  })), [segments]);
98
75
  const hasCards = visibleGroups.length > 0;
99
- const mountAnimationType = isMobile ? undefined : 'fade-slide-up-right';
100
76
  const cards = (() => {
101
77
  if (loading) {
102
78
  return Array.from({ length: 5 }).map((_, index) => _jsx(SortableGroupSkeleton, { isMobile: isMobile }, index));
103
79
  }
104
80
  if (hasCards) {
105
- return (_jsx(SortableContext, { items: visibleGroupIds, strategy: verticalListSortingStrategy, children: _jsx(CardsContext.Provider, { value: cardsContext, children: _jsx(Accordion, { selectionMode: 'multiple', expanded: expandedIds, onExpandedChange: onExpandedChange, children: renderedGroups.map(({ id, label, icon, items, favoritesEnabled, blockColor, highlight }) => (_jsx(SortableGroup, { id: id, icon: icon, label: label, items: items, isExpanded: expandedIdsSet.has(id), blockColor: resolveGroupBlockColor(blockColor, showGroupsColors), isMobile: isMobile, enableServiceDrag: enableServiceDrag, groupFavoritesEnabled: favoritesEnabled, appear: !isMobile, highlight: highlight }, id))) }) }) }));
81
+ return (_jsx(SortableContext, { items: visibleGroups.map(({ id }) => id), strategy: verticalListSortingStrategy, children: _jsx(Accordion, { selectionMode: 'multiple', expanded: expandedIds, onExpandedChange: onExpandedChange, children: visibleGroups.map(({ id, label, icon, items, favoritesEnabled, blockColor, highlight }) => (_jsx(SortableGroup, { id: id, icon: icon, label: label, items: items, isExpanded: expandedIds.includes(id), blockColor: resolveGroupBlockColor(blockColor, preferences?.showGroupsColors?.value), showDescription: showDescription, isMobile: isMobile, enableServiceDrag: enableServiceDrag, favorite: favorite, groupFavoritesEnabled: favoritesEnabled, onServiceClick: handleLinkClick, highlight: highlight }, id))) }) }));
106
82
  }
107
83
  return (_jsx(InfoBlock, { size: 'm', icon: {
108
84
  icon: isSearching ? SearchSVG : CrossSVG,
109
85
  appearance: 'neutral',
110
86
  }, content: isSearching ? t('noDataFound') : t('noData'), "data-test-id": isSearching ? TEST_IDS.noDataFound : TEST_IDS.noData, "data-mobile": isMobile || undefined, className: styles.noData }));
111
87
  })();
112
- return (_jsxs(_Fragment, { children: [search, _jsxs("div", { className: cn(styles.content, className), "data-mobile": isMobile || undefined, "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && (_jsx(_Fragment, { children: _jsxs(MountAnimation, { type: mountAnimationType, className: styles.top, children: [_jsx(ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), rightTop] }) })), cards, footer] })] }));
88
+ return (_jsxs(_Fragment, { children: [search, _jsxs("div", { className: cn(styles.content, className), "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && (_jsxs(_Fragment, { children: [_jsx(ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), rightTop] })), cards, footer] })] }));
113
89
  }
@@ -1,27 +1,18 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { MainMenuPreferencesProps } from '../../../../types.js';
3
3
  export type ContentToolbarSegmentItem = {
4
- /** Значение сегмента (id). */
5
4
  value: string;
6
- /** Подпись сегмента. */
7
5
  label: string;
8
- /** Иконка сегмента. */
9
6
  icon?: ReactNode;
10
7
  };
11
8
  export type ContentToolbarProps = {
12
- /** Значение активного сегмента SegmentControl. */
13
9
  segment: string;
14
- /** Колбэк смены активного сегмента. */
15
10
  onSegmentChange(segment: string): void;
16
- /** Пункты SegmentControl. Без пунктов (или с одним) SegmentControl не отображается. */
17
11
  segmentItems?: ContentToolbarSegmentItem[];
18
- /** Все группы сегмента раскрыты — определяет иконку кнопки свернуть/развернуть все. */
19
12
  allGroupsExpanded: boolean;
20
- /** Колбэк клика по кнопке свернуть/развернуть все группы. */
21
13
  onToggleAllGroupsExpanded(): void;
22
14
  /** Настройки меню (модалка по кнопке). Не передано — кнопка настроек не отображается. */
23
15
  preferences?: MainMenuPreferencesProps;
24
- /** Мобильная раскладка — кнопка свернуть/развернуть все скрывается. */
25
16
  isMobile?: boolean;
26
17
  /** Флаг загрузки данных — сегменты подгружаются с бэка, поэтому SegmentControl тоже уходит в скелетон. */
27
18
  loading?: boolean;
@@ -1,31 +1,12 @@
1
1
  import { LinksGroup, LinksGroupBlockColor, LinksGroupTitle } from '../../../../types.js';
2
- import { CardsContextValue } from '../../cardsContext.js';
3
- export type SortableGroupProps = Pick<LinksGroup, 'icon' | 'items'> & {
4
- /** Id группы. */
2
+ import { SortableGroupCardsProps } from './components/index.js';
3
+ export type SortableGroupProps = Omit<SortableGroupCardsProps, 'groupId'> & Pick<LinksGroup, 'icon'> & {
5
4
  id: string;
6
- /** Заголовок группы. */
7
5
  label: LinksGroupTitle;
8
- /** Раскрыта ли группа. */
9
6
  isExpanded?: boolean;
10
- /** Мобильная раскладка. */
11
- isMobile?: boolean;
12
- /** Группу можно перетаскивать (иначе рендерится без `useSortable`). */
13
- enableServiceDrag?: boolean;
14
- /** Цвет блока группы. */
15
7
  blockColor?: LinksGroupBlockColor;
16
- /** Визуальное выделение группы. */
17
8
  highlight?: boolean;
18
- /** Разрешено ли добавление карточек группы в избранное. */
19
9
  groupFavoritesEnabled?: boolean;
20
- /** Группа появляется с fade-in при монтировании (на desktop; на mobile анимирует контейнер). */
21
- appear?: boolean;
22
10
  };
23
- declare function SortableGroupBase(props: SortableGroupProps): import("react/jsx-runtime").JSX.Element;
24
- export declare const SortableGroup: import("react").MemoExoticComponent<typeof SortableGroupBase>;
25
- export type SortableGroupDragPreviewProps = Omit<SortableGroupProps, 'enableServiceDrag'> & Pick<CardsContextValue, 'showDescription' | 'favoriteIds' | 'onFavoriteChange'>;
26
- /**
27
- * Превью группы в `DragOverlay`. Рендерится вне `Content`, поэтому свой `CardsContext` собирает
28
- * сам: без drag-обвязки карточек и без обработчика клика.
29
- */
30
- export declare function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favoriteIds, onFavoriteChange, groupFavoritesEnabled, blockColor, highlight, }: SortableGroupDragPreviewProps): import("react/jsx-runtime").JSX.Element;
31
- export {};
11
+ export declare function SortableGroup({ id, icon, label, items, isExpanded, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, blockColor, highlight, }: SortableGroupProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favorite, groupFavoritesEnabled, blockColor, highlight, }: Omit<SortableGroupProps, 'enableServiceDrag'>): import("react/jsx-runtime").JSX.Element;
@@ -4,27 +4,14 @@ import { CSS } from '@dnd-kit/utilities';
4
4
  import { Accordion } from '@cloud-ru/ds-accordion';
5
5
  import { DRAG_MODE, DragGhost, DragPreview } from '@cloud-ru/ds-drag-and-drop';
6
6
  import { useThemeAppearance } from '@cloud-ru/ds-theme';
7
- import { memo, useCallback, useState } from 'react';
8
- import { CardsContext } from '../../cardsContext.js';
9
7
  import { TEST_IDS } from '../../constants.js';
10
8
  import { SortableGroupCards, SortableGroupHeader } from './components/index.js';
11
9
  import styles from './styles.module.css';
12
- function GroupView({ id, icon, label, items, isExpanded, isMobile, enableServiceDrag, groupFavoritesEnabled = true, blockColor, highlight, appear, attributes, listeners, setNodeRef, style, isDragging, }) {
13
- const { colorScheme } = useThemeAppearance().appearance;
14
- // Появление проигрывается один раз. React переставляет узлы `insertBefore`, а браузер при
15
- // повторной вставке перезапускает CSS-анимацию — при перетаскивании группы соседи «моргали».
16
- // После окончания флаг снимается, и перестановка анимацию уже не запускает.
17
- const [isAppearing, setIsAppearing] = useState(Boolean(appear));
18
- const handleAnimationEnd = useCallback((event) => {
19
- // `animationend` всплывает от вложенных анимаций — нужна только своя.
20
- if (event.target === event.currentTarget) {
21
- setIsAppearing(false);
22
- }
23
- }, []);
24
- return (_jsxs(DragGhost, { innerRef: setNodeRef, id: id, style: style, className: styles.group, dragging: isDragging, mode: DRAG_MODE.Dynamic, "data-appear": isAppearing || undefined, onAnimationEnd: handleAnimationEnd, "data-test-id": `${TEST_IDS.groupCard}-${id}`, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx(Accordion.CollapseBlockTertiary, { id: id, showChevron: false, afterTitle: _jsx(SortableGroupHeader, { label: label, icon: icon, isExpanded: isExpanded, enableServiceDrag: enableServiceDrag, attributes: attributes, listeners: listeners, isMobile: isMobile }), children: _jsx(SortableGroupCards, { groupId: id, items: items, groupFavoritesEnabled: groupFavoritesEnabled }) })] }));
25
- }
26
- function DraggableGroup(props) {
27
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: props.id });
10
+ export function SortableGroup({ id, icon, label, items, isExpanded, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled = true, onServiceClick, blockColor, highlight, }) {
11
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
12
+ id,
13
+ disabled: !enableServiceDrag,
14
+ });
28
15
  const style = {
29
16
  // CSS.Transform добавляет scaleX/scaleY, из-за чего перетаскиваемая группа "растягивается"
30
17
  // при пересечении с соседней группой другой высоты. CSS.Translate использует только сдвиг.
@@ -33,25 +20,10 @@ function DraggableGroup(props) {
33
20
  transform: transform ? CSS.Translate.toString(transform) : undefined,
34
21
  transition,
35
22
  };
36
- return (_jsx(GroupView, { ...props, attributes: attributes, listeners: listeners, setNodeRef: setNodeRef, style: style, isDragging: isDragging }));
37
- }
38
- function SortableGroupBase(props) {
39
- // Без drag (mobile, поиск, нет избранного) группа не регистрируется в `SortableContext`.
40
- return props.enableServiceDrag ? _jsx(DraggableGroup, { ...props }) : _jsx(GroupView, { ...props });
23
+ const { colorScheme } = useThemeAppearance().appearance;
24
+ return (_jsxs(DragGhost, { innerRef: setNodeRef, id: id, style: style, className: styles.group, dragging: isDragging, mode: DRAG_MODE.Dynamic, "data-test-id": `${TEST_IDS.groupCard}-${id}`, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx(Accordion.CollapseBlockTertiary, { id: id, showChevron: false, afterTitle: _jsx(SortableGroupHeader, { label: label, icon: icon, isExpanded: isExpanded, enableServiceDrag: enableServiceDrag, attributes: attributes, listeners: listeners, isMobile: isMobile }), children: _jsx(SortableGroupCards, { groupId: id, items: items, showDescription: showDescription, isMobile: isMobile, enableServiceDrag: enableServiceDrag, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled, onServiceClick: onServiceClick }) })] }));
41
25
  }
42
- export const SortableGroup = memo(SortableGroupBase);
43
- /**
44
- * Превью группы в `DragOverlay`. Рендерится вне `Content`, поэтому свой `CardsContext` собирает
45
- * сам: без drag-обвязки карточек и без обработчика клика.
46
- */
47
- export function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favoriteIds, onFavoriteChange, groupFavoritesEnabled, blockColor, highlight, }) {
26
+ export function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favorite, groupFavoritesEnabled, blockColor, highlight, }) {
48
27
  const { colorScheme } = useThemeAppearance().appearance;
49
- const cardsContext = {
50
- showDescription,
51
- isMobile,
52
- dragEnabled: false,
53
- favoriteIds,
54
- onFavoriteChange,
55
- };
56
- return (_jsx(DragPreview, { className: styles.groupDragPreview, children: _jsxs("div", { className: styles.group, "data-drag-preview": true, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx("div", { className: styles.groupDragPreviewHeader, children: _jsx(SortableGroupHeader, { label: label, isExpanded: isExpanded, isMobile: isMobile, enableServiceDrag: true }) }), isExpanded && (_jsx(CardsContext.Provider, { value: cardsContext, children: _jsx(SortableGroupCards, { groupId: id, items: items, groupFavoritesEnabled: groupFavoritesEnabled }) }))] }) }));
28
+ return (_jsx(DragPreview, { className: styles.groupDragPreview, children: _jsxs("div", { className: styles.group, "data-drag-preview": true, children: [_jsx("div", { className: styles.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: _jsx("div", { className: styles.decorationBackground, children: _jsx("div", { className: styles.colorMarker, "data-block-color": blockColor }) }) }), _jsx("div", { className: styles.groupDragPreviewHeader, children: _jsx(SortableGroupHeader, { label: label, isExpanded: isExpanded, isMobile: isMobile, enableServiceDrag: true }) }), isExpanded && (_jsx(SortableGroupCards, { groupId: id, items: items, showDescription: showDescription, isMobile: isMobile, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled }))] }) }));
57
29
  }
@@ -1,12 +1,9 @@
1
1
  import { InnerLink } from '../../../../../types.js';
2
- export type SortableGroupCardsProps = {
3
- /** Id группы-предка. */
2
+ import { ServiceCardProps } from '../../../../ServiceCard/index.js';
3
+ export type SortableGroupCardsProps = Pick<ServiceCardProps, 'showDescription' | 'isMobile' | 'favorite' | 'onServiceClick'> & {
4
4
  groupId: string;
5
- /** Карточки сервисов группы. */
6
5
  items: InnerLink[];
7
- /** Разрешено ли добавление карточек группы в избранное. */
6
+ enableServiceDrag?: boolean;
8
7
  groupFavoritesEnabled?: boolean;
9
8
  };
10
- declare function SortableGroupCardsBase({ groupId, items, groupFavoritesEnabled }: SortableGroupCardsProps): import("react/jsx-runtime").JSX.Element;
11
- export declare const SortableGroupCards: import("react").MemoExoticComponent<typeof SortableGroupCardsBase>;
12
- export {};
9
+ export declare function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }: SortableGroupCardsProps): import("react/jsx-runtime").JSX.Element;
@@ -1,22 +1,17 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { memo } from 'react';
3
2
  import { isSubCategoryCard } from '../../../../../utils/innerLink.js';
4
- import { GridServiceCard } from '../../../../ServiceCard/index.js';
5
- import { useCardsContext } from '../../../cardsContext.js';
3
+ import { DraggableServiceCard } from '../../../../ServiceCard/index.js';
6
4
  import styles from '../styles.module.css';
7
5
  import { SubCategory } from './SubCategory/index.js';
8
- function SortableGroupCardsBase({ groupId, items, groupFavoritesEnabled }) {
9
- const { isMobile, showDescription, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick } = useCardsContext();
10
- const cardFavoriteChange = favoriteIds ? onFavoriteChange : undefined;
6
+ export function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }) {
11
7
  return (_jsx("div", { className: styles.groupBody, "data-mobile": isMobile || undefined, children: items.map(service => {
12
8
  if (service.hidden) {
13
9
  return null;
14
10
  }
15
11
  const key = String(groupId) + service.id;
16
12
  if (isSubCategoryCard(service)) {
17
- return (_jsx(SubCategory, { groupId: groupId, service: service, groupFavoritesEnabled: groupFavoritesEnabled }, key));
13
+ return (_jsx(SubCategory, { groupId: groupId, service: service, showDescription: showDescription, isMobile: isMobile, dragDisabled: !enableServiceDrag, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled, onServiceClick: onServiceClick }, key));
18
14
  }
19
- return (_jsx(GridServiceCard, { groupId: groupId, service: service, isFavorite: favoriteIds?.has(service.id), onFavoriteChange: cardFavoriteChange, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragEnabled: dragEnabled }, key));
15
+ return (_jsx(DraggableServiceCard, { groupId: groupId, service: service, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: !enableServiceDrag }, key));
20
16
  }) }));
21
17
  }
22
- export const SortableGroupCards = memo(SortableGroupCardsBase);
@@ -1,8 +1,6 @@
1
1
  import { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';
2
2
  export type SortableGroupDragHandleProps = {
3
- /** ARIA-атрибуты `dnd-kit` draggable-элемента. */
4
3
  attributes?: DraggableAttributes;
5
- /** Обработчики событий `dnd-kit` для инициации перетаскивания. */
6
4
  listeners?: DraggableSyntheticListeners;
7
5
  };
8
6
  export declare function SortableGroupDragHandle({ attributes, listeners }: SortableGroupDragHandleProps): import("react/jsx-runtime").JSX.Element;
@@ -6,6 +6,4 @@ export type SortableGroupHeaderProps = Pick<LinksGroup, 'icon'> & {
6
6
  enableServiceDrag?: boolean;
7
7
  isMobile?: boolean;
8
8
  } & SortableGroupDragHandleProps;
9
- declare function SortableGroupHeaderBase({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }: SortableGroupHeaderProps): import("react/jsx-runtime").JSX.Element;
10
- export declare const SortableGroupHeader: import("react").MemoExoticComponent<typeof SortableGroupHeaderBase>;
11
- export {};
9
+ export declare function SortableGroupHeader({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }: SortableGroupHeaderProps): import("react/jsx-runtime").JSX.Element;
@@ -3,15 +3,13 @@ import { Button } from '@cloud-ru/ds-button';
3
3
  import { ChevronDownSVG, ChevronUpSVG } from '@cloud-ru/ds-icons/interface/system';
4
4
  import { Typography } from '@cloud-ru/ds-typography';
5
5
  import { TitleClickable } from '@cloud-ru/ds-uikit-product-title-clickable';
6
- import { memo, useCallback } from 'react';
7
6
  import { getLinkEmblem } from '../../../../../utils/index.js';
8
7
  import styles from '../styles.module.css';
9
8
  import { SortableGroupDragHandle } from './SortableGroupDragHandle.js';
10
- function SortableGroupHeaderBase({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }) {
11
- const handleLabelClick = useCallback(e => {
9
+ export function SortableGroupHeader({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }) {
10
+ const handleLabelClick = e => {
12
11
  e.stopPropagation();
13
12
  label?.onClick?.(e);
14
- }, [label]);
13
+ };
15
14
  return (_jsxs("div", { className: styles.header, "data-expanded": isExpanded || undefined, children: [_jsx(Typography, { variant: 'title', size: 'm', className: styles.headerTitle, "data-test-id": 'header__drawer-menu__group-card-title', children: label.onClick || label.href ? (_jsx(TitleClickable, { ...(label.href ? { as: 'a', href: label.href } : { as: 'div' }), onClick: handleLabelClick, title: label.text, icon: getLinkEmblem({ icon }) })) : (label.text) }), (enableServiceDrag || !isMobile) && (_jsxs("div", { className: styles.headerActions, "data-always-visible": isMobile || undefined, children: [enableServiceDrag && _jsx(SortableGroupDragHandle, { attributes: attributes, listeners: listeners }), !isMobile && (_jsx(Button, { view: 'elevated', appearance: 'neutral', size: 's', icon: isExpanded ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), "data-test-id": 'header__drawer-menu__group-card-collapse' }))] }))] }));
16
15
  }
17
- export const SortableGroupHeader = memo(SortableGroupHeaderBase);
@@ -1,5 +1,4 @@
1
1
  type SortableGroupSkeletonProps = {
2
- /** Мобильная раскладка. */
3
2
  isMobile?: boolean;
4
3
  };
5
4
  export declare function SortableGroupSkeleton({ isMobile }: SortableGroupSkeletonProps): import("react/jsx-runtime").JSX.Element;
@@ -1,12 +1,7 @@
1
- import { InnerLink } from '../../../../../../types.js';
2
- export type SubCategoryProps = {
3
- /** Id группы-предка. */
1
+ import { ServiceCardProps } from '../../../../../ServiceCard/index.js';
2
+ export type SubCategoryProps = Pick<ServiceCardProps, 'service' | 'onServiceClick' | 'favorite' | 'showDescription' | 'isMobile'> & {
4
3
  groupId: string;
5
- /** Карточка подкатегории (с непустым {@link InnerLink.items}). */
6
- service: InnerLink;
7
- /** Разрешено ли добавление карточек группы в избранное. */
4
+ dragDisabled?: boolean;
8
5
  groupFavoritesEnabled?: boolean;
9
6
  };
10
- declare function SubCategoryBase({ groupId, service, groupFavoritesEnabled }: SubCategoryProps): import("react/jsx-runtime").JSX.Element;
11
- export declare const SubCategory: import("react").MemoExoticComponent<typeof SubCategoryBase>;
12
- export {};
7
+ export declare function SubCategory({ groupId, service, showDescription, isMobile, dragDisabled, favorite, onServiceClick, groupFavoritesEnabled, }: SubCategoryProps): import("react/jsx-runtime").JSX.Element;