@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
|
@@ -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.SubCategoryTitle =
|
|
6
|
+
exports.SubCategoryTitle = SubCategoryTitle;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const typography_1 = require("@cloud-ru/ds-typography");
|
|
9
9
|
const uikit_product_card_predefined_1 = require("@cloud-ru/ds-uikit-product-card-predefined");
|
|
@@ -12,59 +12,53 @@ const utils_1 = require("@cloud-ru/ds-utils");
|
|
|
12
12
|
const react_1 = require("react");
|
|
13
13
|
const utils_2 = require("../../../../../../utils");
|
|
14
14
|
const ServiceCard_1 = require("../../../../../ServiceCard");
|
|
15
|
-
const cardsContext_1 = require("../../../../cardsContext");
|
|
16
15
|
const constants_1 = require("../../../../constants");
|
|
17
16
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
18
|
-
function
|
|
19
|
-
const { isMobile, showDescription: showDescriptionProp, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick, } = (0, cardsContext_1.useCardsContext)();
|
|
17
|
+
function SubCategoryTitle({ groupId, service, showDescription: showDescriptionProp, isMobile, dragDisabled, favorite, onServiceClick, expandable, }) {
|
|
20
18
|
const titleRef = (0, react_1.useRef)(null);
|
|
21
19
|
const tooltipTriggerRef = (0, react_1.useRef)(null);
|
|
22
20
|
const favoriteRef = (0, react_1.useRef)(null);
|
|
23
|
-
const
|
|
24
|
-
const handleServiceClick = (0, react_1.useCallback)((event) => {
|
|
21
|
+
const handleServiceClick = (event) => {
|
|
25
22
|
(0, utils_1.stopEventPropagation)(event);
|
|
26
23
|
onServiceClick?.(service, event);
|
|
27
|
-
}
|
|
28
|
-
const titleTestId = `${constants_1.TEST_IDS.subcategoryTitle}-${id}`;
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const handleKeyDown = (0, react_1.useMemo)(() => (0, uikit_product_card_predefined_1.createCardActionsKeyDownHandler)({
|
|
24
|
+
};
|
|
25
|
+
const titleTestId = `${constants_1.TEST_IDS.subcategoryTitle}-${service.id}`;
|
|
26
|
+
const isFavorite = Boolean(favorite?.value.includes(service.id));
|
|
27
|
+
const showDescription = showDescriptionProp && Boolean(service.description);
|
|
28
|
+
const hasTooltip = !showDescription && service.description;
|
|
29
|
+
const handleKeyDown = (0, uikit_product_card_predefined_1.createCardActionsKeyDownHandler)({
|
|
34
30
|
cardRef: titleRef,
|
|
35
31
|
items: [
|
|
36
32
|
hasTooltip ? { ref: tooltipTriggerRef } : null,
|
|
37
|
-
|
|
33
|
+
favorite
|
|
38
34
|
? {
|
|
39
35
|
ref: favoriteRef,
|
|
40
|
-
onActivate: () =>
|
|
36
|
+
onActivate: () => favorite.onChange(service.id)(!isFavorite),
|
|
41
37
|
}
|
|
42
38
|
: null,
|
|
43
39
|
],
|
|
44
|
-
})
|
|
45
|
-
const emblem = (0, react_1.useMemo)(() => (0, utils_2.getLinkEmblem)({ icon }), [icon]);
|
|
40
|
+
});
|
|
46
41
|
if (expandable?.value) {
|
|
47
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.subcategoryTitle, "data-mobile": isMobile || undefined, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.subcategoryTitleRow, onKeyDown: handleKeyDown, children: [(0, jsx_runtime_1.jsx)(uikit_product_title_clickable_1.TitleClickable, { as: 'a', href: service.href, onClick: handleServiceClick, innerRef: titleRef, title: service.label, icon:
|
|
42
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.subcategoryTitle, "data-mobile": isMobile || undefined, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.subcategoryTitleRow, onKeyDown: handleKeyDown, children: [(0, jsx_runtime_1.jsx)(uikit_product_title_clickable_1.TitleClickable, { as: 'a', href: service.href, onClick: handleServiceClick, innerRef: titleRef, title: service.label, icon: (0, utils_2.getLinkEmblem)(service), className: styles_module_scss_1.default.subcategoryTitleClickable, "data-test-id": titleTestId }), (0, jsx_runtime_1.jsx)(uikit_product_card_predefined_1.CardActionsSurface, { className: styles_module_scss_1.default.subcategoryTitleActions, actionsVisibility: 'always', actionsSize: isMobile ? 's' : 'm', tooltip: hasTooltip
|
|
48
43
|
? {
|
|
49
|
-
tip: description,
|
|
44
|
+
tip: service.description,
|
|
50
45
|
buttonRef: tooltipTriggerRef,
|
|
51
46
|
trigger: isMobile ? 'click' : 'hoverAndFocusVisible',
|
|
52
47
|
'data-test-id': `${titleTestId}-tooltip`,
|
|
53
48
|
}
|
|
54
|
-
: undefined, favorite:
|
|
49
|
+
: undefined, favorite: favorite
|
|
55
50
|
? {
|
|
56
51
|
enabled: true,
|
|
57
52
|
checked: isFavorite,
|
|
58
|
-
onChange: (
|
|
53
|
+
onChange: favorite.onChange(service.id),
|
|
59
54
|
buttonRef: favoriteRef,
|
|
60
55
|
'data-test-id': `${titleTestId}-favorite`,
|
|
61
56
|
}
|
|
62
|
-
: undefined })] }), showDescription && ((0, jsx_runtime_1.jsx)(typography_1.Typography, { as: 'p', variant: 'body', size: 's', className: styles_module_scss_1.default.subcategoryDescription, "data-test-id": `${titleTestId}-description`, children: description }))] }));
|
|
57
|
+
: undefined })] }), showDescription && ((0, jsx_runtime_1.jsx)(typography_1.Typography, { as: 'p', variant: 'body', size: 's', className: styles_module_scss_1.default.subcategoryDescription, "data-test-id": `${titleTestId}-description`, children: service.description }))] }));
|
|
63
58
|
}
|
|
64
59
|
return (
|
|
65
60
|
// Карточка — ссылка `<a>`: клик по ней бы долетал до `onClick={toggleOpen}` заголовка
|
|
66
61
|
// родительского CollapseBlockTertiary (см. TODO там) и лишний раз переключал аккордеон.
|
|
67
62
|
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
68
|
-
(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.subcategoryTitleDraggable, onPointerDown: utils_1.stopEventPropagation, onClick: utils_1.stopEventPropagation, children: (0, jsx_runtime_1.jsx)(ServiceCard_1.
|
|
63
|
+
(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.subcategoryTitleDraggable, onPointerDown: utils_1.stopEventPropagation, onClick: utils_1.stopEventPropagation, children: (0, jsx_runtime_1.jsx)(ServiceCard_1.DraggableServiceCard, { groupId: groupId, service: service, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescriptionProp, dragDisabled: dragDisabled, expandable: expandable }) }));
|
|
69
64
|
}
|
|
70
|
-
exports.SubCategoryTitle = (0, react_1.memo)(SubCategoryTitleBase);
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
.subcategory:has([data-subcategory-body]), .subcategory[data-title-only]{
|
|
13
13
|
grid-column:1/-1;
|
|
14
14
|
padding:0 var(--sn-primitive-dimension-4, 4px);
|
|
15
|
-
border-radius:var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px));
|
|
15
|
+
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
16
16
|
background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
17
17
|
}
|
|
18
18
|
.subcategory[data-title-only]{
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
min-width:0;
|
|
20
20
|
min-height:var(--sn-primitive-dimension-40, 40px);
|
|
21
21
|
padding-inline:var(--sn-primitive-dimension-8, 8px);
|
|
22
|
-
border-radius:var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px));
|
|
22
|
+
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
23
23
|
}
|
|
24
24
|
.header:focus-visible .headerActions, .header:has(:focus-visible) .headerActions{
|
|
25
25
|
pointer-events:auto;
|
|
@@ -46,8 +46,6 @@
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
.group{
|
|
49
|
-
content-visibility:auto;
|
|
50
|
-
contain-intrinsic-size:auto var(--sn-primitive-dimension-128, 128px);
|
|
51
49
|
position:relative;
|
|
52
50
|
overflow-x:clip;
|
|
53
51
|
display:flex;
|
|
@@ -55,16 +53,8 @@
|
|
|
55
53
|
width:100%;
|
|
56
54
|
min-width:0;
|
|
57
55
|
padding:var(--sn-primitive-dimension-4, 4px) var(--sn-primitive-dimension-8, 8px) var(--sn-primitive-dimension-8, 8px) var(--sn-primitive-dimension-12, 12px);
|
|
58
|
-
border-radius:var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px));
|
|
59
|
-
background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-
|
|
60
|
-
}
|
|
61
|
-
.group[data-appear]{
|
|
62
|
-
animation:group-appear 0.24s cubic-bezier(0.4, 0, 0.2, 1) backwards;
|
|
63
|
-
}
|
|
64
|
-
@media (prefers-reduced-motion: reduce){
|
|
65
|
-
.group[data-appear]{
|
|
66
|
-
animation:none;
|
|
67
|
-
}
|
|
56
|
+
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
57
|
+
background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
|
|
68
58
|
}
|
|
69
59
|
.group[data-drag-preview]{
|
|
70
60
|
cursor:grabbing;
|
|
@@ -81,7 +71,7 @@
|
|
|
81
71
|
.groupDragPreview{
|
|
82
72
|
cursor:grabbing;
|
|
83
73
|
container-type:inline-size;
|
|
84
|
-
border-radius:var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px));
|
|
74
|
+
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
85
75
|
}
|
|
86
76
|
|
|
87
77
|
.groupDragPreviewHeader{
|
|
@@ -178,7 +168,7 @@
|
|
|
178
168
|
}
|
|
179
169
|
[data-is-highlighted] .decorationBackground{
|
|
180
170
|
inset:var(--highlight-border-width) var(--highlight-border-width) var(--highlight-border-width) var(--highlight-border-width);
|
|
181
|
-
border-radius:calc(var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px)) - var(--highlight-border-width));
|
|
171
|
+
border-radius:calc(var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px))) - var(--highlight-border-width));
|
|
182
172
|
background:linear-gradient(90deg, var(--highlight-background-color-from) 2.29%, var(--highlight-background-color-to) 97.84%), var(--highlight-background-color);
|
|
183
173
|
}
|
|
184
174
|
|
|
@@ -197,35 +187,35 @@
|
|
|
197
187
|
}
|
|
198
188
|
.colorMarker[data-block-color=neutral]{
|
|
199
189
|
visibility:visible;
|
|
200
|
-
background-color:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-
|
|
190
|
+
background-color:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e3e5ed)));
|
|
201
191
|
}
|
|
202
192
|
.colorMarker[data-block-color=primary]{
|
|
203
193
|
visibility:visible;
|
|
204
|
-
background-color:var(--sn-theme-color-primary-decor, var(--sn-brand-color-primary-80,
|
|
194
|
+
background-color:var(--sn-theme-color-primary-decor, var(--sn-brand-color-primary-80, #caeadb));
|
|
205
195
|
}
|
|
206
196
|
.colorMarker[data-block-color=orange]{
|
|
207
197
|
visibility:visible;
|
|
208
|
-
background-color:var(--sn-theme-color-orange-decor, var(--sn-
|
|
198
|
+
background-color:var(--sn-theme-color-orange-decor, var(--sn-brand-palette-orange-80, #fbdeb6));
|
|
209
199
|
}
|
|
210
200
|
.colorMarker[data-block-color=yellow]{
|
|
211
201
|
visibility:visible;
|
|
212
|
-
background-color:var(--sn-theme-color-yellow-decor, var(--sn-
|
|
202
|
+
background-color:var(--sn-theme-color-yellow-decor, var(--sn-brand-palette-yellow-80, #f0dfb1));
|
|
213
203
|
}
|
|
214
204
|
.colorMarker[data-block-color=green]{
|
|
215
205
|
visibility:visible;
|
|
216
|
-
background-color:var(--sn-theme-color-green-decor, var(--sn-
|
|
206
|
+
background-color:var(--sn-theme-color-green-decor, var(--sn-brand-palette-green-80, #d2ead0));
|
|
217
207
|
}
|
|
218
208
|
.colorMarker[data-block-color=blue]{
|
|
219
209
|
visibility:visible;
|
|
220
|
-
background-color:var(--sn-theme-color-blue-decor, var(--sn-
|
|
210
|
+
background-color:var(--sn-theme-color-blue-decor, var(--sn-brand-palette-blue-80, #d6e2f4));
|
|
221
211
|
}
|
|
222
212
|
.colorMarker[data-block-color=violet]{
|
|
223
213
|
visibility:visible;
|
|
224
|
-
background-color:var(--sn-theme-color-violet-decor, var(--sn-
|
|
214
|
+
background-color:var(--sn-theme-color-violet-decor, var(--sn-brand-palette-violet-80, #e6dcf3));
|
|
225
215
|
}
|
|
226
216
|
.colorMarker[data-block-color=pink]{
|
|
227
217
|
visibility:visible;
|
|
228
|
-
background-color:var(--sn-theme-color-pink-decor, var(--sn-
|
|
218
|
+
background-color:var(--sn-theme-color-pink-decor, var(--sn-brand-palette-pink-80, #f5d9e1));
|
|
229
219
|
}
|
|
230
220
|
|
|
231
221
|
.skeletonTitle{
|
|
@@ -243,11 +233,4 @@
|
|
|
243
233
|
|
|
244
234
|
.skeletonService{
|
|
245
235
|
padding:var(--sn-primitive-dimension-4, 4px);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
@keyframes group-appear{
|
|
249
|
-
from{
|
|
250
|
-
transform:translate(calc(-1 * var(--sn-primitive-dimension-12, 12px)), var(--sn-primitive-dimension-4, 4px));
|
|
251
|
-
opacity:0;
|
|
252
|
-
}
|
|
253
236
|
}
|
package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js
CHANGED
|
@@ -4,10 +4,8 @@ exports.useContentSegmentsSortable = useContentSegmentsSortable;
|
|
|
4
4
|
const sortable_1 = require("@dnd-kit/sortable");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
function mergeIdsPreservingOrder(prevIds, nextIds) {
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const kept = prevIds.filter(id => nextIdSet.has(id));
|
|
10
|
-
const added = nextIds.filter(id => !prevIdSet.has(id));
|
|
7
|
+
const kept = prevIds.filter(id => nextIds.includes(id));
|
|
8
|
+
const added = nextIds.filter(id => !prevIds.includes(id));
|
|
11
9
|
if (added.length === 0 && kept.length === prevIds.length) {
|
|
12
10
|
return prevIds;
|
|
13
11
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { DragEndEvent } from '@dnd-kit/core';
|
|
2
|
-
import { LinksGroup } from '../../../types';
|
|
3
|
-
import { CardsContextValue } from '../cardsContext';
|
|
2
|
+
import { FavoriteProps, LinksGroup } from '../../../types';
|
|
4
3
|
type UseSegmentDndProps = {
|
|
5
4
|
visibleGroups: LinksGroup[];
|
|
6
5
|
expandedIds: string[];
|
|
7
6
|
onSortableDragEnd(event: DragEndEvent): void;
|
|
8
7
|
showDescription: boolean;
|
|
9
8
|
showGroupsColors?: boolean;
|
|
10
|
-
|
|
9
|
+
favorite?: FavoriteProps;
|
|
10
|
+
};
|
|
11
11
|
/**
|
|
12
12
|
* DnD групп внутри активного сегмента: drag overlay группы поверх `useContentSegmentsSortable`.
|
|
13
13
|
* Сервис-драг (карточка → избранное) сюда не попадает — фильтруется через `isServiceDragId`.
|
|
14
14
|
*/
|
|
15
|
-
export declare function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors,
|
|
15
|
+
export declare function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favorite, }: UseSegmentDndProps): void;
|
|
16
16
|
export {};
|
|
@@ -11,16 +11,16 @@ const SortableGroup_1 = require("../helperComponents/SortableGroup");
|
|
|
11
11
|
* DnD групп внутри активного сегмента: drag overlay группы поверх `useContentSegmentsSortable`.
|
|
12
12
|
* Сервис-драг (карточка → избранное) сюда не попадает — фильтруется через `isServiceDragId`.
|
|
13
13
|
*/
|
|
14
|
-
function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors,
|
|
14
|
+
function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favorite, }) {
|
|
15
15
|
const { setGroupDragOverlay } = (0, useMainMenuDnd_1.useMainMenuDndOverlay)();
|
|
16
16
|
const handleDragStart = (0, react_1.useCallback)(({ active }) => {
|
|
17
17
|
if (!(0, utils_1.isServiceDragId)(active.id)) {
|
|
18
18
|
const activeGroup = visibleGroups.find(({ id }) => id === String(active.id));
|
|
19
19
|
if (activeGroup) {
|
|
20
|
-
setGroupDragOverlay((0, jsx_runtime_1.jsx)(SortableGroup_1.SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: (0, utils_1.resolveGroupBlockColor)(activeGroup.blockColor, showGroupsColors), showDescription: showDescription,
|
|
20
|
+
setGroupDragOverlay((0, jsx_runtime_1.jsx)(SortableGroup_1.SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: (0, utils_1.resolveGroupBlockColor)(activeGroup.blockColor, showGroupsColors), showDescription: showDescription, favorite: activeGroup.favoritesEnabled ? favorite : undefined, highlight: activeGroup.highlight }));
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
-
}, [expandedIds,
|
|
23
|
+
}, [expandedIds, favorite, setGroupDragOverlay, showDescription, showGroupsColors, visibleGroups]);
|
|
24
24
|
const handleDragEnd = (0, react_1.useCallback)((event) => {
|
|
25
25
|
setGroupDragOverlay(null);
|
|
26
26
|
if ((0, utils_1.isServiceDragId)(event.active.id)) {
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
.content{
|
|
2
|
-
display:flex;
|
|
3
|
-
flex-direction:column;
|
|
4
|
-
gap:var(--sn-primitive-dimension-4, 4px);
|
|
5
|
-
width:100%;
|
|
6
|
-
min-width:0;
|
|
7
|
-
}
|
|
8
|
-
.content[data-mobile]{
|
|
9
|
-
gap:var(--sn-primitive-dimension-8, 8px);
|
|
10
|
-
}
|
|
11
1
|
.content[data-empty]{
|
|
12
2
|
height:100%;
|
|
13
3
|
}
|
|
@@ -15,12 +5,6 @@
|
|
|
15
5
|
flex:1 1 auto;
|
|
16
6
|
}
|
|
17
7
|
|
|
18
|
-
.top{
|
|
19
|
-
display:flex;
|
|
20
|
-
flex-direction:column;
|
|
21
|
-
gap:inherit;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
8
|
.noData{
|
|
25
9
|
flex:1 1 auto;
|
|
26
10
|
place-self:center center;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { FavoriteProps,
|
|
1
|
+
import { FavoriteProps, LinksGroup } from '../../types';
|
|
2
2
|
export type FavoritesProps = {
|
|
3
3
|
/** Список избранных сервисов */
|
|
4
4
|
favorite: FavoriteProps;
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/** Группы сервисов для разрешения id в карточки */
|
|
6
|
+
allServiceGroups: LinksGroup[];
|
|
7
7
|
/** CSS-класс строки заголовка (segment + кнопка настроек) */
|
|
8
8
|
headerClassName?: string;
|
|
9
9
|
/** Флаг мобильной раскладки */
|
|
10
10
|
isMobile?: boolean;
|
|
11
11
|
};
|
|
12
|
-
export declare function Favorites({ favorite,
|
|
12
|
+
export declare function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }: FavoritesProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -20,7 +20,7 @@ const components_1 = require("./components");
|
|
|
20
20
|
const constants_1 = require("./constants");
|
|
21
21
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
22
22
|
const utils_3 = require("./utils");
|
|
23
|
-
function Favorites({ favorite,
|
|
23
|
+
function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }) {
|
|
24
24
|
const { t } = locale_1.headerLocale.useTranslations();
|
|
25
25
|
const loading = favorite.loading;
|
|
26
26
|
const [segment, setSegment] = (0, utils_1.useValueControl)({
|
|
@@ -32,8 +32,8 @@ function Favorites({ favorite, servicesById, headerClassName, isMobile }) {
|
|
|
32
32
|
{ value: constants_1.FAVORITES_SEGMENT.Favorites, label: t('favorite.title'), disabled: loading },
|
|
33
33
|
{ value: constants_1.FAVORITES_SEGMENT.Recent, label: t('recent.title'), disabled: loading },
|
|
34
34
|
], [t, loading]);
|
|
35
|
-
const favoriteItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.value,
|
|
36
|
-
const recentItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.recentServices ?? [],
|
|
35
|
+
const favoriteItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.value, allServiceGroups), [favorite.value, allServiceGroups]);
|
|
36
|
+
const recentItems = (0, react_1.useMemo)(() => (0, utils_2.resolveInnerLinksByIds)(favorite.recentServices ?? [], allServiceGroups), [favorite.recentServices, allServiceGroups]);
|
|
37
37
|
const resolvedSegment = segment ?? constants_1.FAVORITES_SEGMENT.Favorites;
|
|
38
38
|
const isFavoritesSegment = resolvedSegment === constants_1.FAVORITES_SEGMENT.Favorites;
|
|
39
39
|
const isEmpty = (isFavoritesSegment ? favoriteItems : recentItems).length === 0;
|
|
@@ -45,14 +45,11 @@ function Favorites({ favorite, servicesById, headerClassName, isMobile }) {
|
|
|
45
45
|
favorite.onFavoriteServiceClick?.(service.id, event);
|
|
46
46
|
service.onClick(event);
|
|
47
47
|
};
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
checked: favorite.value.includes(service.id),
|
|
54
|
-
onChange: favorite.onChange(service.id),
|
|
55
|
-
}, ...(0, utils_3.getCommonCardProps)(service, handleRecentServiceClick(service)) }, service.id)));
|
|
48
|
+
const recentCards = recentItems.map(service => ((0, jsx_runtime_1.jsx)(uikit_product_card_predefined_1.CardServiceLight, { as: 'a', className: styles_module_scss_1.default.card, actionsVisibility: isMobile ? 'always' : 'hover', favorite: {
|
|
49
|
+
enabled: true,
|
|
50
|
+
checked: favorite.value.includes(service.id),
|
|
51
|
+
onChange: favorite.onChange(service.id),
|
|
52
|
+
}, ...(0, utils_3.getCommonCardProps)(service, handleRecentServiceClick(service)) }, service.id)));
|
|
56
53
|
const content = (() => {
|
|
57
54
|
if (loading) {
|
|
58
55
|
return (0, jsx_runtime_1.jsx)(components_1.FavoritesItemsSkeleton, {});
|
|
@@ -68,5 +65,5 @@ function Favorites({ favorite, servicesById, headerClassName, isMobile }) {
|
|
|
68
65
|
onChange: favorite.onChange(service.id),
|
|
69
66
|
}, ...(0, utils_3.getCommonCardProps)(service, handleFavoriteServiceClick(service)) }, service.id))), !isEmpty && !isFavoritesSegment && recentCards] }) }) })) : ((0, jsx_runtime_1.jsx)(components_1.FavoritesSortable, { favorite: favorite, favoriteItems: favoriteItems, segment: resolvedSegment, setSegment: setSegment, isEmpty: isEmpty, recentCards: recentCards, onFavoriteServiceClick: handleFavoriteServiceClick }));
|
|
70
67
|
})();
|
|
71
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.root, "data-test-id": constants_1.FAVORITES_TEST_IDS.root, children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.header, headerClassName), "data-test-id": constants_1.FAVORITES_TEST_IDS.header, children: [(0, jsx_runtime_1.jsx)(segment_control_1.SegmentControl, { size: 'm', width: segment_control_1.WIDTH.Full, value: segment, onChange: setSegment, className: styles_module_scss_1.default.segmentControl, "data-test-id": constants_1.FAVORITES_TEST_IDS.segmentControl, items: segmentControlItems }), favorite.actions && ((0, jsx_runtime_1.jsx)(list_1.Droplist, { size: 'm', ...favorite.actions, closeDroplistOnItemClick: true, children: (0, jsx_runtime_1.jsx)(button_1.Button, { view: 'function', size: 'm', appearance: 'neutral', icon: (0, jsx_runtime_1.jsx)(system_1.KebabSVG, { size: 24 }), "data-test-id": constants_1.FAVORITES_TEST_IDS.settingsButton, disabled: loading }) }))] }), content] }));
|
|
68
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.root, "data-test-id": constants_1.FAVORITES_TEST_IDS.root, children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.header, headerClassName), "data-test-id": constants_1.FAVORITES_TEST_IDS.header, children: [(0, jsx_runtime_1.jsx)(segment_control_1.SegmentControl, { size: 'm', width: segment_control_1.WIDTH.Full, value: loading ? undefined : segment, onChange: setSegment, className: styles_module_scss_1.default.segmentControl, "data-test-id": constants_1.FAVORITES_TEST_IDS.segmentControl, items: segmentControlItems }), favorite.actions && ((0, jsx_runtime_1.jsx)(list_1.Droplist, { size: 'm', ...favorite.actions, closeDroplistOnItemClick: true, children: (0, jsx_runtime_1.jsx)(button_1.Button, { view: 'function', size: 'm', appearance: 'neutral', icon: (0, jsx_runtime_1.jsx)(system_1.KebabSVG, { size: 24 }), "data-test-id": constants_1.FAVORITES_TEST_IDS.settingsButton, disabled: loading }) }))] }), content] }));
|
|
72
69
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
flex-shrink:0;
|
|
3
3
|
width:var(--sn-primitive-dimension-40, 40px);
|
|
4
4
|
height:var(--sn-primitive-dimension-40, 40px);
|
|
5
|
-
fill:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-
|
|
6
|
-
stroke:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-
|
|
5
|
+
fill:var(--sn-theme-color-neutral-decor, var(--sn-brand-color-neutral-80, var(--sn-brand-palette-gray-80, #e3e5ed)));
|
|
6
|
+
stroke:var(--sn-theme-color-neutral-text, var(--sn-brand-color-neutral-40, var(--sn-brand-palette-gray-40, #81869c)));
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
.emptyState{
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
width:100%;
|
|
8
8
|
min-height:var(--sn-primitive-dimension-88, 88px);
|
|
9
9
|
padding:var(--sn-primitive-dimension-8, 8px) 0 0;
|
|
10
|
-
border-radius:var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px));
|
|
11
|
-
background:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-
|
|
10
|
+
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
11
|
+
background:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
.header{
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
min-height:var(--sn-primitive-dimension-44, 44px);
|
|
36
36
|
}
|
|
37
37
|
.listScroll[data-insert-new] [data-favorite]{
|
|
38
|
-
fill:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-
|
|
39
|
-
stroke:var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-
|
|
38
|
+
fill:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-50, #389f74));
|
|
39
|
+
stroke:var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-40, #22775b));
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
.dropTarget{
|
|
@@ -89,5 +89,5 @@
|
|
|
89
89
|
.skeletonItem{
|
|
90
90
|
width:100%;
|
|
91
91
|
height:var(--sn-primitive-dimension-24, 24px);
|
|
92
|
-
border-radius:var(--sn-density-radius-3xs, var(--sn-primitive-dimension-2, 2px));
|
|
92
|
+
border-radius:var(--sn-density-radius-3xs, var(--sn-platform-comfort-radius-3xs, var(--sn-primitive-dimension-2, 2px)));
|
|
93
93
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { MainMenuProps } from '../../types';
|
|
2
|
-
export declare function MenuDesktop({ open, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function MenuDesktop({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth, onWidthChangeEnd, draggerTooltip, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -8,11 +8,11 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
8
8
|
const divider_1 = require("@cloud-ru/ds-divider");
|
|
9
9
|
const drawer_1 = require("@cloud-ru/ds-drawer");
|
|
10
10
|
const scroll_1 = require("@cloud-ru/ds-scroll");
|
|
11
|
+
const utils_1 = require("@cloud-ru/ds-utils");
|
|
11
12
|
const react_1 = require("react");
|
|
12
13
|
const constants_1 = require("../../../../constants");
|
|
13
14
|
const useMainMenuDnd_1 = require("../../hooks/useMainMenuDnd");
|
|
14
15
|
const useMenuItems_1 = require("../../hooks/useMenuItems");
|
|
15
|
-
const utils_1 = require("../../utils");
|
|
16
16
|
const Content_1 = require("../Content");
|
|
17
17
|
const Favorites_1 = require("../Favorites");
|
|
18
18
|
const MenuBottom_1 = require("../MenuBottom");
|
|
@@ -21,7 +21,8 @@ const MountAnimation_1 = require("../MountAnimation");
|
|
|
21
21
|
const Search_1 = require("../Search");
|
|
22
22
|
const constants_2 = require("./constants");
|
|
23
23
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
24
|
-
function MenuDesktop({ open
|
|
24
|
+
function MenuDesktop({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, preferences, logo, rightTop, leftTop, leftBottom, defaultWidth = constants_2.MENU_WIDTH_MAX, onWidthChangeEnd, draggerTooltip, loading, }) {
|
|
25
|
+
const [open = false, setOpen] = (0, utils_1.useValueControl)({ value: openProp, onChange: setOpenProp });
|
|
25
26
|
const { scrollRef, searchRef, resultItems } = (0, useMenuItems_1.useMenuItems)({
|
|
26
27
|
segments,
|
|
27
28
|
search,
|
|
@@ -44,19 +45,18 @@ function MenuDesktop({ open = false, setOpen, settingItems, platformGroups, segm
|
|
|
44
45
|
// сегменты используются, `loading` держит панель смонтированной на время ответа бэка — иначе
|
|
45
46
|
// `Content` не успевает показать свой skeleton (он монтируется только когда данные уже пришли),
|
|
46
47
|
// и между "ничего" и карточками на кадр проскакивает пустое состояние «нет данных».
|
|
47
|
-
const isNeedRightBlock =
|
|
48
|
+
const isNeedRightBlock = segments !== undefined && (loading || segments.some(segment => segment.items.length > 0));
|
|
48
49
|
const hasBottomItems = Boolean(settingItems?.length) || Boolean(leftBottom);
|
|
49
50
|
const allServiceGroups = (0, react_1.useMemo)(() => segments?.flatMap(segment => segment.items) ?? [], [segments]);
|
|
50
|
-
const servicesById = (0, react_1.useMemo)(() => (0, utils_1.buildServicesById)(allServiceGroups), [allServiceGroups]);
|
|
51
51
|
const mainMenuDnd = (0, useMainMenuDnd_1.useMainMenuDnd)({
|
|
52
52
|
favorite,
|
|
53
|
-
|
|
53
|
+
groups: allServiceGroups,
|
|
54
54
|
showDescription: preferences?.showDescription.value ?? false,
|
|
55
55
|
});
|
|
56
56
|
const handleCloseDrawer = (0, react_1.useCallback)(() => {
|
|
57
|
-
setOpen
|
|
57
|
+
setOpen(false);
|
|
58
58
|
}, [setOpen]);
|
|
59
|
-
const menu = ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menu, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuHeader, children: [(0, jsx_runtime_1.jsx)(MenuHeaderBrand_1.MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles_module_scss_1.default.menuHeaderBrand }), isNeedRightBlock && search && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), (0, jsx_runtime_1.jsx)(Search_1.Search, { ...search, ref: searchRef })] }))] }), (0, jsx_runtime_1.jsx)(divider_1.Divider, {}), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuBody, children: [(0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { className: styles_module_scss_1.default.left, "data-test-id": constants_1.TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.leftTop, children: leftTop }), isNeedRightBlock && favorite && (0, jsx_runtime_1.jsx)(Favorites_1.Favorites, { favorite: favorite,
|
|
59
|
+
const menu = ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menu, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuHeader, children: [(0, jsx_runtime_1.jsx)(MenuHeaderBrand_1.MenuHeaderBrand, { logo: logo, onClose: handleCloseDrawer, className: styles_module_scss_1.default.menuHeaderBrand }), isNeedRightBlock && search && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), (0, jsx_runtime_1.jsx)(Search_1.Search, { ...search, ref: searchRef })] }))] }), (0, jsx_runtime_1.jsx)(divider_1.Divider, {}), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.menuBody, children: [(0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { className: styles_module_scss_1.default.left, "data-test-id": constants_1.TEST_IDS.mainMenu.left, type: 'slide-right', children: [leftTop && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.leftTop, children: leftTop }), isNeedRightBlock && favorite && (0, jsx_runtime_1.jsx)(Favorites_1.Favorites, { favorite: favorite, allServiceGroups: allServiceGroups }), hasBottomItems && (0, jsx_runtime_1.jsx)(MenuBottom_1.MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }), isNeedRightBlock && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(MountAnimation_1.MountAnimation, { type: 'fade-in', children: (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }) }), (0, jsx_runtime_1.jsx)(MountAnimation_1.MountAnimation, { type: 'fade-slide-up-right', className: styles_module_scss_1.default.right, "data-test-id": constants_1.TEST_IDS.mainMenu.right, children: (0, jsx_runtime_1.jsx)(scroll_1.Scroll, { paddingAbsolute: true, className: styles_module_scss_1.default.scroll, ref: scrollRef, barHideStrategy: 'never', overflow: { x: 'hidden' }, children: (0, jsx_runtime_1.jsx)(Content_1.Content, { className: styles_module_scss_1.default.rightContent, searchValue: search?.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, preferences: preferences, loading: loading }) }) })] }))] })] }));
|
|
60
60
|
return ((0, jsx_runtime_1.jsx)(drawer_1.DrawerCustom, { open: open, onClose: handleCloseDrawer, width: isNeedRightBlock ? 'm' : 's', position: 'left', className: styles_module_scss_1.default.drawer, rootClassName: styles_module_scss_1.default.drawerRoot, "data-test-id": constants_1.TEST_IDS.mainMenu.drawer, "data-small": !isNeedRightBlock || undefined, disableMotions: true, showButtonClosed: false, resizable: isNeedRightBlock
|
|
61
61
|
? {
|
|
62
62
|
min: constants_2.MENU_WIDTH_MIN,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
.drawer{
|
|
2
|
-
border-radius:var(--sn-drawer-anatomy-container-vertical-positionLeft-container-borderTopLeftRadius, var(--sn-primitive-dimension-0,
|
|
2
|
+
border-radius:var(--sn-drawer-anatomy-container-vertical-positionLeft-container-borderTopLeftRadius, var(--sn-primitive-dimension-0, 0px)) var(--sn-drawer-anatomy-container-vertical-positionLeft-container-borderTopRightRadius, var(--sn-brand-anatomy-radius-window-m, var(--sn-primitive-dimension-4, 4px))) var(--sn-drawer-anatomy-container-vertical-positionLeft-container-borderBottomRightRadius, var(--sn-brand-anatomy-radius-window-m, var(--sn-primitive-dimension-4, 4px))) var(--sn-drawer-anatomy-container-vertical-positionLeft-container-borderBottomLeftRadius, var(--sn-primitive-dimension-0, 0px));
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
.scroll{
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
.drawerRoot [data-test-id=header__drawer-menu][data-small][data-position][data-width]{
|
|
28
28
|
box-sizing:border-box;
|
|
29
29
|
width:100%;
|
|
30
|
-
max-width:calc(263px + var(--sn-drawer-anatomy-container-vertical-positionLeft-paddingRight, var(--sn-density-spacing-interval-l, var(--sn-primitive-dimension-
|
|
30
|
+
max-width:calc(263px + var(--sn-drawer-anatomy-container-vertical-positionLeft-paddingRight, var(--sn-density-spacing-interval-l, var(--sn-platform-comfort-spacing-interval-l, var(--sn-primitive-dimension-32, 32px)))));
|
|
31
31
|
}
|
|
32
32
|
.drawerRoot [data-test-id=header__drawer-menu][data-small][data-position][data-width] .left{
|
|
33
33
|
width:100%;
|
|
@@ -53,6 +53,11 @@
|
|
|
53
53
|
.rightContent{
|
|
54
54
|
container-type:inline-size;
|
|
55
55
|
overflow-x:clip;
|
|
56
|
+
display:flex;
|
|
57
|
+
flex-direction:column;
|
|
58
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
59
|
+
width:100%;
|
|
60
|
+
min-width:0;
|
|
56
61
|
padding:var(--sn-primitive-dimension-16, 16px);
|
|
57
62
|
}
|
|
58
63
|
|
|
@@ -61,7 +66,7 @@
|
|
|
61
66
|
--snack-menu-left-width:263px;
|
|
62
67
|
position:relative;
|
|
63
68
|
height:100vh;
|
|
64
|
-
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-
|
|
69
|
+
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
|
|
65
70
|
}
|
|
66
71
|
|
|
67
72
|
.menuBody{
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
4
4
|
align-items:center;
|
|
5
5
|
box-sizing:border-box;
|
|
6
|
-
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-
|
|
6
|
+
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
.closeButton{
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { MainMenuProps } from '../../types';
|
|
2
|
-
export declare function MenuMobile({ open, setOpen, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -6,12 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.MenuMobile = MenuMobile;
|
|
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");
|
|
10
|
+
const utils_1 = require("@cloud-ru/ds-utils");
|
|
9
11
|
const react_1 = require("react");
|
|
10
12
|
const constants_1 = require("../../../../constants");
|
|
11
13
|
const mobileOverlays_1 = require("../../../../mobileOverlays");
|
|
12
14
|
const useMainMenuDnd_1 = require("../../hooks/useMainMenuDnd");
|
|
13
15
|
const useMenuItems_1 = require("../../hooks/useMenuItems");
|
|
14
|
-
const utils_1 = require("../../utils");
|
|
15
16
|
const Content_1 = require("../Content");
|
|
16
17
|
const Favorites_1 = require("../Favorites");
|
|
17
18
|
const MenuBottom_1 = require("../MenuBottom");
|
|
@@ -20,7 +21,8 @@ const MountAnimation_1 = require("../MountAnimation");
|
|
|
20
21
|
const ScrollWithAnimatedStickyPanel_1 = require("../ScrollWithAnimatedStickyPanel");
|
|
21
22
|
const Search_1 = require("../Search");
|
|
22
23
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
23
|
-
function MenuMobile({ open
|
|
24
|
+
function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, platformGroups, segments, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, favorite, search, logo, rightTop, leftTop, leftBottom, loading, }) {
|
|
25
|
+
const [open = false, setOpen] = (0, utils_1.useValueControl)({ value: openProp, onChange: setOpenProp });
|
|
24
26
|
// `segments !== undefined` — сигнал «каталог вообще используется» (консьюмер без сегментов
|
|
25
27
|
// никогда не передаёт проп, и `loading` в этом случае к правой панели не относится). Пока
|
|
26
28
|
// сегменты используются, `loading` держит панель смонтированной на время ответа бэка — иначе
|
|
@@ -34,9 +36,13 @@ function MenuMobile({ open = false, setOpen, settingItems, platformGroups, segme
|
|
|
34
36
|
search,
|
|
35
37
|
platformGroups,
|
|
36
38
|
});
|
|
37
|
-
const
|
|
39
|
+
const allServiceGroups = (0, react_1.useMemo)(() => segments?.flatMap(segment => segment.items) ?? [], [segments]);
|
|
38
40
|
const handleClose = (0, react_1.useCallback)(() => {
|
|
39
|
-
setOpen
|
|
41
|
+
setOpen(false);
|
|
40
42
|
}, [setOpen]);
|
|
41
|
-
return (
|
|
43
|
+
return (
|
|
44
|
+
// Временная фиксация comfort (см. `HeaderLayout`): `MainMenu` используется и отдельно от
|
|
45
|
+
// `HeaderLayout`, поэтому объявляем плотность здесь же. Обёртка провайдера layout-прозрачная
|
|
46
|
+
// (`display: contents`) — меню рендерится порталом, лишний бокс в строке шапки не нужен.
|
|
47
|
+
(0, jsx_runtime_1.jsx)(theme_1.ChildThemeProvider, { value: { density: theme_1.DENSITY.Comfort }, className: styles_module_scss_1.default.densityScope, children: (0, jsx_runtime_1.jsx)(mobileOverlays_1.MobileDrawerCustom, { open: open, onClose: handleClose, position: 'bottom', className: styles_module_scss_1.default.drawerMobile, swipeEnabled: false, "data-test-id": constants_1.TEST_IDS.mainMenu.drawerMobile, closeOnPopstate: true, snapPoints: constants_1.BOTTOM_SHEET_FULLSCREEN_SNAP_POINTS, disableMotions: true, children: (0, jsx_runtime_1.jsx)(ScrollWithAnimatedStickyPanel_1.ScrollWithAnimatedStickyPanel, { panel: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(MenuHeaderBrand_1.MenuHeaderBrand, { logo: logo, onClose: handleClose, className: styles_module_scss_1.default.menuHeader }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' })] }), children: (0, jsx_runtime_1.jsxs)(MountAnimation_1.MountAnimation, { className: styles_module_scss_1.default.scrollMobile, type: 'fade-slide-up', children: [leftTop && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.rightContent, children: leftTop }), search && (0, jsx_runtime_1.jsx)(Search_1.Search, { ...search, ref: searchRef, isMobile: true }), !isSearching && favorite && (0, jsx_runtime_1.jsx)(Favorites_1.Favorites, { favorite: favorite, allServiceGroups: allServiceGroups, isMobile: true }), hasSegments && ((0, jsx_runtime_1.jsx)(useMainMenuDnd_1.MainMenuDndContext, { children: (0, jsx_runtime_1.jsx)(Content_1.Content, { isMobile: true, className: styles_module_scss_1.default.rightContent, searchValue: search && search.value, rightTop: rightTop, favorite: favorite, segments: segments, searchGroups: resultItems, segmentPrefs: segmentPrefs, activeSegmentId: activeSegmentId, onActiveSegmentChange: onActiveSegmentChange, onSegmentOrderChange: onSegmentOrderChange, onSegmentExpandedChange: onSegmentExpandedChange, onSegmentServiceClick: onSegmentServiceClick, loading: loading }) })), !isSearching && hasBottomItems && (0, jsx_runtime_1.jsx)(MenuBottom_1.MenuBottom, { settingItems: settingItems, leftBottom: leftBottom })] }) }) }) }));
|
|
42
48
|
}
|
|
@@ -1,10 +1,21 @@
|
|
|
1
|
+
.densityScope{
|
|
2
|
+
display:contents;
|
|
3
|
+
}
|
|
4
|
+
|
|
1
5
|
.menuHeader{
|
|
2
6
|
height:var(--sn-primitive-dimension-40, 40px);
|
|
3
7
|
padding:0 var(--sn-primitive-dimension-4, 4px);
|
|
4
8
|
}
|
|
5
9
|
|
|
10
|
+
.rightContent{
|
|
11
|
+
display:flex;
|
|
12
|
+
flex-direction:column;
|
|
13
|
+
gap:var(--sn-primitive-dimension-8, 8px);
|
|
14
|
+
min-width:0;
|
|
15
|
+
}
|
|
16
|
+
|
|
6
17
|
.drawerMobile{
|
|
7
|
-
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-
|
|
18
|
+
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3))) !important;
|
|
8
19
|
}
|
|
9
20
|
|
|
10
21
|
.scrollMobile{
|
|
@@ -4,4 +4,4 @@ export type MountAnimationProps = PropsWithChildren<WithSupportProps<{
|
|
|
4
4
|
type?: 'fade-slide-up' | 'fade-slide-up-right' | 'slide-right' | 'fade-in';
|
|
5
5
|
className?: string;
|
|
6
6
|
}>>;
|
|
7
|
-
export declare function MountAnimation({ children, type, className, ...props }: MountAnimationProps):
|
|
7
|
+
export declare function MountAnimation({ children, type, className, ...props }: MountAnimationProps): import("react/jsx-runtime").JSX.Element;
|