@gravity-ui/page-constructor 5.18.1-alpha.1 → 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 +60 -13
  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 +60 -13
  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
@@ -9,6 +9,7 @@ export interface SliderProps extends Omit<SliderParams, 'children'>, Refable<HTM
9
9
  dotsClassName?: string;
10
10
  blockClassName?: string;
11
11
  arrowSize?: number;
12
+ initialIndex?: number;
12
13
  }
13
14
  export declare const SliderBlock: (props: React.PropsWithChildren<SliderProps>) => JSX.Element;
14
15
  export default SliderBlock;
@@ -26,7 +26,7 @@ const DOT_WIDTH = 8;
26
26
  const DOT_GAP = 16;
27
27
  const SliderBlock = (props) => {
28
28
  var _a;
29
- const { animated, title, description, type, anchorId, arrows = true, adaptive, autoplay = undefined, dots = true, dotsClassName, disclaimer, children, className, blockClassName, lazyLoad, arrowSize, onAfterChange: handleAfterChange, onBeforeChange: handleBeforeChange, } = props;
29
+ const { animated, title, description, type, anchorId, arrows = true, adaptive, autoplay = undefined, dots = true, dotsClassName, disclaimer, children, className, blockClassName, lazyLoad, arrowSize, onAfterChange: handleAfterChange, onBeforeChange: handleBeforeChange, initialIndex = 0, } = props;
30
30
  const { isServer } = (0, react_1.useContext)(ssrContext_1.SSRContext);
31
31
  const isMobile = (0, react_1.useContext)(mobileContext_1.MobileContext);
32
32
  const [breakpoint, setBreakpoint] = (0, react_1.useState)(constants_1.BREAKPOINTS.xl);
@@ -39,7 +39,7 @@ const SliderBlock = (props) => {
39
39
  }));
40
40
  const slidesToShowCount = (0, utils_2.getSlidesToShowCount)(slidesToShow);
41
41
  const slidesCountByBreakpoint = (0, utils_2.getSlidesCountByBreakpoint)(breakpoint, slidesToShow);
42
- const [currentIndex, setCurrentIndex] = (0, react_1.useState)(0);
42
+ const [currentIndex, setCurrentIndex] = (0, react_1.useState)(initialIndex);
43
43
  const [childStyles, setChildStyles] = (0, react_1.useState)({});
44
44
  const [slider, setSlider] = (0, react_1.useState)();
45
45
  const autoplayTimeId = (0, react_1.useRef)();
@@ -199,7 +199,7 @@ const SliderBlock = (props) => {
199
199
  responsive: (0, utils_2.getSliderResponsiveParams)(slidesToShow),
200
200
  beforeChange: onBeforeChange,
201
201
  afterChange: onAfterChange,
202
- initialSlide: 0,
202
+ initialSlide: initialIndex,
203
203
  nextArrow: react_1.default.createElement(Arrow_1.default, { type: "right", handleClick: handleArrowClick, size: arrowSize }),
204
204
  prevArrow: react_1.default.createElement(Arrow_1.default, { type: "left", handleClick: handleArrowClick, size: arrowSize }),
205
205
  lazyLoad,
@@ -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
  }
@@ -2,8 +2,9 @@ import { ClassNameProps } from '../../../models';
2
2
  export type ArrowType = 'left' | 'right';
3
3
  export interface ArrowProps {
4
4
  type: ArrowType;
5
+ transparent?: boolean;
5
6
  onClick?: () => void;
6
7
  size?: number;
7
8
  }
8
- declare const Arrow: ({ type, onClick, className, size }: ArrowProps & ClassNameProps) => JSX.Element;
9
+ declare const Arrow: ({ type, transparent, onClick, className, size }: ArrowProps & ClassNameProps) => JSX.Element;
9
10
  export default Arrow;
@@ -6,8 +6,9 @@ const ToggleArrow_1 = tslib_1.__importDefault(require("../../../components/Toggl
6
6
  const utils_1 = require("../../../utils");
7
7
  const i18n_1 = require("../i18n");
8
8
  const b = (0, utils_1.block)('slider-new-block-arrow');
9
- const Arrow = ({ type, onClick, className, size = 16 }) => (react_1.default.createElement("div", { className: b({ type }, className) },
9
+ const Arrow = ({ type, transparent, onClick, className, size = 16 }) => (react_1.default.createElement("div", { className: b(null, className) },
10
10
  react_1.default.createElement("button", { className: b('button'), onClick: onClick, "aria-label": (0, i18n_1.i18n)(`arrow-${type}`) },
11
- react_1.default.createElement("span", { className: b('icon-wrapper') },
12
- react_1.default.createElement(ToggleArrow_1.default, { size: size, type: 'horizontal', iconType: "navigation", className: b('icon') })))));
11
+ react_1.default.createElement("div", { className: b('inner', { type, transparent }) },
12
+ react_1.default.createElement("span", { className: b('icon-wrapper') },
13
+ react_1.default.createElement(ToggleArrow_1.default, { size: size, type: 'horizontal', iconType: "navigation", className: b('icon') }))))));
13
14
  exports.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
  }
@@ -803,12 +793,69 @@ unpredictable css rules order in build */
803
793
  padding-left: 0;
804
794
  }
805
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
+ }
806
838
  @media (max-width: 769px) {
807
- .pc-SliderNewBlock {
808
- margin-left: -8px;
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 {
809
855
  padding-left: 0;
810
- width: calc(100% + 8px);
811
856
  }
857
+ }
858
+ @media (max-width: 769px) {
812
859
  .pc-SliderNewBlock__footer {
813
860
  display: block;
814
861
  }
@@ -8,6 +8,7 @@ export interface SliderNewProps extends Omit<SliderParams, 'children'>, Partial<
8
8
  dotsClassName?: string;
9
9
  blockClassName?: string;
10
10
  arrowSize?: number;
11
+ initialSlide?: number;
11
12
  }
12
- 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;
13
+ 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;
13
14
  export default SliderNewBlock;
@@ -8,13 +8,14 @@ const react_2 = require("swiper/react");
8
8
  const Anchor_1 = tslib_1.__importDefault(require("../../components/Anchor/Anchor"));
9
9
  const AnimateBlock_1 = tslib_1.__importDefault(require("../../components/AnimateBlock/AnimateBlock"));
10
10
  const Title_1 = tslib_1.__importDefault(require("../../components/Title/Title"));
11
+ const models_1 = require("../../models");
11
12
  const utils_1 = require("../../utils");
12
13
  const Arrow_1 = tslib_1.__importDefault(require("./Arrow/Arrow"));
13
14
  const useSlider_1 = require("./useSlider");
14
15
  require("swiper/swiper-bundle.css");
15
16
  const b = (0, utils_1.block)('SliderNewBlock');
16
17
  swiper_1.default.use([swiper_1.Autoplay, swiper_1.A11y, swiper_1.Pagination]);
17
- 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, }) => {
18
+ 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, }) => {
18
19
  const { childrenCount, breakpoints, autoplay, onSwiper, onPrev, onNext, isLocked, setIsLocked } = (0, useSlider_1.useSlider)({
19
20
  slidesToShow,
20
21
  children,
@@ -34,10 +35,10 @@ const SliderNewBlock = ({ animated, title, description, type, anchorId, arrows =
34
35
  clickable: true,
35
36
  bulletClass: b('dot', dotsClassName),
36
37
  bulletActiveClass: b('dot_active'),
37
- }, 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_1.default.Children.map(children, (elem, index) => (react_1.default.createElement(react_2.SwiperSlide, { className: b('slide'), key: index }, elem)))),
38
+ }, 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_1.default.Children.map(children, (elem, index) => (react_1.default.createElement(react_2.SwiperSlide, { className: b('slide'), key: index }, elem)))),
38
39
  arrows && !isLocked && (react_1.default.createElement(react_1.Fragment, null,
39
- react_1.default.createElement(Arrow_1.default, { className: b('arrow', { prev: true }), type: "left", onClick: onPrev, size: arrowSize }),
40
- react_1.default.createElement(Arrow_1.default, { className: b('arrow', { next: true }), type: "right", onClick: onNext, size: arrowSize }))),
40
+ react_1.default.createElement(Arrow_1.default, { className: b('arrow', { prev: true }), type: "left", transparent: type === models_1.SliderType.HeaderCard, onClick: onPrev, size: arrowSize }),
41
+ react_1.default.createElement(Arrow_1.default, { className: b('arrow', { next: true }), type: "right", transparent: type === models_1.SliderType.HeaderCard, onClick: onNext, size: arrowSize }))),
41
42
  react_1.default.createElement("div", { className: b('footer') }, disclaimer ? (react_1.default.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))));
42
43
  };
43
44
  exports.SliderNewBlock = 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,10 +1,15 @@
1
1
  import { CSSProperties, HTMLProps } from 'react';
2
+ import { ImageProps as ModelImageProps } from '../../models';
2
3
  import { ImageProps } from '../Image/Image';
3
4
  export interface FullscreenImageProps extends ImageProps {
4
5
  imageClassName?: string;
5
6
  modalImageClass?: string;
6
7
  imageStyle?: CSSProperties;
7
8
  extraProps?: HTMLProps<HTMLDivElement>;
9
+ sliderData?: {
10
+ items: ModelImageProps[];
11
+ initialIndex: number;
12
+ };
8
13
  }
9
14
  declare const FullscreenImage: (props: FullscreenImageProps) => JSX.Element;
10
15
  export default FullscreenImage;
@@ -4,25 +4,39 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const icons_1 = require("@gravity-ui/icons");
6
6
  const uikit_1 = require("@gravity-ui/uikit");
7
+ const unstable_1 = require("../../blocks/unstable");
8
+ const models_1 = require("../../models");
7
9
  const utils_1 = require("../../utils");
8
10
  const Image_1 = tslib_1.__importDefault(require("../Image/Image"));
11
+ const utils_2 = require("../Media/Image/utils");
9
12
  const i18n_1 = require("./i18n");
10
13
  const b = (0, utils_1.block)('fullscreen-image');
11
14
  const FULL_SCREEN_ICON_SIZE = 18;
12
15
  const CLOSE_ICON_SIZE = 24;
13
16
  const FullscreenImage = (props) => {
14
- const { imageClassName, modalImageClass, imageStyle, alt = (0, i18n_1.i18n)('img-alt'), extraProps } = props;
17
+ const { imageClassName, sliderData, modalImageClass, imageStyle, alt = (0, i18n_1.i18n)('img-alt'), extraProps, } = props;
15
18
  const [isOpened, setIsOpened] = (0, react_1.useState)(false);
19
+ const [sliderLoaded, setSliderLoaded] = (0, react_1.useState)(false);
16
20
  const openModal = () => setIsOpened(true);
17
21
  const closeModal = () => setIsOpened(false);
22
+ (0, react_1.useEffect)(() => {
23
+ if (sliderData && !isOpened) {
24
+ setSliderLoaded(false);
25
+ }
26
+ }, [isOpened, sliderData]);
27
+ const handleSliderImageLoad = () => {
28
+ setSliderLoaded(true);
29
+ };
18
30
  return (react_1.default.createElement("div", Object.assign({ className: b() }, extraProps),
19
31
  react_1.default.createElement("div", { className: b('image-wrapper') },
20
32
  react_1.default.createElement(Image_1.default, Object.assign({}, props, { alt: alt, className: b('image', imageClassName), onClick: openModal, style: imageStyle })),
21
33
  react_1.default.createElement("button", { className: b('icon-wrapper'), onClick: openModal },
22
34
  react_1.default.createElement(uikit_1.Icon, { data: icons_1.ChevronsExpandUpRight, width: FULL_SCREEN_ICON_SIZE, height: FULL_SCREEN_ICON_SIZE, className: b('icon') }))),
23
- isOpened && (react_1.default.createElement(uikit_1.Modal, { open: isOpened, onClose: closeModal, className: b('modal'), contentClassName: b('modal-content') },
35
+ isOpened && (react_1.default.createElement(uikit_1.Modal, { open: isOpened, onClose: closeModal, className: b('modal', { 'with-slider': Boolean(sliderData) }), contentClassName: b('modal-content', { loaded: sliderLoaded }) },
24
36
  react_1.default.createElement("button", { className: b('icon-wrapper', { visible: true }), onClick: closeModal, "aria-label": (0, i18n_1.i18n)('close') },
25
37
  react_1.default.createElement(uikit_1.Icon, { data: icons_1.Xmark, width: CLOSE_ICON_SIZE, height: CLOSE_ICON_SIZE, className: b('icon', { hover: true }) })),
26
- react_1.default.createElement(Image_1.default, Object.assign({}, props, { className: b('modal-image', modalImageClass) }))))));
38
+ sliderData ? (react_1.default.createElement("div", { className: b('modal-slider') },
39
+ react_1.default.createElement(unstable_1.SliderNewBlock, { initialSlide: sliderData.initialIndex, slidesToShow: 1, type: models_1.SliderType.FullscreenCard }, sliderData.items.map((item, index) => (react_1.default.createElement("div", { key: index, className: b('modal-slider_item') },
40
+ react_1.default.createElement(Image_1.default, Object.assign({ onLoad: handleSliderImageLoad, className: b('modal-slider_item-image', modalImageClass), containerClassName: b('modal-slider_item-image-wrapper') }, (0, utils_2.getMediaImage)(item))))))))) : (react_1.default.createElement(Image_1.default, Object.assign({}, props, { className: b('modal-image', modalImageClass) })))))));
27
41
  };
28
42
  exports.default = FullscreenImage;
@@ -3,6 +3,7 @@ export interface ImageAdditionProps {
3
3
  imageClassName?: string;
4
4
  isBackground?: boolean;
5
5
  fullscreen?: boolean;
6
+ fullscreenClassName?: string;
6
7
  onLoad?: () => void;
7
8
  }
8
9
  interface InnerImageProps {
@@ -15,7 +15,7 @@ const utils_2 = require("./utils");
15
15
  const b = (0, utils_1.block)('media-component-image');
16
16
  exports.defaultAnimatedDivQa = 'animated-div';
17
17
  const Image = (props) => {
18
- const { parallax, height, imageClassName, isBackground, hasVideoFallback, video, fullscreen, disableImageSliderForArrayInput, qa, onLoad, } = props;
18
+ const { parallax, height, imageClassName, fullscreenClassName, isBackground, hasVideoFallback, video, fullscreen, disableImageSliderForArrayInput, qa, onLoad, } = props;
19
19
  const image = Array.isArray(props.image) && disableImageSliderForArrayInput
20
20
  ? props.image[0]
21
21
  : props.image;
@@ -41,9 +41,9 @@ const Image = (props) => {
41
41
  parallaxInterpolate = springScrollY.to((value) => `translateY(-${Number(value) / parallaxLevel}px)`);
42
42
  }
43
43
  const imageClass = b('item', { withVideo: Boolean(video) && !hasVideoFallback }, imageClassName);
44
- const renderFullscreenImage = (item) => {
44
+ const renderFullscreenImage = (item, sliderData) => {
45
45
  const itemData = (0, utils_2.getMediaImage)(item);
46
- return (react_1.default.createElement(FullscreenImage_1.default, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, imageStyle: { height }, qa: qaAttributes.fullscreenImage })));
46
+ return (react_1.default.createElement(FullscreenImage_1.default, Object.assign({ key: itemData.alt }, itemData, { imageClassName: imageClass, modalImageClass: fullscreenClassName, imageStyle: { height }, qa: qaAttributes.fullscreenImage, sliderData: sliderData })));
47
47
  };
48
48
  const imageBackground = (oneImage) => {
49
49
  const imageData = (0, utils_2.getMediaImage)(oneImage);
@@ -56,7 +56,9 @@ const Image = (props) => {
56
56
  };
57
57
  const imageSlider = (imageArray) => {
58
58
  const fullscreenItem = fullscreen === undefined || fullscreen;
59
- return (react_1.default.createElement(unstable_1.SliderNewBlock, { slidesToShow: 1, type: models_1.SliderType.MediaCard }, imageArray.map((item, index) => (react_1.default.createElement(react_1.Fragment, { key: index }, fullscreenItem ? renderFullscreenImage(item) : imageOnly(item))))));
59
+ return (react_1.default.createElement(unstable_1.SliderNewBlock, { slidesToShow: 1, type: models_1.SliderType.MediaCard }, imageArray.map((item, index) => (react_1.default.createElement(react_1.Fragment, { key: index }, fullscreenItem
60
+ ? renderFullscreenImage(item, { items: imageArray, initialIndex: index })
61
+ : imageOnly(item))))));
60
62
  };
61
63
  if (Array.isArray(image)) {
62
64
  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
  }
@@ -3,6 +3,7 @@ import { ImageAdditionProps } from './Image/Image';
3
3
  import { VideoAdditionProps } from './Video/Video';
4
4
  export interface MediaAllProps extends MediaProps, VideoAdditionProps, ImageAdditionProps, QAProps {
5
5
  className?: string;
6
+ isFullscreenImageCover?: boolean;
6
7
  youtubeClassName?: string;
7
8
  autoplay?: boolean;
8
9
  onImageLoad?: () => void;
@@ -12,13 +12,13 @@ const Image_1 = tslib_1.__importDefault(require("./Image/Image"));
12
12
  const Video_1 = tslib_1.__importDefault(require("./Video/Video"));
13
13
  const b = (0, utils_1.block)('Media');
14
14
  const Media = (props) => {
15
- 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;
15
+ 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;
16
16
  const [hasVideoFallback, setHasVideoFallback] = (0, react_1.useState)(false);
17
17
  const qaAttributes = (0, utils_1.getQaAttrubutes)(qa, 'video');
18
18
  const content = (0, react_1.useMemo)(() => {
19
19
  let result = [];
20
20
  if (image) {
21
- result.push(react_1.default.createElement(Image_1.default, { 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 }));
21
+ result.push(react_1.default.createElement(Image_1.default, { 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 }));
22
22
  }
23
23
  if (video) {
24
24
  const videoProps = {
@@ -65,6 +65,7 @@ const Media = (props) => {
65
65
  isBackground,
66
66
  hasVideoFallback,
67
67
  fullscreen,
68
+ isFullscreenImageCover,
68
69
  qaAttributes.image,
69
70
  qaAttributes.video,
70
71
  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;
@@ -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) {
@@ -10,6 +10,7 @@ export interface SliderProps extends Omit<SliderParams, 'children'>, Refable<HTM
10
10
  dotsClassName?: string;
11
11
  blockClassName?: string;
12
12
  arrowSize?: number;
13
+ initialIndex?: number;
13
14
  }
14
15
  export declare const SliderBlock: (props: React.PropsWithChildren<SliderProps>) => JSX.Element;
15
16
  export default SliderBlock;
@@ -23,7 +23,7 @@ const DOT_WIDTH = 8;
23
23
  const DOT_GAP = 16;
24
24
  export const SliderBlock = (props) => {
25
25
  var _a;
26
- const { animated, title, description, type, anchorId, arrows = true, adaptive, autoplay = undefined, dots = true, dotsClassName, disclaimer, children, className, blockClassName, lazyLoad, arrowSize, onAfterChange: handleAfterChange, onBeforeChange: handleBeforeChange, } = props;
26
+ const { animated, title, description, type, anchorId, arrows = true, adaptive, autoplay = undefined, dots = true, dotsClassName, disclaimer, children, className, blockClassName, lazyLoad, arrowSize, onAfterChange: handleAfterChange, onBeforeChange: handleBeforeChange, initialIndex = 0, } = props;
27
27
  const { isServer } = useContext(SSRContext);
28
28
  const isMobile = useContext(MobileContext);
29
29
  const [breakpoint, setBreakpoint] = useState(BREAKPOINTS.xl);
@@ -36,7 +36,7 @@ export const SliderBlock = (props) => {
36
36
  }));
37
37
  const slidesToShowCount = getSlidesToShowCount(slidesToShow);
38
38
  const slidesCountByBreakpoint = getSlidesCountByBreakpoint(breakpoint, slidesToShow);
39
- const [currentIndex, setCurrentIndex] = useState(0);
39
+ const [currentIndex, setCurrentIndex] = useState(initialIndex);
40
40
  const [childStyles, setChildStyles] = useState({});
41
41
  const [slider, setSlider] = useState();
42
42
  const autoplayTimeId = useRef();
@@ -196,7 +196,7 @@ export const SliderBlock = (props) => {
196
196
  responsive: getSliderResponsiveParams(slidesToShow),
197
197
  beforeChange: onBeforeChange,
198
198
  afterChange: onAfterChange,
199
- initialSlide: 0,
199
+ initialSlide: initialIndex,
200
200
  nextArrow: React.createElement(Arrow, { type: "right", handleClick: handleArrowClick, size: arrowSize }),
201
201
  prevArrow: React.createElement(Arrow, { type: "left", handleClick: handleArrowClick, size: arrowSize }),
202
202
  lazyLoad,