@gravity-ui/page-constructor 5.26.1 → 5.27.1-alpha.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/README.md +54 -0
- package/build/cjs/blocks/Banner/Banner.js +2 -2
- package/build/cjs/blocks/HeaderSlider/HeaderSlider.css +0 -10
- package/build/cjs/blocks/HeaderSlider/HeaderSlider.js +2 -2
- package/build/cjs/blocks/Slider/Slider.css +2 -0
- package/build/cjs/blocks/Slider/Slider.d.ts +1 -0
- package/build/cjs/blocks/Slider/Slider.js +85 -31
- package/build/cjs/blocks/Slider/i18n/en.json +3 -1
- package/build/cjs/blocks/Slider/i18n/index.d.ts +1 -1
- package/build/cjs/blocks/Slider/i18n/ru.json +3 -1
- package/build/cjs/blocks/Slider/utils.d.ts +10 -0
- package/build/cjs/blocks/Slider/utils.js +85 -1
- package/build/cjs/blocks/SliderNew/Arrow/Arrow.css +23 -19
- package/build/cjs/blocks/SliderNew/Arrow/Arrow.d.ts +4 -1
- package/build/cjs/blocks/SliderNew/Arrow/Arrow.js +5 -4
- package/build/cjs/blocks/SliderNew/Slider.css +103 -22
- package/build/cjs/blocks/SliderNew/Slider.d.ts +2 -1
- package/build/cjs/blocks/SliderNew/Slider.js +22 -9
- package/build/cjs/blocks/SliderNew/i18n/en.json +3 -1
- package/build/cjs/blocks/SliderNew/i18n/index.d.ts +1 -1
- package/build/cjs/blocks/SliderNew/i18n/ru.json +3 -1
- package/build/cjs/blocks/SliderNew/useSlider.d.ts +8 -6
- package/build/cjs/blocks/SliderNew/useSlider.js +4 -2
- package/build/cjs/blocks/SliderNew/useSliderPagination.d.ts +9 -0
- package/build/cjs/blocks/SliderNew/useSliderPagination.js +36 -0
- package/build/cjs/blocks/SliderNew/utils.d.ts +2 -0
- package/build/cjs/blocks/SliderNew/utils.js +13 -1
- package/build/cjs/components/FullscreenImage/FullscreenImage.css +48 -8
- package/build/cjs/components/FullscreenImage/FullscreenImage.d.ts +5 -0
- package/build/cjs/components/FullscreenImage/FullscreenImage.js +17 -3
- package/build/cjs/components/Media/Image/Image.d.ts +1 -0
- package/build/cjs/components/Media/Image/Image.js +7 -5
- package/build/cjs/components/Media/Media.css +4 -0
- package/build/cjs/components/Media/Media.d.ts +1 -0
- package/build/cjs/components/Media/Media.js +3 -2
- package/build/cjs/components/MediaBase/MediaBase.js +1 -1
- package/build/cjs/components/ReactPlayer/ReactPlayer.js +1 -1
- package/build/cjs/constructor-items.d.ts +1 -1
- package/build/cjs/containers/PageConstructor/PageConstructor.js +3 -1
- package/build/cjs/context/projectSettingsContext/ProjectSettingsContext.d.ts +1 -0
- package/build/cjs/models/constructor-items/blocks.d.ts +2 -1
- package/build/cjs/models/constructor-items/blocks.js +1 -0
- package/build/cjs/models/constructor-items/sub-blocks.d.ts +2 -1
- package/build/cjs/navigation/hooks/useShowBorder.js +3 -2
- package/build/cjs/sub-blocks/BannerCard/BannerCard.js +3 -3
- package/build/cjs/sub-blocks/Content/Content.css +14 -4
- package/build/cjs/sub-blocks/ImageCard/ImageCard.css +8 -0
- package/build/esm/blocks/Banner/Banner.js +2 -2
- package/build/esm/blocks/HeaderSlider/HeaderSlider.css +0 -10
- package/build/esm/blocks/HeaderSlider/HeaderSlider.js +1 -1
- package/build/esm/blocks/Slider/Slider.css +2 -0
- package/build/esm/blocks/Slider/Slider.d.ts +1 -0
- package/build/esm/blocks/Slider/Slider.js +86 -32
- package/build/esm/blocks/Slider/i18n/en.json +3 -1
- package/build/esm/blocks/Slider/i18n/index.d.ts +1 -1
- package/build/esm/blocks/Slider/i18n/ru.json +3 -1
- package/build/esm/blocks/Slider/utils.d.ts +10 -0
- package/build/esm/blocks/Slider/utils.js +82 -0
- package/build/esm/blocks/SliderNew/Arrow/Arrow.css +23 -19
- package/build/esm/blocks/SliderNew/Arrow/Arrow.d.ts +4 -1
- package/build/esm/blocks/SliderNew/Arrow/Arrow.js +5 -4
- package/build/esm/blocks/SliderNew/Slider.css +103 -22
- package/build/esm/blocks/SliderNew/Slider.d.ts +2 -1
- package/build/esm/blocks/SliderNew/Slider.js +22 -9
- package/build/esm/blocks/SliderNew/i18n/en.json +3 -1
- package/build/esm/blocks/SliderNew/i18n/index.d.ts +1 -1
- package/build/esm/blocks/SliderNew/i18n/ru.json +3 -1
- package/build/esm/blocks/SliderNew/useSlider.d.ts +8 -6
- package/build/esm/blocks/SliderNew/useSlider.js +6 -3
- package/build/esm/blocks/SliderNew/useSliderPagination.d.ts +9 -0
- package/build/esm/blocks/SliderNew/useSliderPagination.js +32 -0
- package/build/esm/blocks/SliderNew/utils.d.ts +2 -0
- package/build/esm/blocks/SliderNew/utils.js +10 -0
- package/build/esm/components/FullscreenImage/FullscreenImage.css +48 -8
- package/build/esm/components/FullscreenImage/FullscreenImage.d.ts +5 -0
- package/build/esm/components/FullscreenImage/FullscreenImage.js +18 -4
- package/build/esm/components/Media/Image/Image.d.ts +1 -0
- package/build/esm/components/Media/Image/Image.js +7 -5
- package/build/esm/components/Media/Media.css +4 -0
- package/build/esm/components/Media/Media.d.ts +1 -0
- package/build/esm/components/Media/Media.js +3 -2
- package/build/esm/components/MediaBase/MediaBase.js +1 -1
- package/build/esm/components/ReactPlayer/ReactPlayer.js +1 -1
- package/build/esm/constructor-items.d.ts +1 -1
- package/build/esm/containers/PageConstructor/PageConstructor.js +4 -2
- package/build/esm/context/projectSettingsContext/ProjectSettingsContext.d.ts +1 -0
- package/build/esm/models/constructor-items/blocks.d.ts +2 -1
- package/build/esm/models/constructor-items/blocks.js +1 -0
- package/build/esm/models/constructor-items/sub-blocks.d.ts +2 -1
- package/build/esm/navigation/hooks/useShowBorder.js +1 -1
- package/build/esm/sub-blocks/BannerCard/BannerCard.js +3 -3
- package/build/esm/sub-blocks/Content/Content.css +14 -4
- package/build/esm/sub-blocks/ImageCard/ImageCard.css +8 -0
- package/package.json +4 -1
- package/server/models/constructor-items/blocks.d.ts +2 -1
- package/server/models/constructor-items/blocks.js +1 -0
- package/server/models/constructor-items/sub-blocks.d.ts +2 -1
- package/styles/mixins.scss +1 -1
- package/widget/index.js +1 -1
|
@@ -12,6 +12,25 @@ unpredictable css rules order in build */
|
|
|
12
12
|
.pc-fullscreen-image__modal-content {
|
|
13
13
|
position: relative;
|
|
14
14
|
border-radius: var(--pc-border-radius);
|
|
15
|
+
width: 100%;
|
|
16
|
+
}
|
|
17
|
+
.pc-fullscreen-image__modal-content-wrapper {
|
|
18
|
+
width: 100%;
|
|
19
|
+
}
|
|
20
|
+
.pc-fullscreen-image__modal-content_loaded {
|
|
21
|
+
max-width: fit-content;
|
|
22
|
+
}
|
|
23
|
+
.pc-fullscreen-image__modal_with-slider .g-modal__content-wrapper {
|
|
24
|
+
width: 100%;
|
|
25
|
+
height: 100vh;
|
|
26
|
+
margin: 0;
|
|
27
|
+
justify-content: center;
|
|
28
|
+
}
|
|
29
|
+
.pc-fullscreen-image__modal_with-slider .pc-fullscreen-image__modal-content {
|
|
30
|
+
background-color: transparent;
|
|
31
|
+
}
|
|
32
|
+
.pc-fullscreen-image__modal_with-slider .pc-fullscreen-image__modal-content:hover .pc-fullscreen-image__icon-wrapper {
|
|
33
|
+
opacity: 1;
|
|
15
34
|
}
|
|
16
35
|
.pc-fullscreen-image__modal-image {
|
|
17
36
|
display: block;
|
|
@@ -19,6 +38,27 @@ unpredictable css rules order in build */
|
|
|
19
38
|
max-height: 70vh;
|
|
20
39
|
overflow: hidden;
|
|
21
40
|
}
|
|
41
|
+
.pc-fullscreen-image__modal-slider {
|
|
42
|
+
max-width: 100vw;
|
|
43
|
+
width: 100%;
|
|
44
|
+
height: 100vh;
|
|
45
|
+
}
|
|
46
|
+
.pc-fullscreen-image__modal-slider_item {
|
|
47
|
+
height: 100%;
|
|
48
|
+
display: flex;
|
|
49
|
+
justify-content: center;
|
|
50
|
+
align-items: center;
|
|
51
|
+
}
|
|
52
|
+
.pc-fullscreen-image__modal-slider_item-image {
|
|
53
|
+
display: block;
|
|
54
|
+
margin: auto;
|
|
55
|
+
border-radius: var(--pc-border-radius);
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
max-height: calc(100vh - 80px);
|
|
58
|
+
max-width: 100%;
|
|
59
|
+
object-fit: contain;
|
|
60
|
+
object-position: center;
|
|
61
|
+
}
|
|
22
62
|
.pc-fullscreen-image__modal .g-modal__content, .pc-fullscreen-image__modal-image {
|
|
23
63
|
border-radius: var(--pc-border-radius);
|
|
24
64
|
}
|
|
@@ -36,6 +76,7 @@ unpredictable css rules order in build */
|
|
|
36
76
|
align-items: center;
|
|
37
77
|
justify-content: center;
|
|
38
78
|
position: absolute;
|
|
79
|
+
z-index: 1001;
|
|
39
80
|
right: 16px;
|
|
40
81
|
top: 16px;
|
|
41
82
|
width: 36px;
|
|
@@ -56,6 +97,10 @@ unpredictable css rules order in build */
|
|
|
56
97
|
.pc-fullscreen-image__icon-wrapper:focus {
|
|
57
98
|
opacity: 1;
|
|
58
99
|
}
|
|
100
|
+
.pc-fullscreen-image__icon-wrapper_visible {
|
|
101
|
+
right: 24px;
|
|
102
|
+
top: 24px;
|
|
103
|
+
}
|
|
59
104
|
.pc-fullscreen-image__icon {
|
|
60
105
|
color: var(--g-color-text-hint);
|
|
61
106
|
}
|
|
@@ -67,14 +112,9 @@ unpredictable css rules order in build */
|
|
|
67
112
|
width: 100%;
|
|
68
113
|
}
|
|
69
114
|
}
|
|
70
|
-
@media (max-width:
|
|
71
|
-
.pc-fullscreen-image__image {
|
|
72
|
-
pointer-events: none;
|
|
73
|
-
}
|
|
115
|
+
@media (max-width: 769px) {
|
|
74
116
|
.pc-fullscreen-image__icon-wrapper {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
.pc-fullscreen-image__modal {
|
|
78
|
-
display: none !important; /* stylelint-disable-line declaration-no-important */
|
|
117
|
+
right: 20px;
|
|
118
|
+
top: 50px;
|
|
79
119
|
}
|
|
80
120
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CSSProperties, HTMLProps } from 'react';
|
|
2
|
+
import { ImageProps as ModelImageProps } from '../../models';
|
|
2
3
|
import { ImageProps } from '../Image/Image';
|
|
3
4
|
import './FullscreenImage.css';
|
|
4
5
|
export interface FullscreenImageProps extends ImageProps {
|
|
@@ -6,6 +7,10 @@ export interface FullscreenImageProps extends ImageProps {
|
|
|
6
7
|
modalImageClass?: string;
|
|
7
8
|
imageStyle?: CSSProperties;
|
|
8
9
|
extraProps?: HTMLProps<HTMLDivElement>;
|
|
10
|
+
sliderData?: {
|
|
11
|
+
items: ModelImageProps[];
|
|
12
|
+
initialIndex: number;
|
|
13
|
+
};
|
|
9
14
|
}
|
|
10
15
|
declare const FullscreenImage: (props: FullscreenImageProps) => JSX.Element;
|
|
11
16
|
export default FullscreenImage;
|
|
@@ -1,26 +1,40 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
2
|
import { ChevronsExpandUpRight, Xmark } from '@gravity-ui/icons';
|
|
3
3
|
import { Icon, Modal } from '@gravity-ui/uikit';
|
|
4
|
+
import { SliderNewBlock as SliderBlock } from '../../blocks/unstable';
|
|
5
|
+
import { SliderType } from '../../models';
|
|
4
6
|
import { block } from '../../utils';
|
|
5
7
|
import Image from '../Image/Image';
|
|
8
|
+
import { getMediaImage } from '../Media/Image/utils';
|
|
6
9
|
import { i18n } from './i18n';
|
|
7
10
|
import './FullscreenImage.css';
|
|
8
11
|
const b = block('fullscreen-image');
|
|
9
12
|
const FULL_SCREEN_ICON_SIZE = 18;
|
|
10
13
|
const CLOSE_ICON_SIZE = 24;
|
|
11
14
|
const FullscreenImage = (props) => {
|
|
12
|
-
const { imageClassName, modalImageClass, imageStyle, alt = i18n('img-alt'), extraProps } = props;
|
|
15
|
+
const { imageClassName, sliderData, modalImageClass, imageStyle, alt = i18n('img-alt'), extraProps, } = props;
|
|
13
16
|
const [isOpened, setIsOpened] = useState(false);
|
|
17
|
+
const [sliderLoaded, setSliderLoaded] = useState(false);
|
|
14
18
|
const openModal = () => setIsOpened(true);
|
|
15
19
|
const closeModal = () => setIsOpened(false);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (sliderData && !isOpened) {
|
|
22
|
+
setSliderLoaded(false);
|
|
23
|
+
}
|
|
24
|
+
}, [isOpened, sliderData]);
|
|
25
|
+
const handleSliderImageLoad = () => {
|
|
26
|
+
setSliderLoaded(true);
|
|
27
|
+
};
|
|
16
28
|
return (React.createElement("div", Object.assign({ className: b() }, extraProps),
|
|
17
29
|
React.createElement("div", { className: b('image-wrapper') },
|
|
18
30
|
React.createElement(Image, Object.assign({}, props, { alt: alt, className: b('image', imageClassName), onClick: openModal, style: imageStyle })),
|
|
19
31
|
React.createElement("button", { className: b('icon-wrapper'), onClick: openModal },
|
|
20
32
|
React.createElement(Icon, { data: ChevronsExpandUpRight, width: FULL_SCREEN_ICON_SIZE, height: FULL_SCREEN_ICON_SIZE, className: b('icon') }))),
|
|
21
|
-
isOpened && (React.createElement(Modal, { open: isOpened, onClose: closeModal, className: b('modal'), contentClassName: b('modal-content') },
|
|
33
|
+
isOpened && (React.createElement(Modal, { open: isOpened, onClose: closeModal, className: b('modal', { 'with-slider': Boolean(sliderData) }), contentClassName: b('modal-content', { loaded: sliderLoaded }) },
|
|
22
34
|
React.createElement("button", { className: b('icon-wrapper', { visible: true }), onClick: closeModal, "aria-label": i18n('close') },
|
|
23
35
|
React.createElement(Icon, { data: Xmark, width: CLOSE_ICON_SIZE, height: CLOSE_ICON_SIZE, className: b('icon', { hover: true }) })),
|
|
24
|
-
React.createElement(
|
|
36
|
+
sliderData ? (React.createElement("div", { className: b('modal-slider') },
|
|
37
|
+
React.createElement(SliderBlock, { initialSlide: sliderData.initialIndex, slidesToShow: 1, type: SliderType.FullscreenCard }, sliderData.items.map((item, index) => (React.createElement("div", { key: index, className: b('modal-slider_item') },
|
|
38
|
+
React.createElement(Image, Object.assign({ onLoad: handleSliderImageLoad, className: b('modal-slider_item-image', modalImageClass), containerClassName: b('modal-slider_item-image-wrapper') }, getMediaImage(item))))))))) : (React.createElement(Image, Object.assign({}, props, { className: b('modal-image', modalImageClass) })))))));
|
|
25
39
|
};
|
|
26
40
|
export default FullscreenImage;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { Fragment, useEffect, useState } from 'react';
|
|
2
2
|
import { animated, config, useSpring } from '@react-spring/web';
|
|
3
3
|
import debounce from 'lodash/debounce';
|
|
4
|
-
import SliderBlock from '../../../blocks/
|
|
4
|
+
import { SliderNewBlock as SliderBlock } from '../../../blocks/unstable';
|
|
5
5
|
import { SliderType } from '../../../models';
|
|
6
6
|
import { block, getQaAttrubutes } from '../../../utils';
|
|
7
7
|
import BackgroundImage from '../../BackgroundImage/BackgroundImage';
|
|
@@ -12,7 +12,7 @@ import './Image.css';
|
|
|
12
12
|
const b = block('media-component-image');
|
|
13
13
|
export const defaultAnimatedDivQa = 'animated-div';
|
|
14
14
|
const Image = (props) => {
|
|
15
|
-
const { parallax, height, imageClassName, isBackground, hasVideoFallback, video, fullscreen, disableImageSliderForArrayInput, qa, onLoad, } = props;
|
|
15
|
+
const { parallax, height, imageClassName, fullscreenClassName, isBackground, hasVideoFallback, video, fullscreen, disableImageSliderForArrayInput, qa, onLoad, } = props;
|
|
16
16
|
const image = Array.isArray(props.image) && disableImageSliderForArrayInput
|
|
17
17
|
? props.image[0]
|
|
18
18
|
: props.image;
|
|
@@ -38,9 +38,9 @@ const Image = (props) => {
|
|
|
38
38
|
parallaxInterpolate = springScrollY.to((value) => `translateY(-${Number(value) / parallaxLevel}px)`);
|
|
39
39
|
}
|
|
40
40
|
const imageClass = b('item', { withVideo: Boolean(video) && !hasVideoFallback }, imageClassName);
|
|
41
|
-
const renderFullscreenImage = (item) => {
|
|
41
|
+
const renderFullscreenImage = (item, sliderData) => {
|
|
42
42
|
const itemData = getMediaImage(item);
|
|
43
|
-
return (React.createElement(FullscreenImage, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, imageStyle: { height }, qa: qaAttributes.fullscreenImage })));
|
|
43
|
+
return (React.createElement(FullscreenImage, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, modalImageClass: fullscreenClassName, imageStyle: { height }, qa: qaAttributes.fullscreenImage, sliderData: sliderData })));
|
|
44
44
|
};
|
|
45
45
|
const imageBackground = (oneImage) => {
|
|
46
46
|
const imageData = getMediaImage(oneImage);
|
|
@@ -53,7 +53,9 @@ const Image = (props) => {
|
|
|
53
53
|
};
|
|
54
54
|
const imageSlider = (imageArray) => {
|
|
55
55
|
const fullscreenItem = fullscreen === undefined || fullscreen;
|
|
56
|
-
return (React.createElement(SliderBlock, { slidesToShow: 1, type: SliderType.MediaCard }, imageArray.map((item, index) => (React.createElement(Fragment, { key: index }, fullscreenItem
|
|
56
|
+
return (React.createElement(SliderBlock, { slidesToShow: 1, type: SliderType.MediaCard }, imageArray.map((item, index) => (React.createElement(Fragment, { key: index }, fullscreenItem
|
|
57
|
+
? renderFullscreenImage(item, { items: imageArray, initialIndex: index })
|
|
58
|
+
: imageOnly(item))))));
|
|
57
59
|
};
|
|
58
60
|
if (Array.isArray(image)) {
|
|
59
61
|
return imageSlider(image);
|
|
@@ -4,6 +4,7 @@ import { VideoAdditionProps } from './Video/Video';
|
|
|
4
4
|
import './Media.css';
|
|
5
5
|
export interface MediaAllProps extends MediaProps, VideoAdditionProps, ImageAdditionProps, QAProps {
|
|
6
6
|
className?: string;
|
|
7
|
+
isFullscreenImageCover?: boolean;
|
|
7
8
|
youtubeClassName?: string;
|
|
8
9
|
autoplay?: boolean;
|
|
9
10
|
onImageLoad?: () => void;
|
|
@@ -9,13 +9,13 @@ import Video from './Video/Video';
|
|
|
9
9
|
import './Media.css';
|
|
10
10
|
const b = block('Media');
|
|
11
11
|
export const Media = (props) => {
|
|
12
|
-
const { image, video, youtube, videoIframe, dataLens, color, height, previewImg, parallax = false, fullscreen, analyticsEvents, className, imageClassName, videoClassName, youtubeClassName, disableImageSliderForArrayInput, playVideo = true, isBackground, playButton, customBarControlsClassName, qa, ratio, autoplay, onImageLoad, iframe, margins, } = props;
|
|
12
|
+
const { image, video, youtube, videoIframe, dataLens, color, height, previewImg, parallax = false, fullscreen, isFullscreenImageCover, analyticsEvents, className, imageClassName, videoClassName, youtubeClassName, disableImageSliderForArrayInput, playVideo = true, isBackground, playButton, customBarControlsClassName, qa, ratio, autoplay, onImageLoad, iframe, margins, } = props;
|
|
13
13
|
const [hasVideoFallback, setHasVideoFallback] = useState(false);
|
|
14
14
|
const qaAttributes = getQaAttrubutes(qa, 'video');
|
|
15
15
|
const content = useMemo(() => {
|
|
16
16
|
let result = [];
|
|
17
17
|
if (image) {
|
|
18
|
-
result.push(React.createElement(Image, { key: "image", parallax: parallax, image: image, disableImageSliderForArrayInput: disableImageSliderForArrayInput, height: height, imageClassName: imageClassName, isBackground: isBackground, video: video, hasVideoFallback: hasVideoFallback, fullscreen: fullscreen, qa: qaAttributes.image, onLoad: onImageLoad }));
|
|
18
|
+
result.push(React.createElement(Image, { key: "image", parallax: parallax, image: image, disableImageSliderForArrayInput: disableImageSliderForArrayInput, height: height, imageClassName: imageClassName, fullscreenClassName: isFullscreenImageCover ? b('fullscreen-image-cover') : undefined, isBackground: isBackground, video: video, hasVideoFallback: hasVideoFallback, fullscreen: fullscreen, qa: qaAttributes.image, onLoad: onImageLoad }));
|
|
19
19
|
}
|
|
20
20
|
if (video) {
|
|
21
21
|
const videoProps = {
|
|
@@ -63,6 +63,7 @@ export const Media = (props) => {
|
|
|
63
63
|
isBackground,
|
|
64
64
|
hasVideoFallback,
|
|
65
65
|
fullscreen,
|
|
66
|
+
isFullscreenImageCover,
|
|
66
67
|
qaAttributes.image,
|
|
67
68
|
qaAttributes.video,
|
|
68
69
|
onImageLoad,
|
|
@@ -30,7 +30,7 @@ export const MediaBase = (props) => {
|
|
|
30
30
|
}) },
|
|
31
31
|
React.createElement(Col, { className: b('content'), sizes: contentSizes }, mediaContent),
|
|
32
32
|
card ? (React.createElement(Col, { sizes: mediaSizes },
|
|
33
|
-
React.createElement("div",
|
|
33
|
+
React.createElement("div", { className: b('card') }, card))) : null))));
|
|
34
34
|
};
|
|
35
35
|
MediaBase.Card = Card;
|
|
36
36
|
export default MediaBase;
|
|
@@ -21,7 +21,7 @@ const FPS = 60;
|
|
|
21
21
|
// eslint-disable-next-line react/display-name
|
|
22
22
|
export const ReactPlayerBlock = React.forwardRef((props, originRef) => {
|
|
23
23
|
const isMobile = useContext(MobileContext);
|
|
24
|
-
const { src, previewImgUrl, loop = false, controls = MediaVideoControlsType.Default, customControlsOptions = {}, muted: initiallyMuted = false, elapsedTime, playButton, className, customBarControlsClassName, showPreview, onClickPreview, analyticsEvents, height, ariaLabel, ratio, autoRatio, contain, } = props;
|
|
24
|
+
const { src, previewImgUrl, loop = false, controls = MediaVideoControlsType.Default, customControlsOptions = {}, muted: initiallyMuted = false, elapsedTime, playButton, className, customBarControlsClassName, showPreview, onClickPreview, analyticsEvents, height, ariaLabel, ratio, autoRatio, contain = true, } = props;
|
|
25
25
|
const { type = PlayButtonType.Default, theme = PlayButtonThemes.Blue, text, className: buttonClassName, } = playButton || {};
|
|
26
26
|
const { type: customControlsType = CustomControlsType.WithMuteButton, muteButtonShown, positioning = CustomControlsButtonPositioning.Center, } = customControlsOptions;
|
|
27
27
|
const autoPlay = Boolean(!isMobile && !previewImgUrl && props.autoplay);
|
|
@@ -18,7 +18,7 @@ export declare const blockMap: {
|
|
|
18
18
|
"map-block": ({ map, border, disableShadow, ...props }: import("./models").MapBlockProps) => JSX.Element;
|
|
19
19
|
"filter-block": import("react").FC<import("./models").FilterBlockProps>;
|
|
20
20
|
"form-block": import("react").FC<import("./models").FormBlockProps>;
|
|
21
|
-
"slider-new-block": ({ animated, title, description, type, anchorId, arrows, adaptive, autoplay: autoplayMs, dots, className, dotsClassName, disclaimer, children, blockClassName, arrowSize, slidesToShow, onSlideChange, onSlideChangeTransitionStart, onSlideChangeTransitionEnd, onActiveIndexChange, onBreakpoint, }: import("react").PropsWithChildren<import("./blocks/SliderNew/Slider").SliderNewProps>) => JSX.Element;
|
|
21
|
+
"slider-new-block": ({ animated, title, description, type, anchorId, arrows, adaptive, autoplay: autoplayMs, dots, initialSlide, className, dotsClassName, disclaimer, children, blockClassName, arrowSize, slidesToShow, onSlideChange, onSlideChangeTransitionStart, onSlideChangeTransitionEnd, onActiveIndexChange, onBreakpoint, }: import("react").PropsWithChildren<import("./blocks/SliderNew/Slider").SliderNewProps>) => JSX.Element;
|
|
22
22
|
};
|
|
23
23
|
export declare const subBlockMap: {
|
|
24
24
|
divider: ({ size, border }: import("./models").DividerProps) => JSX.Element;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { __rest } from "tslib";
|
|
2
|
-
import React, { useMemo } from 'react';
|
|
2
|
+
import React, { useContext, useMemo } from 'react';
|
|
3
3
|
import '@diplodoc/transform/dist/js/yfm';
|
|
4
4
|
import BackgroundMedia from '../../components/BackgroundMedia/BackgroundMedia';
|
|
5
5
|
import RootCn from '../../components/RootCn';
|
|
6
6
|
import { blockMap, navItemMap, subBlockMap } from '../../constructor-items';
|
|
7
7
|
import { AnimateContext } from '../../context/animateContext';
|
|
8
8
|
import { InnerContext } from '../../context/innerContext';
|
|
9
|
+
import { ProjectSettingsContext } from '../../context/projectSettingsContext';
|
|
9
10
|
import { useTheme } from '../../context/theme';
|
|
10
11
|
import { Grid } from '../../grid';
|
|
11
12
|
import { BlockType, BlockTypes, HeaderBlockTypes, NavigationItemTypes, SubBlockTypes, } from '../../models';
|
|
@@ -51,7 +52,8 @@ export const Constructor = (props) => {
|
|
|
51
52
|
React.createElement(ConstructorBlocks, { items: restBlocks })))))))));
|
|
52
53
|
};
|
|
53
54
|
export const PageConstructor = (props) => {
|
|
54
|
-
const {
|
|
55
|
+
const { isAnimationEnabled = true } = useContext(ProjectSettingsContext);
|
|
56
|
+
const { content: { animated = isAnimationEnabled } = {} } = props, rest = __rest(props, ["content"]);
|
|
55
57
|
return (React.createElement(AnimateContext.Provider, { value: { animated } },
|
|
56
58
|
React.createElement(Constructor, Object.assign({ content: props.content }, rest))));
|
|
57
59
|
};
|
|
@@ -62,7 +62,8 @@ export declare enum SliderBreakpointNames {
|
|
|
62
62
|
}
|
|
63
63
|
export declare enum SliderType {
|
|
64
64
|
MediaCard = "media-card",
|
|
65
|
-
HeaderCard = "header-card"
|
|
65
|
+
HeaderCard = "header-card",
|
|
66
|
+
FullscreenCard = "fullscreen-card"
|
|
66
67
|
}
|
|
67
68
|
export type SliderBreakpointParams = Record<SliderBreakpointNames, number>;
|
|
68
69
|
export type SlidesToShow = Partial<SliderBreakpointParams> | number;
|
|
@@ -35,6 +35,7 @@ export var SliderType;
|
|
|
35
35
|
(function (SliderType) {
|
|
36
36
|
SliderType["MediaCard"] = "media-card";
|
|
37
37
|
SliderType["HeaderCard"] = "header-card";
|
|
38
|
+
SliderType["FullscreenCard"] = "fullscreen-card";
|
|
38
39
|
})(SliderType || (SliderType = {}));
|
|
39
40
|
export var PCShareSocialNetwork;
|
|
40
41
|
(function (PCShareSocialNetwork) {
|
|
@@ -113,11 +113,12 @@ export interface BasicCardProps extends CardBaseProps, AnalyticsEventsBase, Card
|
|
|
113
113
|
export interface BannerCardProps {
|
|
114
114
|
title: string;
|
|
115
115
|
subtitle?: string;
|
|
116
|
+
className?: string;
|
|
116
117
|
image?: ThemeSupporting<string>;
|
|
117
118
|
disableCompress?: boolean;
|
|
118
119
|
color?: ThemeSupporting<string>;
|
|
119
120
|
theme?: TextTheme;
|
|
120
|
-
button
|
|
121
|
+
button?: Pick<ButtonProps, 'text' | 'url' | 'target' | 'theme'>;
|
|
121
122
|
mediaView?: MediaView;
|
|
122
123
|
}
|
|
123
124
|
export interface MediaCardProps extends MediaProps, AnalyticsEventsBase, CardBaseProps {
|
|
@@ -5,7 +5,7 @@ import { block, getThemedValue } from '../../utils';
|
|
|
5
5
|
import './BannerCard.css';
|
|
6
6
|
const b = block('banner-card');
|
|
7
7
|
export const BannerCard = (props) => {
|
|
8
|
-
const { title, subtitle, button: { url, text, target, theme: buttonTheme = 'raised' }, color, theme: textTheme = 'light', image, disableCompress, mediaView = 'full', } = props;
|
|
8
|
+
const { title, subtitle, button: { url, text, target, theme: buttonTheme = 'raised' } = {}, color, theme: textTheme = 'light', image, disableCompress, mediaView = 'full', } = props;
|
|
9
9
|
const theme = useTheme();
|
|
10
10
|
const contentStyle = {};
|
|
11
11
|
if (color) {
|
|
@@ -18,8 +18,8 @@ export const BannerCard = (props) => {
|
|
|
18
18
|
React.createElement("h2", { className: b('title') },
|
|
19
19
|
React.createElement(HTML, null, title)),
|
|
20
20
|
subtitle && (React.createElement(YFMWrapper, { className: b('subtitle'), content: subtitle, modifiers: { constructor: true } }))),
|
|
21
|
-
React.createElement(RouterLink, { href: url },
|
|
22
|
-
React.createElement(Button, { className: b('button'), theme: buttonTheme, size: "xl", text: text, url: url, target: target }))),
|
|
21
|
+
url && (React.createElement(RouterLink, { href: url },
|
|
22
|
+
React.createElement(Button, { className: b('button'), theme: buttonTheme, size: "xl", text: text !== null && text !== void 0 ? text : '', url: url, target: target })))),
|
|
23
23
|
React.createElement(BackgroundImage, { className: b('image'), src: getThemedValue(image, theme), disableCompress: disableCompress }))));
|
|
24
24
|
};
|
|
25
25
|
export default BannerCard;
|
|
@@ -87,6 +87,9 @@ unpredictable css rules order in build */
|
|
|
87
87
|
.pc-content_theme_dark .pc-content__title *,
|
|
88
88
|
.pc-content_theme_dark .pc-content__text .yfm,
|
|
89
89
|
.pc-content_theme_dark .pc-content__text .yfm *,
|
|
90
|
+
.pc-content_theme_dark .pc-content__list *,
|
|
91
|
+
.pc-content_theme_dark .pc-content__list .yfm,
|
|
92
|
+
.pc-content_theme_dark .pc-content__list .yfm *,
|
|
90
93
|
.pc-content_theme_dark .pc-content__links a {
|
|
91
94
|
color: var(--g-color-text-light-primary);
|
|
92
95
|
}
|
|
@@ -101,11 +104,13 @@ unpredictable css rules order in build */
|
|
|
101
104
|
.pc-content_theme_dark .pc-content__notice .yfm a:hover {
|
|
102
105
|
color: var(--g-color-text-light-primary);
|
|
103
106
|
}
|
|
104
|
-
.pc-content_theme_dark .pc-content__text .yfm a
|
|
107
|
+
.pc-content_theme_dark .pc-content__text .yfm a,
|
|
108
|
+
.pc-content_theme_dark .pc-content__list .yfm a {
|
|
105
109
|
color: var(--g-color-text-light-primary);
|
|
106
110
|
text-decoration: underline;
|
|
107
111
|
}
|
|
108
|
-
.pc-content_theme_dark .pc-content__text .yfm a:hover
|
|
112
|
+
.pc-content_theme_dark .pc-content__text .yfm a:hover,
|
|
113
|
+
.pc-content_theme_dark .pc-content__list .yfm a:hover {
|
|
109
114
|
color: var(--g-color-text-light-secondary);
|
|
110
115
|
}
|
|
111
116
|
.pc-content_theme_dark .pc-content__title a {
|
|
@@ -119,6 +124,9 @@ unpredictable css rules order in build */
|
|
|
119
124
|
.pc-content_theme_light .pc-content__title *,
|
|
120
125
|
.pc-content_theme_light .pc-content__text .yfm,
|
|
121
126
|
.pc-content_theme_light .pc-content__text .yfm *,
|
|
127
|
+
.pc-content_theme_light .pc-content__list *,
|
|
128
|
+
.pc-content_theme_light .pc-content__list .yfm,
|
|
129
|
+
.pc-content_theme_light .pc-content__list .yfm *,
|
|
122
130
|
.pc-content_theme_light .pc-content__links a {
|
|
123
131
|
color: var(--g-color-text-dark-primary);
|
|
124
132
|
}
|
|
@@ -133,11 +141,13 @@ unpredictable css rules order in build */
|
|
|
133
141
|
.pc-content_theme_light .pc-content__notice .yfm a:hover {
|
|
134
142
|
color: var(--g-color-text-dark-primary);
|
|
135
143
|
}
|
|
136
|
-
.pc-content_theme_light .pc-content__text .yfm a
|
|
144
|
+
.pc-content_theme_light .pc-content__text .yfm a,
|
|
145
|
+
.pc-content_theme_light .pc-content__list .yfm a {
|
|
137
146
|
color: var(--g-color-text-dark-primary);
|
|
138
147
|
text-decoration: underline;
|
|
139
148
|
}
|
|
140
|
-
.pc-content_theme_light .pc-content__text .yfm a:hover
|
|
149
|
+
.pc-content_theme_light .pc-content__text .yfm a:hover,
|
|
150
|
+
.pc-content_theme_light .pc-content__list .yfm a:hover {
|
|
141
151
|
color: var(--g-color-text-dark-secondary);
|
|
142
152
|
}
|
|
143
153
|
.pc-content_theme_light .pc-content__title a {
|
|
@@ -16,6 +16,14 @@ unpredictable css rules order in build */
|
|
|
16
16
|
.pc-image-card_border_line {
|
|
17
17
|
border: 1px solid var(--g-color-line-generic);
|
|
18
18
|
}
|
|
19
|
+
@media (min-width: 577px) {
|
|
20
|
+
.slick-slide:not(.slick-active) .pc-image-card {
|
|
21
|
+
box-shadow: none;
|
|
22
|
+
}
|
|
23
|
+
.swiper-slide:not(.swiper-slide-visible) .pc-image-card {
|
|
24
|
+
box-shadow: none;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
19
27
|
.pc-image-card .pc-image-card__content {
|
|
20
28
|
display: flex;
|
|
21
29
|
padding: 32px;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gravity-ui/page-constructor",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.27.1-alpha.0",
|
|
4
4
|
"description": "Gravity UI Page Constructor",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -80,6 +80,7 @@
|
|
|
80
80
|
"test:watch": "jest --watchAll",
|
|
81
81
|
"playwright": "playwright test --config=playwright/playwright.config.ts",
|
|
82
82
|
"playwright:update": "npm run playwright -- -u",
|
|
83
|
+
"playwright:clear-cache": "rm -rf ./playwright/.cache",
|
|
83
84
|
"playwright:docker": "./scripts/playwright-docker.sh 'npm run playwright'",
|
|
84
85
|
"playwright:docker:update": "./scripts/playwright-docker.sh 'npm run playwright:update'",
|
|
85
86
|
"playwright:docker:clear-cache": "./scripts/playwright-docker.sh clear-cache",
|
|
@@ -202,6 +203,8 @@
|
|
|
202
203
|
"ts-jest": "^29.0.3",
|
|
203
204
|
"tslib": "^2.4.0",
|
|
204
205
|
"typescript": "^4.9.4",
|
|
206
|
+
"vite-plugin-commonjs": "^0.10.1",
|
|
207
|
+
"vite-plugin-svgr": "^4.2.0",
|
|
205
208
|
"webpack": "^5.88.2",
|
|
206
209
|
"webpack-cli": "^5.1.4",
|
|
207
210
|
"webpack-shell-plugin-next": "^2.3.1"
|
|
@@ -62,7 +62,8 @@ export declare enum SliderBreakpointNames {
|
|
|
62
62
|
}
|
|
63
63
|
export declare enum SliderType {
|
|
64
64
|
MediaCard = "media-card",
|
|
65
|
-
HeaderCard = "header-card"
|
|
65
|
+
HeaderCard = "header-card",
|
|
66
|
+
FullscreenCard = "fullscreen-card"
|
|
66
67
|
}
|
|
67
68
|
export type SliderBreakpointParams = Record<SliderBreakpointNames, number>;
|
|
68
69
|
export type SlidesToShow = Partial<SliderBreakpointParams> | number;
|
|
@@ -38,6 +38,7 @@ var SliderType;
|
|
|
38
38
|
(function (SliderType) {
|
|
39
39
|
SliderType["MediaCard"] = "media-card";
|
|
40
40
|
SliderType["HeaderCard"] = "header-card";
|
|
41
|
+
SliderType["FullscreenCard"] = "fullscreen-card";
|
|
41
42
|
})(SliderType = exports.SliderType || (exports.SliderType = {}));
|
|
42
43
|
var PCShareSocialNetwork;
|
|
43
44
|
(function (PCShareSocialNetwork) {
|
|
@@ -113,11 +113,12 @@ export interface BasicCardProps extends CardBaseProps, AnalyticsEventsBase, Card
|
|
|
113
113
|
export interface BannerCardProps {
|
|
114
114
|
title: string;
|
|
115
115
|
subtitle?: string;
|
|
116
|
+
className?: string;
|
|
116
117
|
image?: ThemeSupporting<string>;
|
|
117
118
|
disableCompress?: boolean;
|
|
118
119
|
color?: ThemeSupporting<string>;
|
|
119
120
|
theme?: TextTheme;
|
|
120
|
-
button
|
|
121
|
+
button?: Pick<ButtonProps, 'text' | 'url' | 'target' | 'theme'>;
|
|
121
122
|
mediaView?: MediaView;
|
|
122
123
|
}
|
|
123
124
|
export interface MediaCardProps extends MediaProps, AnalyticsEventsBase, CardBaseProps {
|
package/styles/mixins.scss
CHANGED