@cloud-ru/ds-uikit-product-header 1.5.1-preview-d90ac2be.0 → 1.5.2-preview-0406cbd2.0

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 (194) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -2
  3. package/dist/cjs/components/HeaderButton/HeaderButton.js +1 -3
  4. package/dist/cjs/components/HeaderLayout/HeaderLayout.js +1 -1
  5. package/dist/cjs/components/HeaderLayout/styles.module.css +9 -2
  6. package/dist/cjs/components/Logo/Logo.js +3 -3
  7. package/dist/cjs/components/Logo/styles.module.css +2 -1
  8. package/dist/cjs/components/MainMenu/MainMenu.js +6 -9
  9. package/dist/cjs/components/MainMenu/helperComponents/Banners/MenuBanner.js +1 -3
  10. package/dist/cjs/components/MainMenu/helperComponents/Banners/styles.module.css +2 -1
  11. package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +11 -35
  12. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.js +1 -1
  13. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.css +2 -1
  14. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -16
  15. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +10 -38
  16. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -4
  17. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +5 -10
  18. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
  19. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +4 -6
  20. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -6
  21. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +11 -16
  22. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -7
  23. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +18 -24
  24. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/styles.module.css +1 -1
  25. package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +22 -32
  26. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
  27. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
  28. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
  29. package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
  30. package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
  31. package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.js +11 -12
  32. package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/styles.module.css +2 -2
  33. package/dist/cjs/components/MainMenu/helperComponents/Favorites/styles.module.css +10 -7
  34. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
  35. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
  36. package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +10 -4
  37. package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +2 -1
  38. package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.js +2 -2
  39. package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +4 -1
  40. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
  41. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +6 -5
  42. package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/styles.module.css +9 -2
  43. package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
  44. package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
  45. package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/styles.module.css +6 -6
  46. package/dist/cjs/components/MainMenu/helperComponents/Search/styles.module.css +3 -1
  47. package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -23
  48. package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +21 -30
  49. package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/styles.module.css +2 -7
  50. package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -4
  51. package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +6 -4
  52. package/dist/cjs/components/MainMenu/hooks/useMenuItems.js +7 -12
  53. package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
  54. package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -21
  55. package/dist/cjs/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
  56. package/dist/cjs/components/MainMenu/utils/flatLinksGroups.js +0 -5
  57. package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
  58. package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
  59. package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +1 -2
  60. package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.js +2 -2
  61. package/dist/cjs/components/PlatformLogo/styles.module.css +4 -2
  62. package/dist/cjs/components/UserMenu/UserMenu.js +5 -1
  63. package/dist/cjs/components/UserMenu/styles.module.css +1 -1
  64. package/dist/cjs/hooks/useDesktopComfortClassName.d.ts +2 -0
  65. package/dist/cjs/hooks/useDesktopComfortClassName.js +11 -0
  66. package/dist/cjs/hooks/useMobileLayout.js +1 -0
  67. package/dist/cjs/locale/index.d.ts +8 -8
  68. package/dist/cjs/locale/index.js +4 -4
  69. package/dist/cjs/style.css +89 -87
  70. package/dist/esm/components/HeaderButton/HeaderButton.js +1 -3
  71. package/dist/esm/components/HeaderLayout/HeaderLayout.js +1 -1
  72. package/dist/esm/components/HeaderLayout/styles.module.css +9 -2
  73. package/dist/esm/components/Logo/Logo.js +3 -3
  74. package/dist/esm/components/Logo/styles.module.css +2 -1
  75. package/dist/esm/components/MainMenu/MainMenu.js +7 -10
  76. package/dist/esm/components/MainMenu/helperComponents/Banners/MenuBanner.js +1 -3
  77. package/dist/esm/components/MainMenu/helperComponents/Banners/styles.module.css +2 -1
  78. package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +13 -37
  79. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.js +1 -1
  80. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.css +2 -1
  81. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -16
  82. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +9 -37
  83. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -4
  84. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +5 -10
  85. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
  86. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +3 -5
  87. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -6
  88. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +12 -17
  89. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -7
  90. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +19 -25
  91. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/styles.module.css +1 -1
  92. package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +22 -32
  93. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
  94. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
  95. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
  96. package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
  97. package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
  98. package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.js +11 -12
  99. package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/styles.module.css +2 -2
  100. package/dist/esm/components/MainMenu/helperComponents/Favorites/styles.module.css +10 -7
  101. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
  102. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
  103. package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +10 -4
  104. package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +2 -1
  105. package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.js +2 -2
  106. package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +4 -1
  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 +9 -2
  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/MountAnimation/styles.module.css +6 -6
  113. package/dist/esm/components/MainMenu/helperComponents/Search/styles.module.css +3 -1
  114. package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -23
  115. package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +20 -30
  116. package/dist/esm/components/MainMenu/helperComponents/ServiceCard/styles.module.css +2 -7
  117. package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -4
  118. package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +8 -6
  119. package/dist/esm/components/MainMenu/hooks/useMenuItems.js +8 -13
  120. package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
  121. package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -20
  122. package/dist/esm/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
  123. package/dist/esm/components/MainMenu/utils/flatLinksGroups.js +0 -4
  124. package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
  125. package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
  126. package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +1 -2
  127. package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.js +2 -2
  128. package/dist/esm/components/PlatformLogo/styles.module.css +4 -2
  129. package/dist/esm/components/UserMenu/UserMenu.js +5 -1
  130. package/dist/esm/components/UserMenu/styles.module.css +1 -1
  131. package/dist/esm/hooks/useDesktopComfortClassName.d.ts +2 -0
  132. package/dist/esm/hooks/useDesktopComfortClassName.js +8 -0
  133. package/dist/esm/hooks/useMobileLayout.js +1 -0
  134. package/dist/esm/locale/index.d.ts +8 -8
  135. package/dist/esm/locale/index.js +4 -4
  136. package/dist/esm/style.css +89 -87
  137. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  138. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  139. package/package.json +22 -22
  140. package/src/components/HeaderButton/HeaderButton.tsx +1 -4
  141. package/src/components/HeaderLayout/HeaderLayout.tsx +8 -2
  142. package/src/components/HeaderLayout/styles.module.scss +11 -1
  143. package/src/components/Logo/Logo.tsx +4 -4
  144. package/src/components/Logo/styles.module.scss +1 -0
  145. package/src/components/MainMenu/MainMenu.tsx +6 -11
  146. package/src/components/MainMenu/helperComponents/Banners/MenuBanner.tsx +1 -3
  147. package/src/components/MainMenu/helperComponents/Banners/styles.module.scss +1 -0
  148. package/src/components/MainMenu/helperComponents/Content/Content.tsx +58 -100
  149. package/src/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.tsx +1 -1
  150. package/src/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.scss +2 -0
  151. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.tsx +47 -99
  152. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.tsx +35 -18
  153. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +6 -11
  154. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.tsx +96 -69
  155. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.tsx +48 -64
  156. package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +13 -29
  157. package/src/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.ts +2 -4
  158. package/src/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.tsx +7 -8
  159. package/src/components/MainMenu/helperComponents/Content/styles.module.scss +0 -19
  160. package/src/components/MainMenu/helperComponents/Favorites/Favorites.tsx +26 -27
  161. package/src/components/MainMenu/helperComponents/Favorites/styles.module.scss +12 -7
  162. package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +11 -17
  163. package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +10 -2
  164. package/src/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.tsx +3 -2
  165. package/src/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.scss +4 -0
  166. package/src/components/MainMenu/helperComponents/MenuMobile/MenuMobile.tsx +10 -7
  167. package/src/components/MainMenu/helperComponents/MenuMobile/styles.module.scss +8 -1
  168. package/src/components/MainMenu/helperComponents/MountAnimation/MountAnimation.tsx +1 -5
  169. package/src/components/MainMenu/helperComponents/MountAnimation/styles.module.scss +4 -2
  170. package/src/components/MainMenu/helperComponents/Search/styles.module.scss +3 -3
  171. package/src/components/MainMenu/helperComponents/ServiceCard/ServiceCard.tsx +41 -85
  172. package/src/components/MainMenu/helperComponents/ServiceCard/styles.module.scss +1 -7
  173. package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +12 -7
  174. package/src/components/MainMenu/hooks/useMenuItems.tsx +10 -34
  175. package/src/components/MainMenu/utils/filterLinksGroupsFuzzy.ts +8 -29
  176. package/src/components/MainMenu/utils/flatLinksGroups.ts +0 -5
  177. package/src/components/MainMenu/utils/resolveInnerLinksByIds.ts +6 -3
  178. package/src/components/PathBreadcrumbs/PathBreadcrumbs.tsx +2 -3
  179. package/src/components/PlatformLogo/styles.module.scss +4 -1
  180. package/src/components/UserMenu/UserMenu.tsx +5 -1
  181. package/src/components/UserMenu/styles.module.scss +1 -1
  182. package/src/hooks/useDesktopComfortClassName.ts +11 -0
  183. package/src/hooks/useMobileLayout.ts +1 -0
  184. package/src/locale/index.ts +4 -4
  185. package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
  186. package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.js +0 -17
  187. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
  188. package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -39
  189. package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
  190. package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.js +0 -13
  191. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
  192. package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -35
  193. package/src/components/MainMenu/helperComponents/Content/cardsContext.ts +0 -36
  194. package/src/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.ts +0 -46
package/CHANGELOG.md CHANGED
@@ -3,6 +3,13 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 1.5.1 (2026-09-25)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **FF-9083:** migrate components to renamed token keys ([fd8237d](https://github.com/cloud-ru-tech/snack-v2/commit/fd8237d04c95b5474955c946d9db7bedb3821c97))
11
+ - **FF-9085:** pin comfort density on mobile header surfaces ([2d23010](https://github.com/cloud-ru-tech/snack-v2/commit/2d230100ae078bfa26fbe4a4d3cd643187eee00b))
12
+
6
13
  # 1.5.0 (2026-09-21)
7
14
 
8
15
  ### Features
package/README.md CHANGED
@@ -478,7 +478,7 @@ import { MainMenu, MenuMobile } from '@cloud-ru/ds-uikit-product-header';
478
478
  | `onSegmentOrderChange` | `((segmentId: string, orderedGroupIds: string[]) => void)` | — | Колбэк после DnD групп в сегменте (без id синтетической группы избранного). |
479
479
  | `onSegmentServiceClick` | `((service: InnerLink, e?: MouseEvent<HTMLElement, MouseEvent>) => void)` | — | Колбэк клика по карточке сервиса в сегменте. |
480
480
  | `onWidthChangeEnd` | `((width: number) => void)` | — | Вызывается при окончании изменения ширины дровера (desktop only) |
481
- | `open` | `boolean` | `false` | |
481
+ | `open` | `boolean` | — | |
482
482
  | `platformGroups` | `LinksGroup` | — | Платформенные группы (например «Облачные продукты», «Другие продукты»). <br/> Без поиска в сетке карточек **не отображаются**. <br/> С поиском: попадают в результаты при совпадении; порядок — <br/> после совпадений из сегментов без `pinBottomOnSearch`, перед сегментами с `pinBottomOnSearch`. <br/> Обычно `favoritesEnabled: false`; карточки могут быть без `icon` (Avatar по `label`). |
483
483
  | `preferences` | `MainMenuPreferencesProps` | — | Настройки меню (модалка по кнопке в тулбаре): описания карточек, цвета групп. <br/> Не передано — кнопка настроек в тулбаре не отображается. |
484
484
  | `rightTop` | `ReactNode` | — | Слот над тулбаром правой колонки (например, баннеры) |
@@ -821,5 +821,4 @@ export function Basic() {
821
821
 
822
822
  | Prop | Type | Default | Description |
823
823
  |------|------|---------|-------------|
824
- | `isMobile` | `boolean` | — | |
825
824
  | `items` | `BreadcrumbsProps` \| `Item` | — | |
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.HeaderButton = HeaderButton;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const button_1 = require("@cloud-ru/ds-button");
9
- const theme_1 = require("@cloud-ru/ds-theme");
10
9
  const tooltip_1 = require("@cloud-ru/ds-tooltip");
11
10
  const classnames_1 = __importDefault(require("classnames"));
12
11
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
@@ -16,7 +15,6 @@ const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
16
15
  * остальное API `Button` и `Tooltip` передаётся как есть.
17
16
  */
18
17
  function HeaderButton({ tooltip, isMobile, className, ...rest }) {
19
- const compactThemeClassName = (0, theme_1.useThemeClassnames)({ density: 'compact' });
20
18
  return (
21
19
  // FIXME: typescript ломается, если не указать tip явно
22
20
  // пока не разбирался почему так
@@ -29,5 +27,5 @@ function HeaderButton({ tooltip, isMobile, className, ...rest }) {
29
27
  placement: 'bottom',
30
28
  ...tooltip,
31
29
  triggerClassName: styles_module_scss_1.default.tooltipTrigger,
32
- }, children: (0, jsx_runtime_1.jsx)(button_1.Button, { ...rest, size: 'm', appearance: 'neutral', view: 'simple', className: (0, classnames_1.default)(styles_module_scss_1.default.headerButton, compactThemeClassName, className) }) }));
30
+ }, children: (0, jsx_runtime_1.jsx)(button_1.Button, { ...rest, size: 'm', appearance: 'neutral', view: 'simple', className: (0, classnames_1.default)(styles_module_scss_1.default.headerButton, className) }) }));
33
31
  }
@@ -13,5 +13,5 @@ const useMobileLayout_1 = require("../../hooks/useMobileLayout");
13
13
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
14
14
  function HeaderLayout({ menu, logo, select, breadcrumbs, toolbar, className, ...rest }) {
15
15
  const isMobile = (0, useMobileLayout_1.useMobileLayout)();
16
- return ((0, jsx_runtime_1.jsxs)("header", { className: (0, classnames_1.default)(styles_module_scss_1.default.header, className), ...(0, utils_1.extractSupportProps)({ 'data-test-id': constants_1.TEST_IDS.headerLayout.root, ...rest }), children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.top, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.left, children: [logo && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: logo }), menu && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), menu] })), !isMobile && select && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), select] })), !isMobile && breadcrumbs && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), breadcrumbs] }))] }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.right, children: toolbar })] }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' }), isMobile && Boolean(breadcrumbs) && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.bottom, children: breadcrumbs })] }));
16
+ return ((0, jsx_runtime_1.jsxs)("header", { className: (0, classnames_1.default)(styles_module_scss_1.default.header, className), "data-mobile": isMobile || undefined, ...(0, utils_1.extractSupportProps)({ 'data-test-id': constants_1.TEST_IDS.headerLayout.root, ...rest }), children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.top, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.left, children: [logo && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: logo }), menu && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), menu, isMobile && (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' })] })), !isMobile && select && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), select] })), !isMobile && breadcrumbs && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), breadcrumbs] }))] }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.right, children: toolbar })] }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' }), isMobile && Boolean(breadcrumbs) && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.bottom, children: breadcrumbs }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' })] }))] }));
17
17
  }
@@ -1,6 +1,6 @@
1
1
  .header{
2
2
  box-sizing:border-box;
3
- background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-primitive-color-gray-90, #eeeff3)));
3
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
4
4
  }
5
5
 
6
6
  .top{
@@ -18,7 +18,6 @@
18
18
  align-items:center;
19
19
  box-sizing:border-box;
20
20
  height:var(--sn-primitive-dimension-24, 24px);
21
- border-bottom:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
22
21
  }
23
22
 
24
23
  .left{
@@ -34,4 +33,12 @@
34
33
  gap:var(--sn-primitive-dimension-8, 8px);
35
34
  align-items:center;
36
35
  height:100%;
36
+ }
37
+
38
+ .header[data-mobile] .top{
39
+ padding:var(--sn-primitive-dimension-0, 0px);
40
+ }
41
+ .header[data-mobile] .left,
42
+ .header[data-mobile] .right{
43
+ gap:var(--sn-primitive-dimension-0, 0px);
37
44
  }
@@ -17,7 +17,7 @@ const constants_1 = require("./constants");
17
17
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
18
18
  function Logo({ path, loading, mode, href, onClick, className, tooltip, ...rest }) {
19
19
  const [error, setError] = (0, react_1.useState)(false);
20
- const brandCThemeClassName = (0, theme_1.useThemeClassnames)({ brand: 'brandC' });
20
+ const logoThemeClassName = (0, theme_1.useThemeClassnames)({ brand: 'hrGreen' });
21
21
  (0, react_1.useEffect)(() => {
22
22
  setError(false);
23
23
  }, [path, loading]);
@@ -29,7 +29,7 @@ function Logo({ path, loading, mode, href, onClick, className, tooltip, ...rest
29
29
  setError(true);
30
30
  } }));
31
31
  }
32
- return ((0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.logoWrap, children: [(0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.iconStack, children: [(0, jsx_runtime_1.jsx)(logos_1.CloudLogo, { size: 24, className: (0, classnames_1.default)(styles_module_scss_1.default.icon, brandCThemeClassName, styles_module_scss_1.default.iconDefault) }), (0, jsx_runtime_1.jsx)(product_1.HomeFilledSVG, { size: 24, className: (0, classnames_1.default)(styles_module_scss_1.default.icon, brandCThemeClassName, styles_module_scss_1.default.iconHover) })] }), mode && mode !== constants_1.HEADER_LOGO_MODE.Prod && ((0, jsx_runtime_1.jsx)(promo_tag_1.PromoTag, { as: 'span', label: mode, size: 'xs', appearance: constants_1.MAP_LOGO_MODE_TO_APPEARANCE[mode] }))] }));
33
- }, [error, mode, path, brandCThemeClassName]);
32
+ return ((0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.logoWrap, children: [(0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.iconStack, children: [(0, jsx_runtime_1.jsx)(logos_1.CloudLogo, { size: 24, className: (0, classnames_1.default)(styles_module_scss_1.default.icon, logoThemeClassName, styles_module_scss_1.default.iconDefault) }), (0, jsx_runtime_1.jsx)(product_1.HomeFilledSVG, { size: 24, className: (0, classnames_1.default)(styles_module_scss_1.default.icon, logoThemeClassName, styles_module_scss_1.default.iconHover) })] }), mode && mode !== constants_1.HEADER_LOGO_MODE.Prod && ((0, jsx_runtime_1.jsx)(promo_tag_1.PromoTag, { as: 'span', label: mode, size: 'xs', appearance: constants_1.MAP_LOGO_MODE_TO_APPEARANCE[mode] }))] }));
33
+ }, [error, mode, path, logoThemeClassName]);
34
34
  return ((0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { as: 'a', tooltip: tooltip, className: (0, classnames_1.default)(styles_module_scss_1.default.logo, className), href: href, tabIndex: 0, onClick: onClick, loading: loading, icon: logo, ...(0, utils_1.extractDataTestProps)(rest) }));
35
35
  }
@@ -19,7 +19,7 @@
19
19
  .icon{
20
20
  transform-origin:50% center;
21
21
  transform-box:fill-box;
22
- color:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-55, var(--sn-brandRole-color-brandA-55, var(--sn-primitive-color-brandA-55, #389f74))));
22
+ color:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-50, #389f74));
23
23
  transition:opacity 0.28s cubic-bezier(0.4, 0, 0.2, 1);
24
24
  }
25
25
 
@@ -36,6 +36,7 @@
36
36
  .logo{
37
37
  position:relative;
38
38
  flex-shrink:0;
39
+ box-sizing:border-box;
39
40
  }
40
41
  .logo:active:not([data-disabled]) .iconDefault{
41
42
  opacity:0;
@@ -14,16 +14,13 @@ const MenuMobile_1 = require("./helperComponents/MenuMobile");
14
14
  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, }) {
15
15
  const { t } = locale_1.headerLocale.useTranslations();
16
16
  const [open = false, setOpen] = (0, utils_1.useValueControl)({ value: openProp, onChange: setOpenProp });
17
- const searchValue = search?.value;
18
- const onSearchChange = search?.onChange;
19
17
  (0, react_1.useEffect)(() => {
20
- if (!open && searchValue)
21
- onSearchChange?.('');
22
- }, [open, searchValue, onSearchChange]);
23
- const handleOpen = (0, react_1.useCallback)(() => {
24
- setOpen(true);
25
- }, [setOpen]);
18
+ if (!open && search?.value)
19
+ search?.onChange('');
20
+ }, [open, search]);
26
21
  const isMobile = (0, useMobileLayout_1.useMobileLayout)();
27
22
  const MenuComponent = isMobile ? MenuMobile_1.MenuMobile : MenuDesktop_1.MenuDesktop;
28
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { tooltip: open ? undefined : { tip: t('services') }, isMobile: isMobile, disabled: disabled, icon: (0, jsx_runtime_1.jsx)(product_1.MainMenuSVG, {}), onClick: handleOpen, "data-test-id": constants_1.TEST_IDS.mainMenu.drawerButton }), (0, jsx_runtime_1.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 })] }));
23
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { tooltip: open ? undefined : { tip: t('services') }, isMobile: isMobile, disabled: disabled, icon: (0, jsx_runtime_1.jsx)(product_1.MainMenuSVG, {}), onClick: () => {
24
+ setOpen(true);
25
+ }, "data-test-id": constants_1.TEST_IDS.mainMenu.drawerButton }), (0, jsx_runtime_1.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 })] }));
29
26
  }
@@ -9,7 +9,6 @@ const button_1 = require("@cloud-ru/ds-button");
9
9
  const card_1 = require("@cloud-ru/ds-card");
10
10
  const system_1 = require("@cloud-ru/ds-icons/interface/system");
11
11
  const promo_tag_1 = require("@cloud-ru/ds-promo-tag");
12
- const theme_1 = require("@cloud-ru/ds-theme");
13
12
  const typography_1 = require("@cloud-ru/ds-typography");
14
13
  const classnames_1 = __importDefault(require("classnames"));
15
14
  const react_1 = require("react");
@@ -18,11 +17,10 @@ const constants_1 = require("./constants");
18
17
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
19
18
  function MenuBanner({ title, promoTag, afterTitle, onClose, className, href = '#', 'data-test-id': dataTestId, ...rest }) {
20
19
  const { t } = locale_1.headerLocale.useTranslations();
21
- const compactThemeClassname = (0, theme_1.useThemeClassnames)({ density: 'compact' });
22
20
  const handleClose = (0, react_1.useCallback)(e => {
23
21
  e.preventDefault();
24
22
  e.stopPropagation();
25
23
  onClose?.(e);
26
24
  }, [onClose]);
27
- return ((0, jsx_runtime_1.jsx)(card_1.Card, { as: 'a', href: href, radius: 'l', view: 'simple', className: (0, classnames_1.default)(styles_module_scss_1.default.root, className), "data-test-id": dataTestId ?? constants_1.MENU_BANNER_TEST_IDS.root, ...rest, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.contentRow, children: [(0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.titleWrapper, children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { as: 'span', variant: 'body', size: 'm', className: styles_module_scss_1.default.title, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.title, children: title }), promoTag && ((0, jsx_runtime_1.jsx)(promo_tag_1.PromoTag, { ...promoTag, className: styles_module_scss_1.default.promoTag, roleAppearance: promo_tag_1.ROLE_APPEARANCE.Decor, size: promo_tag_1.SIZE.Xs, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.promoTag }))] }), afterTitle && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.afterTitle, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.afterTitle, children: afterTitle })), onClose && ((0, jsx_runtime_1.jsx)(button_1.Button, { className: (0, classnames_1.default)(styles_module_scss_1.default.closeButton, compactThemeClassname), view: 'elevated', appearance: 'neutral', size: 's', icon: (0, jsx_runtime_1.jsx)(system_1.CrossSVG, { size: 16 }), onClick: handleClose, "aria-label": t('close'), "data-test-id": constants_1.MENU_BANNER_TEST_IDS.close }))] }) }));
25
+ return ((0, jsx_runtime_1.jsx)(card_1.Card, { as: 'a', href: href, radius: 'l', view: 'simple', className: (0, classnames_1.default)(styles_module_scss_1.default.root, className), "data-test-id": dataTestId ?? constants_1.MENU_BANNER_TEST_IDS.root, ...rest, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.contentRow, children: [(0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.titleWrapper, children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { as: 'span', variant: 'body', size: 'm', className: styles_module_scss_1.default.title, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.title, children: title }), promoTag && ((0, jsx_runtime_1.jsx)(promo_tag_1.PromoTag, { ...promoTag, className: styles_module_scss_1.default.promoTag, roleAppearance: promo_tag_1.ROLE_APPEARANCE.Decor, size: promo_tag_1.SIZE.Xs, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.promoTag }))] }), afterTitle && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.afterTitle, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.afterTitle, children: afterTitle })), onClose && ((0, jsx_runtime_1.jsx)(button_1.Button, { className: styles_module_scss_1.default.closeButton, view: 'elevated', appearance: 'neutral', size: 's', icon: (0, jsx_runtime_1.jsx)(system_1.CrossSVG, { size: 16 }), onClick: handleClose, "aria-label": t('close'), "data-test-id": constants_1.MENU_BANNER_TEST_IDS.close }))] }) }));
28
26
  }
@@ -11,6 +11,7 @@
11
11
  }
12
12
 
13
13
  .root{
14
+ box-sizing:border-box;
14
15
  width:100%;
15
16
  min-width:0;
16
17
  }
@@ -21,7 +22,7 @@
21
22
  .contentRow{
22
23
  position:relative;
23
24
  display:flex;
24
- gap:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px));
25
+ gap:var(--sn-density-spacing-interval-s, var(--sn-platform-comfort-spacing-interval-s, var(--sn-primitive-dimension-12, 12px)));
25
26
  align-items:center;
26
27
  box-sizing:border-box;
27
28
  width:100%;
@@ -15,16 +15,12 @@ const react_1 = require("react");
15
15
  const locale_1 = require("../../../../locale");
16
16
  const shouldBeOpenedInNewTab_1 = require("../../../../utils/shouldBeOpenedInNewTab");
17
17
  const utils_2 = require("../../utils");
18
- const MountAnimation_1 = require("../MountAnimation");
19
- const cardsContext_1 = require("./cardsContext");
20
18
  const constants_1 = require("./constants");
21
19
  const ContentToolbar_1 = require("./helperComponents/ContentToolbar");
22
20
  const SortableGroup_1 = require("./helperComponents/SortableGroup");
23
21
  const useContentSegmentsSortable_1 = require("./hooks/useContentSegmentsSortable");
24
- const useProgressiveCount_1 = require("./hooks/useProgressiveCount");
25
22
  const useSegmentDnd_1 = require("./hooks/useSegmentDnd");
26
23
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
27
- const noopFavoriteChange = () => { };
28
24
  function Content({ searchValue, search, rightTop, segments, searchGroups = [], segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, className, footer, favorite, isMobile, preferences, loading, }) {
29
25
  const { t } = locale_1.headerLocale.useTranslations();
30
26
  const showDescription = (0, react_1.useDeferredValue)(preferences?.showDescription.value ?? false);
@@ -37,8 +33,7 @@ function Content({ searchValue, search, rightTop, segments, searchGroups = [], s
37
33
  });
38
34
  const isSearching = Boolean(searchValue);
39
35
  const enableServiceDrag = Boolean(favorite) && !isMobile && !isSearching;
40
- // Ссылки на обработчики стабильны: иначе `memo` карточек ломается при каждом рендере потребителя.
41
- const handleLinkClick = (0, utils_1.useEventHandler)((service, e) => {
36
+ const handleLinkClick = (0, react_1.useCallback)((service, e) => {
42
37
  if (service.disabled) {
43
38
  e?.preventDefault();
44
39
  return;
@@ -48,11 +43,7 @@ function Content({ searchValue, search, rightTop, segments, searchGroups = [], s
48
43
  }
49
44
  onSegmentServiceClick?.(service, e);
50
45
  service.onClick?.(e);
51
- });
52
- const handleFavoriteChange = (0, utils_1.useEventHandler)((productId) => favorite ? favorite.onChange(productId) : noopFavoriteChange);
53
- const favoriteValue = favorite?.value;
54
- const favoriteIds = (0, react_1.useMemo)(() => (favoriteValue ? new Set(favoriteValue) : undefined), [favoriteValue]);
55
- const showGroupsColors = preferences?.showGroupsColors?.value;
46
+ }, [onSegmentServiceClick]);
56
47
  const { orderedGroups, expandedIds, onExpandedChange, handleDragEnd: handleSortableDragEnd, } = (0, useContentSegmentsSortable_1.useContentSegmentsSortable)({
57
48
  segments,
58
49
  activeSegmentId: segmentId,
@@ -70,50 +61,35 @@ function Content({ searchValue, search, rightTop, segments, searchGroups = [], s
70
61
  expandedIds,
71
62
  onSortableDragEnd: handleSortableDragEnd,
72
63
  showDescription,
73
- showGroupsColors,
74
- favoriteIds,
75
- onFavoriteChange: handleFavoriteChange,
64
+ showGroupsColors: preferences?.showGroupsColors?.value,
65
+ favorite,
76
66
  });
77
- // Первый экран монтируется сразу, остальные группы дорисовываются порциями (см. `useProgressiveCount`).
78
- const renderedGroupsCount = (0, useProgressiveCount_1.useProgressiveCount)(visibleGroups.length, `${segmentId}|${isSearching}`, !loading);
79
- const renderedGroups = (0, react_1.useMemo)(() => (renderedGroupsCount < visibleGroups.length ? visibleGroups.slice(0, renderedGroupsCount) : visibleGroups), [visibleGroups, renderedGroupsCount]);
80
- const expandedIdsSet = (0, react_1.useMemo)(() => new Set(expandedIds), [expandedIds]);
81
- const visibleGroupIds = (0, react_1.useMemo)(() => visibleGroups.map(({ id }) => id), [visibleGroups]);
82
- const allGroupsExpanded = visibleGroups.length > 0 && visibleGroupIds.every(id => expandedIdsSet.has(id));
67
+ const allGroupsExpanded = visibleGroups.length > 0 && visibleGroups.every(({ id }) => expandedIds.includes(id));
83
68
  const handleToggleAllGroupsExpanded = (0, react_1.useCallback)(() => {
69
+ const visibleIds = visibleGroups.map(({ id }) => id);
84
70
  if (allGroupsExpanded) {
85
- const visibleIdsSet = new Set(visibleGroupIds);
86
- onExpandedChange(expandedIds.filter(id => !visibleIdsSet.has(id)));
71
+ onExpandedChange(expandedIds.filter(id => !visibleIds.includes(id)));
87
72
  return;
88
73
  }
89
- onExpandedChange([...new Set([...expandedIds, ...visibleGroupIds])]);
90
- }, [allGroupsExpanded, expandedIds, onExpandedChange, visibleGroupIds]);
91
- const cardsContext = (0, react_1.useMemo)(() => ({
92
- showDescription,
93
- isMobile,
94
- dragEnabled: enableServiceDrag,
95
- favoriteIds,
96
- onFavoriteChange: favoriteIds ? handleFavoriteChange : undefined,
97
- onServiceClick: handleLinkClick,
98
- }), [showDescription, isMobile, enableServiceDrag, favoriteIds, handleFavoriteChange, handleLinkClick]);
74
+ onExpandedChange([...new Set([...expandedIds, ...visibleIds])]);
75
+ }, [allGroupsExpanded, expandedIds, onExpandedChange, visibleGroups]);
99
76
  const segmentItems = (0, react_1.useMemo)(() => segments?.map(segment => ({
100
77
  value: segment.id,
101
78
  label: segment.label,
102
79
  icon: segment.icon,
103
80
  })), [segments]);
104
81
  const hasCards = visibleGroups.length > 0;
105
- const mountAnimationType = isMobile ? undefined : 'fade-slide-up-right';
106
82
  const cards = (() => {
107
83
  if (loading) {
108
84
  return Array.from({ length: 5 }).map((_, index) => (0, jsx_runtime_1.jsx)(SortableGroup_1.SortableGroupSkeleton, { isMobile: isMobile }, index));
109
85
  }
110
86
  if (hasCards) {
111
- return ((0, jsx_runtime_1.jsx)(sortable_1.SortableContext, { items: visibleGroupIds, strategy: sortable_1.verticalListSortingStrategy, children: (0, jsx_runtime_1.jsx)(cardsContext_1.CardsContext.Provider, { value: cardsContext, children: (0, jsx_runtime_1.jsx)(accordion_1.Accordion, { selectionMode: 'multiple', expanded: expandedIds, onExpandedChange: onExpandedChange, children: renderedGroups.map(({ id, label, icon, items, favoritesEnabled, blockColor, highlight }) => ((0, jsx_runtime_1.jsx)(SortableGroup_1.SortableGroup, { id: id, icon: icon, label: label, items: items, isExpanded: expandedIdsSet.has(id), blockColor: (0, utils_2.resolveGroupBlockColor)(blockColor, showGroupsColors), isMobile: isMobile, enableServiceDrag: enableServiceDrag, groupFavoritesEnabled: favoritesEnabled, appear: !isMobile, highlight: highlight }, id))) }) }) }));
87
+ return ((0, jsx_runtime_1.jsx)(sortable_1.SortableContext, { items: visibleGroups.map(({ id }) => id), strategy: sortable_1.verticalListSortingStrategy, children: (0, jsx_runtime_1.jsx)(accordion_1.Accordion, { selectionMode: 'multiple', expanded: expandedIds, onExpandedChange: onExpandedChange, children: visibleGroups.map(({ id, label, icon, items, favoritesEnabled, blockColor, highlight }) => ((0, jsx_runtime_1.jsx)(SortableGroup_1.SortableGroup, { id: id, icon: icon, label: label, items: items, isExpanded: expandedIds.includes(id), blockColor: (0, utils_2.resolveGroupBlockColor)(blockColor, preferences?.showGroupsColors?.value), showDescription: showDescription, isMobile: isMobile, enableServiceDrag: enableServiceDrag, favorite: favorite, groupFavoritesEnabled: favoritesEnabled, onServiceClick: handleLinkClick, highlight: highlight }, id))) }) }));
112
88
  }
113
89
  return ((0, jsx_runtime_1.jsx)(info_block_1.InfoBlock, { size: 'm', icon: {
114
90
  icon: isSearching ? system_1.SearchSVG : system_1.CrossSVG,
115
91
  appearance: 'neutral',
116
92
  }, content: isSearching ? t('noDataFound') : t('noData'), "data-test-id": isSearching ? constants_1.TEST_IDS.noDataFound : constants_1.TEST_IDS.noData, "data-mobile": isMobile || undefined, className: styles_module_scss_1.default.noData }));
117
93
  })();
118
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [search, (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.content, className), "data-mobile": isMobile || undefined, "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { type: mountAnimationType, className: styles_module_scss_1.default.top, children: [(0, jsx_runtime_1.jsx)(ContentToolbar_1.ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), rightTop] }) })), cards, footer] })] }));
94
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [search, (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.content, className), "data-empty": (!loading && !hasCards) || undefined, children: [!isSearching && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ContentToolbar_1.ContentToolbar, { segment: segmentId, onSegmentChange: setSegmentId, segmentItems: segmentItems, allGroupsExpanded: allGroupsExpanded, onToggleAllGroupsExpanded: handleToggleAllGroupsExpanded, preferences: preferences, isMobile: isMobile, loading: loading }), rightTop] })), cards, footer] })] }));
119
95
  }
@@ -28,7 +28,7 @@ function ContentToolbar({ segment, onSegmentChange, segmentItems, allGroupsExpan
28
28
  (0, react_1.startTransition)(() => preferences?.showDescription?.onChange(value));
29
29
  };
30
30
  const hasSegmentItems = segmentItems && segmentItems?.length > 0;
31
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.root, "data-test-id": constants_1.TEST_IDS.toolbar, children: [hasSegmentItems && ((0, jsx_runtime_1.jsx)(skeleton_1.WithSkeleton, { loading: loading, skeleton: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.segmentControlSkeleton, "data-test-id": constants_1.TEST_IDS.segmentControl, "data-mobile": isMobile || undefined, children: (0, jsx_runtime_1.jsx)(skeleton_1.Skeleton, { className: styles_module_scss_1.default.segmentControlSkeletonBlock }) }), children: (0, jsx_runtime_1.jsx)(segment_control_1.SegmentControl, { size: 'm', outline: true, value: segment, onChange: onSegmentChange, className: styles_module_scss_1.default.segmentControl, "data-test-id": constants_1.TEST_IDS.segmentControl, items: segmentItems, width: isMobile ? 'full' : 'auto' }) })), (preferences || !isMobile) && !loading && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.actions, children: [preferences && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { icon: (0, jsx_runtime_1.jsx)(system_1.SettingsSVG, {}), "aria-label": t('menuSettingsTitle'), "data-test-id": constants_1.TEST_IDS.settingsButton, onClick: openModal, tooltip: { tip: t('menuSettingsTitle') } }), (0, jsx_runtime_1.jsx)(modal_1.Modal, { open: open, onClose: closeModal, title: t('menuSettingsTitle'), "data-test-id": constants_1.TEST_IDS.settingsModal, cancelButton: {
31
+ return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.root, "data-mobile": isMobile || undefined, "data-test-id": constants_1.TEST_IDS.toolbar, children: [hasSegmentItems && ((0, jsx_runtime_1.jsx)(skeleton_1.WithSkeleton, { loading: loading, skeleton: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.segmentControlSkeleton, "data-test-id": constants_1.TEST_IDS.segmentControl, "data-mobile": isMobile || undefined, children: (0, jsx_runtime_1.jsx)(skeleton_1.Skeleton, { className: styles_module_scss_1.default.segmentControlSkeletonBlock }) }), children: (0, jsx_runtime_1.jsx)(segment_control_1.SegmentControl, { size: 'm', outline: true, value: segment, onChange: onSegmentChange, className: styles_module_scss_1.default.segmentControl, "data-test-id": constants_1.TEST_IDS.segmentControl, items: segmentItems, width: isMobile ? 'full' : 'auto' }) })), (preferences || !isMobile) && !loading && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.actions, children: [preferences && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { icon: (0, jsx_runtime_1.jsx)(system_1.SettingsSVG, {}), "aria-label": t('menuSettingsTitle'), "data-test-id": constants_1.TEST_IDS.settingsButton, onClick: openModal, tooltip: { tip: t('menuSettingsTitle') } }), (0, jsx_runtime_1.jsx)(modal_1.Modal, { open: open, onClose: closeModal, title: t('menuSettingsTitle'), "data-test-id": constants_1.TEST_IDS.settingsModal, cancelButton: {
32
32
  label: t('close'),
33
33
  onClick: closeModal,
34
34
  }, content: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.settingsContent, children: [preferences.showGroupsColors && ((0, jsx_runtime_1.jsx)(uikit_product_switch_row_1.SwitchRow, { title: t('menuSettingsShowGroupsColors'), checked: preferences.showGroupsColors.value, onChange: preferences.showGroupsColors.onChange, "data-test-id": constants_1.TEST_IDS.settingsShowGroupsColorsSwitch })), (0, jsx_runtime_1.jsx)(uikit_product_switch_row_1.SwitchRow, { title: t('menuSettingsShowDescription'), checked: preferences.showDescription.value, onChange: handleShowDescriptionChange, "data-test-id": constants_1.TEST_IDS.settingsShowDescriptionSwitch })] }) })] })), !isMobile && ((0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { icon: allGroupsExpanded ? (0, jsx_runtime_1.jsx)(system_1.CollapseVerticalSVG, {}) : (0, jsx_runtime_1.jsx)(system_1.ExpandVerticalSVG, {}), "aria-label": allGroupsExpanded ? t('contentCollapseAllGroups') : t('contentExpandAllGroups'), "data-test-id": constants_1.TEST_IDS.toggleAllGroups, onClick: onToggleAllGroupsExpanded, tooltip: { tip: allGroupsExpanded ? t('contentCollapseAllGroups') : t('contentExpandAllGroups') } }))] }))] }));
@@ -3,6 +3,7 @@
3
3
  gap:var(--sn-primitive-dimension-8, 8px);
4
4
  align-items:center;
5
5
  justify-content:space-between;
6
+ box-sizing:border-box;
6
7
  width:100%;
7
8
  min-width:0;
8
9
  min-height:var(--sn-primitive-dimension-32, 32px);
@@ -16,7 +17,7 @@
16
17
  display:flex;
17
18
  flex-shrink:0;
18
19
  width:264px;
19
- height:var(--sn-segmentControl-anatomy-size-m-segment-container-height, var(--sn-density-size-m, var(--sn-primitive-dimension-56, 56px)));
20
+ height:var(--sn-segmentControl-anatomy-size-m-segment-container-height, var(--sn-density-size-m, var(--sn-density-scale-100-m, var(--sn-platform-comfort-scale-100-m, var(--sn-primitive-dimension-40, 40px)))));
20
21
  }
21
22
  .segmentControlSkeleton[data-mobile]{
22
23
  width:100%;
@@ -1,24 +1,12 @@
1
1
  import { LinksGroup, LinksGroupBlockColor, LinksGroupTitle } from '../../../../types';
2
- import { CardsContextValue } from '../../cardsContext';
3
- export type SortableGroupProps = Pick<LinksGroup, 'icon' | 'items'> & {
2
+ import { SortableGroupCardsProps } from './components';
3
+ export type SortableGroupProps = Omit<SortableGroupCardsProps, 'groupId'> & Pick<LinksGroup, 'icon'> & {
4
4
  id: string;
5
5
  label: LinksGroupTitle;
6
6
  isExpanded?: boolean;
7
- isMobile?: boolean;
8
- /** Группу можно перетаскивать (иначе рендерится без `useSortable`). */
9
- enableServiceDrag?: boolean;
10
7
  blockColor?: LinksGroupBlockColor;
11
8
  highlight?: boolean;
12
9
  groupFavoritesEnabled?: boolean;
13
- /** Группа появляется с fade-in при монтировании (на desktop; на mobile анимирует контейнер). */
14
- appear?: boolean;
15
10
  };
16
- declare function SortableGroupBase(props: SortableGroupProps): import("react/jsx-runtime").JSX.Element;
17
- export declare const SortableGroup: import("react").MemoExoticComponent<typeof SortableGroupBase>;
18
- export type SortableGroupDragPreviewProps = Omit<SortableGroupProps, 'enableServiceDrag'> & Pick<CardsContextValue, 'showDescription' | 'favoriteIds' | 'onFavoriteChange'>;
19
- /**
20
- * Превью группы в `DragOverlay`. Рендерится вне `Content`, поэтому свой `CardsContext` собирает
21
- * сам: без drag-обвязки карточек и без обработчика клика.
22
- */
23
- export declare function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favoriteIds, onFavoriteChange, groupFavoritesEnabled, blockColor, highlight, }: SortableGroupDragPreviewProps): import("react/jsx-runtime").JSX.Element;
24
- 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;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SortableGroup = void 0;
6
+ exports.SortableGroup = SortableGroup;
7
7
  exports.SortableGroupDragPreview = SortableGroupDragPreview;
8
8
  const jsx_runtime_1 = require("react/jsx-runtime");
9
9
  const sortable_1 = require("@dnd-kit/sortable");
@@ -11,27 +11,14 @@ const utilities_1 = require("@dnd-kit/utilities");
11
11
  const accordion_1 = require("@cloud-ru/ds-accordion");
12
12
  const drag_and_drop_1 = require("@cloud-ru/ds-drag-and-drop");
13
13
  const theme_1 = require("@cloud-ru/ds-theme");
14
- const react_1 = require("react");
15
- const cardsContext_1 = require("../../cardsContext");
16
14
  const constants_1 = require("../../constants");
17
15
  const components_1 = require("./components");
18
16
  const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
19
- function GroupView({ id, icon, label, items, isExpanded, isMobile, enableServiceDrag, groupFavoritesEnabled = true, blockColor, highlight, appear, attributes, listeners, setNodeRef, style, isDragging, }) {
20
- const { colorScheme } = (0, theme_1.useThemeAppearance)().appearance;
21
- // Появление проигрывается один раз. React переставляет узлы `insertBefore`, а браузер при
22
- // повторной вставке перезапускает CSS-анимацию — при перетаскивании группы соседи «моргали».
23
- // После окончания флаг снимается, и перестановка анимацию уже не запускает.
24
- const [isAppearing, setIsAppearing] = (0, react_1.useState)(Boolean(appear));
25
- const handleAnimationEnd = (0, react_1.useCallback)((event) => {
26
- // `animationend` всплывает от вложенных анимаций — нужна только своя.
27
- if (event.target === event.currentTarget) {
28
- setIsAppearing(false);
29
- }
30
- }, []);
31
- return ((0, jsx_runtime_1.jsxs)(drag_and_drop_1.DragGhost, { innerRef: setNodeRef, id: id, style: style, className: styles_module_scss_1.default.group, dragging: isDragging, mode: drag_and_drop_1.DRAG_MODE.Dynamic, "data-appear": isAppearing || undefined, onAnimationEnd: handleAnimationEnd, "data-test-id": `${constants_1.TEST_IDS.groupCard}-${id}`, children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decorationBackground, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.colorMarker, "data-block-color": blockColor }) }) }), (0, jsx_runtime_1.jsx)(accordion_1.Accordion.CollapseBlockTertiary, { id: id, showChevron: false, afterTitle: (0, jsx_runtime_1.jsx)(components_1.SortableGroupHeader, { label: label, icon: icon, isExpanded: isExpanded, enableServiceDrag: enableServiceDrag, attributes: attributes, listeners: listeners, isMobile: isMobile }), children: (0, jsx_runtime_1.jsx)(components_1.SortableGroupCards, { groupId: id, items: items, groupFavoritesEnabled: groupFavoritesEnabled }) })] }));
32
- }
33
- function DraggableGroup(props) {
34
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = (0, sortable_1.useSortable)({ id: props.id });
17
+ function SortableGroup({ id, icon, label, items, isExpanded, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled = true, onServiceClick, blockColor, highlight, }) {
18
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = (0, sortable_1.useSortable)({
19
+ id,
20
+ disabled: !enableServiceDrag,
21
+ });
35
22
  const style = {
36
23
  // CSS.Transform добавляет scaleX/scaleY, из-за чего перетаскиваемая группа "растягивается"
37
24
  // при пересечении с соседней группой другой высоты. CSS.Translate использует только сдвиг.
@@ -40,25 +27,10 @@ function DraggableGroup(props) {
40
27
  transform: transform ? utilities_1.CSS.Translate.toString(transform) : undefined,
41
28
  transition,
42
29
  };
43
- return ((0, jsx_runtime_1.jsx)(GroupView, { ...props, attributes: attributes, listeners: listeners, setNodeRef: setNodeRef, style: style, isDragging: isDragging }));
44
- }
45
- function SortableGroupBase(props) {
46
- // Без drag (mobile, поиск, нет избранного) группа не регистрируется в `SortableContext`.
47
- return props.enableServiceDrag ? (0, jsx_runtime_1.jsx)(DraggableGroup, { ...props }) : (0, jsx_runtime_1.jsx)(GroupView, { ...props });
30
+ const { colorScheme } = (0, theme_1.useThemeAppearance)().appearance;
31
+ return ((0, jsx_runtime_1.jsxs)(drag_and_drop_1.DragGhost, { innerRef: setNodeRef, id: id, style: style, className: styles_module_scss_1.default.group, dragging: isDragging, mode: drag_and_drop_1.DRAG_MODE.Dynamic, "data-test-id": `${constants_1.TEST_IDS.groupCard}-${id}`, children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decorationBackground, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.colorMarker, "data-block-color": blockColor }) }) }), (0, jsx_runtime_1.jsx)(accordion_1.Accordion.CollapseBlockTertiary, { id: id, showChevron: false, afterTitle: (0, jsx_runtime_1.jsx)(components_1.SortableGroupHeader, { label: label, icon: icon, isExpanded: isExpanded, enableServiceDrag: enableServiceDrag, attributes: attributes, listeners: listeners, isMobile: isMobile }), children: (0, jsx_runtime_1.jsx)(components_1.SortableGroupCards, { groupId: id, items: items, showDescription: showDescription, isMobile: isMobile, enableServiceDrag: enableServiceDrag, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled, onServiceClick: onServiceClick }) })] }));
48
32
  }
49
- exports.SortableGroup = (0, react_1.memo)(SortableGroupBase);
50
- /**
51
- * Превью группы в `DragOverlay`. Рендерится вне `Content`, поэтому свой `CardsContext` собирает
52
- * сам: без drag-обвязки карточек и без обработчика клика.
53
- */
54
- function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favoriteIds, onFavoriteChange, groupFavoritesEnabled, blockColor, highlight, }) {
33
+ function SortableGroupDragPreview({ id, label, items, isExpanded, showDescription, isMobile, favorite, groupFavoritesEnabled, blockColor, highlight, }) {
55
34
  const { colorScheme } = (0, theme_1.useThemeAppearance)().appearance;
56
- const cardsContext = {
57
- showDescription,
58
- isMobile,
59
- dragEnabled: false,
60
- favoriteIds,
61
- onFavoriteChange,
62
- };
63
- return ((0, jsx_runtime_1.jsx)(drag_and_drop_1.DragPreview, { className: styles_module_scss_1.default.groupDragPreview, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.group, "data-drag-preview": true, children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decorationBackground, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.colorMarker, "data-block-color": blockColor }) }) }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupDragPreviewHeader, children: (0, jsx_runtime_1.jsx)(components_1.SortableGroupHeader, { label: label, isExpanded: isExpanded, isMobile: isMobile, enableServiceDrag: true }) }), isExpanded && ((0, jsx_runtime_1.jsx)(cardsContext_1.CardsContext.Provider, { value: cardsContext, children: (0, jsx_runtime_1.jsx)(components_1.SortableGroupCards, { groupId: id, items: items, groupFavoritesEnabled: groupFavoritesEnabled }) }))] }) }));
35
+ return ((0, jsx_runtime_1.jsx)(drag_and_drop_1.DragPreview, { className: styles_module_scss_1.default.groupDragPreview, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.group, "data-drag-preview": true, children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decoration, "data-color-scheme": colorScheme, "data-is-highlighted": highlight || undefined, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.decorationBackground, children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.colorMarker, "data-block-color": blockColor }) }) }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupDragPreviewHeader, children: (0, jsx_runtime_1.jsx)(components_1.SortableGroupHeader, { label: label, isExpanded: isExpanded, isMobile: isMobile, enableServiceDrag: true }) }), isExpanded && ((0, jsx_runtime_1.jsx)(components_1.SortableGroupCards, { groupId: id, items: items, showDescription: showDescription, isMobile: isMobile, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled }))] }) }));
64
36
  }
@@ -1,9 +1,9 @@
1
1
  import { InnerLink } from '../../../../../types';
2
- export type SortableGroupCardsProps = {
2
+ import { ServiceCardProps } from '../../../../ServiceCard';
3
+ export type SortableGroupCardsProps = Pick<ServiceCardProps, 'showDescription' | 'isMobile' | 'favorite' | 'onServiceClick'> & {
3
4
  groupId: string;
4
5
  items: InnerLink[];
6
+ enableServiceDrag?: boolean;
5
7
  groupFavoritesEnabled?: boolean;
6
8
  };
7
- declare function SortableGroupCardsBase({ groupId, items, groupFavoritesEnabled }: SortableGroupCardsProps): import("react/jsx-runtime").JSX.Element;
8
- export declare const SortableGroupCards: import("react").MemoExoticComponent<typeof SortableGroupCardsBase>;
9
- export {};
9
+ export declare function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }: SortableGroupCardsProps): import("react/jsx-runtime").JSX.Element;
@@ -3,26 +3,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SortableGroupCards = void 0;
6
+ exports.SortableGroupCards = SortableGroupCards;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- const react_1 = require("react");
9
8
  const innerLink_1 = require("../../../../../utils/innerLink");
10
9
  const ServiceCard_1 = require("../../../../ServiceCard");
11
- const cardsContext_1 = require("../../../cardsContext");
12
10
  const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
13
11
  const SubCategory_1 = require("./SubCategory");
14
- function SortableGroupCardsBase({ groupId, items, groupFavoritesEnabled }) {
15
- const { isMobile, showDescription, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick } = (0, cardsContext_1.useCardsContext)();
16
- const cardFavoriteChange = favoriteIds ? onFavoriteChange : undefined;
17
- return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBody, "data-mobile": isMobile || undefined, children: items.map(service => {
12
+ function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }) {
13
+ return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBody, "data-mobile": isMobile || undefined, "data-show-description": showDescription || undefined, children: items.map(service => {
18
14
  if (service.hidden) {
19
15
  return null;
20
16
  }
21
17
  const key = String(groupId) + service.id;
22
18
  if ((0, innerLink_1.isSubCategoryCard)(service)) {
23
- return ((0, jsx_runtime_1.jsx)(SubCategory_1.SubCategory, { groupId: groupId, service: service, groupFavoritesEnabled: groupFavoritesEnabled }, key));
19
+ return ((0, jsx_runtime_1.jsx)(SubCategory_1.SubCategory, { groupId: groupId, service: service, showDescription: showDescription, isMobile: isMobile, dragDisabled: !enableServiceDrag, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled, onServiceClick: onServiceClick }, key));
24
20
  }
25
- return ((0, jsx_runtime_1.jsx)(ServiceCard_1.GridServiceCard, { groupId: groupId, service: service, isFavorite: favoriteIds?.has(service.id), onFavoriteChange: cardFavoriteChange, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragEnabled: dragEnabled }, key));
21
+ return ((0, jsx_runtime_1.jsx)(ServiceCard_1.DraggableServiceCard, { groupId: groupId, service: service, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: !enableServiceDrag }, key));
26
22
  }) }));
27
23
  }
28
- exports.SortableGroupCards = (0, react_1.memo)(SortableGroupCardsBase);
@@ -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,21 +3,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SortableGroupHeader = void 0;
6
+ exports.SortableGroupHeader = SortableGroupHeader;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const button_1 = require("@cloud-ru/ds-button");
9
9
  const system_1 = require("@cloud-ru/ds-icons/interface/system");
10
10
  const typography_1 = require("@cloud-ru/ds-typography");
11
11
  const uikit_product_title_clickable_1 = require("@cloud-ru/ds-uikit-product-title-clickable");
12
- const react_1 = require("react");
13
12
  const utils_1 = require("../../../../../utils");
14
13
  const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
15
14
  const SortableGroupDragHandle_1 = require("./SortableGroupDragHandle");
16
- function SortableGroupHeaderBase({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }) {
17
- const handleLabelClick = (0, react_1.useCallback)(e => {
15
+ function SortableGroupHeader({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }) {
16
+ const handleLabelClick = e => {
18
17
  e.stopPropagation();
19
18
  label?.onClick?.(e);
20
- }, [label]);
19
+ };
21
20
  return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.header, "data-expanded": isExpanded || undefined, children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: 'title', size: 'm', className: styles_module_scss_1.default.headerTitle, "data-test-id": 'header__drawer-menu__group-card-title', children: label.onClick || label.href ? ((0, jsx_runtime_1.jsx)(uikit_product_title_clickable_1.TitleClickable, { ...(label.href ? { as: 'a', href: label.href } : { as: 'div' }), onClick: handleLabelClick, title: label.text, icon: (0, utils_1.getLinkEmblem)({ icon }) })) : (label.text) }), (enableServiceDrag || !isMobile) && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.headerActions, "data-always-visible": isMobile || undefined, children: [enableServiceDrag && (0, jsx_runtime_1.jsx)(SortableGroupDragHandle_1.SortableGroupDragHandle, { attributes: attributes, listeners: listeners }), !isMobile && ((0, jsx_runtime_1.jsx)(button_1.Button, { view: 'elevated', appearance: 'neutral', size: 's', icon: isExpanded ? (0, jsx_runtime_1.jsx)(system_1.ChevronUpSVG, {}) : (0, jsx_runtime_1.jsx)(system_1.ChevronDownSVG, {}), "data-test-id": 'header__drawer-menu__group-card-collapse' }))] }))] }));
22
21
  }
23
- exports.SortableGroupHeader = (0, react_1.memo)(SortableGroupHeaderBase);
@@ -1,9 +1,7 @@
1
- import { InnerLink } from '../../../../../../types';
2
- export type SubCategoryProps = {
1
+ import { ServiceCardProps } from '../../../../../ServiceCard';
2
+ export type SubCategoryProps = Pick<ServiceCardProps, 'service' | 'onServiceClick' | 'favorite' | 'showDescription' | 'isMobile'> & {
3
3
  groupId: string;
4
- service: InnerLink;
4
+ dragDisabled?: boolean;
5
5
  groupFavoritesEnabled?: boolean;
6
6
  };
7
- declare function SubCategoryBase({ groupId, service, groupFavoritesEnabled }: SubCategoryProps): import("react/jsx-runtime").JSX.Element;
8
- export declare const SubCategory: import("react").MemoExoticComponent<typeof SubCategoryBase>;
9
- export {};
7
+ export declare function SubCategory({ groupId, service, showDescription, isMobile, dragDisabled, favorite, onServiceClick, groupFavoritesEnabled, }: SubCategoryProps): import("react/jsx-runtime").JSX.Element;