@alfalab/core-components-navigation-bar 0.1.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.
Files changed (70) hide show
  1. package/Component.d.ts +4 -0
  2. package/Component.js +131 -0
  3. package/components/back-arrow-addon/Component.d.ts +26 -0
  4. package/components/back-arrow-addon/Component.js +32 -0
  5. package/components/back-arrow-addon/index.css +69 -0
  6. package/components/back-arrow-addon/index.d.ts +1 -0
  7. package/components/back-arrow-addon/index.js +14 -0
  8. package/components/closer/Component.d.ts +35 -0
  9. package/components/closer/Component.js +30 -0
  10. package/components/closer/index.css +41 -0
  11. package/components/closer/index.d.ts +1 -0
  12. package/components/closer/index.js +13 -0
  13. package/cssm/Component.d.ts +4 -0
  14. package/cssm/Component.js +132 -0
  15. package/cssm/components/back-arrow-addon/Component.d.ts +26 -0
  16. package/cssm/components/back-arrow-addon/Component.js +31 -0
  17. package/cssm/components/back-arrow-addon/index.d.ts +1 -0
  18. package/cssm/components/back-arrow-addon/index.js +15 -0
  19. package/cssm/components/back-arrow-addon/index.module.css +68 -0
  20. package/cssm/components/closer/Component.d.ts +35 -0
  21. package/cssm/components/closer/Component.js +29 -0
  22. package/cssm/components/closer/index.d.ts +1 -0
  23. package/cssm/components/closer/index.js +14 -0
  24. package/cssm/components/closer/index.module.css +40 -0
  25. package/cssm/index.d.ts +3 -0
  26. package/cssm/index.js +23 -0
  27. package/cssm/index.module.css +108 -0
  28. package/cssm/types.d.ts +113 -0
  29. package/cssm/types.js +2 -0
  30. package/esm/Component.d.ts +4 -0
  31. package/esm/Component.js +124 -0
  32. package/esm/components/back-arrow-addon/Component.d.ts +26 -0
  33. package/esm/components/back-arrow-addon/Component.js +25 -0
  34. package/esm/components/back-arrow-addon/index.css +69 -0
  35. package/esm/components/back-arrow-addon/index.d.ts +1 -0
  36. package/esm/components/back-arrow-addon/index.js +8 -0
  37. package/esm/components/closer/Component.d.ts +35 -0
  38. package/esm/components/closer/Component.js +23 -0
  39. package/esm/components/closer/index.css +41 -0
  40. package/esm/components/closer/index.d.ts +1 -0
  41. package/esm/components/closer/index.js +7 -0
  42. package/esm/index.css +108 -0
  43. package/esm/index.d.ts +3 -0
  44. package/esm/index.js +13 -0
  45. package/esm/types.d.ts +113 -0
  46. package/esm/types.js +1 -0
  47. package/index.css +108 -0
  48. package/index.d.ts +3 -0
  49. package/index.js +20 -0
  50. package/modern/Component.d.ts +4 -0
  51. package/modern/Component.js +125 -0
  52. package/modern/components/back-arrow-addon/Component.d.ts +26 -0
  53. package/modern/components/back-arrow-addon/Component.js +22 -0
  54. package/modern/components/back-arrow-addon/index.css +69 -0
  55. package/modern/components/back-arrow-addon/index.d.ts +1 -0
  56. package/modern/components/back-arrow-addon/index.js +7 -0
  57. package/modern/components/closer/Component.d.ts +35 -0
  58. package/modern/components/closer/Component.js +20 -0
  59. package/modern/components/closer/index.css +41 -0
  60. package/modern/components/closer/index.d.ts +1 -0
  61. package/modern/components/closer/index.js +6 -0
  62. package/modern/index.css +108 -0
  63. package/modern/index.d.ts +3 -0
  64. package/modern/index.js +12 -0
  65. package/modern/types.d.ts +113 -0
  66. package/modern/types.js +1 -0
  67. package/package.json +24 -0
  68. package/send-stats.js +82 -0
  69. package/types.d.ts +113 -0
  70. package/types.js +2 -0
@@ -0,0 +1,68 @@
1
+ :root {
2
+ } /* deprecated */ :root {
3
+ --color-light-graphic-primary: #0b1f35;
4
+ --color-light-graphic-secondary: #6d7986;
5
+ --color-light-specialbg-secondary-transparent: rgba(11, 31, 53, 0.05);
6
+ --color-light-bg-primary-alpha-40: rgba(255, 255, 255, 0.4);
7
+ --color-light-graphic-primary-tint-20: rgb(60, 76, 93);
8
+ --color-light-graphic-primary-tint-30: rgb(84, 98, 114);
9
+ } :root {
10
+ } :root {
11
+ } :root {
12
+
13
+ /* Hard */
14
+
15
+ /* Up */
16
+
17
+ /* Hard up */
18
+ } :root {
19
+ --border-radius-circle: 50%;
20
+ --border-radius-pill: 99px;
21
+ } :root {
22
+ --gap-xs: 8px;
23
+ --gap-s: 12px;
24
+ } :root {
25
+ } :root {
26
+ } .component {
27
+ height: 100%;
28
+ background: var(--color-light-bg-primary-alpha-40);
29
+ -webkit-backdrop-filter: blur(10px);
30
+ backdrop-filter: blur(10px);
31
+ border-radius: var(--border-radius-pill)
32
+ } .component svg > path {
33
+ transition: fill 0.2s ease;
34
+ fill: var(--color-light-graphic-primary);
35
+ } .component:hover svg > path {
36
+ fill: var(--color-light-graphic-primary-tint-20);
37
+ } .component:active svg > path {
38
+ fill: var(--color-light-graphic-primary-tint-30);
39
+ } .mobileComponent {
40
+ height: 32px;
41
+ margin: 0 var(--gap-xs);
42
+ -webkit-backdrop-filter: none;
43
+ backdrop-filter: none;
44
+ background: none;
45
+ } .flex {
46
+ display: flex;
47
+ align-items: center;
48
+ } .iconWrapper {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ height: 48px;
53
+ margin: 0 var(--gap-xs) 0 var(--gap-s);
54
+ border-radius: var(--border-radius-circle)
55
+ } .iconWrapper + .text {
56
+ margin-right: var(--gap-s);
57
+ } .mobileWrapper {
58
+ width: 32px;
59
+ height: 32px;
60
+ background: var(--color-light-specialbg-secondary-transparent);
61
+ -webkit-backdrop-filter: blur(10px);
62
+ backdrop-filter: blur(10px);
63
+ margin: 0
64
+ } .mobileWrapper + .text {
65
+ margin: 0 var(--gap-s) 0 var(--gap-xs);
66
+ } .mobileWrapper svg > path {
67
+ fill: var(--color-light-graphic-secondary);
68
+ }
@@ -0,0 +1,35 @@
1
+ /// <reference types="react" />
2
+ import React from 'react';
3
+ import { ButtonHTMLAttributes, ElementType, FC } from "react";
4
+ interface CloserProps extends ButtonHTMLAttributes<HTMLButtonElement> {
5
+ /**
6
+ * Вид компонента
7
+ */
8
+ view: 'desktop' | 'mobile';
9
+ /**
10
+ * Дополнительный класс
11
+ */
12
+ className?: string;
13
+ /**
14
+ * Позиция крестика
15
+ */
16
+ align?: 'left' | 'right';
17
+ /**
18
+ * Фиксирует крестик
19
+ */
20
+ sticky?: boolean;
21
+ /**
22
+ * Иконка
23
+ */
24
+ icon?: ElementType;
25
+ /**
26
+ * Идентификатор для систем автоматизированного тестирования
27
+ */
28
+ dataTestId?: string;
29
+ /**
30
+ * Коллбэк закрытия.
31
+ */
32
+ onClose?: (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>, reason?: 'backdropClick' | 'escapeKeyDown' | 'closerClick') => void;
33
+ }
34
+ declare const Closer: FC<CloserProps>;
35
+ export { CloserProps, Closer };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ var tslib = require('tslib');
4
+ var React = require('react');
5
+ var cn = require('classnames');
6
+ var coreComponentsIconButton = require('@alfalab/core-components-icon-button/cssm');
7
+ var CrossHeavyMIcon = require('@alfalab/icons-glyph/CrossHeavyMIcon');
8
+ var CrossMIcon = require('@alfalab/icons-glyph/CrossMIcon');
9
+ var styles = require('./index.module.css');
10
+
11
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
12
+
13
+ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
14
+ var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
15
+ var styles__default = /*#__PURE__*/_interopDefaultCompat(styles);
16
+
17
+ var Closer = function (_a) {
18
+ var _b, _c;
19
+ var view = _a.view, className = _a.className, sticky = _a.sticky, _d = _a.icon, icon = _d === void 0 ? view === 'desktop' ? CrossHeavyMIcon.CrossHeavyMIcon : CrossMIcon.CrossMIcon : _d, dataTestId = _a.dataTestId, onClose = _a.onClose, restProps = tslib.__rest(_a, ["view", "className", "sticky", "icon", "dataTestId", "onClose"]);
20
+ var handleClick = function (event) {
21
+ onClose === null || onClose === void 0 ? void 0 : onClose(event, 'closerClick');
22
+ };
23
+ return (React__default.default.createElement("div", { className: cn__default.default(styles__default.default.closer, className, (_b = {},
24
+ _b[styles__default.default.sticky] = sticky,
25
+ _b)) },
26
+ React__default.default.createElement(coreComponentsIconButton.IconButton, tslib.__assign({ size: view === 'desktop' ? 's' : 'xs', className: cn__default.default(styles__default.default.button, (_c = {}, _c[styles__default.default.mobile] = view === 'mobile', _c)), "aria-label": '\u0437\u0430\u043A\u0440\u044B\u0442\u044C', onClick: handleClick, icon: icon, dataTestId: dataTestId }, restProps))));
27
+ };
28
+
29
+ exports.Closer = Closer;
@@ -0,0 +1 @@
1
+ export * from "./Component";
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ var components_closer_Component = require('./Component.js');
4
+ require('tslib');
5
+ require('react');
6
+ require('classnames');
7
+ require('@alfalab/core-components-icon-button/cssm');
8
+ require('@alfalab/icons-glyph/CrossHeavyMIcon');
9
+ require('@alfalab/icons-glyph/CrossMIcon');
10
+ require('./index.module.css');
11
+
12
+
13
+
14
+ exports.Closer = components_closer_Component.Closer;
@@ -0,0 +1,40 @@
1
+ :root {
2
+ } /* deprecated */ :root {
3
+ --color-light-graphic-primary: #0b1f35;
4
+ --color-light-graphic-secondary: #6d7986;
5
+ --color-light-specialbg-secondary-transparent: rgba(11, 31, 53, 0.05);
6
+ --color-light-bg-primary-alpha-40: rgba(255, 255, 255, 0.4);
7
+ } :root {
8
+ } :root {
9
+ } :root {
10
+
11
+ /* Hard */
12
+
13
+ /* Up */
14
+
15
+ /* Hard up */
16
+ } :root {
17
+ } :root {
18
+ } :root {
19
+ } :root {
20
+ } .closer {
21
+ flex-shrink: 0;
22
+ width: 48px;
23
+ height: 48px;
24
+ margin-left: auto;
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: center;
28
+ } .button {
29
+ background: var(--color-light-bg-primary-alpha-40);
30
+ -webkit-backdrop-filter: blur(10px);
31
+ backdrop-filter: blur(10px);
32
+ border-radius: 50px;
33
+ color: var(--color-light-graphic-primary)
34
+ } .button.mobile {
35
+ background: var(--color-light-specialbg-secondary-transparent);
36
+ color: var(--color-light-graphic-secondary);
37
+ } .sticky {
38
+ position: sticky;
39
+ top: 0;
40
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./Component";
2
+ export * from "./components/closer/index";
3
+ export type { NavigationBarProps } from "./types";
package/cssm/index.js ADDED
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var Component = require('./Component.js');
4
+ var components_closer_Component = require('./components/closer/Component.js');
5
+ require('tslib');
6
+ require('react');
7
+ require('classnames');
8
+ require('./components/back-arrow-addon/Component.js');
9
+ require('@alfalab/core-components-button/cssm');
10
+ require('@alfalab/core-components-typography/cssm');
11
+ require('@alfalab/icons-glyph/ArrowLeftMediumMIcon');
12
+ require('@alfalab/icons-glyph/ArrowLeftMIcon');
13
+ require('./components/back-arrow-addon/index.module.css');
14
+ require('./index.module.css');
15
+ require('@alfalab/core-components-icon-button/cssm');
16
+ require('@alfalab/icons-glyph/CrossHeavyMIcon');
17
+ require('@alfalab/icons-glyph/CrossMIcon');
18
+ require('./components/closer/index.module.css');
19
+
20
+
21
+
22
+ exports.NavigationBar = Component.NavigationBar;
23
+ exports.Closer = components_closer_Component.Closer;
@@ -0,0 +1,108 @@
1
+ :root {
2
+ } /* deprecated */ :root {
3
+ --color-light-text-primary: #0b1f35;
4
+ --color-light-text-secondary: rgba(11, 31, 53, 0.7);
5
+ } :root {
6
+ } :root {
7
+ } :root {
8
+
9
+ /* Hard */
10
+
11
+ /* Up */
12
+
13
+ /* Hard up */
14
+ } :root {
15
+ } :root {
16
+ --gap-2xs: 4px;
17
+ --gap-s: 12px;
18
+ } :root {
19
+ } :root {
20
+ } .header {
21
+ width: 100%;
22
+ box-sizing: border-box;
23
+ transition: box-shadow 0.2s ease, background 0.2s ease
24
+ } .header.header.backgroundImage {
25
+ background-repeat: no-repeat;
26
+ background-position: center;
27
+ background-size: cover;
28
+ } .mainLine {
29
+ display: flex;
30
+ align-items: stretch;
31
+ justify-content: space-between;
32
+ z-index: 1;
33
+ background-color: inherit;
34
+ } .mainLineSticky {
35
+ position: sticky;
36
+ top: 0;
37
+ } .mainLineWithImageBg {
38
+ background-color: transparent;
39
+ background-color: initial;
40
+ } .content {
41
+ color: var(--color-light-text-primary);
42
+ display: flex;
43
+ flex-flow: column nowrap;
44
+ justify-content: center;
45
+ flex-grow: 1;
46
+ align-self: baseline;
47
+ box-sizing: border-box;
48
+ min-height: 48px
49
+ } .content.withBothAddons,
50
+ .content.withCompactTitle {
51
+ font-size: 16px;
52
+ line-height: 20px;
53
+ font-weight: 500;
54
+ align-self: center;
55
+ padding-top: var(--gap-2xs);
56
+ padding-bottom: var(--gap-2xs)
57
+ } .content.withBothAddons > .children,
58
+ .content.withBothAddons > .title,
59
+ .content.withCompactTitle > .children,
60
+ .content.withCompactTitle > .title {
61
+ -webkit-line-clamp: 1;
62
+ word-break: break-all;
63
+ } .content.contentOnBotDesktop.contentOnBotDesktop {
64
+ padding-top: var(--gap-s);
65
+ } .content.contentOnBotMobile.contentOnBotMobile {
66
+ padding-top: var(--gap-s);
67
+ } .title {
68
+ word-break: break-word;
69
+ } .subtitle {
70
+ font-size: 14px;
71
+ line-height: 20px;
72
+ font-weight: 400;
73
+ -webkit-line-clamp: 1;
74
+ display: -webkit-box;
75
+ -webkit-box-orient: vertical;
76
+ overflow: hidden;
77
+
78
+ color: var(--color-light-text-secondary);
79
+ word-break: break-all;
80
+ } .addonsWrapper {
81
+ display: flex;
82
+ } .rightAddons {
83
+ margin-left: auto;
84
+ } .addon {
85
+ min-width: 48px;
86
+ height: 48px;
87
+ display: flex;
88
+ justify-content: center;
89
+ align-items: center;
90
+ flex-shrink: 0;
91
+ pointer-events: all;
92
+ } .bottomAddons {
93
+ pointer-events: all;
94
+ } .closer {
95
+ margin-left: auto;
96
+ } .left {
97
+ text-align: left;
98
+ } .center {
99
+ text-align: center;
100
+ } .trim {
101
+ overflow: hidden
102
+ } .trim .title,
103
+ .trim .children {
104
+ -webkit-line-clamp: 2;
105
+ display: -webkit-box;
106
+ -webkit-box-orient: vertical;
107
+ overflow: hidden;
108
+ }
@@ -0,0 +1,113 @@
1
+ /// <reference types="react" />
2
+ import React from 'react';
3
+ import { ReactNode } from "react";
4
+ import { CloserProps } from "./components/closer/index";
5
+ type NavigationBarProps = {
6
+ /**
7
+ * Контент шапки
8
+ */
9
+ children?: ReactNode;
10
+ /**
11
+ * Заголовок шапки
12
+ */
13
+ title?: string;
14
+ /**
15
+ * Подзаголовок (доступен только в мобильной версии)
16
+ */
17
+ subtitle?: string;
18
+ /**
19
+ * Размер заголовка (compact доступен только в мобильной версии)
20
+ */
21
+ titleSize?: 'default' | 'compact';
22
+ /**
23
+ * Доп. класс для аддонов
24
+ */
25
+ addonClassName?: string;
26
+ /**
27
+ * Слот слева
28
+ */
29
+ leftAddons?: ReactNode;
30
+ /**
31
+ * Слот справа
32
+ */
33
+ rightAddons?: ReactNode;
34
+ /**
35
+ * Дополнительный класс для closer
36
+ */
37
+ closerClassName?: string;
38
+ /**
39
+ * Слот снизу
40
+ */
41
+ bottomAddons?: ReactNode;
42
+ /**
43
+ * Наличие компонента крестика
44
+ */
45
+ hasCloser?: boolean;
46
+ /**
47
+ * Наличие кнопки "Назад"
48
+ */
49
+ hasBackButton?: boolean;
50
+ /**
51
+ * Дополнительный класс для правого аддона
52
+ */
53
+ backButtonClassName?: string;
54
+ /**
55
+ * Дополнительный класс
56
+ */
57
+ className?: string;
58
+ /**
59
+ * Дополнительный класс для контента
60
+ */
61
+ contentClassName?: string;
62
+ /**
63
+ * Дополнительный класс для нижнего аддона
64
+ */
65
+ bottomAddonsClassName?: string;
66
+ /**
67
+ * Выравнивание заголовка
68
+ */
69
+ align?: 'left' | 'center';
70
+ /**
71
+ * Обрезать ли заголовок
72
+ */
73
+ trim?: boolean;
74
+ /**
75
+ * Фиксирует шапку
76
+ */
77
+ sticky?: boolean;
78
+ /**
79
+ * Идентификатор для систем автоматизированного тестирования
80
+ */
81
+ dataTestId?: string;
82
+ /**
83
+ * Фоновое изображение
84
+ */
85
+ imageUrl?: string;
86
+ /**
87
+ * Иконка closer.
88
+ */
89
+ closerIcon?: React.ElementType;
90
+ /**
91
+ * Обработчик закрытия
92
+ */
93
+ onClose?: CloserProps['onClose'];
94
+ /**
95
+ * обработчик клика по кнопке "назад"
96
+ */
97
+ onBack?: () => void;
98
+ /**
99
+ * Вид шапки - мобильный или десктоп
100
+ */
101
+ view: 'desktop' | 'mobile';
102
+ /**
103
+ * Ссылка на родительскую ноду.
104
+ */
105
+ parentRef?: React.RefObject<HTMLDivElement>;
106
+ };
107
+ type ContentParams = {
108
+ extraClassName?: string;
109
+ ref?: React.RefObject<HTMLDivElement>;
110
+ style?: React.CSSProperties;
111
+ hidden?: boolean;
112
+ };
113
+ export { NavigationBarProps, ContentParams };
package/cssm/types.js ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';
2
+
@@ -0,0 +1,4 @@
1
+ import { FC } from 'react';
2
+ import { NavigationBarProps } from "./types";
3
+ declare const NavigationBar: FC<NavigationBarProps>;
4
+ export { NavigationBar };
@@ -0,0 +1,124 @@
1
+ import { __assign } from 'tslib';
2
+ import React, { useState, useRef, useEffect } from 'react';
3
+ import cn from 'classnames';
4
+ import { BackArrowAddon } from './components/back-arrow-addon/Component.js';
5
+ import { Closer } from './components/closer/Component.js';
6
+ import '@alfalab/core-components-button/esm';
7
+ import '@alfalab/core-components-typography/esm';
8
+ import '@alfalab/icons-glyph/ArrowLeftMediumMIcon';
9
+ import '@alfalab/icons-glyph/ArrowLeftMIcon';
10
+ import '@alfalab/core-components-icon-button/esm';
11
+ import '@alfalab/icons-glyph/CrossHeavyMIcon';
12
+ import '@alfalab/icons-glyph/CrossMIcon';
13
+
14
+ var getDataTestId = function (dataTestId, element) {
15
+ var elementPart = element ? "-".concat(element.toLowerCase()) : '';
16
+ return dataTestId ? "".concat(dataTestId).concat(elementPart) : undefined;
17
+ };
18
+
19
+ var styles = {"header":"navigation-bar__header_1ssvj","backgroundImage":"navigation-bar__backgroundImage_1ssvj","mainLine":"navigation-bar__mainLine_1ssvj","mainLineSticky":"navigation-bar__mainLineSticky_1ssvj","mainLineWithImageBg":"navigation-bar__mainLineWithImageBg_1ssvj","content":"navigation-bar__content_1ssvj","withBothAddons":"navigation-bar__withBothAddons_1ssvj","withCompactTitle":"navigation-bar__withCompactTitle_1ssvj","children":"navigation-bar__children_1ssvj","title":"navigation-bar__title_1ssvj","contentOnBotDesktop":"navigation-bar__contentOnBotDesktop_1ssvj","contentOnBotMobile":"navigation-bar__contentOnBotMobile_1ssvj","subtitle":"navigation-bar__subtitle_1ssvj","addonsWrapper":"navigation-bar__addonsWrapper_1ssvj","rightAddons":"navigation-bar__rightAddons_1ssvj","addon":"navigation-bar__addon_1ssvj","bottomAddons":"navigation-bar__bottomAddons_1ssvj","closer":"navigation-bar__closer_1ssvj","left":"navigation-bar__left_1ssvj","center":"navigation-bar__center_1ssvj","trim":"navigation-bar__trim_1ssvj"};
20
+ require('./index.css')
21
+
22
+ var ADDONS_HEIGHT = 48;
23
+ var NavigationBar = function (_a) {
24
+ var _b, _c, _d;
25
+ var addonClassName = _a.addonClassName, className = _a.className, contentClassName = _a.contentClassName, closerClassName = _a.closerClassName, leftAddons = _a.leftAddons, rightAddons = _a.rightAddons, bottomAddons = _a.bottomAddons, bottomAddonsClassName = _a.bottomAddonsClassName, children = _a.children, _e = _a.align, align = _e === void 0 ? 'left' : _e, _f = _a.trim, trim = _f === void 0 ? true : _f, title = _a.title, _g = _a.titleSize, titleSize = _g === void 0 ? 'default' : _g, subtitle = _a.subtitle, hasCloser = _a.hasCloser, hasBackButton = _a.hasBackButton, backButtonClassName = _a.backButtonClassName, dataTestId = _a.dataTestId, imageUrl = _a.imageUrl, closerIcon = _a.closerIcon, onClose = _a.onClose, view = _a.view, parentRef = _a.parentRef, sticky = _a.sticky, onBack = _a.onBack;
26
+ var _h = useState(0), scrollTop = _h[0], setScrollTop = _h[1];
27
+ var bottomContentRef = useRef(null);
28
+ var headerRef = useRef(null);
29
+ var mainLinePaddingTopRef = useRef('0px');
30
+ var compactTitle = view === 'mobile' && titleSize === 'compact';
31
+ var hasLeftPart = Boolean(leftAddons || hasBackButton);
32
+ var hasRightPart = Boolean(rightAddons || hasCloser);
33
+ var hasContent = Boolean(title || children);
34
+ var withAnimation = Boolean(view === 'mobile' && hasLeftPart && sticky && !compactTitle);
35
+ var showContentOnTop = hasContent && (compactTitle || !hasLeftPart);
36
+ var showContentOnBot = hasContent && !compactTitle && hasLeftPart;
37
+ var showStaticContentOnTop = !withAnimation && showContentOnTop;
38
+ var showStaticContentOnBot = !withAnimation && showContentOnBot;
39
+ var showAnimatedContentOnTop = withAnimation && showContentOnBot && scrollTop > ADDONS_HEIGHT;
40
+ var showAnimatedContentOnBot = withAnimation && showContentOnBot;
41
+ var headerPaddingTop = mainLinePaddingTopRef.current;
42
+ useEffect(function () {
43
+ var parent = parentRef === null || parentRef === void 0 ? void 0 : parentRef.current;
44
+ var handleScroll = function (ev) {
45
+ var divElement = ev.target;
46
+ setScrollTop(divElement.scrollTop);
47
+ };
48
+ if (withAnimation && headerRef.current) {
49
+ mainLinePaddingTopRef.current = getComputedStyle(headerRef.current).paddingTop;
50
+ }
51
+ if (withAnimation && parent) {
52
+ parent.addEventListener('scroll', handleScroll);
53
+ }
54
+ return function () { return parent === null || parent === void 0 ? void 0 : parent.removeEventListener('scroll', handleScroll); };
55
+ }, [parentRef, withAnimation]);
56
+ var renderBackButton = function () {
57
+ var textOpacity = 1;
58
+ if (withAnimation) {
59
+ var height = hasContent ? ADDONS_HEIGHT : ADDONS_HEIGHT / 2;
60
+ textOpacity = Math.max(0, 1 - scrollTop / height);
61
+ }
62
+ else if (compactTitle) {
63
+ textOpacity = 0;
64
+ }
65
+ return (React.createElement("div", { className: cn(styles.addon, backButtonClassName) },
66
+ React.createElement(BackArrowAddon, { textOpacity: textOpacity, view: view, onClick: onBack, "data-test-id": getDataTestId(dataTestId, 'back-button') })));
67
+ };
68
+ var renderContent = function (args) {
69
+ var _a;
70
+ if (args === void 0) { args = {}; }
71
+ var extraClassName = args.extraClassName, ref = args.ref, style = args.style, hidden = args.hidden;
72
+ return (React.createElement("div", { style: __assign(__assign({}, style), { visibility: hidden ? 'hidden' : 'visible' }), ref: ref, className: cn(styles.content, extraClassName, contentClassName, styles[align], (_a = {},
73
+ _a[styles.trim] = trim,
74
+ _a[styles.withCompactTitle] = view === 'mobile' && compactTitle && hasContent,
75
+ _a)), "aria-hidden": hidden },
76
+ children && React.createElement("div", { className: styles.children }, children),
77
+ title && (React.createElement("div", { className: styles.title, "data-test-id": hidden ? undefined : getDataTestId(dataTestId, 'title') }, title)),
78
+ compactTitle && subtitle && React.createElement("div", { className: styles.subtitle }, subtitle)));
79
+ };
80
+ var renderCloser = function () { return (React.createElement("div", { className: cn(styles.addon, styles.closer, closerClassName) },
81
+ React.createElement(Closer, { view: view, icon: closerIcon, dataTestId: getDataTestId(dataTestId, 'closer'), onClose: onClose }))); };
82
+ return (React.createElement("div", { ref: headerRef, className: cn(styles.header, className, (_b = {}, _b[styles.backgroundImage] = imageUrl, _b)), "data-test-id": getDataTestId(dataTestId), style: __assign(__assign({}, (imageUrl && { backgroundImage: "url(".concat(imageUrl, ")") })), (withAnimation &&
83
+ bottomContentRef.current && { top: -bottomContentRef.current.scrollHeight })) },
84
+ React.createElement("div", { className: cn(styles.mainLine, (_c = {},
85
+ _c[styles.mainLineSticky] = withAnimation,
86
+ _c[styles.mainLineWithImageBg] = imageUrl,
87
+ _c)), style: __assign({}, (withAnimation
88
+ ? {
89
+ marginTop: "-".concat(headerPaddingTop),
90
+ paddingTop: headerPaddingTop,
91
+ }
92
+ : null)) },
93
+ hasLeftPart && (React.createElement("div", { className: styles.addonsWrapper },
94
+ hasBackButton && renderBackButton(),
95
+ leftAddons && (React.createElement("div", { className: cn(styles.addon, addonClassName) }, leftAddons)))),
96
+ showStaticContentOnTop && renderContent(),
97
+ showAnimatedContentOnTop &&
98
+ renderContent({
99
+ extraClassName: styles.withBothAddons,
100
+ style: {
101
+ opacity: Math.min(1, (scrollTop - ADDONS_HEIGHT) / ADDONS_HEIGHT),
102
+ },
103
+ }),
104
+ hasRightPart && (React.createElement("div", { className: cn(styles.addonsWrapper, styles.rightAddons) },
105
+ rightAddons && (React.createElement("div", { className: cn(styles.addon, addonClassName) }, rightAddons)),
106
+ hasCloser && renderCloser()))),
107
+ showAnimatedContentOnBot &&
108
+ renderContent({
109
+ ref: bottomContentRef,
110
+ extraClassName: styles.underAddons,
111
+ style: { opacity: Math.max(0, 1 - scrollTop / ADDONS_HEIGHT) },
112
+ hidden: scrollTop / ADDONS_HEIGHT > 1,
113
+ }),
114
+ showStaticContentOnBot &&
115
+ renderContent({
116
+ extraClassName: cn((_d = {},
117
+ _d[styles.contentOnBotDesktop] = view === 'desktop',
118
+ _d[styles.contentOnBotMobile] = view === 'mobile',
119
+ _d)),
120
+ }),
121
+ bottomAddons && (React.createElement("div", { className: cn(styles.bottomAddons, bottomAddonsClassName) }, bottomAddons))));
122
+ };
123
+
124
+ export { NavigationBar };
@@ -0,0 +1,26 @@
1
+ /// <reference types="react" />
2
+ import React from 'react';
3
+ interface BackArrowAddonProps extends React.HTMLAttributes<HTMLButtonElement> {
4
+ /**
5
+ * Текст после иконки
6
+ */
7
+ text?: string;
8
+ /**
9
+ * Дополнительный класс
10
+ */
11
+ className?: string;
12
+ /**
13
+ * Вид компонента
14
+ */
15
+ view: 'mobile' | 'desktop';
16
+ /**
17
+ * Прозрачность текста
18
+ */
19
+ textOpacity?: number;
20
+ /**
21
+ * Обработчик клика
22
+ */
23
+ onClick?: () => void;
24
+ }
25
+ declare const BackArrowAddon: React.FC<BackArrowAddonProps>;
26
+ export { BackArrowAddonProps, BackArrowAddon };
@@ -0,0 +1,25 @@
1
+ import { __rest, __assign } from 'tslib';
2
+ import React from 'react';
3
+ import cn from 'classnames';
4
+ import { Button } from '@alfalab/core-components-button/esm';
5
+ import { Typography } from '@alfalab/core-components-typography/esm';
6
+ import { ArrowLeftMediumMIcon } from '@alfalab/icons-glyph/ArrowLeftMediumMIcon';
7
+ import { ArrowLeftMIcon } from '@alfalab/icons-glyph/ArrowLeftMIcon';
8
+
9
+ var styles = {"component":"navigation-bar__component_17er7","mobileComponent":"navigation-bar__mobileComponent_17er7","flex":"navigation-bar__flex_17er7","iconWrapper":"navigation-bar__iconWrapper_17er7","text":"navigation-bar__text_17er7","mobileWrapper":"navigation-bar__mobileWrapper_17er7"};
10
+ require('./index.css')
11
+
12
+ var BackArrowAddon = function (_a) {
13
+ var _b, _c;
14
+ var _d = _a.text, text = _d === void 0 ? 'Назад' : _d, onClick = _a.onClick, className = _a.className, _e = _a.textOpacity, textOpacity = _e === void 0 ? 1 : _e, view = _a.view, htmlAttributes = __rest(_a, ["text", "onClick", "className", "textOpacity", "view"]);
15
+ var Icon = view === 'desktop' ? ArrowLeftMediumMIcon : ArrowLeftMIcon;
16
+ return (React.createElement(Button, __assign({ view: 'ghost', size: view === 'mobile' ? 'xxs' : 's', onClick: onClick, "aria-label": '\u043D\u0430\u0437\u0430\u0434', className: cn(styles.component, (_b = {}, _b[styles.mobileComponent] = view === 'mobile', _b), className) }, htmlAttributes),
17
+ React.createElement("div", { className: styles.flex },
18
+ React.createElement("div", { className: cn(styles.iconWrapper, (_c = {},
19
+ _c[styles.mobileWrapper] = view === 'mobile',
20
+ _c)) },
21
+ React.createElement(Icon, null)),
22
+ textOpacity > 0 && (React.createElement(Typography.Text, { className: styles.text, view: view === 'desktop' ? 'primary-large' : 'component', weight: 'medium', style: { opacity: textOpacity } }, text)))));
23
+ };
24
+
25
+ export { BackArrowAddon };