@doyourjob/gravity-ui-page-constructor 5.31.119 → 5.31.120-background-effect-for-header-2
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/build/cjs/blocks/Header/BackgroundEffect/BackgroundEffect.css +24 -0
- package/build/cjs/blocks/Header/BackgroundEffect/BackgroundEffect.d.ts +6 -0
- package/build/cjs/blocks/Header/BackgroundEffect/BackgroundEffect.js +76 -0
- package/build/cjs/blocks/Header/Header.css +4 -0
- package/build/cjs/blocks/Header/Header.js +4 -1
- package/build/cjs/blocks/Header/schema.d.ts +32 -0
- package/build/cjs/blocks/Header/schema.js +12 -0
- package/build/cjs/blocks/HeaderSlider/schema.d.ts +16 -0
- package/build/cjs/blocks/RelevantReports/RelevantReports.d.ts +1 -1
- package/build/cjs/blocks/RelevantReports/RelevantReports.js +7 -3
- package/build/cjs/blocks/RelevantReports/schema.d.ts +3 -0
- package/build/cjs/blocks/RelevantReports/schema.js +2 -0
- package/build/cjs/components/Media/Video/utils.d.ts +1 -0
- package/build/cjs/components/Media/Video/utils.js +2 -1
- package/build/cjs/constructor-items.d.ts +1 -1
- package/build/cjs/models/constructor-items/blocks.d.ts +6 -0
- package/build/esm/blocks/Header/BackgroundEffect/BackgroundEffect.css +24 -0
- package/build/esm/blocks/Header/BackgroundEffect/BackgroundEffect.d.ts +7 -0
- package/build/esm/blocks/Header/BackgroundEffect/BackgroundEffect.js +72 -0
- package/build/esm/blocks/Header/Header.css +4 -0
- package/build/esm/blocks/Header/Header.js +4 -1
- package/build/esm/blocks/Header/schema.d.ts +32 -0
- package/build/esm/blocks/Header/schema.js +12 -0
- package/build/esm/blocks/HeaderSlider/schema.d.ts +16 -0
- package/build/esm/blocks/RelevantReports/RelevantReports.d.ts +1 -1
- package/build/esm/blocks/RelevantReports/RelevantReports.js +7 -3
- package/build/esm/blocks/RelevantReports/schema.d.ts +3 -0
- package/build/esm/blocks/RelevantReports/schema.js +2 -0
- package/build/esm/components/Media/Video/utils.d.ts +1 -0
- package/build/esm/components/Media/Video/utils.js +1 -1
- package/build/esm/constructor-items.d.ts +1 -1
- package/build/esm/models/constructor-items/blocks.d.ts +6 -0
- package/package.json +1 -1
- package/schema/index.js +1 -1
- package/server/models/constructor-items/blocks.d.ts +6 -0
- package/widget/index.js +1 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
|
2
|
+
unpredictable css rules order in build */
|
|
3
|
+
.pc-background-effect {
|
|
4
|
+
position: absolute;
|
|
5
|
+
inset: 0;
|
|
6
|
+
}
|
|
7
|
+
.pc-background-effect__left {
|
|
8
|
+
width: 100%;
|
|
9
|
+
height: 100%;
|
|
10
|
+
}
|
|
11
|
+
.pc-background-effect__right {
|
|
12
|
+
position: absolute;
|
|
13
|
+
inset: 0;
|
|
14
|
+
clip-path: inset(0 0 0 99.99%);
|
|
15
|
+
transition: clip-path 1.5s ease;
|
|
16
|
+
}
|
|
17
|
+
.pc-header-block:hover .pc-background-effect__right {
|
|
18
|
+
clip-path: inset(0 0 0 0.01%);
|
|
19
|
+
}
|
|
20
|
+
.pc-background-effect__video {
|
|
21
|
+
width: 100%;
|
|
22
|
+
height: 100%;
|
|
23
|
+
object-fit: cover;
|
|
24
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BackgroundEffect = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
const utils_1 = require("../../../components/Media/Video/utils");
|
|
7
|
+
const utils_2 = require("../../../utils");
|
|
8
|
+
const b = (0, utils_2.block)('background-effect');
|
|
9
|
+
const SYNC_THRESHOLD = 0.03;
|
|
10
|
+
const MAX_DESYNC = 0.5;
|
|
11
|
+
const FAST_RATE = 1.05;
|
|
12
|
+
const SLOW_RATE = 0.95;
|
|
13
|
+
const BackgroundEffect = ({ firstSrc, secondSrc }) => {
|
|
14
|
+
const master = (0, react_1.useRef)(null);
|
|
15
|
+
const driven = (0, react_1.useRef)(null);
|
|
16
|
+
(0, react_1.useEffect)(() => {
|
|
17
|
+
const m = master.current;
|
|
18
|
+
const d = driven.current;
|
|
19
|
+
let rafId;
|
|
20
|
+
if (m && d) {
|
|
21
|
+
const syncMaster = () => {
|
|
22
|
+
if (m.paused) {
|
|
23
|
+
m.play().catch(() => { });
|
|
24
|
+
}
|
|
25
|
+
const delta = m.currentTime - d.currentTime;
|
|
26
|
+
if (d.paused) {
|
|
27
|
+
d.play().catch(() => { });
|
|
28
|
+
}
|
|
29
|
+
if (Math.abs(delta) > MAX_DESYNC) {
|
|
30
|
+
d.currentTime = m.currentTime;
|
|
31
|
+
d.playbackRate = 1;
|
|
32
|
+
}
|
|
33
|
+
else if (Math.abs(delta) > SYNC_THRESHOLD) {
|
|
34
|
+
d.playbackRate = delta > 0 ? FAST_RATE : SLOW_RATE;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
d.playbackRate = 1;
|
|
38
|
+
}
|
|
39
|
+
rafId = m.requestVideoFrameCallback(syncMaster);
|
|
40
|
+
};
|
|
41
|
+
rafId = m.requestVideoFrameCallback(syncMaster);
|
|
42
|
+
}
|
|
43
|
+
const handleVisibility = () => {
|
|
44
|
+
if (!document.hidden && m && d) {
|
|
45
|
+
m.play().catch(() => { });
|
|
46
|
+
d.play().catch(() => { });
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
document.addEventListener('visibilitychange', handleVisibility);
|
|
50
|
+
return () => {
|
|
51
|
+
var _a;
|
|
52
|
+
document.removeEventListener('visibilitychange', handleVisibility);
|
|
53
|
+
if (rafId && m) {
|
|
54
|
+
(_a = m.cancelVideoFrameCallback) === null || _a === void 0 ? void 0 : _a.call(m, rafId);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}, []);
|
|
58
|
+
if (!firstSrc || !secondSrc) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return (react_1.default.createElement("div", { className: b() },
|
|
62
|
+
react_1.default.createElement("div", { className: b('left') },
|
|
63
|
+
react_1.default.createElement("video", { ref: master, disablePictureInPicture: true, playsInline: true,
|
|
64
|
+
// @ts-ignore
|
|
65
|
+
// eslint-disable-next-line react/no-unknown-property
|
|
66
|
+
pip: "false", autoPlay: true, loop: true, preload: "auto", muted: true, className: b('video') },
|
|
67
|
+
react_1.default.createElement("source", { src: firstSrc, type: (0, utils_1.parseVideoType)(firstSrc) }))),
|
|
68
|
+
react_1.default.createElement("div", { className: b('right') },
|
|
69
|
+
react_1.default.createElement("video", { ref: driven, disablePictureInPicture: true, playsInline: true,
|
|
70
|
+
// @ts-ignore
|
|
71
|
+
// eslint-disable-next-line react/no-unknown-property
|
|
72
|
+
pip: "false", autoPlay: true, loop: true, preload: "auto", muted: true, className: b('video') },
|
|
73
|
+
react_1.default.createElement("source", { src: secondSrc, type: (0, utils_1.parseVideoType)(secondSrc) })))));
|
|
74
|
+
};
|
|
75
|
+
exports.BackgroundEffect = BackgroundEffect;
|
|
76
|
+
exports.default = exports.BackgroundEffect;
|
|
@@ -13,6 +13,10 @@ unpredictable css rules order in build */
|
|
|
13
13
|
padding: 16px 0;
|
|
14
14
|
margin: 0 0 16px;
|
|
15
15
|
}
|
|
16
|
+
.pc-header-block_header-space {
|
|
17
|
+
padding-top: var(--header-height);
|
|
18
|
+
margin-top: calc(var(--header-height) * -1);
|
|
19
|
+
}
|
|
16
20
|
.pc-header-block__content-wrapper {
|
|
17
21
|
margin: 0 8px;
|
|
18
22
|
height: 100%;
|
|
@@ -12,6 +12,7 @@ const theme_1 = require("../../context/theme");
|
|
|
12
12
|
const grid_1 = require("../../grid");
|
|
13
13
|
const utils_2 = require("../../utils");
|
|
14
14
|
const BackButton_1 = tslib_1.__importDefault(require("./BackButton/BackButton"));
|
|
15
|
+
const BackgroundEffect_1 = tslib_1.__importDefault(require("./BackgroundEffect/BackgroundEffect"));
|
|
15
16
|
const Breadcrumbs_1 = tslib_1.__importDefault(require("./Breadcrumbs/Breadcrumbs"));
|
|
16
17
|
const HeaderButtons_1 = tslib_1.__importDefault(require("./HeaderButtons/HeaderButtons"));
|
|
17
18
|
const HeaderDescription_1 = tslib_1.__importDefault(require("./HeaderDescription/HeaderDescription"));
|
|
@@ -30,7 +31,7 @@ const Background = ({ background, isMobile }) => {
|
|
|
30
31
|
const FullWidthBackground = ({ background }) => (react_1.default.createElement("div", { className: b('background', { ['full-width']: true }), style: { backgroundColor: background === null || background === void 0 ? void 0 : background.color } }));
|
|
31
32
|
// eslint-disable-next-line complexity
|
|
32
33
|
const HeaderBlock = (props) => {
|
|
33
|
-
const { title, switchingTitle, topTags, bottomTags, overtitle, description, buttons, stock, stockPrice, stockShares, image, video, width = 's', imageSize, offset = 'default', background, theme: textTheme = 'light', verticalOffset = 'm', className, breadcrumbs, status, renderTitle, children, mediaView = 'full', } = props;
|
|
34
|
+
const { title, switchingTitle, topTags, bottomTags, overtitle, description, buttons, stock, stockPrice, stockShares, image, video, width = 's', imageSize, offset = 'default', background, theme: textTheme = 'light', verticalOffset = 'm', className, breadcrumbs, status, renderTitle, children, mediaView = 'full', backgroundEffect, headerSpace, } = props;
|
|
34
35
|
const isMobile = (0, react_1.useContext)(mobileContext_1.MobileContext);
|
|
35
36
|
const { backButton, blockTag } = (0, react_1.useContext)(headerContext_1.HeaderContext);
|
|
36
37
|
const theme = (0, theme_1.useTheme)();
|
|
@@ -48,9 +49,11 @@ const HeaderBlock = (props) => {
|
|
|
48
49
|
['full-width']: fullWidth,
|
|
49
50
|
['media-view']: mediaView,
|
|
50
51
|
['controls-view']: textTheme,
|
|
52
|
+
['header-space']: headerSpace,
|
|
51
53
|
}, className) },
|
|
52
54
|
backgroundThemed && fullWidth && react_1.default.createElement(FullWidthBackground, { background: backgroundThemed }),
|
|
53
55
|
backgroundThemed && react_1.default.createElement(Background, { background: backgroundThemed, isMobile: isMobile }),
|
|
56
|
+
backgroundEffect && backgroundEffect.firstSrc && backgroundEffect.secondSrc && (react_1.default.createElement(BackgroundEffect_1.default, Object.assign({}, backgroundEffect))),
|
|
54
57
|
react_1.default.createElement(grid_1.Grid, { containerClass: b('container-fluid') },
|
|
55
58
|
react_1.default.createElement(Breadcrumbs_1.default, { breadcrumbs: breadcrumbs, theme: textTheme }),
|
|
56
59
|
react_1.default.createElement(BackButton_1.default, { backButton: verticalOffset !== '0' && !breadcrumbs ? backButton : undefined, theme: textTheme }),
|
|
@@ -979,6 +979,22 @@ export declare const HeaderProperties: {
|
|
|
979
979
|
};
|
|
980
980
|
};
|
|
981
981
|
};
|
|
982
|
+
backgroundEffect: {
|
|
983
|
+
type: string;
|
|
984
|
+
additionalProperties: boolean;
|
|
985
|
+
required: boolean;
|
|
986
|
+
properties: {
|
|
987
|
+
firstSrc: {
|
|
988
|
+
type: string;
|
|
989
|
+
};
|
|
990
|
+
secondSrc: {
|
|
991
|
+
type: string;
|
|
992
|
+
};
|
|
993
|
+
};
|
|
994
|
+
};
|
|
995
|
+
headerSpace: {
|
|
996
|
+
type: string;
|
|
997
|
+
};
|
|
982
998
|
};
|
|
983
999
|
export declare const HeaderBlock: {
|
|
984
1000
|
'header-block': {
|
|
@@ -1648,6 +1664,22 @@ export declare const HeaderBlock: {
|
|
|
1648
1664
|
};
|
|
1649
1665
|
};
|
|
1650
1666
|
};
|
|
1667
|
+
backgroundEffect: {
|
|
1668
|
+
type: string;
|
|
1669
|
+
additionalProperties: boolean;
|
|
1670
|
+
required: boolean;
|
|
1671
|
+
properties: {
|
|
1672
|
+
firstSrc: {
|
|
1673
|
+
type: string;
|
|
1674
|
+
};
|
|
1675
|
+
secondSrc: {
|
|
1676
|
+
type: string;
|
|
1677
|
+
};
|
|
1678
|
+
};
|
|
1679
|
+
};
|
|
1680
|
+
headerSpace: {
|
|
1681
|
+
type: string;
|
|
1682
|
+
};
|
|
1651
1683
|
anchor: {
|
|
1652
1684
|
type: string;
|
|
1653
1685
|
additionalProperties: boolean;
|
|
@@ -190,6 +190,18 @@ exports.HeaderProperties = {
|
|
|
190
190
|
},
|
|
191
191
|
},
|
|
192
192
|
},
|
|
193
|
+
backgroundEffect: {
|
|
194
|
+
type: 'object',
|
|
195
|
+
additionalProperties: false,
|
|
196
|
+
required: true,
|
|
197
|
+
properties: {
|
|
198
|
+
firstSrc: { type: 'string' },
|
|
199
|
+
secondSrc: { type: 'string' },
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
headerSpace: {
|
|
203
|
+
type: 'boolean',
|
|
204
|
+
},
|
|
193
205
|
};
|
|
194
206
|
exports.HeaderBlock = {
|
|
195
207
|
'header-block': {
|
|
@@ -673,6 +673,22 @@ export declare const HeaderSliderBlock: {
|
|
|
673
673
|
};
|
|
674
674
|
};
|
|
675
675
|
};
|
|
676
|
+
backgroundEffect: {
|
|
677
|
+
type: string;
|
|
678
|
+
additionalProperties: boolean;
|
|
679
|
+
required: boolean;
|
|
680
|
+
properties: {
|
|
681
|
+
firstSrc: {
|
|
682
|
+
type: string;
|
|
683
|
+
};
|
|
684
|
+
secondSrc: {
|
|
685
|
+
type: string;
|
|
686
|
+
};
|
|
687
|
+
};
|
|
688
|
+
};
|
|
689
|
+
headerSpace: {
|
|
690
|
+
type: string;
|
|
691
|
+
};
|
|
676
692
|
};
|
|
677
693
|
};
|
|
678
694
|
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { RelevantReportsBlockProps } from '../../models';
|
|
2
|
-
export declare const RelevantReports: ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, }: RelevantReportsBlockProps) => JSX.Element;
|
|
2
|
+
export declare const RelevantReports: ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, count, }: RelevantReportsBlockProps) => JSX.Element;
|
|
3
3
|
export default RelevantReports;
|
|
@@ -16,7 +16,7 @@ const layoutColSizes = {
|
|
|
16
16
|
lg: 4,
|
|
17
17
|
md: 6,
|
|
18
18
|
};
|
|
19
|
-
const RelevantReports = ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, }) => {
|
|
19
|
+
const RelevantReports = ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, count, }) => {
|
|
20
20
|
const [now, setNow] = react_1.default.useState(null);
|
|
21
21
|
const data = (0, react_1.useContext)(__1.ReportsContext);
|
|
22
22
|
const { items = [] } = (0, react_1.useMemo)(() => data[typeKey] || {}, [data, typeKey]);
|
|
@@ -26,7 +26,7 @@ const RelevantReports = ({ typeKey, link, title, description, slider, date, date
|
|
|
26
26
|
const filteredPosts = (0, react_1.useMemo)(() => {
|
|
27
27
|
if (!now)
|
|
28
28
|
return [];
|
|
29
|
-
|
|
29
|
+
const filteredItems = items.filter((item) => {
|
|
30
30
|
var _a;
|
|
31
31
|
const itemDate = new Date(((_a = item.options) === null || _a === void 0 ? void 0 : _a.date) || '');
|
|
32
32
|
let isDateMatch = true;
|
|
@@ -61,7 +61,11 @@ const RelevantReports = ({ typeKey, link, title, description, slider, date, date
|
|
|
61
61
|
}
|
|
62
62
|
return isDateMatch;
|
|
63
63
|
});
|
|
64
|
-
|
|
64
|
+
if (count) {
|
|
65
|
+
return filteredItems.slice(0, count);
|
|
66
|
+
}
|
|
67
|
+
return filteredItems;
|
|
68
|
+
}, [now, items, count, date, dateStart, dateEnd]);
|
|
65
69
|
const renderItems = (0, react_1.useMemo)(() => {
|
|
66
70
|
if (slider) {
|
|
67
71
|
return (react_1.default.createElement("div", { className: b('slider') },
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getVideoTypesWithPriority = exports.VideoType = exports.VideoExt = void 0;
|
|
3
|
+
exports.getVideoTypesWithPriority = exports.parseVideoType = exports.VideoType = exports.VideoExt = void 0;
|
|
4
4
|
var VideoExt;
|
|
5
5
|
(function (VideoExt) {
|
|
6
6
|
VideoExt["Mp4"] = "mp4";
|
|
@@ -34,6 +34,7 @@ function parseVideoType(src) {
|
|
|
34
34
|
return undefined;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
+
exports.parseVideoType = parseVideoType;
|
|
37
38
|
const getVideoTypesWithPriority = (sources) => sources
|
|
38
39
|
.map((src) => ({ src, type: parseVideoType(src) }))
|
|
39
40
|
.sort(({ type: typeA }, { type: typeB }) => {
|
|
@@ -27,7 +27,7 @@ export declare const blockMap: {
|
|
|
27
27
|
"blog-feed-block": ({ image, title }: import("./models").BlogFeedBlockProps) => JSX.Element;
|
|
28
28
|
"relevant-posts-block": ({ title, description, slider, date, dateStart, dateEnd, tags, services, pinnedPost, }: import("./models").RelevantPostsBlockProps) => JSX.Element;
|
|
29
29
|
"relevant-reports-cards-block": ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, }: import("./models").RelevantReportsCardsBlockProps) => JSX.Element;
|
|
30
|
-
"relevant-reports-block": ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, }: import("./models").RelevantReportsBlockProps) => JSX.Element;
|
|
30
|
+
"relevant-reports-block": ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, count, }: import("./models").RelevantReportsBlockProps) => JSX.Element;
|
|
31
31
|
"press-releases-block": ({ title }: import("./models").PressReleasesBlockProps) => JSX.Element;
|
|
32
32
|
"highlight-table-block": ({ title, description, table, legend, contentSize, legendPosition, legendAlign, }: import("./models").HighlightTableBlockProps) => JSX.Element;
|
|
33
33
|
"mini-case-block": (props: import("./models").MiniCaseBlockProps) => JSX.Element;
|
|
@@ -199,6 +199,11 @@ export interface HeaderBlockProps {
|
|
|
199
199
|
breadcrumbs?: HeaderBreadCrumbsProps;
|
|
200
200
|
status?: JSX.Element;
|
|
201
201
|
renderTitle?: (title: string) => React.ReactNode;
|
|
202
|
+
backgroundEffect?: {
|
|
203
|
+
firstSrc: string;
|
|
204
|
+
secondSrc: string;
|
|
205
|
+
};
|
|
206
|
+
headerSpace?: boolean;
|
|
202
207
|
}
|
|
203
208
|
export interface ExtendedFeaturesItem extends Omit<ContentBlockProps, 'theme' | 'centered' | 'colSizes' | 'size' | 'title'> {
|
|
204
209
|
title: Pick<TitleItemProps, 'text' | 'textSize'> | string;
|
|
@@ -416,6 +421,7 @@ export interface RelevantReportsBlockProps {
|
|
|
416
421
|
date?: 'today' | 'week' | 'month';
|
|
417
422
|
dateStart?: string;
|
|
418
423
|
dateEnd?: string;
|
|
424
|
+
count?: number;
|
|
419
425
|
}
|
|
420
426
|
export interface PressReleasesBlockProps {
|
|
421
427
|
title?: string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
|
2
|
+
unpredictable css rules order in build */
|
|
3
|
+
.pc-background-effect {
|
|
4
|
+
position: absolute;
|
|
5
|
+
inset: 0;
|
|
6
|
+
}
|
|
7
|
+
.pc-background-effect__left {
|
|
8
|
+
width: 100%;
|
|
9
|
+
height: 100%;
|
|
10
|
+
}
|
|
11
|
+
.pc-background-effect__right {
|
|
12
|
+
position: absolute;
|
|
13
|
+
inset: 0;
|
|
14
|
+
clip-path: inset(0 0 0 99.99%);
|
|
15
|
+
transition: clip-path 1.5s ease;
|
|
16
|
+
}
|
|
17
|
+
.pc-header-block:hover .pc-background-effect__right {
|
|
18
|
+
clip-path: inset(0 0 0 0.01%);
|
|
19
|
+
}
|
|
20
|
+
.pc-background-effect__video {
|
|
21
|
+
width: 100%;
|
|
22
|
+
height: 100%;
|
|
23
|
+
object-fit: cover;
|
|
24
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
|
+
import { parseVideoType } from '../../../components/Media/Video/utils';
|
|
3
|
+
import { block } from '../../../utils';
|
|
4
|
+
import './BackgroundEffect.css';
|
|
5
|
+
const b = block('background-effect');
|
|
6
|
+
const SYNC_THRESHOLD = 0.03;
|
|
7
|
+
const MAX_DESYNC = 0.5;
|
|
8
|
+
const FAST_RATE = 1.05;
|
|
9
|
+
const SLOW_RATE = 0.95;
|
|
10
|
+
export const BackgroundEffect = ({ firstSrc, secondSrc }) => {
|
|
11
|
+
const master = useRef(null);
|
|
12
|
+
const driven = useRef(null);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const m = master.current;
|
|
15
|
+
const d = driven.current;
|
|
16
|
+
let rafId;
|
|
17
|
+
if (m && d) {
|
|
18
|
+
const syncMaster = () => {
|
|
19
|
+
if (m.paused) {
|
|
20
|
+
m.play().catch(() => { });
|
|
21
|
+
}
|
|
22
|
+
const delta = m.currentTime - d.currentTime;
|
|
23
|
+
if (d.paused) {
|
|
24
|
+
d.play().catch(() => { });
|
|
25
|
+
}
|
|
26
|
+
if (Math.abs(delta) > MAX_DESYNC) {
|
|
27
|
+
d.currentTime = m.currentTime;
|
|
28
|
+
d.playbackRate = 1;
|
|
29
|
+
}
|
|
30
|
+
else if (Math.abs(delta) > SYNC_THRESHOLD) {
|
|
31
|
+
d.playbackRate = delta > 0 ? FAST_RATE : SLOW_RATE;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
d.playbackRate = 1;
|
|
35
|
+
}
|
|
36
|
+
rafId = m.requestVideoFrameCallback(syncMaster);
|
|
37
|
+
};
|
|
38
|
+
rafId = m.requestVideoFrameCallback(syncMaster);
|
|
39
|
+
}
|
|
40
|
+
const handleVisibility = () => {
|
|
41
|
+
if (!document.hidden && m && d) {
|
|
42
|
+
m.play().catch(() => { });
|
|
43
|
+
d.play().catch(() => { });
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
document.addEventListener('visibilitychange', handleVisibility);
|
|
47
|
+
return () => {
|
|
48
|
+
var _a;
|
|
49
|
+
document.removeEventListener('visibilitychange', handleVisibility);
|
|
50
|
+
if (rafId && m) {
|
|
51
|
+
(_a = m.cancelVideoFrameCallback) === null || _a === void 0 ? void 0 : _a.call(m, rafId);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}, []);
|
|
55
|
+
if (!firstSrc || !secondSrc) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return (React.createElement("div", { className: b() },
|
|
59
|
+
React.createElement("div", { className: b('left') },
|
|
60
|
+
React.createElement("video", { ref: master, disablePictureInPicture: true, playsInline: true,
|
|
61
|
+
// @ts-ignore
|
|
62
|
+
// eslint-disable-next-line react/no-unknown-property
|
|
63
|
+
pip: "false", autoPlay: true, loop: true, preload: "auto", muted: true, className: b('video') },
|
|
64
|
+
React.createElement("source", { src: firstSrc, type: parseVideoType(firstSrc) }))),
|
|
65
|
+
React.createElement("div", { className: b('right') },
|
|
66
|
+
React.createElement("video", { ref: driven, disablePictureInPicture: true, playsInline: true,
|
|
67
|
+
// @ts-ignore
|
|
68
|
+
// eslint-disable-next-line react/no-unknown-property
|
|
69
|
+
pip: "false", autoPlay: true, loop: true, preload: "auto", muted: true, className: b('video') },
|
|
70
|
+
React.createElement("source", { src: secondSrc, type: parseVideoType(secondSrc) })))));
|
|
71
|
+
};
|
|
72
|
+
export default BackgroundEffect;
|
|
@@ -13,6 +13,10 @@ unpredictable css rules order in build */
|
|
|
13
13
|
padding: 16px 0;
|
|
14
14
|
margin: 0 0 16px;
|
|
15
15
|
}
|
|
16
|
+
.pc-header-block_header-space {
|
|
17
|
+
padding-top: var(--header-height);
|
|
18
|
+
margin-top: calc(var(--header-height) * -1);
|
|
19
|
+
}
|
|
16
20
|
.pc-header-block__content-wrapper {
|
|
17
21
|
margin: 0 8px;
|
|
18
22
|
height: 100%;
|
|
@@ -8,6 +8,7 @@ import { useTheme } from '../../context/theme';
|
|
|
8
8
|
import { Col, Grid, Row } from '../../grid';
|
|
9
9
|
import { block, getThemedValue } from '../../utils';
|
|
10
10
|
import BackButton from './BackButton/BackButton';
|
|
11
|
+
import BackgroundEffect from './BackgroundEffect/BackgroundEffect';
|
|
11
12
|
import Breadcrumbs from './Breadcrumbs/Breadcrumbs';
|
|
12
13
|
import HeaderButtons from './HeaderButtons/HeaderButtons';
|
|
13
14
|
import HeaderDescription from './HeaderDescription/HeaderDescription';
|
|
@@ -27,7 +28,7 @@ const Background = ({ background, isMobile }) => {
|
|
|
27
28
|
const FullWidthBackground = ({ background }) => (React.createElement("div", { className: b('background', { ['full-width']: true }), style: { backgroundColor: background === null || background === void 0 ? void 0 : background.color } }));
|
|
28
29
|
// eslint-disable-next-line complexity
|
|
29
30
|
export const HeaderBlock = (props) => {
|
|
30
|
-
const { title, switchingTitle, topTags, bottomTags, overtitle, description, buttons, stock, stockPrice, stockShares, image, video, width = 's', imageSize, offset = 'default', background, theme: textTheme = 'light', verticalOffset = 'm', className, breadcrumbs, status, renderTitle, children, mediaView = 'full', } = props;
|
|
31
|
+
const { title, switchingTitle, topTags, bottomTags, overtitle, description, buttons, stock, stockPrice, stockShares, image, video, width = 's', imageSize, offset = 'default', background, theme: textTheme = 'light', verticalOffset = 'm', className, breadcrumbs, status, renderTitle, children, mediaView = 'full', backgroundEffect, headerSpace, } = props;
|
|
31
32
|
const isMobile = useContext(MobileContext);
|
|
32
33
|
const { backButton, blockTag } = useContext(HeaderContext);
|
|
33
34
|
const theme = useTheme();
|
|
@@ -45,9 +46,11 @@ export const HeaderBlock = (props) => {
|
|
|
45
46
|
['full-width']: fullWidth,
|
|
46
47
|
['media-view']: mediaView,
|
|
47
48
|
['controls-view']: textTheme,
|
|
49
|
+
['header-space']: headerSpace,
|
|
48
50
|
}, className) },
|
|
49
51
|
backgroundThemed && fullWidth && React.createElement(FullWidthBackground, { background: backgroundThemed }),
|
|
50
52
|
backgroundThemed && React.createElement(Background, { background: backgroundThemed, isMobile: isMobile }),
|
|
53
|
+
backgroundEffect && backgroundEffect.firstSrc && backgroundEffect.secondSrc && (React.createElement(BackgroundEffect, Object.assign({}, backgroundEffect))),
|
|
51
54
|
React.createElement(Grid, { containerClass: b('container-fluid') },
|
|
52
55
|
React.createElement(Breadcrumbs, { breadcrumbs: breadcrumbs, theme: textTheme }),
|
|
53
56
|
React.createElement(BackButton, { backButton: verticalOffset !== '0' && !breadcrumbs ? backButton : undefined, theme: textTheme }),
|
|
@@ -979,6 +979,22 @@ export declare const HeaderProperties: {
|
|
|
979
979
|
};
|
|
980
980
|
};
|
|
981
981
|
};
|
|
982
|
+
backgroundEffect: {
|
|
983
|
+
type: string;
|
|
984
|
+
additionalProperties: boolean;
|
|
985
|
+
required: boolean;
|
|
986
|
+
properties: {
|
|
987
|
+
firstSrc: {
|
|
988
|
+
type: string;
|
|
989
|
+
};
|
|
990
|
+
secondSrc: {
|
|
991
|
+
type: string;
|
|
992
|
+
};
|
|
993
|
+
};
|
|
994
|
+
};
|
|
995
|
+
headerSpace: {
|
|
996
|
+
type: string;
|
|
997
|
+
};
|
|
982
998
|
};
|
|
983
999
|
export declare const HeaderBlock: {
|
|
984
1000
|
'header-block': {
|
|
@@ -1648,6 +1664,22 @@ export declare const HeaderBlock: {
|
|
|
1648
1664
|
};
|
|
1649
1665
|
};
|
|
1650
1666
|
};
|
|
1667
|
+
backgroundEffect: {
|
|
1668
|
+
type: string;
|
|
1669
|
+
additionalProperties: boolean;
|
|
1670
|
+
required: boolean;
|
|
1671
|
+
properties: {
|
|
1672
|
+
firstSrc: {
|
|
1673
|
+
type: string;
|
|
1674
|
+
};
|
|
1675
|
+
secondSrc: {
|
|
1676
|
+
type: string;
|
|
1677
|
+
};
|
|
1678
|
+
};
|
|
1679
|
+
};
|
|
1680
|
+
headerSpace: {
|
|
1681
|
+
type: string;
|
|
1682
|
+
};
|
|
1651
1683
|
anchor: {
|
|
1652
1684
|
type: string;
|
|
1653
1685
|
additionalProperties: boolean;
|
|
@@ -187,6 +187,18 @@ export const HeaderProperties = {
|
|
|
187
187
|
},
|
|
188
188
|
},
|
|
189
189
|
},
|
|
190
|
+
backgroundEffect: {
|
|
191
|
+
type: 'object',
|
|
192
|
+
additionalProperties: false,
|
|
193
|
+
required: true,
|
|
194
|
+
properties: {
|
|
195
|
+
firstSrc: { type: 'string' },
|
|
196
|
+
secondSrc: { type: 'string' },
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
headerSpace: {
|
|
200
|
+
type: 'boolean',
|
|
201
|
+
},
|
|
190
202
|
};
|
|
191
203
|
export const HeaderBlock = {
|
|
192
204
|
'header-block': {
|
|
@@ -673,6 +673,22 @@ export declare const HeaderSliderBlock: {
|
|
|
673
673
|
};
|
|
674
674
|
};
|
|
675
675
|
};
|
|
676
|
+
backgroundEffect: {
|
|
677
|
+
type: string;
|
|
678
|
+
additionalProperties: boolean;
|
|
679
|
+
required: boolean;
|
|
680
|
+
properties: {
|
|
681
|
+
firstSrc: {
|
|
682
|
+
type: string;
|
|
683
|
+
};
|
|
684
|
+
secondSrc: {
|
|
685
|
+
type: string;
|
|
686
|
+
};
|
|
687
|
+
};
|
|
688
|
+
};
|
|
689
|
+
headerSpace: {
|
|
690
|
+
type: string;
|
|
691
|
+
};
|
|
676
692
|
};
|
|
677
693
|
};
|
|
678
694
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { RelevantReportsBlockProps } from '../../models';
|
|
2
2
|
import './RelevantReports.css';
|
|
3
|
-
export declare const RelevantReports: ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, }: RelevantReportsBlockProps) => JSX.Element;
|
|
3
|
+
export declare const RelevantReports: ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, count, }: RelevantReportsBlockProps) => JSX.Element;
|
|
4
4
|
export default RelevantReports;
|
|
@@ -13,7 +13,7 @@ const layoutColSizes = {
|
|
|
13
13
|
lg: 4,
|
|
14
14
|
md: 6,
|
|
15
15
|
};
|
|
16
|
-
export const RelevantReports = ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, }) => {
|
|
16
|
+
export const RelevantReports = ({ typeKey, link, title, description, slider, date, dateStart, dateEnd, count, }) => {
|
|
17
17
|
const [now, setNow] = React.useState(null);
|
|
18
18
|
const data = useContext(ReportsContext);
|
|
19
19
|
const { items = [] } = useMemo(() => data[typeKey] || {}, [data, typeKey]);
|
|
@@ -23,7 +23,7 @@ export const RelevantReports = ({ typeKey, link, title, description, slider, dat
|
|
|
23
23
|
const filteredPosts = useMemo(() => {
|
|
24
24
|
if (!now)
|
|
25
25
|
return [];
|
|
26
|
-
|
|
26
|
+
const filteredItems = items.filter((item) => {
|
|
27
27
|
var _a;
|
|
28
28
|
const itemDate = new Date(((_a = item.options) === null || _a === void 0 ? void 0 : _a.date) || '');
|
|
29
29
|
let isDateMatch = true;
|
|
@@ -58,7 +58,11 @@ export const RelevantReports = ({ typeKey, link, title, description, slider, dat
|
|
|
58
58
|
}
|
|
59
59
|
return isDateMatch;
|
|
60
60
|
});
|
|
61
|
-
|
|
61
|
+
if (count) {
|
|
62
|
+
return filteredItems.slice(0, count);
|
|
63
|
+
}
|
|
64
|
+
return filteredItems;
|
|
65
|
+
}, [now, items, count, date, dateStart, dateEnd]);
|
|
62
66
|
const renderItems = useMemo(() => {
|
|
63
67
|
if (slider) {
|
|
64
68
|
return (React.createElement("div", { className: b('slider') },
|