@cloud-ru/ds-uikit-product-header 1.5.1-preview-d90ac2be.0 → 1.5.1
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.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -1
- package/dist/cjs/components/HeaderLayout/HeaderLayout.js +12 -1
- package/dist/cjs/components/HeaderLayout/styles.module.css +1 -1
- package/dist/cjs/components/Logo/Logo.js +3 -3
- package/dist/cjs/components/Logo/styles.module.css +1 -1
- package/dist/cjs/components/MainMenu/MainMenu.js +6 -9
- package/dist/cjs/components/MainMenu/helperComponents/Banners/styles.module.css +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +11 -35
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.css +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -16
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +10 -38
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -4
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +4 -6
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -6
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +11 -16
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -7
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +18 -24
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/styles.module.css +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +13 -30
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
- package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.js +9 -12
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/styles.module.css +2 -2
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/styles.module.css +5 -5
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +8 -3
- package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +11 -5
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/styles.module.css +12 -1
- package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -23
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +21 -30
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/styles.module.css +2 -7
- package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -4
- package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +6 -4
- package/dist/cjs/components/MainMenu/hooks/useMenuItems.js +7 -12
- package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
- package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -21
- package/dist/cjs/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
- package/dist/cjs/components/MainMenu/utils/flatLinksGroups.js +0 -5
- package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
- package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
- package/dist/cjs/components/PlatformLogo/styles.module.css +2 -2
- package/dist/cjs/style.css +50 -72
- package/dist/esm/components/HeaderLayout/HeaderLayout.js +12 -1
- package/dist/esm/components/HeaderLayout/styles.module.css +1 -1
- package/dist/esm/components/Logo/Logo.js +3 -3
- package/dist/esm/components/Logo/styles.module.css +1 -1
- package/dist/esm/components/MainMenu/MainMenu.js +7 -10
- package/dist/esm/components/MainMenu/helperComponents/Banners/styles.module.css +1 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +13 -37
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.css +1 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -16
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +9 -37
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -4
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +3 -5
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -6
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +12 -17
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -7
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +19 -25
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/styles.module.css +1 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +13 -30
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
- package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
- package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
- package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.js +9 -12
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/styles.module.css +2 -2
- package/dist/esm/components/MainMenu/helperComponents/Favorites/styles.module.css +5 -5
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +8 -3
- package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +11 -5
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/styles.module.css +12 -1
- package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -23
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +20 -30
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/styles.module.css +2 -7
- package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -4
- package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +8 -6
- package/dist/esm/components/MainMenu/hooks/useMenuItems.js +8 -13
- package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
- package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -20
- package/dist/esm/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
- package/dist/esm/components/MainMenu/utils/flatLinksGroups.js +0 -4
- package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
- package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
- package/dist/esm/components/PlatformLogo/styles.module.css +2 -2
- package/dist/esm/style.css +50 -72
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +28 -28
- package/src/components/HeaderLayout/HeaderLayout.tsx +19 -2
- package/src/components/Logo/Logo.tsx +4 -4
- package/src/components/MainMenu/MainMenu.tsx +6 -11
- package/src/components/MainMenu/helperComponents/Content/Content.tsx +58 -100
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.tsx +47 -99
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.tsx +30 -17
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +6 -11
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.tsx +86 -69
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.tsx +48 -64
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +0 -27
- package/src/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.ts +2 -4
- package/src/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.tsx +7 -8
- package/src/components/MainMenu/helperComponents/Content/styles.module.scss +0 -19
- package/src/components/MainMenu/helperComponents/Favorites/Favorites.tsx +23 -26
- package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +11 -17
- package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +6 -0
- package/src/components/MainMenu/helperComponents/MenuMobile/MenuMobile.tsx +59 -50
- package/src/components/MainMenu/helperComponents/MenuMobile/styles.module.scss +13 -0
- package/src/components/MainMenu/helperComponents/MountAnimation/MountAnimation.tsx +1 -5
- package/src/components/MainMenu/helperComponents/ServiceCard/ServiceCard.tsx +41 -85
- package/src/components/MainMenu/helperComponents/ServiceCard/styles.module.scss +1 -7
- package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +12 -7
- package/src/components/MainMenu/hooks/useMenuItems.tsx +10 -34
- package/src/components/MainMenu/utils/filterLinksGroupsFuzzy.ts +8 -29
- package/src/components/MainMenu/utils/flatLinksGroups.ts +0 -5
- package/src/components/MainMenu/utils/resolveInnerLinksByIds.ts +6 -3
- package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
- package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.js +0 -17
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -39
- package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
- package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.js +0 -13
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -35
- package/src/components/MainMenu/helperComponents/Content/cardsContext.ts +0 -36
- 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` |
|
|
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` | — | Слот над тулбаром правой колонки (например, баннеры) |
|
|
@@ -6,12 +6,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.HeaderLayout = HeaderLayout;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const divider_1 = require("@cloud-ru/ds-divider");
|
|
9
|
+
const theme_1 = require("@cloud-ru/ds-theme");
|
|
9
10
|
const utils_1 = require("@cloud-ru/ds-utils");
|
|
10
11
|
const classnames_1 = __importDefault(require("classnames"));
|
|
12
|
+
const react_1 = require("react");
|
|
11
13
|
const constants_1 = require("../../constants");
|
|
12
14
|
const useMobileLayout_1 = require("../../hooks/useMobileLayout");
|
|
13
15
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
14
16
|
function HeaderLayout({ menu, logo, select, breadcrumbs, toolbar, className, ...rest }) {
|
|
15
17
|
const isMobile = (0, useMobileLayout_1.useMobileLayout)();
|
|
16
|
-
|
|
18
|
+
const headerRef = (0, react_1.useRef)(null);
|
|
19
|
+
const header = ((0, jsx_runtime_1.jsxs)("header", { ref: headerRef, 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 })] }));
|
|
20
|
+
// Временная фиксация: на mobile прикладная тема переключилась на compact, а шапка сверстана
|
|
21
|
+
// под comfort и на compact ещё не переехала. Провайдер (а не класс на `<header>`) нужен потому,
|
|
22
|
+
// что поверхности шапки — порталы: они переэмитят набор `sn-*` из контекста на своём корне,
|
|
23
|
+
// и класс, поставленный поверх, проиграл бы их собственному.
|
|
24
|
+
if (isMobile) {
|
|
25
|
+
return ((0, jsx_runtime_1.jsx)(theme_1.ChildThemeProvider, { value: { density: theme_1.DENSITY.Comfort }, rootRef: headerRef, children: header }));
|
|
26
|
+
}
|
|
27
|
+
return header;
|
|
17
28
|
}
|
|
@@ -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-
|
|
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{
|
|
@@ -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
|
|
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,
|
|
33
|
-
}, [error, mode, path,
|
|
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-
|
|
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
|
|
|
@@ -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 &&
|
|
21
|
-
|
|
22
|
-
}, [open,
|
|
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:
|
|
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
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
.contentRow{
|
|
22
22
|
position:relative;
|
|
23
23
|
display:flex;
|
|
24
|
-
gap:var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-
|
|
24
|
+
gap:var(--sn-density-spacing-interval-s, var(--sn-platform-comfort-spacing-interval-s, var(--sn-primitive-dimension-12, 12px)));
|
|
25
25
|
align-items:center;
|
|
26
26
|
box-sizing:border-box;
|
|
27
27
|
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
|
-
|
|
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
|
-
|
|
75
|
-
onFavoriteChange: handleFavoriteChange,
|
|
64
|
+
showGroupsColors: preferences?.showGroupsColors?.value,
|
|
65
|
+
favorite,
|
|
76
66
|
});
|
|
77
|
-
|
|
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
|
-
|
|
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, ...
|
|
90
|
-
}, [allGroupsExpanded, expandedIds, onExpandedChange,
|
|
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:
|
|
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-
|
|
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
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
display:flex;
|
|
17
17
|
flex-shrink:0;
|
|
18
18
|
width:264px;
|
|
19
|
-
height:var(--sn-segmentControl-anatomy-size-m-segment-container-height, var(--sn-density-size-m, var(--sn-primitive-dimension-
|
|
19
|
+
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
20
|
}
|
|
21
21
|
.segmentControlSkeleton[data-mobile]{
|
|
22
22
|
width:100%;
|
|
@@ -1,24 +1,12 @@
|
|
|
1
1
|
import { LinksGroup, LinksGroupBlockColor, LinksGroupTitle } from '../../../../types';
|
|
2
|
-
import {
|
|
3
|
-
export type SortableGroupProps =
|
|
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
|
|
17
|
-
export declare
|
|
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 =
|
|
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
|
|
20
|
-
const {
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
15
|
-
const { isMobile, showDescription, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick } = (0, cardsContext_1.useCardsContext)();
|
|
16
|
-
const cardFavoriteChange = favoriteIds ? onFavoriteChange : undefined;
|
|
12
|
+
function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }) {
|
|
17
13
|
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBody, "data-mobile": isMobile || 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.
|
|
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
|
|
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 =
|
|
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
|
|
17
|
-
const handleLabelClick =
|
|
15
|
+
function SortableGroupHeader({ label, icon, isExpanded, enableServiceDrag, attributes, listeners, isMobile, }) {
|
|
16
|
+
const handleLabelClick = e => {
|
|
18
17
|
e.stopPropagation();
|
|
19
18
|
label?.onClick?.(e);
|
|
20
|
-
}
|
|
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 {
|
|
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
|
-
|
|
4
|
+
dragDisabled?: boolean;
|
|
5
5
|
groupFavoritesEnabled?: boolean;
|
|
6
6
|
};
|
|
7
|
-
declare function
|
|
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;
|
|
@@ -3,25 +3,18 @@ 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.SubCategory =
|
|
6
|
+
exports.SubCategory = SubCategory;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const accordion_1 = require("@cloud-ru/ds-accordion");
|
|
9
9
|
const react_1 = require("react");
|
|
10
10
|
const innerLink_1 = require("../../../../../../utils/innerLink");
|
|
11
11
|
const ServiceCard_1 = require("../../../../../ServiceCard");
|
|
12
|
-
const cardsContext_1 = require("../../../../cardsContext");
|
|
13
12
|
const constants_1 = require("../../../../constants");
|
|
14
13
|
const styles_module_scss_1 = __importDefault(require('../../styles.module.css'));
|
|
15
14
|
const styles_module_scss_2 = __importDefault(require('./styles.module.css'));
|
|
16
15
|
const SubCategoryTitle_1 = require("./SubCategoryTitle");
|
|
17
16
|
const noop = () => { };
|
|
18
|
-
|
|
19
|
-
const SubCategoryBody = (0, react_1.memo)(function SubCategoryBody({ nestedGroupId, items, variant }) {
|
|
20
|
-
const { isMobile, showDescription, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick } = (0, cardsContext_1.useCardsContext)();
|
|
21
|
-
const cardFavoriteChange = favoriteIds ? onFavoriteChange : undefined;
|
|
22
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBody, "data-subcategory-body": variant === 'expanded' ? 'expanded' : true, "data-mobile": isMobile || undefined, children: items.map(nestedService => ((0, jsx_runtime_1.jsx)(ServiceCard_1.GridServiceCard, { groupId: nestedGroupId, service: nestedService, isFavorite: favoriteIds?.has(nestedService.id), onFavoriteChange: cardFavoriteChange, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragEnabled: dragEnabled }, nestedGroupId + nestedService.id))) }));
|
|
23
|
-
});
|
|
24
|
-
function SubCategoryBase({ groupId, service, groupFavoritesEnabled }) {
|
|
17
|
+
function SubCategory({ groupId, service, showDescription, isMobile, dragDisabled, favorite, onServiceClick, groupFavoritesEnabled, }) {
|
|
25
18
|
const subcategoryId = (0, innerLink_1.getSubCategoryId)(groupId, service.id);
|
|
26
19
|
const nestedGroupId = (0, innerLink_1.getNestedServiceGroupId)(groupId, service.id);
|
|
27
20
|
const nestedItems = (0, react_1.useMemo)(() => service.items?.filter(item => !item.hidden) ?? [], [service.items]);
|
|
@@ -35,17 +28,19 @@ function SubCategoryBase({ groupId, service, groupFavoritesEnabled }) {
|
|
|
35
28
|
setIsExpanded(isExpanded ? undefined : subcategoryId);
|
|
36
29
|
}
|
|
37
30
|
}, [isExpanded, subcategoryId, isExpandableEnabled]);
|
|
38
|
-
const expandable = (0, react_1.useMemo)(() => ({ value: Boolean(isExpanded), onClick: handleExpandedChange }), [isExpanded, handleExpandedChange]);
|
|
39
|
-
const testId = `${constants_1.TEST_IDS.subcategory}-${service.id}`;
|
|
40
|
-
const title = ((0, jsx_runtime_1.jsx)(SubCategoryTitle_1.SubCategoryTitle, { groupId: groupId, service: service, expandable: viewMode === 'group-title-only' ? TITLE_ONLY_EXPANDABLE : expandable, groupFavoritesEnabled: groupFavoritesEnabled }));
|
|
41
31
|
// 'group-title-only' — только заголовок подкатегории, без раскрываемого тела и кнопки
|
|
42
32
|
// переключения: карточка ведёт себя как обычная ссылка (см. isSubCategoryCard в utils/innerLink).
|
|
43
33
|
if (viewMode === 'group-title-only') {
|
|
44
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.subcategory, "data-title-only": true, "data-test-id":
|
|
34
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.subcategory, "data-title-only": true, "data-test-id": `${constants_1.TEST_IDS.subcategory}-${service.id}`, children: (0, jsx_runtime_1.jsx)(SubCategoryTitle_1.SubCategoryTitle, { groupId: groupId, service: service, expandable: { value: true, onClick: noop }, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }) }));
|
|
45
35
|
}
|
|
46
36
|
if (viewMode === 'expanded') {
|
|
47
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_2.default.subcategory, "data-test-id":
|
|
37
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_2.default.subcategory, "data-test-id": `${constants_1.TEST_IDS.subcategory}-${service.id}`, children: [(0, jsx_runtime_1.jsx)(SubCategoryTitle_1.SubCategoryTitle, { groupId: groupId, service: service, expandable: {
|
|
38
|
+
value: Boolean(isExpanded),
|
|
39
|
+
onClick: handleExpandedChange,
|
|
40
|
+
}, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBody, "data-subcategory-body": 'expanded', "data-mobile": isMobile || undefined, children: nestedItems.map(nestedService => ((0, jsx_runtime_1.jsx)(ServiceCard_1.DraggableServiceCard, { groupId: nestedGroupId, service: nestedService, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: dragDisabled }, nestedGroupId + nestedService.id))) })] }));
|
|
48
41
|
}
|
|
49
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.subcategory, "data-test-id":
|
|
42
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_2.default.subcategory, "data-test-id": `${constants_1.TEST_IDS.subcategory}-${service.id}`, children: (0, jsx_runtime_1.jsx)(accordion_1.Accordion, { selectionMode: 'single', expanded: isExpanded, onExpandedChange: handleExpandedChange, children: (0, jsx_runtime_1.jsx)(accordion_1.Accordion.CollapseBlockTertiary, { id: subcategoryId, showChevron: false, className: styles_module_scss_2.default.subcategoryAccordion, afterTitle: (0, jsx_runtime_1.jsx)(SubCategoryTitle_1.SubCategoryTitle, { groupId: groupId, service: service, expandable: {
|
|
43
|
+
value: Boolean(isExpanded),
|
|
44
|
+
onClick: handleExpandedChange,
|
|
45
|
+
}, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }), children: (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBody, "data-subcategory-body": true, "data-mobile": isMobile || undefined, children: nestedItems.map(nestedService => ((0, jsx_runtime_1.jsx)(ServiceCard_1.DraggableServiceCard, { groupId: nestedGroupId, service: nestedService, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: dragDisabled }, nestedGroupId + nestedService.id))) }) }) }) }));
|
|
50
46
|
}
|
|
51
|
-
exports.SubCategory = (0, react_1.memo)(SubCategoryBase);
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DraggableServiceCardProps } from '../../../../../ServiceCard';
|
|
2
2
|
export type SubCategoryTitleProps = {
|
|
3
3
|
groupId: string;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} & Pick<GridServiceCardProps, 'expandable' | 'service'>;
|
|
7
|
-
declare function SubCategoryTitleBase({ groupId, service, groupFavoritesEnabled, expandable }: SubCategoryTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export declare const SubCategoryTitle: import("react").MemoExoticComponent<typeof SubCategoryTitleBase>;
|
|
9
|
-
export {};
|
|
4
|
+
} & Pick<DraggableServiceCardProps, 'expandable' | 'service' | 'onServiceClick' | 'favorite' | 'showDescription' | 'isMobile' | 'dragDisabled'>;
|
|
5
|
+
export declare function SubCategoryTitle({ groupId, service, showDescription: showDescriptionProp, isMobile, dragDisabled, favorite, onServiceClick, expandable, }: SubCategoryTitleProps): import("react/jsx-runtime").JSX.Element;
|