@gravity-ui/page-constructor 4.12.0 → 4.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/components/BackgroundImage/BackgroundImage.d.ts +1 -0
- package/build/cjs/components/BackgroundImage/BackgroundImage.js +5 -2
- package/build/cjs/components/BackgroundMedia/BackgroundMedia.d.ts +1 -1
- package/build/cjs/components/BackgroundMedia/BackgroundMedia.js +4 -3
- package/build/cjs/components/Image/Image.js +7 -5
- package/build/cjs/components/Media/Image/Image.d.ts +3 -2
- package/build/cjs/components/Media/Image/Image.js +8 -5
- package/build/cjs/components/Media/Media.d.ts +2 -2
- package/build/cjs/components/Media/Media.js +9 -6
- package/build/cjs/components/Media/Video/Video.d.ts +2 -2
- package/build/cjs/components/Media/Video/Video.js +13 -4
- package/build/cjs/models/constructor-items/common.d.ts +1 -1
- package/build/cjs/text-transform/common.d.ts +7 -2
- package/build/cjs/text-transform/common.js +8 -2
- package/build/cjs/text-transform/transformers.d.ts +2 -0
- package/build/cjs/text-transform/transformers.js +11 -8
- package/build/cjs/utils/blocks.d.ts +1 -1
- package/build/cjs/utils/blocks.js +4 -3
- package/build/esm/components/BackgroundImage/BackgroundImage.d.ts +1 -0
- package/build/esm/components/BackgroundImage/BackgroundImage.js +5 -3
- package/build/esm/components/BackgroundMedia/BackgroundMedia.d.ts +1 -1
- package/build/esm/components/BackgroundMedia/BackgroundMedia.js +5 -4
- package/build/esm/components/Image/Image.js +7 -5
- package/build/esm/components/Media/Image/Image.d.ts +3 -2
- package/build/esm/components/Media/Image/Image.js +8 -6
- package/build/esm/components/Media/Media.d.ts +2 -2
- package/build/esm/components/Media/Media.js +10 -7
- package/build/esm/components/Media/Video/Video.d.ts +2 -2
- package/build/esm/components/Media/Video/Video.js +14 -5
- package/build/esm/models/constructor-items/common.d.ts +1 -1
- package/build/esm/text-transform/common.d.ts +7 -2
- package/build/esm/text-transform/common.js +7 -2
- package/build/esm/text-transform/transformers.d.ts +2 -0
- package/build/esm/text-transform/transformers.js +11 -8
- package/build/esm/utils/blocks.d.ts +1 -1
- package/build/esm/utils/blocks.js +5 -4
- package/package.json +1 -1
- package/server/models/constructor-items/common.d.ts +1 -1
- package/server/text-transform/common.d.ts +7 -2
- package/server/text-transform/common.js +10 -2
- package/server/text-transform/transformers.d.ts +2 -0
- package/server/text-transform/transformers.js +11 -8
- package/server/utils/blocks.d.ts +1 -1
- package/server/utils/blocks.js +4 -3
- package/widget/index.js +1 -1
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.qaIdByDefault = void 0;
|
|
3
4
|
const tslib_1 = require("tslib");
|
|
4
5
|
const react_1 = tslib_1.__importDefault(require("react"));
|
|
5
6
|
const utils_1 = require("../../utils");
|
|
6
7
|
const Image_1 = tslib_1.__importDefault(require("../Image/Image"));
|
|
8
|
+
exports.qaIdByDefault = 'background-image';
|
|
7
9
|
const b = (0, utils_1.block)('storage-background-image');
|
|
8
10
|
const BackgroundImage = (props) => {
|
|
9
11
|
const { children, src, desktop, className, imageClassName, style, hide, qa } = props;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
const qaAttributes = (0, utils_1.getQaAttrubutes)(qa || exports.qaIdByDefault);
|
|
13
|
+
return (react_1.default.createElement("div", { className: b(null, className), style: style, "data-qa": qa || exports.qaIdByDefault },
|
|
14
|
+
(src || desktop) && !hide && (react_1.default.createElement(Image_1.default, Object.assign({}, props, { className: b('img', imageClassName), qa: qaAttributes.image }))),
|
|
12
15
|
children && react_1.default.createElement("div", { className: b('container') }, children)));
|
|
13
16
|
};
|
|
14
17
|
exports.default = BackgroundImage;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { BackgroundMediaProps } from '../../models';
|
|
2
|
-
declare const BackgroundMedia: ({ className, color, animated, parallax, video, mediaClassName, fullWidthMedia, ...props }: BackgroundMediaProps) => JSX.Element;
|
|
2
|
+
declare const BackgroundMedia: ({ className, color, animated, parallax, video, mediaClassName, fullWidthMedia, qa, ...props }: BackgroundMediaProps) => JSX.Element;
|
|
3
3
|
export default BackgroundMedia;
|
|
@@ -8,10 +8,11 @@ const AnimateBlock_1 = tslib_1.__importDefault(require("../AnimateBlock/AnimateB
|
|
|
8
8
|
const Media_1 = tslib_1.__importDefault(require("../Media/Media"));
|
|
9
9
|
const b = (0, utils_1.block)('BackgroundMedia');
|
|
10
10
|
const BackgroundMedia = (_a) => {
|
|
11
|
-
var { className, color, animated, parallax = true, video, mediaClassName, fullWidthMedia } = _a, props = tslib_1.__rest(_a, ["className", "color", "animated", "parallax", "video", "mediaClassName", "fullWidthMedia"]);
|
|
11
|
+
var { className, color, animated, parallax = true, video, mediaClassName, fullWidthMedia, qa } = _a, props = tslib_1.__rest(_a, ["className", "color", "animated", "parallax", "video", "mediaClassName", "fullWidthMedia", "qa"]);
|
|
12
12
|
const isMobile = (0, react_1.useContext)(mobileContext_1.MobileContext);
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
const qaAttributes = (0, utils_1.getQaAttrubutes)(qa, 'media');
|
|
14
|
+
return (react_1.default.createElement(AnimateBlock_1.default, { className: b(null, className), style: { backgroundColor: color }, animate: animated, qa: qaAttributes.animate },
|
|
15
|
+
react_1.default.createElement(Media_1.default, Object.assign({ className: b('media', { 'full-width-media': fullWidthMedia }, mediaClassName), imageClassName: b('image'), videoClassName: b('video'), isBackground: true, qa: qaAttributes.media }, Object.assign({ height: 720, color,
|
|
15
16
|
parallax, video: isMobile ? undefined : video }, props)))));
|
|
16
17
|
};
|
|
17
18
|
exports.default = BackgroundMedia;
|
|
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
5
|
const constants_1 = require("../../constants");
|
|
6
6
|
const projectSettingsContext_1 = require("../../context/projectSettingsContext");
|
|
7
|
+
const utils_1 = require("../../utils");
|
|
7
8
|
const imageCompress_1 = require("../../utils/imageCompress");
|
|
8
9
|
const ImageBase_1 = tslib_1.__importDefault(require("../ImageBase/ImageBase"));
|
|
9
10
|
const i18n_1 = tslib_1.__importDefault(require("./i18n"));
|
|
@@ -18,18 +19,19 @@ const Image = (props) => {
|
|
|
18
19
|
if (!src) {
|
|
19
20
|
return null;
|
|
20
21
|
}
|
|
22
|
+
const qaAttributes = (0, utils_1.getQaAttrubutes)(qa, 'mobile-webp-source', 'mobile-source', 'tablet-webp-source', 'tablet-source', 'display-source');
|
|
21
23
|
const disableWebp = projectSettings.disableCompress ||
|
|
22
24
|
disableCompress ||
|
|
23
25
|
!(0, imageCompress_1.isCompressible)(src) ||
|
|
24
26
|
imgLoadingError;
|
|
25
27
|
return (react_1.default.createElement("picture", { className: containerClassName, "data-qa": qa },
|
|
26
28
|
mobile && (react_1.default.createElement(react_1.Fragment, null,
|
|
27
|
-
!disableWebp && (react_1.default.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)
|
|
28
|
-
react_1.default.createElement("source", { srcSet: mobile, media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)
|
|
29
|
+
!disableWebp && (react_1.default.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)`, "data-qa": qaAttributes.mobileWebpSource })),
|
|
30
|
+
react_1.default.createElement("source", { srcSet: mobile, media: `(max-width: ${constants_1.BREAKPOINTS.sm}px)`, "data-qa": qaAttributes.mobileSource }))),
|
|
29
31
|
tablet && (react_1.default.createElement(react_1.Fragment, null,
|
|
30
|
-
!disableWebp && (react_1.default.createElement("source", { srcSet: checkWebP(tablet), type: "image/webp", media: `(max-width: ${constants_1.BREAKPOINTS.md}px)
|
|
31
|
-
react_1.default.createElement("source", { srcSet: tablet, media: `(max-width: ${constants_1.BREAKPOINTS.md}px)
|
|
32
|
-
src && !disableWebp && react_1.default.createElement("source", { srcSet: checkWebP(src), type: "image/webp" }),
|
|
32
|
+
!disableWebp && (react_1.default.createElement("source", { srcSet: checkWebP(tablet), type: "image/webp", media: `(max-width: ${constants_1.BREAKPOINTS.md}px)`, "data-qa": qaAttributes.tabletWebpSource })),
|
|
33
|
+
react_1.default.createElement("source", { srcSet: tablet, media: `(max-width: ${constants_1.BREAKPOINTS.md}px)`, "data-qa": qaAttributes.tabletSource }))),
|
|
34
|
+
src && !disableWebp && (react_1.default.createElement("source", { srcSet: checkWebP(src), type: "image/webp", "data-qa": qaAttributes.displaySource })),
|
|
33
35
|
react_1.default.createElement(ImageBase_1.default, { className: className, alt: alt, src: src, style: style, onClick: onClick, onError: () => setImgLoadingError(true) })));
|
|
34
36
|
};
|
|
35
37
|
exports.default = Image;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MediaComponentImageProps } from '../../../models';
|
|
1
|
+
import { MediaComponentImageProps, QAProps } from '../../../models';
|
|
2
2
|
export interface ImageAdditionProps {
|
|
3
3
|
imageClassName?: string;
|
|
4
4
|
isBackground?: boolean;
|
|
@@ -7,6 +7,7 @@ export interface ImageAdditionProps {
|
|
|
7
7
|
interface InnerImageProps {
|
|
8
8
|
hasVideoFallback: boolean;
|
|
9
9
|
}
|
|
10
|
-
type ImageAllProps = ImageAdditionProps & MediaComponentImageProps & InnerImageProps;
|
|
10
|
+
type ImageAllProps = ImageAdditionProps & MediaComponentImageProps & InnerImageProps & QAProps;
|
|
11
|
+
export declare const defaultAnimatedDivQa = "animated-div";
|
|
11
12
|
declare const Image: (props: ImageAllProps) => JSX.Element;
|
|
12
13
|
export default Image;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultAnimatedDivQa = void 0;
|
|
3
4
|
const tslib_1 = require("tslib");
|
|
4
5
|
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
6
|
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
@@ -12,8 +13,10 @@ const FullscreenImage_1 = tslib_1.__importDefault(require("../../FullscreenImage
|
|
|
12
13
|
const Image_1 = tslib_1.__importDefault(require("../../Image/Image"));
|
|
13
14
|
const utils_2 = require("./utils");
|
|
14
15
|
const b = (0, utils_1.block)('media-component-image');
|
|
16
|
+
exports.defaultAnimatedDivQa = 'animated-div';
|
|
15
17
|
const Image = (props) => {
|
|
16
|
-
const { parallax, image, height, imageClassName, isBackground, hasVideoFallback, video, fullscreen, } = props;
|
|
18
|
+
const { parallax, image, height, imageClassName, isBackground, hasVideoFallback, video, fullscreen, qa, } = props;
|
|
19
|
+
const qaAttributes = (0, utils_1.getQaAttrubutes)(qa, 'fullscreen-image', 'animate', 'background-image', 'image-view', 'slider-block');
|
|
17
20
|
const [scrollY, setScrollY] = (0, react_1.useState)(0);
|
|
18
21
|
const [{ springScrollY }, springSetScrollY] = (0, react_spring_1.useSpring)(() => ({
|
|
19
22
|
springScrollY: 0,
|
|
@@ -37,16 +40,16 @@ const Image = (props) => {
|
|
|
37
40
|
const imageClass = b('item', { withVideo: Boolean(video) && !hasVideoFallback }, imageClassName);
|
|
38
41
|
const renderFullscreenImage = (item) => {
|
|
39
42
|
const itemData = (0, utils_2.getMediaImage)(item);
|
|
40
|
-
return (react_1.default.createElement(FullscreenImage_1.default, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, imageStyle: { height } })));
|
|
43
|
+
return (react_1.default.createElement(FullscreenImage_1.default, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, imageStyle: { height }, qa: qaAttributes.fullscreenImage })));
|
|
41
44
|
};
|
|
42
45
|
const imageBackground = (oneImage) => {
|
|
43
46
|
const imageData = (0, utils_2.getMediaImage)(oneImage);
|
|
44
|
-
return (react_1.default.createElement(react_spring_1.animated.div, { style: { transform: parallaxInterpolate
|
|
45
|
-
react_1.default.createElement(BackgroundImage_1.default, Object.assign({}, imageData, { className: imageClass, style: { height } }))));
|
|
47
|
+
return (react_1.default.createElement(react_spring_1.animated.div, { style: { transform: parallaxInterpolate }, "data-qa": qaAttributes.animate },
|
|
48
|
+
react_1.default.createElement(BackgroundImage_1.default, Object.assign({}, imageData, { className: imageClass, style: { height }, qa: qaAttributes.backgroundImage }))));
|
|
46
49
|
};
|
|
47
50
|
const imageOnly = (oneImage) => {
|
|
48
51
|
const imageData = (0, utils_2.getMediaImage)(oneImage);
|
|
49
|
-
return react_1.default.createElement(Image_1.default, Object.assign({}, imageData, { className: imageClass, style: { height } }));
|
|
52
|
+
return (react_1.default.createElement(Image_1.default, Object.assign({}, imageData, { className: imageClass, style: { height }, qa: qaAttributes.imageView })));
|
|
50
53
|
};
|
|
51
54
|
const imageSlider = (imageArray) => {
|
|
52
55
|
const fullscreenItem = fullscreen === undefined || fullscreen;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { MediaProps } from '../../models';
|
|
1
|
+
import { MediaProps, QAProps } from '../../models';
|
|
2
2
|
import { ImageAdditionProps } from './Image/Image';
|
|
3
3
|
import { VideoAdditionProps } from './Video/Video';
|
|
4
|
-
export interface MediaAllProps extends MediaProps, VideoAdditionProps, ImageAdditionProps {
|
|
4
|
+
export interface MediaAllProps extends MediaProps, VideoAdditionProps, ImageAdditionProps, QAProps {
|
|
5
5
|
className?: string;
|
|
6
6
|
youtubeClassName?: string;
|
|
7
7
|
}
|
|
@@ -11,12 +11,13 @@ const Image_1 = tslib_1.__importDefault(require("./Image/Image"));
|
|
|
11
11
|
const Video_1 = tslib_1.__importDefault(require("./Video/Video"));
|
|
12
12
|
const b = (0, utils_1.block)('Media');
|
|
13
13
|
const Media = (props) => {
|
|
14
|
-
const { image, video, youtube, dataLens, color, height, previewImg, parallax = false, metrika, fullscreen, analyticsEvents, className, imageClassName, videoClassName, youtubeClassName, playVideo = true, isBackground, playButton, customBarControlsClassName, } = props;
|
|
14
|
+
const { image, video, youtube, dataLens, color, height, previewImg, parallax = false, metrika, fullscreen, analyticsEvents, className, imageClassName, videoClassName, youtubeClassName, playVideo = true, isBackground, playButton, customBarControlsClassName, qa, } = props;
|
|
15
15
|
const [hasVideoFallback, setHasVideoFallback] = (0, react_1.useState)(false);
|
|
16
|
+
const qaAttributes = (0, utils_1.getQaAttrubutes)(qa, 'video');
|
|
16
17
|
const content = (0, react_1.useMemo)(() => {
|
|
17
18
|
let result = [];
|
|
18
19
|
if (image) {
|
|
19
|
-
result.push(react_1.default.createElement(Image_1.default, { key: "image", parallax: parallax, image: image, height: height, imageClassName: imageClassName, isBackground: isBackground, video: video, hasVideoFallback: hasVideoFallback, fullscreen: fullscreen }));
|
|
20
|
+
result.push(react_1.default.createElement(Image_1.default, { key: "image", parallax: parallax, image: image, height: height, imageClassName: imageClassName, isBackground: isBackground, video: video, hasVideoFallback: hasVideoFallback, fullscreen: fullscreen, qa: qaAttributes.image }));
|
|
20
21
|
}
|
|
21
22
|
if (video) {
|
|
22
23
|
const videoProps = {
|
|
@@ -34,10 +35,10 @@ const Media = (props) => {
|
|
|
34
35
|
setHasVideoFallback,
|
|
35
36
|
};
|
|
36
37
|
if (fullscreen) {
|
|
37
|
-
result.push(react_1.default.createElement(FullscreenVideo_1.default, Object.assign({}, videoProps)));
|
|
38
|
+
result.push(react_1.default.createElement(FullscreenVideo_1.default, Object.assign({}, videoProps, { qa: qaAttributes.video })));
|
|
38
39
|
}
|
|
39
40
|
else {
|
|
40
|
-
result.push(react_1.default.createElement(Video_1.default, Object.assign({}, videoProps)));
|
|
41
|
+
result.push(react_1.default.createElement(Video_1.default, Object.assign({}, videoProps, { qa: qaAttributes.video })));
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
44
|
if (youtube) {
|
|
@@ -57,6 +58,9 @@ const Media = (props) => {
|
|
|
57
58
|
imageClassName,
|
|
58
59
|
isBackground,
|
|
59
60
|
hasVideoFallback,
|
|
61
|
+
fullscreen,
|
|
62
|
+
qaAttributes.image,
|
|
63
|
+
qaAttributes.video,
|
|
60
64
|
videoClassName,
|
|
61
65
|
metrika,
|
|
62
66
|
analyticsEvents,
|
|
@@ -65,9 +69,8 @@ const Media = (props) => {
|
|
|
65
69
|
playButton,
|
|
66
70
|
customBarControlsClassName,
|
|
67
71
|
youtubeClassName,
|
|
68
|
-
fullscreen,
|
|
69
72
|
]);
|
|
70
|
-
return (react_1.default.createElement("div", { className: b(null, className), style: { backgroundColor: color } }, content));
|
|
73
|
+
return (react_1.default.createElement("div", { className: b(null, className), style: { backgroundColor: color }, "data-qa": qa }, content));
|
|
71
74
|
};
|
|
72
75
|
exports.Media = Media;
|
|
73
76
|
exports.default = exports.Media;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { MediaComponentVideoProps, PlayButtonProps } from '../../../models';
|
|
2
|
+
import { MediaComponentVideoProps, PlayButtonProps, QAProps } from '../../../models';
|
|
3
3
|
export interface VideoAdditionProps {
|
|
4
4
|
playButton?: PlayButtonProps;
|
|
5
5
|
customBarControlsClassName?: string;
|
|
@@ -10,6 +10,6 @@ interface InnerVideoProps {
|
|
|
10
10
|
setHasVideoFallback: React.Dispatch<boolean>;
|
|
11
11
|
hasVideoFallback: boolean;
|
|
12
12
|
}
|
|
13
|
-
export type VideoAllProps = VideoAdditionProps & MediaComponentVideoProps & InnerVideoProps;
|
|
13
|
+
export type VideoAllProps = VideoAdditionProps & MediaComponentVideoProps & InnerVideoProps & QAProps;
|
|
14
14
|
declare const Video: (props: VideoAllProps) => JSX.Element | null;
|
|
15
15
|
export default Video;
|
|
@@ -8,7 +8,8 @@ const ReactPlayer_1 = tslib_1.__importDefault(require("../../ReactPlayer/ReactPl
|
|
|
8
8
|
const utils_2 = require("./utils");
|
|
9
9
|
const b = (0, utils_1.block)('media-component-video');
|
|
10
10
|
const Video = (props) => {
|
|
11
|
-
const { video, height, metrika, analyticsEvents, previewImg, playButton: commonPlayButton, customBarControlsClassName, videoClassName, playVideo, setHasVideoFallback, hasVideoFallback, } = props;
|
|
11
|
+
const { video, height, metrika, analyticsEvents, previewImg, playButton: commonPlayButton, customBarControlsClassName, videoClassName, playVideo, setHasVideoFallback, hasVideoFallback, qa, } = props;
|
|
12
|
+
const qaAttributes = (0, utils_1.getQaAttrubutes)(qa, 'source');
|
|
12
13
|
const ref = (0, react_1.useRef)(null);
|
|
13
14
|
(0, react_1.useEffect)(() => {
|
|
14
15
|
if (ref && ref.current) {
|
|
@@ -44,12 +45,20 @@ const Video = (props) => {
|
|
|
44
45
|
analyticsEvents,
|
|
45
46
|
]);
|
|
46
47
|
const defaultVideoBlock = (0, react_1.useMemo)(() => {
|
|
47
|
-
return video.src.length && !hasVideoFallback ? (react_1.default.createElement("div", { className: b('wrap', videoClassName), style: { height } },
|
|
48
|
+
return video.src.length && !hasVideoFallback ? (react_1.default.createElement("div", { className: b('wrap', videoClassName), style: { height }, "data-qa": qaAttributes.default },
|
|
48
49
|
react_1.default.createElement("video", { disablePictureInPicture: true, playsInline: true,
|
|
49
50
|
// @ts-ignore
|
|
50
51
|
// eslint-disable-next-line react/no-unknown-property
|
|
51
|
-
pip: "false", className: b('item'), ref: ref, preload: "metadata", muted: true, "aria-label": video.ariaLabel }, (0, utils_2.getVideoTypesWithPriority)(video.src).map(({ src, type }, index) => (react_1.default.createElement("source", { key: index, src: src, type: type })))))) : null;
|
|
52
|
-
}, [
|
|
52
|
+
pip: "false", className: b('item'), ref: ref, preload: "metadata", muted: true, "aria-label": video.ariaLabel }, (0, utils_2.getVideoTypesWithPriority)(video.src).map(({ src, type }, index) => (react_1.default.createElement("source", { key: index, src: src, type: type, "data-qa": qaAttributes.source })))))) : null;
|
|
53
|
+
}, [
|
|
54
|
+
video.src,
|
|
55
|
+
video.ariaLabel,
|
|
56
|
+
hasVideoFallback,
|
|
57
|
+
videoClassName,
|
|
58
|
+
height,
|
|
59
|
+
qaAttributes.default,
|
|
60
|
+
qaAttributes.source,
|
|
61
|
+
]);
|
|
53
62
|
switch (video.type) {
|
|
54
63
|
case models_1.MediaVideoType.Player:
|
|
55
64
|
return reactPlayerBlock;
|
|
@@ -186,7 +186,7 @@ export interface MediaComponentDataLensProps {
|
|
|
186
186
|
export interface MediaProps extends Animatable, Partial<MediaComponentDataLensProps>, Partial<MediaComponentYoutubeProps>, Partial<MediaComponentImageProps>, Partial<MediaComponentVideoProps> {
|
|
187
187
|
color?: string;
|
|
188
188
|
}
|
|
189
|
-
export interface BackgroundMediaProps extends MediaProps, Animatable {
|
|
189
|
+
export interface BackgroundMediaProps extends MediaProps, Animatable, QAProps {
|
|
190
190
|
fullWidthMedia?: boolean;
|
|
191
191
|
className?: string;
|
|
192
192
|
mediaClassName?: string;
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import { MarkdownItPluginCb } from '@doc-tools/transform/lib/plugins/typings';
|
|
1
2
|
import { Lang } from '../utils/configure';
|
|
2
3
|
export type ComplexItem = {
|
|
3
4
|
[key: string]: string;
|
|
4
5
|
};
|
|
5
6
|
export type Item = string | null | ComplexItem;
|
|
6
7
|
export type Transformer = (text: string) => string;
|
|
7
|
-
export type TransformerRaw = (lang: Lang, content: string
|
|
8
|
+
export type TransformerRaw = (lang: Lang, content: string, options: {
|
|
9
|
+
plugins: MarkdownItPluginCb[];
|
|
10
|
+
}) => string;
|
|
8
11
|
export type Parser<T = any> = (transformer: Transformer, block: T) => T;
|
|
9
12
|
export declare const createItemsParser: (fields: string[]) => (transformer: Transformer, items: Item[]) => (string | {
|
|
10
13
|
[x: string]: string;
|
|
11
14
|
} | null)[];
|
|
12
|
-
export declare function yfmTransformer(lang: Lang, content: string
|
|
15
|
+
export declare function yfmTransformer(lang: Lang, content: string, options?: {
|
|
16
|
+
plugins?: MarkdownItPluginCb[];
|
|
17
|
+
}): string;
|
|
13
18
|
export declare function typografTransformer(lang: Lang, content: string): string;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.typografTransformer = exports.yfmTransformer = exports.createItemsParser = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const plugins_1 = tslib_1.__importDefault(require("@doc-tools/transform/lib/plugins"));
|
|
4
6
|
const utils_1 = require("./utils");
|
|
5
7
|
const createItemsParser = (fields) => (transformer, items) => items.map((item) => {
|
|
6
8
|
if (!item) {
|
|
@@ -20,8 +22,12 @@ const createItemsParser = (fields) => (transformer, items) => items.map((item) =
|
|
|
20
22
|
}
|
|
21
23
|
});
|
|
22
24
|
exports.createItemsParser = createItemsParser;
|
|
23
|
-
function yfmTransformer(lang, content) {
|
|
24
|
-
const {
|
|
25
|
+
function yfmTransformer(lang, content, options = {}) {
|
|
26
|
+
const { plugins = [] } = options;
|
|
27
|
+
const { html } = (0, utils_1.fullTransform)(content, {
|
|
28
|
+
lang,
|
|
29
|
+
plugins: [...plugins_1.default, ...plugins],
|
|
30
|
+
});
|
|
25
31
|
return html;
|
|
26
32
|
}
|
|
27
33
|
exports.yfmTransformer = yfmTransformer;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MarkdownItPluginCb } from '@doc-tools/transform/lib/plugins/typings';
|
|
1
2
|
import { ConstructorBlock } from '../models/constructor';
|
|
2
3
|
import { Lang } from '../utils/configure';
|
|
3
4
|
export type ContentVariables = Record<string, string>;
|
|
@@ -9,6 +10,7 @@ export type ContentTransformerProps = {
|
|
|
9
10
|
lang: Lang;
|
|
10
11
|
customConfig?: {};
|
|
11
12
|
vars?: ContentVariables;
|
|
13
|
+
plugins?: MarkdownItPluginCb[];
|
|
12
14
|
};
|
|
13
15
|
};
|
|
14
16
|
export declare const contentTransformer: ({ content, options }: ContentTransformerProps) => {
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.contentTransformer = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
/* eslint-disable no-param-reassign */
|
|
6
|
-
/* eslint-disable no-not-accumulator-reassign/no-not-accumulator-reassign */
|
|
7
5
|
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
8
6
|
const config_1 = require("./config");
|
|
9
7
|
const filter_1 = require("./filter");
|
|
10
|
-
function transformBlocks(blocks, lang, customConfig = {}) {
|
|
8
|
+
function transformBlocks(blocks, lang, customConfig = {}, options = {}) {
|
|
11
9
|
const fullConfig = Object.assign(Object.assign({}, config_1.config), customConfig);
|
|
10
|
+
const { plugins = [] } = options;
|
|
12
11
|
const clonedBlocks = lodash_1.default.cloneDeep(blocks);
|
|
13
|
-
return clonedBlocks.map((block) => transformBlock(lang, fullConfig, block));
|
|
12
|
+
return clonedBlocks.map((block) => transformBlock(lang, fullConfig, block, plugins));
|
|
14
13
|
}
|
|
15
|
-
function transformBlock(lang, blocksConfig, block) {
|
|
14
|
+
function transformBlock(lang, blocksConfig, block, plugins) {
|
|
16
15
|
const blockConfig = blocksConfig[block.type];
|
|
17
16
|
if (block) {
|
|
18
17
|
if ('randomOrder' in block && block.randomOrder && 'children' in block && block.children) {
|
|
@@ -23,7 +22,9 @@ function transformBlock(lang, blocksConfig, block) {
|
|
|
23
22
|
const configs = Array.isArray(blockConfig) ? blockConfig : [blockConfig];
|
|
24
23
|
configs.forEach((transformConfig) => {
|
|
25
24
|
const { fields, transformer: transformerRaw, parser } = transformConfig;
|
|
26
|
-
const transformer =
|
|
25
|
+
const transformer = (content) =>
|
|
26
|
+
// eslint-disable-next-line no-useless-call
|
|
27
|
+
transformerRaw.call(null, lang, content, { plugins });
|
|
27
28
|
if (fields) {
|
|
28
29
|
fields.forEach((field) => {
|
|
29
30
|
if (block[field]) {
|
|
@@ -47,9 +48,11 @@ function transformBlock(lang, blocksConfig, block) {
|
|
|
47
48
|
return block;
|
|
48
49
|
}
|
|
49
50
|
const contentTransformer = ({ content, options }) => {
|
|
50
|
-
const { lang, customConfig = {}, vars } = options;
|
|
51
|
+
const { lang, customConfig = {}, vars, plugins = [] } = options;
|
|
51
52
|
const { blocks = [] } = (vars ? (0, filter_1.filterContent)(content, vars) : content);
|
|
52
|
-
const transformedBlocks = transformBlocks(blocks, lang, customConfig
|
|
53
|
+
const transformedBlocks = transformBlocks(blocks, lang, customConfig, {
|
|
54
|
+
plugins,
|
|
55
|
+
});
|
|
53
56
|
return {
|
|
54
57
|
blocks: transformedBlocks,
|
|
55
58
|
};
|
|
@@ -7,4 +7,4 @@ export declare const getCustomTypes: (types: (keyof CustomConfig)[], customBlock
|
|
|
7
7
|
export declare const getOrderedBlocks: (blocks: ConstructorBlock[], headerBlockTypes?: string[]) => ConstructorBlock[];
|
|
8
8
|
export declare const getHeaderBlock: (blocks: ConstructorBlock[], headerBlockTypes?: string[]) => ConstructorBlock | undefined;
|
|
9
9
|
export declare const getShareLink: (url: string, type: PCShareSocialNetwork, title?: string, text?: string) => string | undefined;
|
|
10
|
-
export declare const getQaAttrubutes: (qa?: string, customKeys
|
|
10
|
+
export declare const getQaAttrubutes: (qa?: string, ...customKeys: (string | Array<string>)[]) => Record<string, string>;
|
|
@@ -40,7 +40,7 @@ const BLOCK_ELEMENTS = [
|
|
|
40
40
|
'td',
|
|
41
41
|
];
|
|
42
42
|
const BLOCK_ELEMENTS_REGEX = `<(${BLOCK_ELEMENTS.join('|')})[^>]*>`;
|
|
43
|
-
const QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button'];
|
|
43
|
+
const QA_ATTRIBUTES_KEYS = ['container', 'content', 'wrapper', 'image', 'button', 'animate'];
|
|
44
44
|
function getHeaderTag(size) {
|
|
45
45
|
switch (size) {
|
|
46
46
|
case 'l':
|
|
@@ -122,13 +122,14 @@ const getShareLink = (url, type, title, text) => {
|
|
|
122
122
|
}
|
|
123
123
|
};
|
|
124
124
|
exports.getShareLink = getShareLink;
|
|
125
|
-
const getQaAttrubutes = (qa, customKeys
|
|
125
|
+
const getQaAttrubutes = (qa, ...customKeys) => {
|
|
126
126
|
const attributes = {};
|
|
127
127
|
if (qa) {
|
|
128
|
-
const keys = QA_ATTRIBUTES_KEYS.concat(customKeys);
|
|
128
|
+
const keys = QA_ATTRIBUTES_KEYS.concat((0, lodash_1.flatten)(customKeys));
|
|
129
129
|
keys.forEach((key) => {
|
|
130
130
|
attributes[(0, lodash_1.camelCase)(key)] = `${qa}-${key}`;
|
|
131
131
|
});
|
|
132
|
+
attributes.default = qa;
|
|
132
133
|
}
|
|
133
134
|
return attributes;
|
|
134
135
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BackgroundImageProps, WithChildren } from '../../models';
|
|
2
2
|
import './BackgroundImage.css';
|
|
3
|
+
export declare const qaIdByDefault = "background-image";
|
|
3
4
|
declare const BackgroundImage: (props: WithChildren<BackgroundImageProps>) => JSX.Element;
|
|
4
5
|
export default BackgroundImage;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { block } from '../../utils';
|
|
2
|
+
import { block, getQaAttrubutes } from '../../utils';
|
|
3
3
|
import Image from '../Image/Image';
|
|
4
4
|
import './BackgroundImage.css';
|
|
5
|
+
export const qaIdByDefault = 'background-image';
|
|
5
6
|
const b = block('storage-background-image');
|
|
6
7
|
const BackgroundImage = (props) => {
|
|
7
8
|
const { children, src, desktop, className, imageClassName, style, hide, qa } = props;
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
const qaAttributes = getQaAttrubutes(qa || qaIdByDefault);
|
|
10
|
+
return (React.createElement("div", { className: b(null, className), style: style, "data-qa": qa || qaIdByDefault },
|
|
11
|
+
(src || desktop) && !hide && (React.createElement(Image, Object.assign({}, props, { className: b('img', imageClassName), qa: qaAttributes.image }))),
|
|
10
12
|
children && React.createElement("div", { className: b('container') }, children)));
|
|
11
13
|
};
|
|
12
14
|
export default BackgroundImage;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { BackgroundMediaProps } from '../../models';
|
|
2
2
|
import './BackgroundMedia.css';
|
|
3
|
-
declare const BackgroundMedia: ({ className, color, animated, parallax, video, mediaClassName, fullWidthMedia, ...props }: BackgroundMediaProps) => JSX.Element;
|
|
3
|
+
declare const BackgroundMedia: ({ className, color, animated, parallax, video, mediaClassName, fullWidthMedia, qa, ...props }: BackgroundMediaProps) => JSX.Element;
|
|
4
4
|
export default BackgroundMedia;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { __rest } from "tslib";
|
|
2
2
|
import React, { useContext } from 'react';
|
|
3
3
|
import { MobileContext } from '../../context/mobileContext';
|
|
4
|
-
import { block } from '../../utils';
|
|
4
|
+
import { block, getQaAttrubutes } from '../../utils';
|
|
5
5
|
import AnimateBlock from '../AnimateBlock/AnimateBlock';
|
|
6
6
|
import Media from '../Media/Media';
|
|
7
7
|
import './BackgroundMedia.css';
|
|
8
8
|
const b = block('BackgroundMedia');
|
|
9
9
|
const BackgroundMedia = (_a) => {
|
|
10
|
-
var { className, color, animated, parallax = true, video, mediaClassName, fullWidthMedia } = _a, props = __rest(_a, ["className", "color", "animated", "parallax", "video", "mediaClassName", "fullWidthMedia"]);
|
|
10
|
+
var { className, color, animated, parallax = true, video, mediaClassName, fullWidthMedia, qa } = _a, props = __rest(_a, ["className", "color", "animated", "parallax", "video", "mediaClassName", "fullWidthMedia", "qa"]);
|
|
11
11
|
const isMobile = useContext(MobileContext);
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const qaAttributes = getQaAttrubutes(qa, 'media');
|
|
13
|
+
return (React.createElement(AnimateBlock, { className: b(null, className), style: { backgroundColor: color }, animate: animated, qa: qaAttributes.animate },
|
|
14
|
+
React.createElement(Media, Object.assign({ className: b('media', { 'full-width-media': fullWidthMedia }, mediaClassName), imageClassName: b('image'), videoClassName: b('video'), isBackground: true, qa: qaAttributes.media }, Object.assign({ height: 720, color,
|
|
14
15
|
parallax, video: isMobile ? undefined : video }, props)))));
|
|
15
16
|
};
|
|
16
17
|
export default BackgroundMedia;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { Fragment, useContext, useState } from 'react';
|
|
2
2
|
import { BREAKPOINTS } from '../../constants';
|
|
3
3
|
import { ProjectSettingsContext } from '../../context/projectSettingsContext';
|
|
4
|
+
import { getQaAttrubutes } from '../../utils';
|
|
4
5
|
import { isCompressible } from '../../utils/imageCompress';
|
|
5
6
|
import ImageBase from '../ImageBase/ImageBase';
|
|
6
7
|
import i18n from './i18n';
|
|
@@ -15,18 +16,19 @@ const Image = (props) => {
|
|
|
15
16
|
if (!src) {
|
|
16
17
|
return null;
|
|
17
18
|
}
|
|
19
|
+
const qaAttributes = getQaAttrubutes(qa, 'mobile-webp-source', 'mobile-source', 'tablet-webp-source', 'tablet-source', 'display-source');
|
|
18
20
|
const disableWebp = projectSettings.disableCompress ||
|
|
19
21
|
disableCompress ||
|
|
20
22
|
!isCompressible(src) ||
|
|
21
23
|
imgLoadingError;
|
|
22
24
|
return (React.createElement("picture", { className: containerClassName, "data-qa": qa },
|
|
23
25
|
mobile && (React.createElement(Fragment, null,
|
|
24
|
-
!disableWebp && (React.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${BREAKPOINTS.sm}px)
|
|
25
|
-
React.createElement("source", { srcSet: mobile, media: `(max-width: ${BREAKPOINTS.sm}px)
|
|
26
|
+
!disableWebp && (React.createElement("source", { srcSet: checkWebP(mobile), type: "image/webp", media: `(max-width: ${BREAKPOINTS.sm}px)`, "data-qa": qaAttributes.mobileWebpSource })),
|
|
27
|
+
React.createElement("source", { srcSet: mobile, media: `(max-width: ${BREAKPOINTS.sm}px)`, "data-qa": qaAttributes.mobileSource }))),
|
|
26
28
|
tablet && (React.createElement(Fragment, null,
|
|
27
|
-
!disableWebp && (React.createElement("source", { srcSet: checkWebP(tablet), type: "image/webp", media: `(max-width: ${BREAKPOINTS.md}px)
|
|
28
|
-
React.createElement("source", { srcSet: tablet, media: `(max-width: ${BREAKPOINTS.md}px)
|
|
29
|
-
src && !disableWebp && React.createElement("source", { srcSet: checkWebP(src), type: "image/webp" }),
|
|
29
|
+
!disableWebp && (React.createElement("source", { srcSet: checkWebP(tablet), type: "image/webp", media: `(max-width: ${BREAKPOINTS.md}px)`, "data-qa": qaAttributes.tabletWebpSource })),
|
|
30
|
+
React.createElement("source", { srcSet: tablet, media: `(max-width: ${BREAKPOINTS.md}px)`, "data-qa": qaAttributes.tabletSource }))),
|
|
31
|
+
src && !disableWebp && (React.createElement("source", { srcSet: checkWebP(src), type: "image/webp", "data-qa": qaAttributes.displaySource })),
|
|
30
32
|
React.createElement(ImageBase, { className: className, alt: alt, src: src, style: style, onClick: onClick, onError: () => setImgLoadingError(true) })));
|
|
31
33
|
};
|
|
32
34
|
export default Image;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MediaComponentImageProps } from '../../../models';
|
|
1
|
+
import { MediaComponentImageProps, QAProps } from '../../../models';
|
|
2
2
|
import './Image.css';
|
|
3
3
|
export interface ImageAdditionProps {
|
|
4
4
|
imageClassName?: string;
|
|
@@ -8,6 +8,7 @@ export interface ImageAdditionProps {
|
|
|
8
8
|
interface InnerImageProps {
|
|
9
9
|
hasVideoFallback: boolean;
|
|
10
10
|
}
|
|
11
|
-
type ImageAllProps = ImageAdditionProps & MediaComponentImageProps & InnerImageProps;
|
|
11
|
+
type ImageAllProps = ImageAdditionProps & MediaComponentImageProps & InnerImageProps & QAProps;
|
|
12
|
+
export declare const defaultAnimatedDivQa = "animated-div";
|
|
12
13
|
declare const Image: (props: ImageAllProps) => JSX.Element;
|
|
13
14
|
export default Image;
|
|
@@ -3,15 +3,17 @@ import _ from 'lodash';
|
|
|
3
3
|
import { animated, config, useSpring } from 'react-spring';
|
|
4
4
|
import SliderBlock from '../../../blocks/Slider/Slider';
|
|
5
5
|
import { SliderType } from '../../../models';
|
|
6
|
-
import { block } from '../../../utils';
|
|
6
|
+
import { block, getQaAttrubutes } from '../../../utils';
|
|
7
7
|
import BackgroundImage from '../../BackgroundImage/BackgroundImage';
|
|
8
8
|
import FullscreenImage from '../../FullscreenImage/FullscreenImage';
|
|
9
9
|
import ImageView from '../../Image/Image';
|
|
10
10
|
import { getMediaImage } from './utils';
|
|
11
11
|
import './Image.css';
|
|
12
12
|
const b = block('media-component-image');
|
|
13
|
+
export const defaultAnimatedDivQa = 'animated-div';
|
|
13
14
|
const Image = (props) => {
|
|
14
|
-
const { parallax, image, height, imageClassName, isBackground, hasVideoFallback, video, fullscreen, } = props;
|
|
15
|
+
const { parallax, image, height, imageClassName, isBackground, hasVideoFallback, video, fullscreen, qa, } = props;
|
|
16
|
+
const qaAttributes = getQaAttrubutes(qa, 'fullscreen-image', 'animate', 'background-image', 'image-view', 'slider-block');
|
|
15
17
|
const [scrollY, setScrollY] = useState(0);
|
|
16
18
|
const [{ springScrollY }, springSetScrollY] = useSpring(() => ({
|
|
17
19
|
springScrollY: 0,
|
|
@@ -35,16 +37,16 @@ const Image = (props) => {
|
|
|
35
37
|
const imageClass = b('item', { withVideo: Boolean(video) && !hasVideoFallback }, imageClassName);
|
|
36
38
|
const renderFullscreenImage = (item) => {
|
|
37
39
|
const itemData = getMediaImage(item);
|
|
38
|
-
return (React.createElement(FullscreenImage, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, imageStyle: { height } })));
|
|
40
|
+
return (React.createElement(FullscreenImage, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, imageStyle: { height }, qa: qaAttributes.fullscreenImage })));
|
|
39
41
|
};
|
|
40
42
|
const imageBackground = (oneImage) => {
|
|
41
43
|
const imageData = getMediaImage(oneImage);
|
|
42
|
-
return (React.createElement(animated.div, { style: { transform: parallaxInterpolate
|
|
43
|
-
React.createElement(BackgroundImage, Object.assign({}, imageData, { className: imageClass, style: { height } }))));
|
|
44
|
+
return (React.createElement(animated.div, { style: { transform: parallaxInterpolate }, "data-qa": qaAttributes.animate },
|
|
45
|
+
React.createElement(BackgroundImage, Object.assign({}, imageData, { className: imageClass, style: { height }, qa: qaAttributes.backgroundImage }))));
|
|
44
46
|
};
|
|
45
47
|
const imageOnly = (oneImage) => {
|
|
46
48
|
const imageData = getMediaImage(oneImage);
|
|
47
|
-
return React.createElement(ImageView, Object.assign({}, imageData, { className: imageClass, style: { height } }));
|
|
49
|
+
return (React.createElement(ImageView, Object.assign({}, imageData, { className: imageClass, style: { height }, qa: qaAttributes.imageView })));
|
|
48
50
|
};
|
|
49
51
|
const imageSlider = (imageArray) => {
|
|
50
52
|
const fullscreenItem = fullscreen === undefined || fullscreen;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { MediaProps } from '../../models';
|
|
1
|
+
import { MediaProps, QAProps } from '../../models';
|
|
2
2
|
import { ImageAdditionProps } from './Image/Image';
|
|
3
3
|
import { VideoAdditionProps } from './Video/Video';
|
|
4
4
|
import './Media.css';
|
|
5
|
-
export interface MediaAllProps extends MediaProps, VideoAdditionProps, ImageAdditionProps {
|
|
5
|
+
export interface MediaAllProps extends MediaProps, VideoAdditionProps, ImageAdditionProps, QAProps {
|
|
6
6
|
className?: string;
|
|
7
7
|
youtubeClassName?: string;
|
|
8
8
|
}
|