@gravity-ui/page-constructor 5.18.1-alpha.0 → 5.18.1-alpha.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.
Files changed (42) hide show
  1. package/build/cjs/blocks/Slider/Slider.d.ts +1 -0
  2. package/build/cjs/blocks/Slider/Slider.js +3 -3
  3. package/build/cjs/blocks/SliderNew/Arrow/Arrow.css +22 -18
  4. package/build/cjs/blocks/SliderNew/Arrow/Arrow.d.ts +2 -1
  5. package/build/cjs/blocks/SliderNew/Arrow/Arrow.js +4 -3
  6. package/build/cjs/blocks/SliderNew/Slider.css +69 -17
  7. package/build/cjs/blocks/SliderNew/Slider.d.ts +2 -1
  8. package/build/cjs/blocks/SliderNew/Slider.js +5 -4
  9. package/build/cjs/components/FullscreenImage/FullscreenImage.css +46 -10
  10. package/build/cjs/components/FullscreenImage/FullscreenImage.d.ts +5 -0
  11. package/build/cjs/components/FullscreenImage/FullscreenImage.js +17 -3
  12. package/build/cjs/components/Media/Image/Image.d.ts +1 -0
  13. package/build/cjs/components/Media/Image/Image.js +6 -4
  14. package/build/cjs/components/Media/Media.css +4 -0
  15. package/build/cjs/components/Media/Media.d.ts +1 -0
  16. package/build/cjs/components/Media/Media.js +3 -2
  17. package/build/cjs/constructor-items.d.ts +1 -1
  18. package/build/cjs/models/constructor-items/blocks.d.ts +2 -1
  19. package/build/cjs/models/constructor-items/blocks.js +1 -0
  20. package/build/esm/blocks/Slider/Slider.d.ts +1 -0
  21. package/build/esm/blocks/Slider/Slider.js +3 -3
  22. package/build/esm/blocks/SliderNew/Arrow/Arrow.css +22 -18
  23. package/build/esm/blocks/SliderNew/Arrow/Arrow.d.ts +2 -1
  24. package/build/esm/blocks/SliderNew/Arrow/Arrow.js +4 -3
  25. package/build/esm/blocks/SliderNew/Slider.css +69 -17
  26. package/build/esm/blocks/SliderNew/Slider.d.ts +2 -1
  27. package/build/esm/blocks/SliderNew/Slider.js +5 -4
  28. package/build/esm/components/FullscreenImage/FullscreenImage.css +46 -10
  29. package/build/esm/components/FullscreenImage/FullscreenImage.d.ts +5 -0
  30. package/build/esm/components/FullscreenImage/FullscreenImage.js +18 -4
  31. package/build/esm/components/Media/Image/Image.d.ts +1 -0
  32. package/build/esm/components/Media/Image/Image.js +6 -4
  33. package/build/esm/components/Media/Media.css +4 -0
  34. package/build/esm/components/Media/Media.d.ts +1 -0
  35. package/build/esm/components/Media/Media.js +3 -2
  36. package/build/esm/constructor-items.d.ts +1 -1
  37. package/build/esm/models/constructor-items/blocks.d.ts +2 -1
  38. package/build/esm/models/constructor-items/blocks.js +1 -0
  39. package/package.json +1 -1
  40. package/server/models/constructor-items/blocks.d.ts +2 -1
  41. package/server/models/constructor-items/blocks.js +1 -0
  42. package/widget/index.js +1 -1
@@ -1,33 +1,25 @@
1
- .pc-slider-new-block-arrow__button {
1
+ .pc-slider-new-block-arrow__inner {
2
2
  box-shadow: 0px 4px 24px var(--pc-color-sfx-shadow), 0px 2px 8px var(--pc-color-sfx-shadow);
3
3
  }
4
4
 
5
- .pc-slider-new-block-arrow__button:hover {
5
+ .pc-slider-new-block-arrow__inner:hover {
6
6
  box-shadow: 0px 4px 24px var(--g-color-sfx-shadow), 0px 2px 8px var(--g-color-sfx-shadow);
7
7
  cursor: pointer;
8
8
  }
9
9
 
10
10
  /* use this for style redefinitions to awoid problems with
11
11
  unpredictable css rules order in build */
12
- .pc-slider-new-block-arrow__icon-wrapper, .pc-slider-new-block-arrow__button, .pc-slider-new-block-arrow {
12
+ .pc-slider-new-block-arrow__icon-wrapper, .pc-slider-new-block-arrow__inner, .pc-slider-new-block-arrow {
13
13
  display: flex;
14
14
  align-items: center;
15
15
  justify-content: center;
16
16
  }
17
17
 
18
- .pc-slider-new-block-arrow {
19
- width: 42px;
20
- height: 42px;
21
- cursor: pointer;
22
- }
23
18
  @media (max-width: 576px) {
24
19
  .pc-slider-new-block-arrow {
25
20
  display: none;
26
21
  }
27
22
  }
28
- .pc-slider-new-block-arrow_type_left .pc-slider-new-block-arrow__icon-wrapper {
29
- transform: rotate(180deg);
30
- }
31
23
  .pc-slider-new-block-arrow__button {
32
24
  display: inline-block;
33
25
  margin: 0;
@@ -38,6 +30,15 @@ unpredictable css rules order in build */
38
30
  color: inherit;
39
31
  background: none;
40
32
  cursor: pointer;
33
+ }
34
+ .pc-slider-new-block-arrow__button:focus {
35
+ outline: 2px solid var(--g-color-line-focus);
36
+ outline-offset: 0;
37
+ }
38
+ .pc-slider-new-block-arrow__button:focus:not(:focus-visible) {
39
+ outline: 0;
40
+ }
41
+ .pc-slider-new-block-arrow__inner {
41
42
  width: 42px;
42
43
  height: 42px;
43
44
  color: var(--g-color-text-secondary);
@@ -46,17 +47,20 @@ unpredictable css rules order in build */
46
47
  box-shadow: 0 4px 24px var(--pc-color-sfx-shadow), 0 2px 8px var(--pc-color-sfx-shadow);
47
48
  transition: box-shadow 0.3s cubic-bezier(0.22, 0.61, 0.36, 1), color 0.3s cubic-bezier(0.22, 0.61, 0.36, 1);
48
49
  }
49
- .pc-slider-new-block-arrow__button:focus {
50
- outline: 2px solid var(--g-color-line-focus);
51
- outline-offset: 0;
52
- }
53
- .pc-slider-new-block-arrow__button:focus:not(:focus-visible) {
54
- outline: 0;
50
+ .pc-slider-new-block-arrow__inner_type_left .pc-slider-new-block-arrow__icon-wrapper {
51
+ transform: rotate(180deg);
55
52
  }
56
- .pc-slider-new-block-arrow:hover .pc-slider-new-block-arrow__button {
53
+ .pc-slider-new-block-arrow__inner:hover {
57
54
  color: var(--g-color-text-primary);
58
55
  box-shadow: 0 2px 12px var(--pc-color-sfx-shadow), 0 4px 24px var(--pc-color-sfx-shadow);
59
56
  }
57
+ .pc-slider-new-block-arrow__inner_transparent {
58
+ background-color: transparent;
59
+ box-shadow: none;
60
+ }
61
+ .pc-slider-new-block-arrow__inner_transparent:hover {
62
+ box-shadow: none;
63
+ }
60
64
  .pc-slider-new-block-arrow__icon {
61
65
  position: relative;
62
66
  }
@@ -3,8 +3,9 @@ import './Arrow.css';
3
3
  export type ArrowType = 'left' | 'right';
4
4
  export interface ArrowProps {
5
5
  type: ArrowType;
6
+ transparent?: boolean;
6
7
  onClick?: () => void;
7
8
  size?: number;
8
9
  }
9
- declare const Arrow: ({ type, onClick, className, size }: ArrowProps & ClassNameProps) => JSX.Element;
10
+ declare const Arrow: ({ type, transparent, onClick, className, size }: ArrowProps & ClassNameProps) => JSX.Element;
10
11
  export default Arrow;
@@ -4,8 +4,9 @@ import { block } from '../../../utils';
4
4
  import { i18n } from '../i18n';
5
5
  import './Arrow.css';
6
6
  const b = block('slider-new-block-arrow');
7
- const Arrow = ({ type, onClick, className, size = 16 }) => (React.createElement("div", { className: b({ type }, className) },
7
+ const Arrow = ({ type, transparent, onClick, className, size = 16 }) => (React.createElement("div", { className: b(null, className) },
8
8
  React.createElement("button", { className: b('button'), onClick: onClick, "aria-label": i18n(`arrow-${type}`) },
9
- React.createElement("span", { className: b('icon-wrapper') },
10
- React.createElement(ToggleArrow, { size: size, type: 'horizontal', iconType: "navigation", className: b('icon') })))));
9
+ React.createElement("div", { className: b('inner', { type, transparent }) },
10
+ React.createElement("span", { className: b('icon-wrapper') },
11
+ React.createElement(ToggleArrow, { size: size, type: 'horizontal', iconType: "navigation", className: b('icon') }))))));
11
12
  export default Arrow;
@@ -775,16 +775,6 @@ unpredictable css rules order in build */
775
775
  left: 0;
776
776
  margin-right: 0;
777
777
  }
778
- .pc-SliderNewBlock_type_header-card .pc-SliderNewBlock__arrow button {
779
- background-color: transparent;
780
- box-shadow: none;
781
- }
782
- .pc-SliderNewBlock_type_header-card .pc-SliderNewBlock__arrow button:hover {
783
- box-shadow: none;
784
- }
785
- .pc-SliderNewBlock_type_header-card .pc-SliderNewBlock__arrow:hover button {
786
- box-shadow: none;
787
- }
788
778
  .pc-SliderNewBlock_type_header-card .pc-SliderNewBlock__slide {
789
779
  padding: 0;
790
780
  }
@@ -795,12 +785,74 @@ unpredictable css rules order in build */
795
785
  .pc-SliderNewBlock_type_header-card.pc-SliderNewBlock:not(.pc-SliderNewBlock_type_header-card_one-slide) .pc-SliderNewBlock__slider {
796
786
  margin-left: 0;
797
787
  }
788
+ .pc-SliderNewBlock_type_header-card.pc-SliderNewBlock:not(.pc-SliderNewBlock_type_header-card_one-slide) .swiper-wrapper {
789
+ padding-left: 0;
790
+ }
798
791
  .pc-SliderNewBlock_type_header-card.pc-SliderNewBlock:not(.pc-SliderNewBlock_type_header-card_one-slide) .pc-SliderNewBlock__slide {
799
792
  padding-right: 0;
800
793
  padding-left: 0;
801
794
  }
802
- .pc-SliderNewBlock_type_header-card.pc-SliderNewBlock:not(.pc-SliderNewBlock_type_header-card_one-slide) .pc-SliderNewBlock__slide:last-child {
803
- padding-right: 0;
795
+ }
796
+ .pc-SliderNewBlock_type_fullscreen-card {
797
+ padding-top: 0;
798
+ }
799
+ @media (max-width: 577px) {
800
+ .pc-SliderNewBlock_type_fullscreen-card:not(.pc-SliderNewBlock_type_fullscreen-card_one-slide) {
801
+ margin-left: 0;
802
+ padding-left: 0;
803
+ width: 100%;
804
+ overflow: inherit;
805
+ }
806
+ }
807
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock__slider {
808
+ padding: 40px 0;
809
+ height: 100vh;
810
+ margin: 0;
811
+ }
812
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock__slider .swiper-pagination {
813
+ bottom: 11px;
814
+ }
815
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock__slider .pc-SliderNewBlock__dot {
816
+ background-color: var(--g-color-text-light-hint);
817
+ }
818
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock__slider .pc-SliderNewBlock__dot_active {
819
+ background-color: var(--g-color-text-light-primary);
820
+ }
821
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock__slider .pc-SliderNewBlock__slide {
822
+ height: 100%;
823
+ padding: 0 120px;
824
+ }
825
+ .pc-SliderNewBlock_type_fullscreen-card:hover .pc-SliderNewBlock__arrow {
826
+ display: flex;
827
+ }
828
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock__arrow {
829
+ display: none;
830
+ width: 120px;
831
+ top: 40px;
832
+ bottom: 40px;
833
+ }
834
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock__arrow_prev {
835
+ left: 0;
836
+ margin-right: 0;
837
+ }
838
+ @media (max-width: 769px) {
839
+ .pc-SliderNewBlock_type_fullscreen-card {
840
+ margin-left: 0;
841
+ }
842
+ .pc-SliderNewBlock_type_fullscreen-card .pc-SliderNewBlock_slider {
843
+ margin-left: 0;
844
+ width: 100%;
845
+ }
846
+ .pc-SliderNewBlock_type_fullscreen-card:hover .pc-SliderNewBlock__arrow {
847
+ display: none;
848
+ }
849
+ }
850
+ @media (max-width: 577px) {
851
+ .pc-SliderNewBlock.pc-SliderNewBlock_type_fullscreen-card:not(.pc-SliderNewBlock_type_fullscreen-card_one-slide) .pc-SliderNewBlock__slider {
852
+ margin-left: 0;
853
+ }
854
+ .pc-SliderNewBlock.pc-SliderNewBlock_type_fullscreen-card:not(.pc-SliderNewBlock_type_fullscreen-card_one-slide) .swiper-wrapper {
855
+ padding-left: 0;
804
856
  }
805
857
  }
806
858
  @media (max-width: 769px) {
@@ -815,14 +867,14 @@ unpredictable css rules order in build */
815
867
  }
816
868
  @media (max-width: 577px) {
817
869
  .pc-SliderNewBlock:not(.pc-SliderNewBlock_one-slide) {
818
- margin-left: -24px;
819
- padding-left: 24px;
820
- width: calc(100% + 48px);
821
870
  overflow-x: auto;
822
871
  }
823
872
  .pc-SliderNewBlock:not(.pc-SliderNewBlock_one-slide) .pc-SliderNewBlock__slider {
824
- padding: 24px 24px 48px;
825
- margin: 0 0 0 -24px;
873
+ margin-left: -24px;
874
+ margin-right: 0;
875
+ }
876
+ .pc-SliderNewBlock:not(.pc-SliderNewBlock_one-slide) .swiper-wrapper {
877
+ padding-left: 16px;
826
878
  }
827
879
  .pc-SliderNewBlock:not(.pc-SliderNewBlock_one-slide) .pc-SliderNewBlock__slide {
828
880
  padding: 0 8px;
@@ -9,6 +9,7 @@ export interface SliderNewProps extends Omit<SliderParams, 'children'>, Partial<
9
9
  dotsClassName?: string;
10
10
  blockClassName?: string;
11
11
  arrowSize?: number;
12
+ initialSlide?: number;
12
13
  }
13
- export declare const SliderNewBlock: ({ animated, title, description, type, anchorId, arrows, adaptive, autoplay: autoplayMs, dots, className, dotsClassName, disclaimer, children, blockClassName, arrowSize, slidesToShow, onSlideChange, onSlideChangeTransitionStart, onSlideChangeTransitionEnd, onActiveIndexChange, onBreakpoint, }: PropsWithChildren<SliderNewProps>) => JSX.Element;
14
+ export declare const SliderNewBlock: ({ animated, title, description, type, anchorId, arrows, adaptive, autoplay: autoplayMs, dots, initialSlide, className, dotsClassName, disclaimer, children, blockClassName, arrowSize, slidesToShow, onSlideChange, onSlideChangeTransitionStart, onSlideChangeTransitionEnd, onActiveIndexChange, onBreakpoint, }: PropsWithChildren<SliderNewProps>) => JSX.Element;
14
15
  export default SliderNewBlock;
@@ -4,6 +4,7 @@ import { Swiper, SwiperSlide } from 'swiper/react';
4
4
  import Anchor from '../../components/Anchor/Anchor';
5
5
  import AnimateBlock from '../../components/AnimateBlock/AnimateBlock';
6
6
  import Title from '../../components/Title/Title';
7
+ import { SliderType } from '../../models';
7
8
  import { block } from '../../utils';
8
9
  import Arrow from './Arrow/Arrow';
9
10
  import { useSlider } from './useSlider';
@@ -11,7 +12,7 @@ import './Slider.css';
11
12
  import 'swiper/swiper-bundle.css';
12
13
  const b = block('SliderNewBlock');
13
14
  SwiperCore.use([Autoplay, A11y, Pagination]);
14
- export const SliderNewBlock = ({ animated, title, description, type, anchorId, arrows = true, adaptive, autoplay: autoplayMs, dots = true, className, dotsClassName, disclaimer, children, blockClassName, arrowSize, slidesToShow, onSlideChange, onSlideChangeTransitionStart, onSlideChangeTransitionEnd, onActiveIndexChange, onBreakpoint, }) => {
15
+ export const SliderNewBlock = ({ animated, title, description, type, anchorId, arrows = true, adaptive, autoplay: autoplayMs, dots = true, initialSlide = 0, className, dotsClassName, disclaimer, children, blockClassName, arrowSize, slidesToShow, onSlideChange, onSlideChangeTransitionStart, onSlideChangeTransitionEnd, onActiveIndexChange, onBreakpoint, }) => {
15
16
  const { childrenCount, breakpoints, autoplay, onSwiper, onPrev, onNext, isLocked, setIsLocked } = useSlider({
16
17
  slidesToShow,
17
18
  children,
@@ -31,10 +32,10 @@ export const SliderNewBlock = ({ animated, title, description, type, anchorId, a
31
32
  clickable: true,
32
33
  bulletClass: b('dot', dotsClassName),
33
34
  bulletActiveClass: b('dot_active'),
34
- }, speed: 1000, autoplay: autoplay, autoHeight: adaptive, initialSlide: 0, noSwiping: false, breakpoints: breakpoints, onSlideChange: onSlideChange, onSlideChangeTransitionStart: onSlideChangeTransitionStart, onSlideChangeTransitionEnd: onSlideChangeTransitionEnd, onActiveIndexChange: onActiveIndexChange, onBreakpoint: onBreakpoint, onLock: () => setIsLocked(true), onUnlock: () => setIsLocked(false), watchSlidesVisibility: true, watchOverflow: true }, React.Children.map(children, (elem, index) => (React.createElement(SwiperSlide, { className: b('slide'), key: index }, elem)))),
35
+ }, speed: 1000, autoplay: autoplay, autoHeight: adaptive, initialSlide: initialSlide, noSwiping: false, breakpoints: breakpoints, onSlideChange: onSlideChange, onSlideChangeTransitionStart: onSlideChangeTransitionStart, onSlideChangeTransitionEnd: onSlideChangeTransitionEnd, onActiveIndexChange: onActiveIndexChange, onBreakpoint: onBreakpoint, onLock: () => setIsLocked(true), onUnlock: () => setIsLocked(false), watchSlidesVisibility: true, watchOverflow: true }, React.Children.map(children, (elem, index) => (React.createElement(SwiperSlide, { className: b('slide'), key: index }, elem)))),
35
36
  arrows && !isLocked && (React.createElement(Fragment, null,
36
- React.createElement(Arrow, { className: b('arrow', { prev: true }), type: "left", onClick: onPrev, size: arrowSize }),
37
- React.createElement(Arrow, { className: b('arrow', { next: true }), type: "right", onClick: onNext, size: arrowSize }))),
37
+ React.createElement(Arrow, { className: b('arrow', { prev: true }), type: "left", transparent: type === SliderType.HeaderCard, onClick: onPrev, size: arrowSize }),
38
+ React.createElement(Arrow, { className: b('arrow', { next: true }), type: "right", transparent: type === SliderType.HeaderCard, onClick: onNext, size: arrowSize }))),
38
39
  React.createElement("div", { className: b('footer') }, disclaimer ? (React.createElement("div", { className: b('disclaimer', { size: (disclaimer === null || disclaimer === void 0 ? void 0 : disclaimer.size) || 'm' }) }, disclaimer === null || disclaimer === void 0 ? void 0 : disclaimer.text)) : null))));
39
40
  };
40
41
  export default SliderNewBlock;
@@ -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,8 +76,9 @@ unpredictable css rules order in build */
36
76
  align-items: center;
37
77
  justify-content: center;
38
78
  position: absolute;
39
- right: 16px;
40
- top: 16px;
79
+ z-index: 1001;
80
+ right: 40px;
81
+ top: 40px;
41
82
  width: 36px;
42
83
  height: 36px;
43
84
  border-radius: 8px;
@@ -67,14 +108,9 @@ unpredictable css rules order in build */
67
108
  width: 100%;
68
109
  }
69
110
  }
70
- @media (max-width: 1081px) {
71
- .pc-fullscreen-image__image {
72
- pointer-events: none;
73
- }
111
+ @media (max-width: 769px) {
74
112
  .pc-fullscreen-image__icon-wrapper {
75
- display: none;
76
- }
77
- .pc-fullscreen-image__modal {
78
- display: none !important; /* stylelint-disable-line declaration-no-important */
113
+ right: 20px;
114
+ top: 50px;
79
115
  }
80
116
  }
@@ -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(Image, Object.assign({}, props, { className: b('modal-image', modalImageClass) }))))));
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;
@@ -4,6 +4,7 @@ export interface ImageAdditionProps {
4
4
  imageClassName?: string;
5
5
  isBackground?: boolean;
6
6
  fullscreen?: boolean;
7
+ fullscreenClassName?: string;
7
8
  onLoad?: () => void;
8
9
  }
9
10
  interface InnerImageProps {
@@ -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 ? renderFullscreenImage(item) : imageOnly(item))))));
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);
@@ -8,4 +8,8 @@ unpredictable css rules order in build */
8
8
  overflow: hidden;
9
9
  display: flex;
10
10
  align-items: center;
11
+ }
12
+ .pc-Media__fullscreen-image-cover {
13
+ object-fit: cover;
14
+ object-position: top;
11
15
  }
@@ -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, 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, 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 = {
@@ -62,6 +62,7 @@ export const Media = (props) => {
62
62
  isBackground,
63
63
  hasVideoFallback,
64
64
  fullscreen,
65
+ isFullscreenImageCover,
65
66
  qaAttributes.image,
66
67
  qaAttributes.video,
67
68
  onImageLoad,
@@ -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;
@@ -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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/page-constructor",
3
- "version": "5.18.1-alpha.0",
3
+ "version": "5.18.1-alpha.2",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -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) {