@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.
Files changed (140) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/dist/cjs/components/HeaderItems/HeaderItem.d.ts +10 -0
  3. package/dist/cjs/components/HeaderItems/HeaderItem.js +74 -0
  4. package/dist/cjs/components/HeaderItems/index.d.ts +2 -0
  5. package/dist/cjs/components/HeaderItems/index.js +18 -0
  6. package/dist/cjs/components/HeaderItems/styles.module.css +44 -0
  7. package/dist/cjs/components/HeaderItems/types.d.ts +12 -0
  8. package/dist/cjs/components/HeaderItems/types.js +2 -0
  9. package/dist/cjs/components/SiteHeaderBasic/SiteHeaderBasic.d.ts +45 -0
  10. package/dist/cjs/components/SiteHeaderBasic/SiteHeaderBasic.js +38 -0
  11. package/dist/cjs/components/SiteHeaderBasic/index.d.ts +1 -0
  12. package/dist/cjs/components/SiteHeaderBasic/index.js +17 -0
  13. package/dist/cjs/components/SiteHeaderBasic/styles.module.css +66 -0
  14. package/dist/cjs/components/SubHeader/SubHeader.d.ts +17 -0
  15. package/dist/cjs/components/SubHeader/SubHeader.js +23 -0
  16. package/dist/cjs/components/SubHeader/index.d.ts +1 -0
  17. package/dist/cjs/components/SubHeader/index.js +17 -0
  18. package/dist/cjs/components/SubHeader/styles.module.css +34 -0
  19. package/dist/cjs/components/UserDetailsDropdown/UserDetailsDropdown.d.ts +7 -0
  20. package/dist/cjs/components/UserDetailsDropdown/UserDetailsDropdown.js +14 -0
  21. package/dist/cjs/components/UserDetailsDropdown/index.d.ts +1 -0
  22. package/dist/cjs/components/UserDetailsDropdown/index.js +17 -0
  23. package/dist/cjs/components/UserDetailsDropdown/styles.module.css +13 -0
  24. package/dist/cjs/components/UserDetailsInline/UserDetailsInline.d.ts +8 -0
  25. package/dist/cjs/components/UserDetailsInline/UserDetailsInline.js +16 -0
  26. package/dist/cjs/components/UserDetailsInline/index.d.ts +1 -0
  27. package/dist/cjs/components/UserDetailsInline/index.js +17 -0
  28. package/dist/cjs/components/UserDetailsInline/styles.module.css +6 -0
  29. package/dist/cjs/components/index.d.ts +5 -0
  30. package/dist/cjs/components/index.js +21 -0
  31. package/dist/cjs/helperComponents/ButtonBurger/ButtonBurger.d.ts +6 -0
  32. package/dist/cjs/helperComponents/ButtonBurger/ButtonBurger.js +12 -0
  33. package/dist/cjs/helperComponents/ButtonBurger/index.d.ts +1 -0
  34. package/dist/cjs/helperComponents/ButtonBurger/index.js +17 -0
  35. package/dist/cjs/helperComponents/ButtonBurger/styles.module.css +17 -0
  36. package/dist/cjs/helperComponents/LinkItemHeader/LinkItemHeader.d.ts +10 -0
  37. package/dist/cjs/helperComponents/LinkItemHeader/LinkItemHeader.js +19 -0
  38. package/dist/cjs/helperComponents/LinkItemHeader/index.d.ts +1 -0
  39. package/dist/cjs/helperComponents/LinkItemHeader/index.js +17 -0
  40. package/dist/cjs/helperComponents/LinkItemHeader/styles.module.css +46 -0
  41. package/dist/cjs/helperComponents/LogoContent/LogoContent.d.ts +7 -0
  42. package/dist/cjs/helperComponents/LogoContent/LogoContent.js +14 -0
  43. package/dist/cjs/helperComponents/LogoContent/index.d.ts +1 -0
  44. package/dist/cjs/helperComponents/LogoContent/index.js +17 -0
  45. package/dist/cjs/helperComponents/LogoContent/styles.module.css +35 -0
  46. package/dist/cjs/helperComponents/MobileMenu/MobileMenu.d.ts +9 -0
  47. package/dist/cjs/helperComponents/MobileMenu/MobileMenu.js +12 -0
  48. package/dist/cjs/helperComponents/MobileMenu/index.d.ts +1 -0
  49. package/dist/cjs/helperComponents/MobileMenu/index.js +17 -0
  50. package/dist/cjs/helperComponents/MobileMenu/styles.module.css +7 -0
  51. package/dist/cjs/helperComponents/MoreButton/MoreButton.d.ts +7 -0
  52. package/dist/cjs/helperComponents/MoreButton/MoreButton.js +29 -0
  53. package/dist/cjs/helperComponents/MoreButton/index.d.ts +1 -0
  54. package/dist/cjs/helperComponents/MoreButton/index.js +17 -0
  55. package/dist/cjs/helperComponents/MoreButton/styles.module.css +33 -0
  56. package/dist/cjs/helperComponents/UserInfo/UserInfo.d.ts +7 -0
  57. package/dist/cjs/helperComponents/UserInfo/UserInfo.js +15 -0
  58. package/dist/cjs/helperComponents/UserInfo/index.d.ts +1 -0
  59. package/dist/cjs/helperComponents/UserInfo/index.js +17 -0
  60. package/dist/cjs/helperComponents/UserInfo/styles.module.css +13 -0
  61. package/dist/cjs/helperComponents/index.d.ts +5 -0
  62. package/dist/cjs/helperComponents/index.js +21 -0
  63. package/dist/cjs/hooks/index.d.ts +2 -0
  64. package/dist/cjs/hooks/index.js +18 -0
  65. package/dist/cjs/hooks/useHeaderPosition.d.ts +6 -0
  66. package/dist/cjs/hooks/useHeaderPosition.js +47 -0
  67. package/dist/cjs/hooks/useResizeObserver.d.ts +3 -0
  68. package/dist/cjs/hooks/useResizeObserver.js +21 -0
  69. package/dist/cjs/index.d.ts +1 -0
  70. package/dist/cjs/index.js +17 -0
  71. package/dist/esm/components/HeaderItems/HeaderItem.d.ts +10 -0
  72. package/dist/esm/components/HeaderItems/HeaderItem.js +68 -0
  73. package/dist/esm/components/HeaderItems/index.d.ts +2 -0
  74. package/dist/esm/components/HeaderItems/index.js +2 -0
  75. package/dist/esm/components/HeaderItems/styles.module.css +44 -0
  76. package/dist/esm/components/HeaderItems/types.d.ts +12 -0
  77. package/dist/esm/components/HeaderItems/types.js +1 -0
  78. package/dist/esm/components/SiteHeaderBasic/SiteHeaderBasic.d.ts +45 -0
  79. package/dist/esm/components/SiteHeaderBasic/SiteHeaderBasic.js +32 -0
  80. package/dist/esm/components/SiteHeaderBasic/index.d.ts +1 -0
  81. package/dist/esm/components/SiteHeaderBasic/index.js +1 -0
  82. package/dist/esm/components/SiteHeaderBasic/styles.module.css +66 -0
  83. package/dist/esm/components/SubHeader/SubHeader.d.ts +17 -0
  84. package/dist/esm/components/SubHeader/SubHeader.js +17 -0
  85. package/dist/esm/components/SubHeader/index.d.ts +1 -0
  86. package/dist/esm/components/SubHeader/index.js +1 -0
  87. package/dist/esm/components/SubHeader/styles.module.css +34 -0
  88. package/dist/esm/components/UserDetailsDropdown/UserDetailsDropdown.d.ts +7 -0
  89. package/dist/esm/components/UserDetailsDropdown/UserDetailsDropdown.js +8 -0
  90. package/dist/esm/components/UserDetailsDropdown/index.d.ts +1 -0
  91. package/dist/esm/components/UserDetailsDropdown/index.js +1 -0
  92. package/dist/esm/components/UserDetailsDropdown/styles.module.css +13 -0
  93. package/dist/esm/components/UserDetailsInline/UserDetailsInline.d.ts +8 -0
  94. package/dist/esm/components/UserDetailsInline/UserDetailsInline.js +10 -0
  95. package/dist/esm/components/UserDetailsInline/index.d.ts +1 -0
  96. package/dist/esm/components/UserDetailsInline/index.js +1 -0
  97. package/dist/esm/components/UserDetailsInline/styles.module.css +6 -0
  98. package/dist/esm/components/index.d.ts +5 -0
  99. package/dist/esm/components/index.js +5 -0
  100. package/dist/esm/helperComponents/ButtonBurger/ButtonBurger.d.ts +6 -0
  101. package/dist/esm/helperComponents/ButtonBurger/ButtonBurger.js +6 -0
  102. package/dist/esm/helperComponents/ButtonBurger/index.d.ts +1 -0
  103. package/dist/esm/helperComponents/ButtonBurger/index.js +1 -0
  104. package/dist/esm/helperComponents/ButtonBurger/styles.module.css +17 -0
  105. package/dist/esm/helperComponents/LinkItemHeader/LinkItemHeader.d.ts +10 -0
  106. package/dist/esm/helperComponents/LinkItemHeader/LinkItemHeader.js +13 -0
  107. package/dist/esm/helperComponents/LinkItemHeader/index.d.ts +1 -0
  108. package/dist/esm/helperComponents/LinkItemHeader/index.js +1 -0
  109. package/dist/esm/helperComponents/LinkItemHeader/styles.module.css +46 -0
  110. package/dist/esm/helperComponents/LogoContent/LogoContent.d.ts +7 -0
  111. package/dist/esm/helperComponents/LogoContent/LogoContent.js +8 -0
  112. package/dist/esm/helperComponents/LogoContent/index.d.ts +1 -0
  113. package/dist/esm/helperComponents/LogoContent/index.js +1 -0
  114. package/dist/esm/helperComponents/LogoContent/styles.module.css +35 -0
  115. package/dist/esm/helperComponents/MobileMenu/MobileMenu.d.ts +9 -0
  116. package/dist/esm/helperComponents/MobileMenu/MobileMenu.js +6 -0
  117. package/dist/esm/helperComponents/MobileMenu/index.d.ts +1 -0
  118. package/dist/esm/helperComponents/MobileMenu/index.js +1 -0
  119. package/dist/esm/helperComponents/MobileMenu/styles.module.css +7 -0
  120. package/dist/esm/helperComponents/MoreButton/MoreButton.d.ts +7 -0
  121. package/dist/esm/helperComponents/MoreButton/MoreButton.js +23 -0
  122. package/dist/esm/helperComponents/MoreButton/index.d.ts +1 -0
  123. package/dist/esm/helperComponents/MoreButton/index.js +1 -0
  124. package/dist/esm/helperComponents/MoreButton/styles.module.css +33 -0
  125. package/dist/esm/helperComponents/UserInfo/UserInfo.d.ts +7 -0
  126. package/dist/esm/helperComponents/UserInfo/UserInfo.js +9 -0
  127. package/dist/esm/helperComponents/UserInfo/index.d.ts +1 -0
  128. package/dist/esm/helperComponents/UserInfo/index.js +1 -0
  129. package/dist/esm/helperComponents/UserInfo/styles.module.css +13 -0
  130. package/dist/esm/helperComponents/index.d.ts +5 -0
  131. package/dist/esm/helperComponents/index.js +5 -0
  132. package/dist/esm/hooks/index.d.ts +2 -0
  133. package/dist/esm/hooks/index.js +2 -0
  134. package/dist/esm/hooks/useHeaderPosition.d.ts +6 -0
  135. package/dist/esm/hooks/useHeaderPosition.js +43 -0
  136. package/dist/esm/hooks/useResizeObserver.d.ts +3 -0
  137. package/dist/esm/hooks/useResizeObserver.js +17 -0
  138. package/dist/esm/index.d.ts +1 -0
  139. package/dist/esm/index.js +1 -0
  140. 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,2 @@
1
+ export * from './HeaderItem';
2
+ export * from './types';
@@ -0,0 +1,2 @@
1
+ export * from './HeaderItem';
2
+ export * from './types';
@@ -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,13 @@
1
+ .authAvatar{
2
+ cursor:pointer;
3
+ }
4
+
5
+ .wrapper{
6
+ min-width:240px;
7
+ padding:4px 8px;
8
+ z-index:5;
9
+ }
10
+
11
+ .container{
12
+ gap:4px;
13
+ }
@@ -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
+ .userAuthContent{
2
+ display:flex;
3
+ align-items:start;
4
+ flex-direction:column;
5
+ gap:8px;
6
+ }
@@ -0,0 +1,5 @@
1
+ export * from './SiteHeaderBasic';
2
+ export * from './HeaderItems';
3
+ export * from './SubHeader';
4
+ export * from './UserDetailsInline';
5
+ export * from './UserDetailsDropdown';
@@ -0,0 +1,5 @@
1
+ export * from './SiteHeaderBasic';
2
+ export * from './HeaderItems';
3
+ export * from './SubHeader';
4
+ export * from './UserDetailsInline';
5
+ export * from './UserDetailsDropdown';
@@ -0,0 +1,6 @@
1
+ type ButtonBurgerProps = {
2
+ mobileMenuOpen: boolean;
3
+ onClick: () => void;
4
+ };
5
+ export declare function ButtonBurger({ mobileMenuOpen, onClick }: ButtonBurgerProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -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
+ }