@cloud-ru/uikit-product-site-header 0.4.8 → 0.4.9
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 +16 -1
- package/dist/cjs/components/HeaderItems/HeaderItem.d.ts +10 -0
- package/dist/cjs/components/HeaderItems/HeaderItem.js +74 -0
- package/dist/cjs/components/HeaderItems/index.d.ts +2 -0
- package/dist/cjs/components/HeaderItems/index.js +18 -0
- package/dist/cjs/components/HeaderItems/styles.module.css +44 -0
- package/dist/cjs/components/HeaderItems/types.d.ts +12 -0
- package/dist/cjs/components/HeaderItems/types.js +2 -0
- package/dist/cjs/components/SiteHeaderBasic/SiteHeaderBasic.d.ts +45 -0
- package/dist/cjs/components/SiteHeaderBasic/SiteHeaderBasic.js +38 -0
- package/dist/cjs/components/SiteHeaderBasic/index.d.ts +1 -0
- package/dist/cjs/components/SiteHeaderBasic/index.js +17 -0
- package/dist/cjs/components/SiteHeaderBasic/styles.module.css +66 -0
- package/dist/cjs/components/SubHeader/SubHeader.d.ts +17 -0
- package/dist/cjs/components/SubHeader/SubHeader.js +23 -0
- package/dist/cjs/components/SubHeader/index.d.ts +1 -0
- package/dist/cjs/components/SubHeader/index.js +17 -0
- package/dist/cjs/components/SubHeader/styles.module.css +34 -0
- package/dist/cjs/components/UserDetailsDropdown/UserDetailsDropdown.d.ts +7 -0
- package/dist/cjs/components/UserDetailsDropdown/UserDetailsDropdown.js +14 -0
- package/dist/cjs/components/UserDetailsDropdown/index.d.ts +1 -0
- package/dist/cjs/components/UserDetailsDropdown/index.js +17 -0
- package/dist/cjs/components/UserDetailsDropdown/styles.module.css +13 -0
- package/dist/cjs/components/UserDetailsInline/UserDetailsInline.d.ts +8 -0
- package/dist/cjs/components/UserDetailsInline/UserDetailsInline.js +16 -0
- package/dist/cjs/components/UserDetailsInline/index.d.ts +1 -0
- package/dist/cjs/components/UserDetailsInline/index.js +17 -0
- package/dist/cjs/components/UserDetailsInline/styles.module.css +6 -0
- package/dist/cjs/components/index.d.ts +5 -0
- package/dist/cjs/components/index.js +21 -0
- package/dist/cjs/helperComponents/ButtonBurger/ButtonBurger.d.ts +6 -0
- package/dist/cjs/helperComponents/ButtonBurger/ButtonBurger.js +12 -0
- package/dist/cjs/helperComponents/ButtonBurger/index.d.ts +1 -0
- package/dist/cjs/helperComponents/ButtonBurger/index.js +17 -0
- package/dist/cjs/helperComponents/ButtonBurger/styles.module.css +17 -0
- package/dist/cjs/helperComponents/LinkItemHeader/LinkItemHeader.d.ts +10 -0
- package/dist/cjs/helperComponents/LinkItemHeader/LinkItemHeader.js +19 -0
- package/dist/cjs/helperComponents/LinkItemHeader/index.d.ts +1 -0
- package/dist/cjs/helperComponents/LinkItemHeader/index.js +17 -0
- package/dist/cjs/helperComponents/LinkItemHeader/styles.module.css +46 -0
- package/dist/cjs/helperComponents/LogoContent/LogoContent.d.ts +7 -0
- package/dist/cjs/helperComponents/LogoContent/LogoContent.js +14 -0
- package/dist/cjs/helperComponents/LogoContent/index.d.ts +1 -0
- package/dist/cjs/helperComponents/LogoContent/index.js +17 -0
- package/dist/cjs/helperComponents/LogoContent/styles.module.css +35 -0
- package/dist/cjs/helperComponents/MobileMenu/MobileMenu.d.ts +9 -0
- package/dist/cjs/helperComponents/MobileMenu/MobileMenu.js +12 -0
- package/dist/cjs/helperComponents/MobileMenu/index.d.ts +1 -0
- package/dist/cjs/helperComponents/MobileMenu/index.js +17 -0
- package/dist/cjs/helperComponents/MobileMenu/styles.module.css +7 -0
- package/dist/cjs/helperComponents/MoreButton/MoreButton.d.ts +7 -0
- package/dist/cjs/helperComponents/MoreButton/MoreButton.js +29 -0
- package/dist/cjs/helperComponents/MoreButton/index.d.ts +1 -0
- package/dist/cjs/helperComponents/MoreButton/index.js +17 -0
- package/dist/cjs/helperComponents/MoreButton/styles.module.css +33 -0
- package/dist/cjs/helperComponents/UserInfo/UserInfo.d.ts +7 -0
- package/dist/cjs/helperComponents/UserInfo/UserInfo.js +15 -0
- package/dist/cjs/helperComponents/UserInfo/index.d.ts +1 -0
- package/dist/cjs/helperComponents/UserInfo/index.js +17 -0
- package/dist/cjs/helperComponents/UserInfo/styles.module.css +13 -0
- package/dist/cjs/helperComponents/index.d.ts +5 -0
- package/dist/cjs/helperComponents/index.js +21 -0
- package/dist/cjs/hooks/index.d.ts +2 -0
- package/dist/cjs/hooks/index.js +18 -0
- package/dist/cjs/hooks/useHeaderPosition.d.ts +6 -0
- package/dist/cjs/hooks/useHeaderPosition.js +47 -0
- package/dist/cjs/hooks/useResizeObserver.d.ts +3 -0
- package/dist/cjs/hooks/useResizeObserver.js +21 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +17 -0
- package/dist/esm/components/HeaderItems/HeaderItem.d.ts +10 -0
- package/dist/esm/components/HeaderItems/HeaderItem.js +68 -0
- package/dist/esm/components/HeaderItems/index.d.ts +2 -0
- package/dist/esm/components/HeaderItems/index.js +2 -0
- package/dist/esm/components/HeaderItems/styles.module.css +44 -0
- package/dist/esm/components/HeaderItems/types.d.ts +12 -0
- package/dist/esm/components/HeaderItems/types.js +1 -0
- package/dist/esm/components/SiteHeaderBasic/SiteHeaderBasic.d.ts +45 -0
- package/dist/esm/components/SiteHeaderBasic/SiteHeaderBasic.js +32 -0
- package/dist/esm/components/SiteHeaderBasic/index.d.ts +1 -0
- package/dist/esm/components/SiteHeaderBasic/index.js +1 -0
- package/dist/esm/components/SiteHeaderBasic/styles.module.css +66 -0
- package/dist/esm/components/SubHeader/SubHeader.d.ts +17 -0
- package/dist/esm/components/SubHeader/SubHeader.js +17 -0
- package/dist/esm/components/SubHeader/index.d.ts +1 -0
- package/dist/esm/components/SubHeader/index.js +1 -0
- package/dist/esm/components/SubHeader/styles.module.css +34 -0
- package/dist/esm/components/UserDetailsDropdown/UserDetailsDropdown.d.ts +7 -0
- package/dist/esm/components/UserDetailsDropdown/UserDetailsDropdown.js +8 -0
- package/dist/esm/components/UserDetailsDropdown/index.d.ts +1 -0
- package/dist/esm/components/UserDetailsDropdown/index.js +1 -0
- package/dist/esm/components/UserDetailsDropdown/styles.module.css +13 -0
- package/dist/esm/components/UserDetailsInline/UserDetailsInline.d.ts +8 -0
- package/dist/esm/components/UserDetailsInline/UserDetailsInline.js +10 -0
- package/dist/esm/components/UserDetailsInline/index.d.ts +1 -0
- package/dist/esm/components/UserDetailsInline/index.js +1 -0
- package/dist/esm/components/UserDetailsInline/styles.module.css +6 -0
- package/dist/esm/components/index.d.ts +5 -0
- package/dist/esm/components/index.js +5 -0
- package/dist/esm/helperComponents/ButtonBurger/ButtonBurger.d.ts +6 -0
- package/dist/esm/helperComponents/ButtonBurger/ButtonBurger.js +6 -0
- package/dist/esm/helperComponents/ButtonBurger/index.d.ts +1 -0
- package/dist/esm/helperComponents/ButtonBurger/index.js +1 -0
- package/dist/esm/helperComponents/ButtonBurger/styles.module.css +17 -0
- package/dist/esm/helperComponents/LinkItemHeader/LinkItemHeader.d.ts +10 -0
- package/dist/esm/helperComponents/LinkItemHeader/LinkItemHeader.js +13 -0
- package/dist/esm/helperComponents/LinkItemHeader/index.d.ts +1 -0
- package/dist/esm/helperComponents/LinkItemHeader/index.js +1 -0
- package/dist/esm/helperComponents/LinkItemHeader/styles.module.css +46 -0
- package/dist/esm/helperComponents/LogoContent/LogoContent.d.ts +7 -0
- package/dist/esm/helperComponents/LogoContent/LogoContent.js +8 -0
- package/dist/esm/helperComponents/LogoContent/index.d.ts +1 -0
- package/dist/esm/helperComponents/LogoContent/index.js +1 -0
- package/dist/esm/helperComponents/LogoContent/styles.module.css +35 -0
- package/dist/esm/helperComponents/MobileMenu/MobileMenu.d.ts +9 -0
- package/dist/esm/helperComponents/MobileMenu/MobileMenu.js +6 -0
- package/dist/esm/helperComponents/MobileMenu/index.d.ts +1 -0
- package/dist/esm/helperComponents/MobileMenu/index.js +1 -0
- package/dist/esm/helperComponents/MobileMenu/styles.module.css +7 -0
- package/dist/esm/helperComponents/MoreButton/MoreButton.d.ts +7 -0
- package/dist/esm/helperComponents/MoreButton/MoreButton.js +23 -0
- package/dist/esm/helperComponents/MoreButton/index.d.ts +1 -0
- package/dist/esm/helperComponents/MoreButton/index.js +1 -0
- package/dist/esm/helperComponents/MoreButton/styles.module.css +33 -0
- package/dist/esm/helperComponents/UserInfo/UserInfo.d.ts +7 -0
- package/dist/esm/helperComponents/UserInfo/UserInfo.js +9 -0
- package/dist/esm/helperComponents/UserInfo/index.d.ts +1 -0
- package/dist/esm/helperComponents/UserInfo/index.js +1 -0
- package/dist/esm/helperComponents/UserInfo/styles.module.css +13 -0
- package/dist/esm/helperComponents/index.d.ts +5 -0
- package/dist/esm/helperComponents/index.js +5 -0
- package/dist/esm/hooks/index.d.ts +2 -0
- package/dist/esm/hooks/index.js +2 -0
- package/dist/esm/hooks/useHeaderPosition.d.ts +6 -0
- package/dist/esm/hooks/useHeaderPosition.js +43 -0
- package/dist/esm/hooks/useResizeObserver.d.ts +3 -0
- package/dist/esm/hooks/useResizeObserver.js +17 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/package.json +7 -6
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import { useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { LinkItemHeader, MoreButton } from '../../helperComponents';
|
|
5
|
+
import { useResizeObserver } from '../../hooks';
|
|
6
|
+
import styles from './styles.module.css';
|
|
7
|
+
const GAP_ITEMS = 22;
|
|
8
|
+
const WIDTH_MORE_BUTTON = 24;
|
|
9
|
+
export function HeaderItems({ linkItems, isMobileTabletView, activeLinkItemId }) {
|
|
10
|
+
const [visibleItems, setVisibleItems] = useState([]);
|
|
11
|
+
const [hiddenItems, setHiddenItems] = useState([]);
|
|
12
|
+
const hiddenRowElementRef = useRef(null);
|
|
13
|
+
const [firstItemElement, setFirstItemElement] = useState(null);
|
|
14
|
+
const itemsMapRef = useRef(new Map());
|
|
15
|
+
const { width: maxWidth } = useResizeObserver(hiddenRowElementRef.current);
|
|
16
|
+
const { width: firstVisibleItemWidth } = useResizeObserver(firstItemElement);
|
|
17
|
+
function setItemElement(item, index) {
|
|
18
|
+
return (itemElement) => {
|
|
19
|
+
if (index === 0 && itemElement) {
|
|
20
|
+
setFirstItemElement(itemElement);
|
|
21
|
+
}
|
|
22
|
+
if (itemElement === null) {
|
|
23
|
+
itemsMapRef.current.delete(item);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
itemsMapRef.current.set(item, itemElement);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (maxWidth < 1) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const newVisibleItems = [];
|
|
35
|
+
const newHiddenItems = [];
|
|
36
|
+
let isHidden = false;
|
|
37
|
+
let indexElement = 0;
|
|
38
|
+
let currentRowWidth = 0;
|
|
39
|
+
const size = itemsMapRef.current.size;
|
|
40
|
+
itemsMapRef.current.forEach((itemElement, itemRowItem) => {
|
|
41
|
+
const itemWidth = (itemElement === null || itemElement === void 0 ? void 0 : itemElement.offsetWidth) || 0;
|
|
42
|
+
const isLastElement = indexElement + 1 === size;
|
|
43
|
+
const sumRowWidth = currentRowWidth + itemWidth + (isLastElement ? 0 : GAP_ITEMS);
|
|
44
|
+
if (isHidden) {
|
|
45
|
+
newHiddenItems.push(itemRowItem);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
if (maxWidth > sumRowWidth + (isLastElement ? 0 : WIDTH_MORE_BUTTON)) {
|
|
49
|
+
newVisibleItems.push(itemRowItem);
|
|
50
|
+
currentRowWidth = sumRowWidth;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
newHiddenItems.push(itemRowItem);
|
|
54
|
+
isHidden = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
indexElement++;
|
|
58
|
+
});
|
|
59
|
+
setVisibleItems(newVisibleItems);
|
|
60
|
+
setHiddenItems(newHiddenItems);
|
|
61
|
+
}, [linkItems, maxWidth, firstVisibleItemWidth]);
|
|
62
|
+
if (!linkItems || isMobileTabletView)
|
|
63
|
+
return null;
|
|
64
|
+
const isVisibleEmpty = visibleItems.length === 0;
|
|
65
|
+
return (_jsxs("div", { className: styles.wrapper, children: [_jsx("div", { className: cn(styles.linkItemsContainer, styles.hiddenRow), ref: hiddenRowElementRef, children: linkItems.map((linkItem, index) => (_jsx("div", { className: styles.lastItemContainer, ref: setItemElement(linkItem, index), children: _jsx(LinkItemHeader, { label: linkItem.label, target: linkItem.target, href: linkItem.href, onClick: linkItem.onClick }) }, linkItem.id))) }), _jsxs("div", { className: cn(styles.linkItemsContainer, {
|
|
66
|
+
[styles.linkItemsFirstViewContainer]: isVisibleEmpty,
|
|
67
|
+
}), children: [(isVisibleEmpty ? linkItems : visibleItems).map(linkItem => (_jsx("div", { className: styles.lastItemContainer, children: _jsx(LinkItemHeader, { label: linkItem.label, href: linkItem.href, onClick: linkItem.onClick, active: activeLinkItemId === linkItem.id }) }, linkItem.id))), hiddenItems.length > 0 && _jsx(MoreButton, { linkItemsArray: hiddenItems, activeItemId: activeLinkItemId })] })] }));
|
|
68
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
.wrapper{
|
|
2
|
+
display:flex;
|
|
3
|
+
flex-direction:row;
|
|
4
|
+
justify-content:start;
|
|
5
|
+
gap:22px;
|
|
6
|
+
flex-wrap:nowrap;
|
|
7
|
+
min-height:24px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.linkItemsContainer{
|
|
11
|
+
display:flex;
|
|
12
|
+
flex-direction:row;
|
|
13
|
+
align-items:center;
|
|
14
|
+
flex-wrap:wrap;
|
|
15
|
+
gap:22px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.lastItemContainer{
|
|
19
|
+
display:flex;
|
|
20
|
+
flex-direction:row;
|
|
21
|
+
align-items:center;
|
|
22
|
+
flex-wrap:nowrap;
|
|
23
|
+
gap:22px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.hiddenRow{
|
|
27
|
+
position:absolute;
|
|
28
|
+
top:0;
|
|
29
|
+
left:0;
|
|
30
|
+
display:flex;
|
|
31
|
+
width:100%;
|
|
32
|
+
visibility:hidden;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.linkItemsFirstViewContainer{
|
|
36
|
+
display:flex;
|
|
37
|
+
flex-direction:row;
|
|
38
|
+
overflow:hidden;
|
|
39
|
+
height:24px;
|
|
40
|
+
flex-grow:1;
|
|
41
|
+
align-items:center;
|
|
42
|
+
flex-wrap:wrap;
|
|
43
|
+
gap:22px;
|
|
44
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type LinkItem = {
|
|
2
|
+
/** id Элемента */
|
|
3
|
+
id: string;
|
|
4
|
+
/** Текст элемента */
|
|
5
|
+
label: string;
|
|
6
|
+
/** Хэндлер клика элемента */
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
/** Ссылка элемента */
|
|
9
|
+
href?: string;
|
|
10
|
+
/** target для ссылки элемента */
|
|
11
|
+
target?: string;
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { MouseEvent, ReactNode } from 'react';
|
|
2
|
+
import { WithLayoutType, WithSupportProps } from '@sbercloud/uikit-product-utils';
|
|
3
|
+
export type AdditionalLogoText = {
|
|
4
|
+
/** Дополнительный текст Логотипа */
|
|
5
|
+
text?: string;
|
|
6
|
+
/** Переход по ссылке по дополнительному тексту Логотипа */
|
|
7
|
+
link?: string;
|
|
8
|
+
/** Коллбэк по клику на дополнительный текс Логотипа */
|
|
9
|
+
onClick?(event?: MouseEvent<HTMLAnchorElement>): void;
|
|
10
|
+
};
|
|
11
|
+
export type Logo = {
|
|
12
|
+
/** Переход по ссылке Логотипа */
|
|
13
|
+
logoLink: string;
|
|
14
|
+
/** Коллбэк по клику на Логотип */
|
|
15
|
+
onClick?(event?: MouseEvent<HTMLAnchorElement>): void;
|
|
16
|
+
};
|
|
17
|
+
export type HeaderProps = WithSupportProps<WithLayoutType<{
|
|
18
|
+
/** Настройки текста справа Логотипа */
|
|
19
|
+
additionalLogoText?: AdditionalLogoText;
|
|
20
|
+
/** className root блока */
|
|
21
|
+
className?: string;
|
|
22
|
+
/** className основного хедера */
|
|
23
|
+
mainHeaderClassName?: string;
|
|
24
|
+
/** максимальная ширина контейнера */
|
|
25
|
+
maxWidth?: number;
|
|
26
|
+
/** Флаг открытия мобильного меню */
|
|
27
|
+
mobileMenuOpen: boolean;
|
|
28
|
+
/** Настройки Логотипа */
|
|
29
|
+
logo: Logo;
|
|
30
|
+
/** Функция изменения флаг открытия мобильного меню */
|
|
31
|
+
onSetMobileMenuOpen(open: boolean): void;
|
|
32
|
+
/** Контент посередине (между логотипом и правым блоком) */
|
|
33
|
+
middleContent?: ReactNode;
|
|
34
|
+
/** Контент занимающий всю возможную ширину хэдера */
|
|
35
|
+
fullWidthContent?: ReactNode;
|
|
36
|
+
/** Контент справа (левее бургера) */
|
|
37
|
+
rightContent?: ReactNode;
|
|
38
|
+
/** Контент сверху над хэдером, для инфостроки */
|
|
39
|
+
subHeader?: ReactNode;
|
|
40
|
+
/** Контент мобильной версии меню */
|
|
41
|
+
mobileMenuContent?: ReactNode;
|
|
42
|
+
/** Нижний контент кнопок мобильной версии меню */
|
|
43
|
+
mobileConsultationButton?: ReactNode;
|
|
44
|
+
}>>;
|
|
45
|
+
export declare function SiteHeaderBasic({ className, maxWidth, additionalLogoText, middleContent, rightContent, mobileMenuContent, subHeader, fullWidthContent, layoutType, mobileConsultationButton, mobileMenuOpen, onSetMobileMenuOpen, mainHeaderClassName, logo, ...rest }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
import cn from 'classnames';
|
|
14
|
+
import { useRef } from 'react';
|
|
15
|
+
import { Layout } from '@sbercloud/uikit-product-site-layout';
|
|
16
|
+
import { extractSupportProps } from '@sbercloud/uikit-product-utils';
|
|
17
|
+
import { ButtonBurger, LogoContent, MobileMenu } from '../../helperComponents';
|
|
18
|
+
import { useHeaderPosition } from '../../hooks';
|
|
19
|
+
import styles from './styles.module.css';
|
|
20
|
+
const HEIGHT_SUBHEADER = 25;
|
|
21
|
+
export function SiteHeaderBasic(_a) {
|
|
22
|
+
var { className, maxWidth, additionalLogoText, middleContent, rightContent, mobileMenuContent, subHeader, fullWidthContent, layoutType, mobileConsultationButton, mobileMenuOpen, onSetMobileMenuOpen, mainHeaderClassName, logo } = _a, rest = __rest(_a, ["className", "maxWidth", "additionalLogoText", "middleContent", "rightContent", "mobileMenuContent", "subHeader", "fullWidthContent", "layoutType", "mobileConsultationButton", "mobileMenuOpen", "onSetMobileMenuOpen", "mainHeaderClassName", "logo"]);
|
|
23
|
+
const refHeader = useRef(null);
|
|
24
|
+
const { showHeader, headerHeight } = useHeaderPosition(mobileMenuOpen, refHeader);
|
|
25
|
+
const isMobileTabletView = layoutType === 'mobile' || layoutType === 'tablet';
|
|
26
|
+
const isMobile = layoutType === 'mobile';
|
|
27
|
+
return (_jsxs(Layout.Header, Object.assign({ style: {
|
|
28
|
+
transform: `translateY(-${!showHeader ? headerHeight + HEIGHT_SUBHEADER : 0}px)`,
|
|
29
|
+
}, className: cn(styles.root, className), "data-attr": 'layout-header' }, extractSupportProps(rest), { children: [subHeader, _jsx("div", { ref: refHeader, className: cn(styles.headerMaster, styles.dividerHeader, mainHeaderClassName), "data-layout-type": layoutType, children: _jsx("div", { className: styles.headerPartsContainer, style: {
|
|
30
|
+
maxWidth,
|
|
31
|
+
}, children: fullWidthContent !== null && fullWidthContent !== void 0 ? fullWidthContent : (_jsxs(_Fragment, { children: [_jsx("div", { className: styles.leftPart, "data-layout-type": layoutType, children: _jsx(LogoContent, { additionalLogoText: additionalLogoText, isMobile: isMobile, logo: logo }) }), _jsx("div", { className: styles.middlePart, children: middleContent }), _jsxs("div", { className: styles.rightPart, children: [rightContent, mobileMenuContent && isMobileTabletView && (_jsxs(_Fragment, { children: [_jsx(ButtonBurger, { mobileMenuOpen: mobileMenuOpen, onClick: () => onSetMobileMenuOpen(!mobileMenuOpen) }), _jsx(MobileMenu, { mobileConsultationButton: mobileConsultationButton, mobileMenuContent: mobileMenuContent, mobileMenuOpen: mobileMenuOpen, onClickForCloseMobileMenu: () => onSetMobileMenuOpen(false) })] }))] })] })) }) })] })));
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SiteHeaderBasic';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SiteHeaderBasic';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
.root{
|
|
2
|
+
position:sticky;
|
|
3
|
+
top:0;
|
|
4
|
+
transition:box-shadow 0.3s ease-in-out, transform 0.3s ease-in-out;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.headerMaster{
|
|
8
|
+
width:100%;
|
|
9
|
+
background:var(--sys-neutral-background1-level, #fdfdfd);
|
|
10
|
+
padding:0 32px;
|
|
11
|
+
}
|
|
12
|
+
.headerMaster[data-layout-type=mobile]{
|
|
13
|
+
padding:0 16px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.dividerHeader{
|
|
17
|
+
box-sizing:border-box;
|
|
18
|
+
border-bottom:1px solid var(--sys-neutral-decor-default, #dde0ea);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.leftPart{
|
|
22
|
+
display:flex;
|
|
23
|
+
flex-direction:row;
|
|
24
|
+
align-items:center;
|
|
25
|
+
margin-right:40px;
|
|
26
|
+
}
|
|
27
|
+
.leftPart[data-layout-type=mobile]{
|
|
28
|
+
margin-right:0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.middlePart{
|
|
32
|
+
position:relative;
|
|
33
|
+
display:flex;
|
|
34
|
+
flex-direction:row;
|
|
35
|
+
align-items:center;
|
|
36
|
+
flex-grow:1;
|
|
37
|
+
justify-content:start;
|
|
38
|
+
gap:40px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.linkItemsContainer{
|
|
42
|
+
display:flex;
|
|
43
|
+
flex-direction:row;
|
|
44
|
+
align-items:center;
|
|
45
|
+
gap:20px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.rightPart{
|
|
49
|
+
display:flex;
|
|
50
|
+
flex-direction:row;
|
|
51
|
+
align-items:center;
|
|
52
|
+
gap:12px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.headerPartsContainer{
|
|
56
|
+
max-width:1216px;
|
|
57
|
+
width:100%;
|
|
58
|
+
display:flex;
|
|
59
|
+
align-items:center;
|
|
60
|
+
flex-direction:row;
|
|
61
|
+
justify-content:space-between;
|
|
62
|
+
height:60px;
|
|
63
|
+
box-sizing:border-box;
|
|
64
|
+
margin:0 auto;
|
|
65
|
+
overflow:hidden;
|
|
66
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WithLayoutType } from '@sbercloud/uikit-product-utils';
|
|
2
|
+
type BannerInfo = {
|
|
3
|
+
/** Цвет фона SubHeader */
|
|
4
|
+
color: 'yellow' | 'blue' | 'green';
|
|
5
|
+
/** Ссылка на текст SubHeader */
|
|
6
|
+
link?: string;
|
|
7
|
+
/** Текст SubHeader, может передаваться без ссылки */
|
|
8
|
+
title: string;
|
|
9
|
+
};
|
|
10
|
+
type SubHeaderProps = WithLayoutType<{
|
|
11
|
+
/** Объект для отображения данных на баннере */
|
|
12
|
+
bannerInfo: BannerInfo;
|
|
13
|
+
/** Функция закрытия SubHeader */
|
|
14
|
+
onCloseSubHeader?(): void;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function SubHeader({ bannerInfo, onCloseSubHeader, layoutType }: SubHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import { AlertTop } from '@snack-uikit/alert';
|
|
4
|
+
import styles from './styles.module.css';
|
|
5
|
+
const APPEARANCE_ALERT = {
|
|
6
|
+
green: 'success',
|
|
7
|
+
yellow: 'warning',
|
|
8
|
+
blue: 'info',
|
|
9
|
+
};
|
|
10
|
+
export function SubHeader({ bannerInfo, onCloseSubHeader, layoutType }) {
|
|
11
|
+
return (_jsx("div", { className: cn(styles.root, styles[bannerInfo.color]), "data-layout-type": layoutType, children: _jsx(AlertTop, { className: styles.subHeaderContainer, title: !bannerInfo.link ? bannerInfo.title : undefined, link: bannerInfo.link
|
|
12
|
+
? {
|
|
13
|
+
text: bannerInfo.title,
|
|
14
|
+
href: bannerInfo.link,
|
|
15
|
+
}
|
|
16
|
+
: undefined, description: '', icon: false, appearance: APPEARANCE_ALERT[bannerInfo.color], onClose: onCloseSubHeader }) }));
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SubHeader';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SubHeader';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.root{
|
|
2
|
+
background:var(--sys-neutral-background1-level, #fdfdfd);
|
|
3
|
+
padding:0 16px;
|
|
4
|
+
}
|
|
5
|
+
.root[data-layout-type=mobile]{
|
|
6
|
+
padding:0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.subHeaderContainer{
|
|
10
|
+
max-width:1248px;
|
|
11
|
+
margin:0 auto;
|
|
12
|
+
height:36px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.closeIcon{
|
|
16
|
+
cursor:pointer;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.green{
|
|
20
|
+
background-color:var(--sys-green-accent-default, #67b963);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.yellow{
|
|
24
|
+
background-color:var(--sys-yellow-accent-default, #f0d559);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.blue{
|
|
28
|
+
background-color:var(--sys-blue-accent-default, #0063ff);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.link{
|
|
32
|
+
text-decoration:underline;
|
|
33
|
+
color:var(--sys-graphite-text-main, #222222);
|
|
34
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type UserDetailsDropdownProps = {
|
|
2
|
+
userName: string;
|
|
3
|
+
lastName: string;
|
|
4
|
+
onClickExit: () => void;
|
|
5
|
+
onClickDropdownContent?: () => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function UserDetailsDropdown({ userName, lastName, onClickExit, onClickDropdownContent, }: UserDetailsDropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Avatar } from '@snack-uikit/avatar';
|
|
3
|
+
import { Dropdown } from '@snack-uikit/dropdown';
|
|
4
|
+
import { UserDetailsInline } from '../UserDetailsInline';
|
|
5
|
+
import styles from './styles.module.css';
|
|
6
|
+
export function UserDetailsDropdown({ userName, lastName, onClickExit, onClickDropdownContent, }) {
|
|
7
|
+
return (_jsx(Dropdown, { offset: 8, placement: 'bottom-end', onOpenChange: onClickDropdownContent, content: _jsx("div", { className: styles.wrapper, children: _jsx(UserDetailsInline, { className: styles.container, userName: userName, lastName: lastName, onClickExit: onClickExit, withDivider: true }) }), children: _jsx(Avatar, { name: `${userName} ${lastName}`, size: 's', showTwoSymbols: true, className: styles.authAvatar, appearance: 'green' }) }));
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './UserDetailsDropdown';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './UserDetailsDropdown';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type UserDetailsInlineProps = {
|
|
2
|
+
userName: string;
|
|
3
|
+
lastName: string;
|
|
4
|
+
className?: string;
|
|
5
|
+
onClickExit: () => void;
|
|
6
|
+
withDivider?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function UserDetailsInline({ userName, lastName, onClickExit, withDivider, className }: UserDetailsInlineProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import { ExitSVG } from '@sbercloud/uikit-product-icons';
|
|
4
|
+
import { ButtonFunction } from '@snack-uikit/button';
|
|
5
|
+
import { Divider } from '@snack-uikit/divider';
|
|
6
|
+
import { UserInfo } from '../../helperComponents/UserInfo';
|
|
7
|
+
import styles from './styles.module.css';
|
|
8
|
+
export function UserDetailsInline({ userName, lastName, onClickExit, withDivider, className }) {
|
|
9
|
+
return (_jsxs("div", { className: cn(styles.userAuthContent, className), children: [_jsx(UserInfo, { userName: userName, lastName: lastName }), withDivider && _jsx(Divider, {}), _jsx(ButtonFunction, { label: '\u0412\u044B\u0439\u0442\u0438 \u0438\u0437 \u0430\u043A\u043A\u0430\u0443\u043D\u0442\u0430', size: 'xs', appearance: 'neutral', icon: _jsx(ExitSVG, { size: 24 }), iconPosition: 'before', className: styles.buttonExit, onClick: onClickExit })] }));
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './UserDetailsInline';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './UserDetailsInline';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { BurgerSVG, CloseSVG } from '@sbercloud/uikit-product-icons';
|
|
3
|
+
import styles from './styles.module.css';
|
|
4
|
+
export function ButtonBurger({ mobileMenuOpen, onClick }) {
|
|
5
|
+
return (_jsx("button", { className: styles.buttonBurger, onClick: onClick, children: mobileMenuOpen ? _jsx(CloseSVG, {}) : _jsx(BurgerSVG, {}) }));
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ButtonBurger';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ButtonBurger';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
.buttonBurger{
|
|
2
|
+
background-color:transparent;
|
|
3
|
+
cursor:pointer;
|
|
4
|
+
box-shadow:none;
|
|
5
|
+
padding:0;
|
|
6
|
+
height:32px;
|
|
7
|
+
width:32px;
|
|
8
|
+
display:flex;
|
|
9
|
+
align-items:center;
|
|
10
|
+
justify-content:center;
|
|
11
|
+
box-sizing:border-box;
|
|
12
|
+
border:2px solid var(--sys-graphite-decor-default, #ececec);
|
|
13
|
+
color:var(--sys-graphite-accent-default, #222222);
|
|
14
|
+
}
|
|
15
|
+
.buttonBurger:active, .buttonBurger:focus{
|
|
16
|
+
outline:none;
|
|
17
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type LinkItemHeaderProps = {
|
|
2
|
+
href?: string;
|
|
3
|
+
target?: string;
|
|
4
|
+
label: string;
|
|
5
|
+
withoutHover?: boolean;
|
|
6
|
+
active?: boolean;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
};
|
|
9
|
+
export declare function LinkItemHeader({ href, label, onClick, withoutHover, target, active }: LinkItemHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import { Typography } from '@snack-uikit/typography';
|
|
4
|
+
import styles from './styles.module.css';
|
|
5
|
+
export function LinkItemHeader({ href, label, onClick, withoutHover, target, active }) {
|
|
6
|
+
if (href) {
|
|
7
|
+
return (_jsx("a", { href: href, target: target, onClick: onClick, className: styles.item, children: _jsx(Typography.SansTitleS, { children: label }) }));
|
|
8
|
+
}
|
|
9
|
+
return (_jsx("button", { onClick: onClick, className: cn(styles.item, styles.button, {
|
|
10
|
+
[styles.active]: active,
|
|
11
|
+
[styles.hovered]: !withoutHover && !active,
|
|
12
|
+
}), children: _jsx(Typography.SansTitleS, { children: label }) }));
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LinkItemHeader';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LinkItemHeader';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
.button{
|
|
2
|
+
background-color:transparent;
|
|
3
|
+
border:none;
|
|
4
|
+
box-shadow:none;
|
|
5
|
+
padding:0;
|
|
6
|
+
}
|
|
7
|
+
.button:active, .button:focus{
|
|
8
|
+
outline:none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.item{
|
|
12
|
+
position:relative;
|
|
13
|
+
text-decoration:none;
|
|
14
|
+
color:var(--sys-graphite-accent-default, #222222);
|
|
15
|
+
transition:color 0.3s ease-in-out;
|
|
16
|
+
cursor:pointer;
|
|
17
|
+
}
|
|
18
|
+
.item:hover{
|
|
19
|
+
color:var(--sys-graphite-accent-hovered, #383838);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.hovered::after{
|
|
23
|
+
content:"";
|
|
24
|
+
position:absolute;
|
|
25
|
+
bottom:-20px;
|
|
26
|
+
left:0;
|
|
27
|
+
width:100%;
|
|
28
|
+
height:2px;
|
|
29
|
+
opacity:0;
|
|
30
|
+
background:var(--sys-primary-accent-default, #26d07c);
|
|
31
|
+
transition:opacity 0.3s ease-in-out;
|
|
32
|
+
}
|
|
33
|
+
.hovered:hover::after{
|
|
34
|
+
opacity:1;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.active::after{
|
|
38
|
+
content:"";
|
|
39
|
+
position:absolute;
|
|
40
|
+
bottom:-20px;
|
|
41
|
+
left:0;
|
|
42
|
+
width:100%;
|
|
43
|
+
height:2px;
|
|
44
|
+
opacity:1;
|
|
45
|
+
background:var(--sys-primary-accent-default, #26d07c);
|
|
46
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AdditionalLogoText, Logo } from '../../components/SiteHeaderBasic/SiteHeaderBasic';
|
|
2
|
+
export type LogoContentProps = {
|
|
3
|
+
additionalLogoText?: AdditionalLogoText;
|
|
4
|
+
logo: Logo;
|
|
5
|
+
isMobile?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function LogoContent({ additionalLogoText, isMobile, logo }: LogoContentProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CloudFullLogoSVG } from '@sbercloud/uikit-product-icons';
|
|
3
|
+
import { Typography } from '@snack-uikit/typography';
|
|
4
|
+
import styles from './styles.module.css';
|
|
5
|
+
export function LogoContent({ additionalLogoText, isMobile, logo }) {
|
|
6
|
+
const heightIconSizeProp = isMobile ? 102 : 130;
|
|
7
|
+
return (_jsxs("div", { className: styles.logoContentContainer, children: [_jsx("a", { href: logo.logoLink, onClick: logo.onClick, className: styles.logoLink, children: _jsx(CloudFullLogoSVG, { size: heightIconSizeProp, width: '60px' }) }), additionalLogoText && (_jsxs("div", { className: styles.subLogo, children: [_jsx(Typography, { className: styles.slash, size: 'm', purpose: 'title', family: 'sans', children: "/" }), _jsx("a", { href: additionalLogoText.link, onClick: additionalLogoText.onClick, className: styles.link, children: _jsx(Typography, { size: 'm', purpose: 'title', family: 'sans', children: additionalLogoText.text }) })] }))] }));
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LogoContent';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LogoContent';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
.logoContentContainer{
|
|
2
|
+
display:flex;
|
|
3
|
+
flex-direction:row;
|
|
4
|
+
align-items:center;
|
|
5
|
+
gap:10px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.link{
|
|
9
|
+
text-decoration:none;
|
|
10
|
+
display:flex;
|
|
11
|
+
align-items:center;
|
|
12
|
+
color:var(--sys-graphite-accent-default, #222222);
|
|
13
|
+
}
|
|
14
|
+
.link:hover{
|
|
15
|
+
color:var(--sys-primary-accent-hovered, #12bf6a);
|
|
16
|
+
}
|
|
17
|
+
.link:active{
|
|
18
|
+
color:var(--sys-primary-accent-pressed, #0ea55b);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.slash{
|
|
22
|
+
color:var(--sys-neutral-text-disabled, #aaaebd);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.logoLink{
|
|
26
|
+
display:flex;
|
|
27
|
+
align-items:center;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.subLogo{
|
|
31
|
+
display:flex;
|
|
32
|
+
flex-direction:row;
|
|
33
|
+
align-items:center;
|
|
34
|
+
gap:8px;
|
|
35
|
+
}
|