@cloud-ru/ds-uikit-product-header 1.5.3 → 1.5.4-preview-71f1139f.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/cjs/components/HeaderButton/HeaderButton.js +1 -4
- package/dist/cjs/components/HeaderLayout/HeaderLayout.js +1 -12
- package/dist/cjs/components/HeaderLayout/styles.module.css +12 -6
- package/dist/cjs/components/Logo/Logo.js +2 -1
- package/dist/cjs/components/Logo/constants.d.ts +2 -0
- package/dist/cjs/components/Logo/constants.js +7 -1
- package/dist/cjs/components/Logo/styles.module.css +4 -0
- package/dist/cjs/components/MainMenu/helperComponents/Banners/MenuBanner.js +1 -3
- package/dist/cjs/components/MainMenu/helperComponents/Banners/styles.module.css +1 -0
- package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +2 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.css +2 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +7 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +2 -2
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +15 -6
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/utils.d.ts +10 -0
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/utils.js +21 -0
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.js +3 -1
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/styles.module.css +5 -2
- package/dist/cjs/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +2 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuBottom/MenuBottom.js +2 -2
- package/dist/cjs/components/MainMenu/helperComponents/MenuBottom/styles.module.css +4 -0
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +2 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +2 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.js +2 -2
- package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +9 -0
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +1 -6
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/styles.module.css +1 -5
- package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/styles.module.css +6 -6
- package/dist/cjs/components/MainMenu/helperComponents/Search/Search.js +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/Search/styles.module.css +3 -1
- package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +1 -2
- package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.js +2 -2
- package/dist/cjs/components/PathBreadcrumbs/styles.module.css +1 -0
- package/dist/cjs/components/PlatformLogo/styles.module.css +3 -1
- package/dist/cjs/components/UserMenu/UserMenu.d.ts +7 -2
- package/dist/cjs/components/UserMenu/UserMenu.js +10 -4
- package/dist/cjs/components/UserMenu/hooks/useProfileItem.js +5 -1
- package/dist/cjs/components/UserMenu/hooks/useThemeItem.js +4 -1
- package/dist/cjs/components/UserMenu/hooks/useUserMenuItems.d.ts +5 -76
- package/dist/cjs/components/UserMenu/hooks/useUserMenuItems.js +23 -14
- package/dist/cjs/components/UserMenu/styles.module.css +3 -3
- package/dist/cjs/hooks/useDesktopComfortClassName.d.ts +2 -0
- package/dist/cjs/hooks/useDesktopComfortClassName.js +11 -0
- package/dist/cjs/hooks/useMobileLayout.js +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/locale/index.d.ts +8 -8
- package/dist/cjs/locale/index.js +4 -4
- package/dist/cjs/style.css +70 -31
- package/dist/cjs/utils/emptyArray.d.ts +2 -0
- package/dist/cjs/utils/emptyArray.js +5 -0
- package/dist/esm/components/HeaderButton/HeaderButton.js +1 -4
- package/dist/esm/components/HeaderLayout/HeaderLayout.js +1 -12
- package/dist/esm/components/HeaderLayout/styles.module.css +12 -6
- package/dist/esm/components/Logo/Logo.js +3 -2
- package/dist/esm/components/Logo/constants.d.ts +2 -0
- package/dist/esm/components/Logo/constants.js +6 -0
- package/dist/esm/components/Logo/styles.module.css +4 -0
- package/dist/esm/components/MainMenu/helperComponents/Banners/MenuBanner.js +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Banners/styles.module.css +1 -0
- package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +2 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.css +2 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +7 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +2 -2
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +15 -6
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/utils.d.ts +10 -0
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/utils.js +18 -0
- package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.js +3 -1
- package/dist/esm/components/MainMenu/helperComponents/Favorites/styles.module.css +5 -2
- package/dist/esm/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +2 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuBottom/MenuBottom.js +2 -2
- package/dist/esm/components/MainMenu/helperComponents/MenuBottom/styles.module.css +4 -0
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +2 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +2 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.js +2 -2
- package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.css +9 -0
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +1 -6
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/styles.module.css +1 -5
- package/dist/esm/components/MainMenu/helperComponents/MountAnimation/styles.module.css +6 -6
- package/dist/esm/components/MainMenu/helperComponents/Search/Search.js +1 -1
- package/dist/esm/components/MainMenu/helperComponents/Search/styles.module.css +3 -1
- package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +1 -2
- package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.js +2 -2
- package/dist/esm/components/PathBreadcrumbs/styles.module.css +1 -0
- package/dist/esm/components/PlatformLogo/styles.module.css +3 -1
- package/dist/esm/components/UserMenu/UserMenu.d.ts +7 -2
- package/dist/esm/components/UserMenu/UserMenu.js +10 -4
- package/dist/esm/components/UserMenu/hooks/useProfileItem.js +2 -1
- package/dist/esm/components/UserMenu/hooks/useThemeItem.js +4 -1
- package/dist/esm/components/UserMenu/hooks/useUserMenuItems.d.ts +5 -76
- package/dist/esm/components/UserMenu/hooks/useUserMenuItems.js +23 -14
- package/dist/esm/components/UserMenu/styles.module.css +3 -3
- package/dist/esm/hooks/useDesktopComfortClassName.d.ts +2 -0
- package/dist/esm/hooks/useDesktopComfortClassName.js +8 -0
- package/dist/esm/hooks/useMobileLayout.js +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/locale/index.d.ts +8 -8
- package/dist/esm/locale/index.js +4 -4
- package/dist/esm/style.css +70 -31
- package/dist/esm/utils/emptyArray.d.ts +2 -0
- package/dist/esm/utils/emptyArray.js +2 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +28 -28
- package/src/components/HeaderButton/HeaderButton.tsx +1 -5
- package/src/components/HeaderLayout/HeaderLayout.tsx +10 -21
- package/src/components/HeaderLayout/styles.module.scss +16 -6
- package/src/components/Logo/Logo.tsx +6 -4
- package/src/components/Logo/constants.ts +7 -0
- package/src/components/Logo/styles.module.scss +7 -0
- package/src/components/MainMenu/helperComponents/Banners/MenuBanner.tsx +1 -3
- package/src/components/MainMenu/helperComponents/Banners/styles.module.scss +1 -0
- package/src/components/MainMenu/helperComponents/Content/Content.tsx +2 -1
- package/src/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/styles.module.scss +2 -1
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.tsx +29 -22
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.tsx +12 -2
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +20 -11
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/utils.ts +26 -0
- package/src/components/MainMenu/helperComponents/Favorites/Favorites.tsx +4 -2
- package/src/components/MainMenu/helperComponents/Favorites/styles.module.scss +12 -7
- package/src/components/MainMenu/helperComponents/MenuBottom/MenuBottom.tsx +8 -2
- package/src/components/MainMenu/helperComponents/MenuBottom/styles.module.scss +7 -0
- package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +4 -2
- package/src/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.tsx +3 -2
- package/src/components/MainMenu/helperComponents/MenuHeaderBrand/styles.module.scss +16 -0
- package/src/components/MainMenu/helperComponents/MenuMobile/MenuMobile.tsx +46 -52
- package/src/components/MainMenu/helperComponents/MenuMobile/styles.module.scss +1 -7
- package/src/components/MainMenu/helperComponents/MountAnimation/styles.module.scss +4 -2
- package/src/components/MainMenu/helperComponents/Search/Search.tsx +1 -1
- package/src/components/MainMenu/helperComponents/Search/styles.module.scss +3 -3
- package/src/components/PathBreadcrumbs/PathBreadcrumbs.tsx +2 -3
- package/src/components/PathBreadcrumbs/styles.module.scss +1 -0
- package/src/components/PlatformLogo/styles.module.scss +4 -1
- package/src/components/UserMenu/UserMenu.tsx +24 -6
- package/src/components/UserMenu/hooks/useProfileItem.tsx +2 -1
- package/src/components/UserMenu/hooks/useThemeItem.tsx +4 -1
- package/src/components/UserMenu/hooks/useUserMenuItems.ts +48 -28
- package/src/components/UserMenu/styles.module.scss +6 -3
- package/src/hooks/useDesktopComfortClassName.ts +11 -0
- package/src/hooks/useMobileLayout.ts +1 -0
- package/src/index.ts +1 -0
- package/src/locale/index.ts +4 -4
- package/src/utils/emptyArray.ts +2 -0
package/README.md
CHANGED
|
@@ -656,7 +656,7 @@ export function Basic() {
|
|
|
656
656
|
profile={{ fullName: 'Ivan Petrov', email: 'ipetrov@cloud.ru', inviteCount: 1 }}
|
|
657
657
|
theme={{ value: 'light' }}
|
|
658
658
|
settingItems={SETTING_ITEMS}
|
|
659
|
-
|
|
659
|
+
topItems={[{ content: { label: 'Option 1' } }, { content: { label: 'Option 2' } }]}
|
|
660
660
|
data-test-id='header-user-menu-basic'
|
|
661
661
|
/>
|
|
662
662
|
);
|
|
@@ -693,14 +693,16 @@ export function ControlledTheme() {
|
|
|
693
693
|
|
|
694
694
|
| Prop | Type | Default | Description |
|
|
695
695
|
|------|------|---------|-------------|
|
|
696
|
-
| `
|
|
696
|
+
| `bottomItems` | `BaseItemWithoutNonGroup` \| `CommonGroupItem` \| `DroplistProps` \| `ScrollProps` | — | Пункты перед «Выйти из аккаунта». На desktop закреплены снизу |
|
|
697
697
|
| `onClick` | `(() => void)` | — | |
|
|
698
698
|
| `onLogout` | `(() => void)` | — | |
|
|
699
699
|
| `open` | `boolean` | — | |
|
|
700
|
+
| `organizationItems` | `BaseItemWithoutNonGroup` \| `CommonGroupItem` \| `DroplistProps` \| `ScrollProps` | — | Список организаций. На desktop — единственная прокручиваемая часть меню |
|
|
700
701
|
| `profile` | `UserProfileProps` | `{}` | |
|
|
701
702
|
| `setOpen` | `((open: boolean) => void)` | — | |
|
|
702
703
|
| `settingItems` | `BaseItemProps` | — | |
|
|
703
704
|
| `theme` | `ThemeProps` | — | |
|
|
705
|
+
| `topItems` | `BaseItemWithoutNonGroup` \| `CommonGroupItem` \| `DroplistProps` \| `ScrollProps` | — | Пункты после темы. На desktop закреплены сверху вместе с профилем и темой |
|
|
704
706
|
| `triggerTooltip` | `string` | — | |
|
|
705
707
|
|
|
706
708
|
##### Related types
|
|
@@ -821,5 +823,4 @@ export function Basic() {
|
|
|
821
823
|
|
|
822
824
|
| Prop | Type | Default | Description |
|
|
823
825
|
|------|------|---------|-------------|
|
|
824
|
-
| `isMobile` | `boolean` | — | |
|
|
825
826
|
| `items` | `BreadcrumbsProps` \| `Item` | — | |
|
|
@@ -6,9 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.HeaderButton = HeaderButton;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const button_1 = require("@cloud-ru/ds-button");
|
|
9
|
-
const theme_1 = require("@cloud-ru/ds-theme");
|
|
10
9
|
const tooltip_1 = require("@cloud-ru/ds-tooltip");
|
|
11
|
-
const classnames_1 = __importDefault(require("classnames"));
|
|
12
10
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
13
11
|
/**
|
|
14
12
|
* HeaderButton — кнопка хедера с тултипом (лого, пользовательское меню и т.п.).
|
|
@@ -16,7 +14,6 @@ const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
|
16
14
|
* остальное API `Button` и `Tooltip` передаётся как есть.
|
|
17
15
|
*/
|
|
18
16
|
function HeaderButton({ tooltip, isMobile, className, ...rest }) {
|
|
19
|
-
const compactThemeClassName = (0, theme_1.useThemeClassnames)({ density: 'compact' });
|
|
20
17
|
return (
|
|
21
18
|
// FIXME: typescript ломается, если не указать tip явно
|
|
22
19
|
// пока не разбирался почему так
|
|
@@ -29,5 +26,5 @@ function HeaderButton({ tooltip, isMobile, className, ...rest }) {
|
|
|
29
26
|
placement: 'bottom',
|
|
30
27
|
...tooltip,
|
|
31
28
|
triggerClassName: styles_module_scss_1.default.tooltipTrigger,
|
|
32
|
-
}, children: (0, jsx_runtime_1.jsx)(button_1.Button, { ...rest, size: 'm', appearance: 'neutral', view: 'simple', className:
|
|
29
|
+
}, children: (0, jsx_runtime_1.jsx)(button_1.Button, { ...rest, size: 'm', appearance: 'neutral', view: 'simple', className: className }) }));
|
|
33
30
|
}
|
|
@@ -6,23 +6,12 @@ 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");
|
|
10
9
|
const utils_1 = require("@cloud-ru/ds-utils");
|
|
11
10
|
const classnames_1 = __importDefault(require("classnames"));
|
|
12
|
-
const react_1 = require("react");
|
|
13
11
|
const constants_1 = require("../../constants");
|
|
14
12
|
const useMobileLayout_1 = require("../../hooks/useMobileLayout");
|
|
15
13
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
16
14
|
function HeaderLayout({ menu, logo, select, breadcrumbs, toolbar, className, ...rest }) {
|
|
17
15
|
const isMobile = (0, useMobileLayout_1.useMobileLayout)();
|
|
18
|
-
|
|
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;
|
|
16
|
+
return ((0, jsx_runtime_1.jsxs)("header", { className: (0, classnames_1.default)(styles_module_scss_1.default.header, className), "data-mobile": isMobile || undefined, ...(0, utils_1.extractSupportProps)({ 'data-test-id': constants_1.TEST_IDS.headerLayout.root, ...rest }), children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.top, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.left, children: [logo && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: logo }), menu && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), menu, isMobile && (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' })] })), !isMobile && select && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), select] })), !isMobile && breadcrumbs && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), breadcrumbs] }))] }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.right, children: toolbar })] }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' }), isMobile && Boolean(breadcrumbs) && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.bottom, children: breadcrumbs }), (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal' })] }))] }));
|
|
28
17
|
}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
.header{
|
|
2
|
-
box-sizing:border-box;
|
|
3
|
-
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
|
|
4
|
-
}
|
|
5
|
-
|
|
6
1
|
.top{
|
|
7
2
|
display:flex;
|
|
8
3
|
align-items:center;
|
|
@@ -18,7 +13,6 @@
|
|
|
18
13
|
align-items:center;
|
|
19
14
|
box-sizing:border-box;
|
|
20
15
|
height:var(--sn-primitive-dimension-24, 24px);
|
|
21
|
-
border-bottom:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
22
16
|
}
|
|
23
17
|
|
|
24
18
|
.left{
|
|
@@ -34,4 +28,16 @@
|
|
|
34
28
|
gap:var(--sn-primitive-dimension-8, 8px);
|
|
35
29
|
align-items:center;
|
|
36
30
|
height:100%;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.header{
|
|
34
|
+
box-sizing:border-box;
|
|
35
|
+
background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-brand-palette-gray-90, #eeeff3)));
|
|
36
|
+
}
|
|
37
|
+
.header[data-mobile] .top{
|
|
38
|
+
padding:0;
|
|
39
|
+
}
|
|
40
|
+
.header[data-mobile] .left,
|
|
41
|
+
.header[data-mobile] .right{
|
|
42
|
+
gap:0;
|
|
37
43
|
}
|
|
@@ -29,7 +29,8 @@ function Logo({ path, loading, mode, href, onClick, className, tooltip, ...rest
|
|
|
29
29
|
setError(true);
|
|
30
30
|
} }));
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
const showMode = mode && mode !== constants_1.HEADER_LOGO_MODE.Prod;
|
|
33
|
+
return ((0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.logoWrap, "data-with-mode": showMode || undefined, 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) })] }), showMode && ((0, jsx_runtime_1.jsx)(promo_tag_1.PromoTag, { label: constants_1.MAP_LOGO_MODE_TO_LABEL[mode], size: 'xs', appearance: constants_1.MAP_LOGO_MODE_TO_APPEARANCE[mode] }))] }));
|
|
33
34
|
}, [error, mode, path, logoThemeClassName]);
|
|
34
35
|
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
36
|
}
|
|
@@ -8,3 +8,5 @@ export declare const HEADER_LOGO_MODE: {
|
|
|
8
8
|
};
|
|
9
9
|
export type HeaderLogoMode = ValueOf<typeof HEADER_LOGO_MODE>;
|
|
10
10
|
export declare const MAP_LOGO_MODE_TO_APPEARANCE: Record<Exclude<HeaderLogoMode, 'prod'>, PromoTagProps['appearance']>;
|
|
11
|
+
/** Подпись тега режима, как в макете `logoEvo` */
|
|
12
|
+
export declare const MAP_LOGO_MODE_TO_LABEL: Record<Exclude<HeaderLogoMode, 'prod'>, string>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MAP_LOGO_MODE_TO_APPEARANCE = exports.HEADER_LOGO_MODE = void 0;
|
|
3
|
+
exports.MAP_LOGO_MODE_TO_LABEL = exports.MAP_LOGO_MODE_TO_APPEARANCE = exports.HEADER_LOGO_MODE = void 0;
|
|
4
4
|
exports.HEADER_LOGO_MODE = {
|
|
5
5
|
Develop: 'develop',
|
|
6
6
|
Stage: 'stage',
|
|
@@ -12,3 +12,9 @@ exports.MAP_LOGO_MODE_TO_APPEARANCE = {
|
|
|
12
12
|
[exports.HEADER_LOGO_MODE.Stage]: 'orange',
|
|
13
13
|
[exports.HEADER_LOGO_MODE.Hybrid]: 'violet',
|
|
14
14
|
};
|
|
15
|
+
/** Подпись тега режима, как в макете `logoEvo` */
|
|
16
|
+
exports.MAP_LOGO_MODE_TO_LABEL = {
|
|
17
|
+
[exports.HEADER_LOGO_MODE.Develop]: 'dev',
|
|
18
|
+
[exports.HEADER_LOGO_MODE.Stage]: 'stage',
|
|
19
|
+
[exports.HEADER_LOGO_MODE.Hybrid]: 'hybrid',
|
|
20
|
+
};
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
10
10
|
align-items:center;
|
|
11
11
|
}
|
|
12
|
+
.logoWrap[data-with-mode]{
|
|
13
|
+
padding:0 var(--sn-primitive-dimension-4, 4px);
|
|
14
|
+
}
|
|
12
15
|
|
|
13
16
|
.iconStack{
|
|
14
17
|
position:relative;
|
|
@@ -36,6 +39,7 @@
|
|
|
36
39
|
.logo{
|
|
37
40
|
position:relative;
|
|
38
41
|
flex-shrink:0;
|
|
42
|
+
box-sizing:border-box;
|
|
39
43
|
}
|
|
40
44
|
.logo:active:not([data-disabled]) .iconDefault{
|
|
41
45
|
opacity:0;
|
|
@@ -9,7 +9,6 @@ const button_1 = require("@cloud-ru/ds-button");
|
|
|
9
9
|
const card_1 = require("@cloud-ru/ds-card");
|
|
10
10
|
const system_1 = require("@cloud-ru/ds-icons/interface/system");
|
|
11
11
|
const promo_tag_1 = require("@cloud-ru/ds-promo-tag");
|
|
12
|
-
const theme_1 = require("@cloud-ru/ds-theme");
|
|
13
12
|
const typography_1 = require("@cloud-ru/ds-typography");
|
|
14
13
|
const classnames_1 = __importDefault(require("classnames"));
|
|
15
14
|
const react_1 = require("react");
|
|
@@ -18,11 +17,10 @@ const constants_1 = require("./constants");
|
|
|
18
17
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
19
18
|
function MenuBanner({ title, promoTag, afterTitle, onClose, className, href = '#', 'data-test-id': dataTestId, ...rest }) {
|
|
20
19
|
const { t } = locale_1.headerLocale.useTranslations();
|
|
21
|
-
const compactThemeClassname = (0, theme_1.useThemeClassnames)({ density: 'compact' });
|
|
22
20
|
const handleClose = (0, react_1.useCallback)(e => {
|
|
23
21
|
e.preventDefault();
|
|
24
22
|
e.stopPropagation();
|
|
25
23
|
onClose?.(e);
|
|
26
24
|
}, [onClose]);
|
|
27
|
-
return ((0, jsx_runtime_1.jsx)(card_1.Card, { as: 'a', href: href, radius: 'l', view: 'simple', className: (0, classnames_1.default)(styles_module_scss_1.default.root, className), "data-test-id": dataTestId ?? constants_1.MENU_BANNER_TEST_IDS.root, ...rest, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.contentRow, children: [(0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.titleWrapper, children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { as: 'span', variant: 'body', size: 'm', className: styles_module_scss_1.default.title, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.title, children: title }), promoTag && ((0, jsx_runtime_1.jsx)(promo_tag_1.PromoTag, { ...promoTag, className: styles_module_scss_1.default.promoTag, roleAppearance: promo_tag_1.ROLE_APPEARANCE.Decor, size: promo_tag_1.SIZE.Xs, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.promoTag }))] }), afterTitle && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.afterTitle, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.afterTitle, children: afterTitle })), onClose && ((0, jsx_runtime_1.jsx)(button_1.Button, { className:
|
|
25
|
+
return ((0, jsx_runtime_1.jsx)(card_1.Card, { as: 'a', href: href, radius: 'l', view: 'simple', className: (0, classnames_1.default)(styles_module_scss_1.default.root, className), "data-test-id": dataTestId ?? constants_1.MENU_BANNER_TEST_IDS.root, ...rest, children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.contentRow, children: [(0, jsx_runtime_1.jsxs)("span", { className: styles_module_scss_1.default.titleWrapper, children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { as: 'span', variant: 'body', size: 'm', className: styles_module_scss_1.default.title, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.title, children: title }), promoTag && ((0, jsx_runtime_1.jsx)(promo_tag_1.PromoTag, { ...promoTag, className: styles_module_scss_1.default.promoTag, roleAppearance: promo_tag_1.ROLE_APPEARANCE.Decor, size: promo_tag_1.SIZE.Xs, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.promoTag }))] }), afterTitle && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.afterTitle, "data-test-id": constants_1.MENU_BANNER_TEST_IDS.afterTitle, children: afterTitle })), onClose && ((0, jsx_runtime_1.jsx)(button_1.Button, { className: styles_module_scss_1.default.closeButton, view: 'elevated', appearance: 'neutral', size: 's', icon: (0, jsx_runtime_1.jsx)(system_1.CrossSVG, { size: 16 }), onClick: handleClose, "aria-label": t('close'), "data-test-id": constants_1.MENU_BANNER_TEST_IDS.close }))] }) }));
|
|
28
26
|
}
|
|
@@ -13,6 +13,7 @@ const utils_1 = require("@cloud-ru/ds-utils");
|
|
|
13
13
|
const classnames_1 = __importDefault(require("classnames"));
|
|
14
14
|
const react_1 = require("react");
|
|
15
15
|
const locale_1 = require("../../../../locale");
|
|
16
|
+
const emptyArray_1 = require("../../../../utils/emptyArray");
|
|
16
17
|
const shouldBeOpenedInNewTab_1 = require("../../../../utils/shouldBeOpenedInNewTab");
|
|
17
18
|
const utils_2 = require("../../utils");
|
|
18
19
|
const constants_1 = require("./constants");
|
|
@@ -21,7 +22,7 @@ const SortableGroup_1 = require("./helperComponents/SortableGroup");
|
|
|
21
22
|
const useContentSegmentsSortable_1 = require("./hooks/useContentSegmentsSortable");
|
|
22
23
|
const useSegmentDnd_1 = require("./hooks/useSegmentDnd");
|
|
23
24
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
24
|
-
function Content({ searchValue, search, rightTop, segments, searchGroups =
|
|
25
|
+
function Content({ searchValue, search, rightTop, segments, searchGroups = emptyArray_1.EMPTY_ARRAY, segmentPrefs, activeSegmentId, onActiveSegmentChange, onSegmentOrderChange, onSegmentExpandedChange, onSegmentServiceClick, className, footer, favorite, isMobile, preferences, loading, }) {
|
|
25
26
|
const { t } = locale_1.headerLocale.useTranslations();
|
|
26
27
|
const showDescription = (0, react_1.useDeferredValue)(preferences?.showDescription.value ?? false);
|
|
27
28
|
const segmentPrefsById = (0, react_1.useMemo)(() => new Map((segmentPrefs ?? []).map(prefs => [prefs.id, prefs])), [segmentPrefs]);
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
gap:var(--sn-primitive-dimension-8, 8px);
|
|
4
4
|
align-items:center;
|
|
5
5
|
justify-content:space-between;
|
|
6
|
+
box-sizing:border-box;
|
|
6
7
|
width:100%;
|
|
7
8
|
min-width:0;
|
|
8
9
|
min-height:var(--sn-primitive-dimension-32, 32px);
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
.actions{
|
|
32
33
|
display:flex;
|
|
33
34
|
flex-shrink:0;
|
|
34
|
-
gap:
|
|
35
|
+
gap:0;
|
|
35
36
|
align-items:center;
|
|
36
37
|
margin-left:auto;
|
|
37
38
|
}
|
|
@@ -5,19 +5,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SortableGroupCards = SortableGroupCards;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
-
const
|
|
8
|
+
const react_1 = require("react");
|
|
9
9
|
const ServiceCard_1 = require("../../../../ServiceCard");
|
|
10
10
|
const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
|
|
11
|
+
const utils_1 = require("../utils");
|
|
11
12
|
const SubCategory_1 = require("./SubCategory");
|
|
12
13
|
function SortableGroupCards({ groupId, items, showDescription, isMobile, enableServiceDrag, favorite, groupFavoritesEnabled, onServiceClick, }) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const blocks = (0, react_1.useMemo)(() => (0, utils_1.splitIntoBlocks)(items), [items]);
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBlocks, children: blocks.map(block => {
|
|
16
|
+
if (block.type === 'subcategory') {
|
|
17
|
+
return ((0, jsx_runtime_1.jsx)(SubCategory_1.SubCategory, { groupId: groupId, service: block.service, showDescription: showDescription, isMobile: isMobile, dragDisabled: !enableServiceDrag, favorite: favorite, groupFavoritesEnabled: groupFavoritesEnabled, onServiceClick: onServiceClick }, String(groupId) + block.service.id));
|
|
16
18
|
}
|
|
17
|
-
|
|
18
|
-
if ((0, innerLink_1.isSubCategoryCard)(service)) {
|
|
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));
|
|
20
|
-
}
|
|
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));
|
|
19
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.groupBody, "data-mobile": isMobile || undefined, "data-show-description": showDescription || undefined, children: block.services.map(service => ((0, jsx_runtime_1.jsx)(ServiceCard_1.DraggableServiceCard, { groupId: groupId, service: service, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: !enableServiceDrag }, String(groupId) + service.id))) }, String(groupId) + block.services[0].id));
|
|
22
20
|
}) }));
|
|
23
21
|
}
|
|
@@ -37,10 +37,10 @@ function SubCategory({ groupId, service, showDescription, isMobile, dragDisabled
|
|
|
37
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
38
|
value: Boolean(isExpanded),
|
|
39
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))) })] }));
|
|
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, "data-show-description": showDescription || 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))) })] }));
|
|
41
41
|
}
|
|
42
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
43
|
value: Boolean(isExpanded),
|
|
44
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))) }) }) }) }));
|
|
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, "data-show-description": showDescription || 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))) }) }) }) }));
|
|
46
46
|
}
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
}
|
|
28
28
|
@media (hover: hover){
|
|
29
29
|
.header:hover{
|
|
30
|
-
background-color:var(--sn-theme-color-
|
|
30
|
+
background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
31
31
|
}
|
|
32
32
|
.header:hover .headerActions{
|
|
33
33
|
pointer-events:auto;
|
|
@@ -40,16 +40,13 @@
|
|
|
40
40
|
min-width:0;
|
|
41
41
|
color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
|
|
42
42
|
}
|
|
43
|
-
.headerTitle:hover .headerActions, .headerTitle:focus-visible .headerActions, .headerTitle:has(:focus-visible) .headerActions{
|
|
44
|
-
pointer-events:auto;
|
|
45
|
-
opacity:1;
|
|
46
|
-
}
|
|
47
43
|
|
|
48
44
|
.group{
|
|
49
45
|
position:relative;
|
|
50
46
|
overflow-x:clip;
|
|
51
47
|
display:flex;
|
|
52
48
|
flex-direction:column;
|
|
49
|
+
box-sizing:border-box;
|
|
53
50
|
width:100%;
|
|
54
51
|
min-width:0;
|
|
55
52
|
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);
|
|
@@ -104,11 +101,23 @@
|
|
|
104
101
|
outline-offset:var(--sn-primitive-strokeWeight-strokeSemiBold, 2px);
|
|
105
102
|
}
|
|
106
103
|
|
|
104
|
+
.groupBlocks{
|
|
105
|
+
display:flex;
|
|
106
|
+
flex-direction:column;
|
|
107
|
+
gap:var(--sn-primitive-dimension-2, 2px);
|
|
108
|
+
}
|
|
109
|
+
|
|
107
110
|
.groupBody{
|
|
108
111
|
display:grid;
|
|
109
112
|
grid-template-columns:repeat(3, minmax(auto, 1fr));
|
|
110
113
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
111
114
|
}
|
|
115
|
+
.groupBody:not([data-subcategory-body]){
|
|
116
|
+
padding:var(--sn-primitive-dimension-4, 4px);
|
|
117
|
+
}
|
|
118
|
+
.groupBody:not([data-show-description]){
|
|
119
|
+
gap:0;
|
|
120
|
+
}
|
|
112
121
|
@container (width <= 728px){
|
|
113
122
|
.groupBody:not([data-mobile]){
|
|
114
123
|
grid-template-columns:repeat(2, minmax(auto, 1fr));
|
|
@@ -125,7 +134,7 @@
|
|
|
125
134
|
}
|
|
126
135
|
|
|
127
136
|
.decoration{
|
|
128
|
-
--highlight-border-width:1px;
|
|
137
|
+
--highlight-border-width:var(--sn-primitive-strokeWeight-strokeRegular, 1px);
|
|
129
138
|
position:absolute;
|
|
130
139
|
top:0;
|
|
131
140
|
left:0;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InnerLink } from '../../../../types';
|
|
2
|
+
export type GroupBlock = {
|
|
3
|
+
type: 'subcategory';
|
|
4
|
+
service: InnerLink;
|
|
5
|
+
} | {
|
|
6
|
+
type: 'cards';
|
|
7
|
+
services: InnerLink[];
|
|
8
|
+
};
|
|
9
|
+
/** Разбивает сервисы группы на блоки, как в макете: подкатегория — свой блок, подряд идущие карточки — общий. */
|
|
10
|
+
export declare function splitIntoBlocks(items: InnerLink[]): GroupBlock[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.splitIntoBlocks = splitIntoBlocks;
|
|
4
|
+
const innerLink_1 = require("../../../../utils/innerLink");
|
|
5
|
+
/** Разбивает сервисы группы на блоки, как в макете: подкатегория — свой блок, подряд идущие карточки — общий. */
|
|
6
|
+
function splitIntoBlocks(items) {
|
|
7
|
+
return items.reduce((blocks, service) => {
|
|
8
|
+
if (service.hidden) {
|
|
9
|
+
return blocks;
|
|
10
|
+
}
|
|
11
|
+
if ((0, innerLink_1.isSubCategoryCard)(service)) {
|
|
12
|
+
return [...blocks, { type: 'subcategory', service }];
|
|
13
|
+
}
|
|
14
|
+
const last = blocks[blocks.length - 1];
|
|
15
|
+
if (last?.type === 'cards') {
|
|
16
|
+
last.services.push(service);
|
|
17
|
+
return blocks;
|
|
18
|
+
}
|
|
19
|
+
return [...blocks, { type: 'cards', services: [service] }];
|
|
20
|
+
}, []);
|
|
21
|
+
}
|
|
@@ -14,6 +14,7 @@ const uikit_product_card_predefined_1 = require("@cloud-ru/ds-uikit-product-card
|
|
|
14
14
|
const utils_1 = require("@cloud-ru/ds-utils");
|
|
15
15
|
const classnames_1 = __importDefault(require("classnames"));
|
|
16
16
|
const react_1 = require("react");
|
|
17
|
+
const useDesktopComfortClassName_1 = require("../../../../hooks/useDesktopComfortClassName");
|
|
17
18
|
const locale_1 = require("../../../../locale");
|
|
18
19
|
const utils_2 = require("../../utils");
|
|
19
20
|
const components_1 = require("./components");
|
|
@@ -23,6 +24,7 @@ const utils_3 = require("./utils");
|
|
|
23
24
|
function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }) {
|
|
24
25
|
const { t } = locale_1.headerLocale.useTranslations();
|
|
25
26
|
const loading = favorite.loading;
|
|
27
|
+
const comfortClassName = (0, useDesktopComfortClassName_1.useDesktopComfortClassName)();
|
|
26
28
|
const [segment, setSegment] = (0, utils_1.useValueControl)({
|
|
27
29
|
value: favorite.segment,
|
|
28
30
|
defaultValue: constants_1.FAVORITES_SEGMENT.Favorites,
|
|
@@ -65,5 +67,5 @@ function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }) {
|
|
|
65
67
|
onChange: favorite.onChange(service.id),
|
|
66
68
|
}, ...(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 }));
|
|
67
69
|
})();
|
|
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: '
|
|
70
|
+
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, className: comfortClassName, closeDroplistOnItemClick: true, children: (0, jsx_runtime_1.jsx)(button_1.Button, { view: 'simple', 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] }));
|
|
69
71
|
}
|
|
@@ -47,16 +47,18 @@
|
|
|
47
47
|
|
|
48
48
|
.listScrollInner{
|
|
49
49
|
height:100%;
|
|
50
|
-
max-height:calc(var(--sn-primitive-dimension-32, 32px)
|
|
50
|
+
max-height:calc((var(--sn-primitive-dimension-32, 32px) + var(--sn-primitive-dimension-4, 4px)) * 12 + var(--sn-primitive-dimension-8, 8px));
|
|
51
51
|
}
|
|
52
52
|
.listScrollInner[data-mobile]{
|
|
53
|
-
max-height:calc(var(--sn-primitive-dimension-40, 40px)
|
|
53
|
+
max-height:calc((var(--sn-primitive-dimension-40, 40px) + var(--sn-primitive-dimension-4, 4px)) * 6 + var(--sn-primitive-dimension-8, 8px));
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
.list{
|
|
57
57
|
display:flex;
|
|
58
58
|
flex-direction:column;
|
|
59
|
+
gap:var(--sn-primitive-dimension-4, 4px);
|
|
59
60
|
align-items:stretch;
|
|
61
|
+
box-sizing:border-box;
|
|
60
62
|
width:100%;
|
|
61
63
|
padding:var(--sn-primitive-dimension-4, 4px) var(--sn-primitive-dimension-8, 8px) var(--sn-primitive-dimension-8, 8px);
|
|
62
64
|
}
|
|
@@ -82,6 +84,7 @@
|
|
|
82
84
|
flex-direction:column;
|
|
83
85
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
84
86
|
align-items:stretch;
|
|
87
|
+
box-sizing:border-box;
|
|
85
88
|
width:100%;
|
|
86
89
|
padding:var(--sn-primitive-dimension-8, 8px);
|
|
87
90
|
}
|
|
@@ -3,6 +3,7 @@ import { MainMenuSettingsItem } from '../../types';
|
|
|
3
3
|
type MenuBottomProps = {
|
|
4
4
|
settingItems?: MainMenuSettingsItem[];
|
|
5
5
|
leftBottom: ReactNode;
|
|
6
|
+
isMobile?: boolean;
|
|
6
7
|
};
|
|
7
|
-
export declare function MenuBottom({ settingItems, leftBottom }: MenuBottomProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function MenuBottom({ settingItems, leftBottom, isMobile }: MenuBottomProps): import("react/jsx-runtime").JSX.Element;
|
|
8
9
|
export {};
|
|
@@ -11,6 +11,6 @@ const react_1 = require("react");
|
|
|
11
11
|
const constants_1 = require("../../../../constants");
|
|
12
12
|
const utils_1 = require("../../utils");
|
|
13
13
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
14
|
-
function MenuBottom({ settingItems, leftBottom }) {
|
|
15
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.bottom, "data-test-id": constants_1.TEST_IDS.mainMenu.leftBottom, children: [Boolean(settingItems?.length) && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.bottomItems, "data-test-id": constants_1.TEST_IDS.mainMenu.leftBottomItems, children: settingItems?.map(item => ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [item.divider === 'before' && (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal', className: styles_module_scss_1.default.bottomDivider }), (0, jsx_runtime_1.jsx)(uikit_product_card_predefined_1.CardServiceLight, { ...(item.href ? { href: item.href, as: 'a' } : { as: 'button', type: 'button' }), title: item.label, icon: (0, utils_1.getLinkEmblem)(item), onClick: item.onClick, "data-test-id": `header__drawer-menu__setting-${item.id}` }), item.divider === 'after' && (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal', className: styles_module_scss_1.default.bottomDivider })] }, item.id))) })), leftBottom] }));
|
|
14
|
+
function MenuBottom({ settingItems, leftBottom, isMobile }) {
|
|
15
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.bottom, "data-test-id": constants_1.TEST_IDS.mainMenu.leftBottom, children: [Boolean(settingItems?.length) && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.bottomItems, "data-mobile": isMobile || undefined, "data-test-id": constants_1.TEST_IDS.mainMenu.leftBottomItems, children: settingItems?.map(item => ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [item.divider === 'before' && (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal', className: styles_module_scss_1.default.bottomDivider }), (0, jsx_runtime_1.jsx)(uikit_product_card_predefined_1.CardServiceLight, { ...(item.href ? { href: item.href, as: 'a' } : { as: 'button', type: 'button' }), title: item.label, icon: (0, utils_1.getLinkEmblem)(item), onClick: item.onClick, className: styles_module_scss_1.default.bottomCard, "data-test-id": `header__drawer-menu__setting-${item.id}` }), item.divider === 'after' && (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'horizontal', className: styles_module_scss_1.default.bottomDivider })] }, item.id))) })), leftBottom] }));
|
|
16
16
|
}
|
|
@@ -56,13 +56,14 @@
|
|
|
56
56
|
display:flex;
|
|
57
57
|
flex-direction:column;
|
|
58
58
|
gap:var(--sn-primitive-dimension-4, 4px);
|
|
59
|
+
box-sizing:border-box;
|
|
59
60
|
width:100%;
|
|
60
61
|
min-width:0;
|
|
61
62
|
padding:var(--sn-primitive-dimension-16, 16px);
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
.menu{
|
|
65
|
-
--snack-menu-header-height:40px;
|
|
66
|
+
--snack-menu-header-height:var(--sn-primitive-dimension-40, 40px);
|
|
66
67
|
--snack-menu-left-width:263px;
|
|
67
68
|
position:relative;
|
|
68
69
|
height:100vh;
|
|
@@ -3,5 +3,6 @@ export type MenuHeaderBrandProps = {
|
|
|
3
3
|
logo?: ReactNode;
|
|
4
4
|
onClose(): void;
|
|
5
5
|
className?: string;
|
|
6
|
+
isMobile?: boolean;
|
|
6
7
|
};
|
|
7
|
-
export declare function MenuHeaderBrand({ logo, onClose, className }: MenuHeaderBrandProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function MenuHeaderBrand({ logo, onClose, className, isMobile }: MenuHeaderBrandProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -11,7 +11,7 @@ const classnames_1 = __importDefault(require("classnames"));
|
|
|
11
11
|
const locale_1 = require("../../../../locale");
|
|
12
12
|
const HeaderButton_1 = require("../../../HeaderButton");
|
|
13
13
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
14
|
-
function MenuHeaderBrand({ logo, onClose, className }) {
|
|
14
|
+
function MenuHeaderBrand({ logo, onClose, className, isMobile }) {
|
|
15
15
|
const { t } = locale_1.headerLocale.useTranslations();
|
|
16
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.container, className), children: [logo, (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), (0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { className: styles_module_scss_1.default.closeButton, onClick: onClose, icon: (0, jsx_runtime_1.jsx)(system_1.ChevronLeftSVG, {}), label: t('close') })] }));
|
|
16
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.container, className), "data-mobile": isMobile || undefined, children: [logo, (0, jsx_runtime_1.jsx)(divider_1.Divider, { orientation: 'vertical' }), (0, jsx_runtime_1.jsx)(HeaderButton_1.HeaderButton, { className: styles_module_scss_1.default.closeButton, onClick: onClose, icon: (0, jsx_runtime_1.jsx)(system_1.ChevronLeftSVG, {}), label: t('close') })] }));
|
|
17
17
|
}
|
|
@@ -5,9 +5,18 @@
|
|
|
5
5
|
box-sizing:border-box;
|
|
6
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
|
+
.container[data-mobile]{
|
|
9
|
+
gap:0;
|
|
10
|
+
}
|
|
8
11
|
|
|
9
12
|
.closeButton{
|
|
10
13
|
flex-grow:1;
|
|
11
14
|
flex-shrink:1;
|
|
12
15
|
justify-content:flex-start;
|
|
16
|
+
}
|
|
17
|
+
.closeButton.closeButton[data-view=simple][data-appearance=neutral] [data-text-opacity]{
|
|
18
|
+
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
19
|
+
}
|
|
20
|
+
.closeButton.closeButton[data-view=simple][data-appearance=neutral] [aria-hidden][data-text-opacity]{
|
|
21
|
+
color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
|
|
13
22
|
}
|
|
@@ -6,7 +6,6 @@ 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
9
|
const utils_1 = require("@cloud-ru/ds-utils");
|
|
11
10
|
const react_1 = require("react");
|
|
12
11
|
const constants_1 = require("../../../../constants");
|
|
@@ -40,9 +39,5 @@ function MenuMobile({ open: openProp, setOpen: setOpenProp, settingItems, platfo
|
|
|
40
39
|
const handleClose = (0, react_1.useCallback)(() => {
|
|
41
40
|
setOpen(false);
|
|
42
41
|
}, [setOpen]);
|
|
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
|
+
return ((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, isMobile: true }), (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, isMobile: true })] }) }) }));
|
|
48
43
|
}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
.densityScope{
|
|
2
|
-
display:contents;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
1
|
.menuHeader{
|
|
6
2
|
height:var(--sn-primitive-dimension-40, 40px);
|
|
7
|
-
padding:0 var(--sn-primitive-dimension-4, 4px);
|
|
8
3
|
}
|
|
9
4
|
|
|
10
5
|
.rightContent{
|
|
@@ -22,6 +17,7 @@
|
|
|
22
17
|
display:flex;
|
|
23
18
|
flex-direction:column;
|
|
24
19
|
gap:var(--sn-primitive-dimension-8, 8px);
|
|
20
|
+
box-sizing:border-box;
|
|
25
21
|
min-height:100%;
|
|
26
22
|
margin-top:calc(var(--sn-primitive-dimension-40, 40px) + var(--sn-divider-anatomy-container-height, var(--sn-primitive-dimension-1, 1px)));
|
|
27
23
|
padding:var(--sn-primitive-dimension-16, 16px);
|