@gravity-ui/page-constructor 2.22.0 → 2.23.0-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.
@@ -12,6 +12,6 @@ const DEFAULT_SIZES = {
12
12
  };
13
13
  const b = (0, utils_1.block)('card-layout-block');
14
14
  const CardLayout = ({ title, description, animated, colSizes = DEFAULT_SIZES, children, }) => (react_1.default.createElement(components_1.AnimateBlock, { className: b(), animate: animated },
15
- react_1.default.createElement(components_1.BlockHeader, { title: title, description: description }),
15
+ (title || description) && react_1.default.createElement(components_1.BlockHeader, { title: title, description: description }),
16
16
  react_1.default.createElement(grid_1.Row, null, react_1.default.Children.map(children, (child, index) => (react_1.default.createElement(grid_1.Col, { key: index, sizes: colSizes, className: b('item') }, child))))));
17
17
  exports.default = CardLayout;
@@ -1,6 +1,6 @@
1
1
  export declare const CardLayoutProps: {
2
2
  additionalProperties: boolean;
3
- required: string[];
3
+ required: never[];
4
4
  properties: {
5
5
  colSizes: {
6
6
  type: string;
@@ -76,7 +76,7 @@ export declare const CardLayoutProps: {
76
76
  export declare const CardLayoutBlock: {
77
77
  'card-layout-block': {
78
78
  additionalProperties: boolean;
79
- required: string[];
79
+ required: never[];
80
80
  properties: {
81
81
  colSizes: {
82
82
  type: string;
@@ -4,7 +4,7 @@ exports.CardLayoutBlock = exports.CardLayoutProps = void 0;
4
4
  const common_1 = require("../../schema/validators/common");
5
5
  exports.CardLayoutProps = {
6
6
  additionalProperties: false,
7
- required: ['title'],
7
+ required: [],
8
8
  properties: Object.assign(Object.assign(Object.assign(Object.assign({}, common_1.BlockBaseProps), common_1.AnimatableProps), common_1.BlockHeaderProps), { colSizes: common_1.containerSizesObject, children: common_1.ChildrenCardsProps }),
9
9
  };
10
10
  exports.CardLayoutBlock = {
@@ -2,11 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
+ const __1 = require("..");
5
6
  const components_1 = require("../../components");
6
7
  const ButtonTabs_1 = tslib_1.__importDefault(require("../../components/ButtonTabs/ButtonTabs"));
7
- const ConstructorBlocks_1 = require("../../containers/PageConstructor/components/ConstructorBlocks");
8
+ const ConstructorItem_1 = require("../../containers/PageConstructor/components/ConstructorItem");
8
9
  const grid_1 = require("../../grid");
9
- const models_1 = require("../../models");
10
10
  const utils_1 = require("../../utils");
11
11
  const i18n_1 = tslib_1.__importDefault(require("./i18n"));
12
12
  const b = (0, utils_1.block)('filter-block');
@@ -24,25 +24,21 @@ const FilterBlock = ({ title, description, tags, tagButtonSize, allTag, items, c
24
24
  ? tabButtons[0].id
25
25
  : selectedTag;
26
26
  }, [tabButtons, selectedTag]);
27
- const container = (0, react_1.useMemo)(() => {
27
+ const cards = (0, react_1.useMemo)(() => {
28
28
  const itemsToShow = actualTag
29
29
  ? items.filter((item) => item.tags.includes(actualTag))
30
30
  : items;
31
- return [
32
- {
33
- type: models_1.BlockType.CardLayoutBlock,
34
- title: '',
35
- colSizes: colSizes,
36
- children: itemsToShow.map((item) => item.card),
37
- },
38
- ];
39
- }, [actualTag, items, colSizes]);
31
+ return itemsToShow.map((item) => item.card);
32
+ }, [actualTag, items]);
40
33
  return (react_1.default.createElement(components_1.AnimateBlock, { className: b(), animate: animated },
41
34
  title && (react_1.default.createElement(components_1.BlockHeader, { className: b('title', { centered: centered }), title: title, description: description })),
42
35
  tabButtons.length && (react_1.default.createElement(grid_1.Row, null,
43
36
  react_1.default.createElement(grid_1.Col, null,
44
37
  react_1.default.createElement(ButtonTabs_1.default, { className: b('tabs', { centered: centered }), items: tabButtons, activeTab: selectedTag, onSelectTab: setSelectedTag, tabSize: tagButtonSize })))),
45
38
  react_1.default.createElement(grid_1.Row, { className: b('block-container') },
46
- react_1.default.createElement(ConstructorBlocks_1.ConstructorBlocks, { items: container }))));
39
+ react_1.default.createElement(__1.CardLayoutBlock, { title: "", colSizes: colSizes }, cards.map((card, index) => {
40
+ const key = (0, utils_1.getBlockKey)(card, index);
41
+ return react_1.default.createElement(ConstructorItem_1.ConstructorItem, { data: card, blockKey: key, key: key });
42
+ })))));
47
43
  };
48
44
  exports.default = FilterBlock;
@@ -6,7 +6,6 @@
6
6
  unpredictable css rules order in build */
7
7
  .pc-header-block {
8
8
  position: relative;
9
- margin: 16px 0;
10
9
  }
11
10
  .pc-header-block_full-width {
12
11
  --pc-border-radius: 0;
@@ -30,16 +29,16 @@ unpredictable css rules order in build */
30
29
  margin: 16px 0;
31
30
  }
32
31
  .pc-header-block__content_vertical-offset_s {
33
- padding: 48px 0;
32
+ padding: 64px 0;
34
33
  }
35
34
  .pc-header-block__content_vertical-offset_m {
36
- padding: calc(96px - 16px) 0;
35
+ padding: 96px 0;
37
36
  }
38
37
  .pc-header-block__content_vertical-offset_l {
39
- padding: calc(128px - 16px) 0;
38
+ padding: 128px 0;
40
39
  }
41
40
  .pc-header-block__content_vertical-offset_xl {
42
- padding: calc(160px - 16px) 0;
41
+ padding: 160px 0;
43
42
  }
44
43
  .pc-header-block__content_offset_large {
45
44
  padding: calc(128px - 16px) 0 16px;
@@ -95,10 +94,10 @@ unpredictable css rules order in build */
95
94
  .pc-header-block__media {
96
95
  position: absolute;
97
96
  display: none;
98
- top: 0;
97
+ top: 16px;
99
98
  right: 0;
100
99
  width: 50%;
101
- height: 100%;
100
+ height: calc(100% - 2 * 16px);
102
101
  overflow: hidden;
103
102
  object-fit: cover;
104
103
  border-radius: var(--pc-border-radius);
@@ -246,7 +246,7 @@ export interface LinkTableBlockProps extends BlockHeaderProps {
246
246
  linkTheme?: LinkTheme;
247
247
  }
248
248
  export interface CardLayoutBlockProps extends Childable, Animatable, LoadableChildren {
249
- title: TitleProps | string;
249
+ title?: TitleProps | string;
250
250
  description?: string;
251
251
  colSizes?: GridColumnSizesType;
252
252
  }
@@ -63,6 +63,7 @@ export interface HeaderData {
63
63
  leftItems: NavigationItemModel[];
64
64
  rightItems?: NavigationItemModel[];
65
65
  iconSize?: number;
66
+ withBorder?: boolean;
66
67
  }
67
68
  export interface FooterColumn {
68
69
  title: string;
@@ -9,6 +9,8 @@ unpredictable css rules order in build */
9
9
  align-items: center;
10
10
  height: var(--header-height);
11
11
  background-color: var(--yc-color-base-background);
12
+ }
13
+ .pc-header_with-border {
12
14
  box-shadow: inset 0 -1px 0 var(--yc-color-line-generic);
13
15
  }
14
16
  .pc-header__wrapper {
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Header = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importStar(require("react"));
6
+ const lodash_1 = tslib_1.__importDefault(require("lodash"));
6
7
  const Control_1 = tslib_1.__importDefault(require("../../../components/Control/Control"));
7
8
  const OutsideClick_1 = tslib_1.__importDefault(require("../../../components/OutsideClick/OutsideClick"));
8
9
  const grid_1 = require("../../../grid");
@@ -27,9 +28,10 @@ const MobileMenuButton = ({ isSidebarOpened, onSidebarOpenedChange, }) => {
27
28
  };
28
29
  const iconSizeKey = 'iconSize';
29
30
  const Header = ({ data, logo }) => {
30
- const { leftItems, rightItems, iconSize = 20 } = data;
31
+ const { leftItems, rightItems, iconSize = 20, withBorder = false } = data;
31
32
  const [isSidebarOpened, setIsSidebarOpened] = (0, react_1.useState)(false);
32
33
  const [activeItemId, setactiveItemId] = (0, react_1.useState)(undefined);
34
+ const [withHeaderBorder, setWithHeaderBorder] = (0, react_1.useState)(withBorder);
33
35
  const getNavigationItemWithIconSize = (0, react_1.useCallback)((item) => {
34
36
  if (!(iconSizeKey in item)) {
35
37
  return Object.assign(Object.assign({}, item), { iconSize });
@@ -50,7 +52,19 @@ const Header = ({ data, logo }) => {
50
52
  const hideSidebar = (0, react_1.useCallback)(() => {
51
53
  setIsSidebarOpened(false);
52
54
  }, []);
53
- return (react_1.default.createElement(grid_1.Grid, { className: b() },
55
+ (0, react_1.useEffect)(() => {
56
+ const handleScroll = () => {
57
+ if (window.scrollY > 0 && !withBorder) {
58
+ setWithHeaderBorder(true);
59
+ }
60
+ else if (window.scrollY === 0 && !withBorder) {
61
+ setWithHeaderBorder(false);
62
+ }
63
+ };
64
+ window.addEventListener('scroll', lodash_1.default.debounce(handleScroll, 5), { passive: true });
65
+ return () => window.removeEventListener('scroll', lodash_1.default.debounce(handleScroll, 5));
66
+ });
67
+ return (react_1.default.createElement(grid_1.Grid, { className: b({ 'with-border': withHeaderBorder }) },
54
68
  react_1.default.createElement(grid_1.Row, null,
55
69
  react_1.default.createElement(grid_1.Col, null,
56
70
  react_1.default.createElement("header", { className: b('wrapper') },
@@ -10,6 +10,6 @@ const DEFAULT_SIZES = {
10
10
  };
11
11
  const b = block('card-layout-block');
12
12
  const CardLayout = ({ title, description, animated, colSizes = DEFAULT_SIZES, children, }) => (React.createElement(AnimateBlock, { className: b(), animate: animated },
13
- React.createElement(BlockHeader, { title: title, description: description }),
13
+ (title || description) && React.createElement(BlockHeader, { title: title, description: description }),
14
14
  React.createElement(Row, null, React.Children.map(children, (child, index) => (React.createElement(Col, { key: index, sizes: colSizes, className: b('item') }, child))))));
15
15
  export default CardLayout;
@@ -1,6 +1,6 @@
1
1
  export declare const CardLayoutProps: {
2
2
  additionalProperties: boolean;
3
- required: string[];
3
+ required: never[];
4
4
  properties: {
5
5
  colSizes: {
6
6
  type: string;
@@ -76,7 +76,7 @@ export declare const CardLayoutProps: {
76
76
  export declare const CardLayoutBlock: {
77
77
  'card-layout-block': {
78
78
  additionalProperties: boolean;
79
- required: string[];
79
+ required: never[];
80
80
  properties: {
81
81
  colSizes: {
82
82
  type: string;
@@ -1,7 +1,7 @@
1
1
  import { AnimatableProps, BlockBaseProps, BlockHeaderProps, ChildrenCardsProps, containerSizesObject, } from '../../schema/validators/common';
2
2
  export const CardLayoutProps = {
3
3
  additionalProperties: false,
4
- required: ['title'],
4
+ required: [],
5
5
  properties: Object.assign(Object.assign(Object.assign(Object.assign({}, BlockBaseProps), AnimatableProps), BlockHeaderProps), { colSizes: containerSizesObject, children: ChildrenCardsProps }),
6
6
  };
7
7
  export const CardLayoutBlock = {
@@ -1,10 +1,10 @@
1
1
  import React, { useMemo, useState } from 'react';
2
+ import { CardLayoutBlock } from '..';
2
3
  import { AnimateBlock, BlockHeader } from '../../components';
3
4
  import ButtonTabs from '../../components/ButtonTabs/ButtonTabs';
4
- import { ConstructorBlocks } from '../../containers/PageConstructor/components/ConstructorBlocks';
5
+ import { ConstructorItem } from '../../containers/PageConstructor/components/ConstructorItem';
5
6
  import { Col, Row } from '../../grid';
6
- import { BlockType } from '../../models';
7
- import { block } from '../../utils';
7
+ import { block, getBlockKey } from '../../utils';
8
8
  import i18n from './i18n';
9
9
  import './FilterBlock.css';
10
10
  const b = block('filter-block');
@@ -22,25 +22,21 @@ const FilterBlock = ({ title, description, tags, tagButtonSize, allTag, items, c
22
22
  ? tabButtons[0].id
23
23
  : selectedTag;
24
24
  }, [tabButtons, selectedTag]);
25
- const container = useMemo(() => {
25
+ const cards = useMemo(() => {
26
26
  const itemsToShow = actualTag
27
27
  ? items.filter((item) => item.tags.includes(actualTag))
28
28
  : items;
29
- return [
30
- {
31
- type: BlockType.CardLayoutBlock,
32
- title: '',
33
- colSizes: colSizes,
34
- children: itemsToShow.map((item) => item.card),
35
- },
36
- ];
37
- }, [actualTag, items, colSizes]);
29
+ return itemsToShow.map((item) => item.card);
30
+ }, [actualTag, items]);
38
31
  return (React.createElement(AnimateBlock, { className: b(), animate: animated },
39
32
  title && (React.createElement(BlockHeader, { className: b('title', { centered: centered }), title: title, description: description })),
40
33
  tabButtons.length && (React.createElement(Row, null,
41
34
  React.createElement(Col, null,
42
35
  React.createElement(ButtonTabs, { className: b('tabs', { centered: centered }), items: tabButtons, activeTab: selectedTag, onSelectTab: setSelectedTag, tabSize: tagButtonSize })))),
43
36
  React.createElement(Row, { className: b('block-container') },
44
- React.createElement(ConstructorBlocks, { items: container }))));
37
+ React.createElement(CardLayoutBlock, { title: "", colSizes: colSizes }, cards.map((card, index) => {
38
+ const key = getBlockKey(card, index);
39
+ return React.createElement(ConstructorItem, { data: card, blockKey: key, key: key });
40
+ })))));
45
41
  };
46
42
  export default FilterBlock;
@@ -6,7 +6,6 @@
6
6
  unpredictable css rules order in build */
7
7
  .pc-header-block {
8
8
  position: relative;
9
- margin: 16px 0;
10
9
  }
11
10
  .pc-header-block_full-width {
12
11
  --pc-border-radius: 0;
@@ -30,16 +29,16 @@ unpredictable css rules order in build */
30
29
  margin: 16px 0;
31
30
  }
32
31
  .pc-header-block__content_vertical-offset_s {
33
- padding: 48px 0;
32
+ padding: 64px 0;
34
33
  }
35
34
  .pc-header-block__content_vertical-offset_m {
36
- padding: calc(96px - 16px) 0;
35
+ padding: 96px 0;
37
36
  }
38
37
  .pc-header-block__content_vertical-offset_l {
39
- padding: calc(128px - 16px) 0;
38
+ padding: 128px 0;
40
39
  }
41
40
  .pc-header-block__content_vertical-offset_xl {
42
- padding: calc(160px - 16px) 0;
41
+ padding: 160px 0;
43
42
  }
44
43
  .pc-header-block__content_offset_large {
45
44
  padding: calc(128px - 16px) 0 16px;
@@ -95,10 +94,10 @@ unpredictable css rules order in build */
95
94
  .pc-header-block__media {
96
95
  position: absolute;
97
96
  display: none;
98
- top: 0;
97
+ top: 16px;
99
98
  right: 0;
100
99
  width: 50%;
101
- height: 100%;
100
+ height: calc(100% - 2 * 16px);
102
101
  overflow: hidden;
103
102
  object-fit: cover;
104
103
  border-radius: var(--pc-border-radius);
@@ -246,7 +246,7 @@ export interface LinkTableBlockProps extends BlockHeaderProps {
246
246
  linkTheme?: LinkTheme;
247
247
  }
248
248
  export interface CardLayoutBlockProps extends Childable, Animatable, LoadableChildren {
249
- title: TitleProps | string;
249
+ title?: TitleProps | string;
250
250
  description?: string;
251
251
  colSizes?: GridColumnSizesType;
252
252
  }
@@ -63,6 +63,7 @@ export interface HeaderData {
63
63
  leftItems: NavigationItemModel[];
64
64
  rightItems?: NavigationItemModel[];
65
65
  iconSize?: number;
66
+ withBorder?: boolean;
66
67
  }
67
68
  export interface FooterColumn {
68
69
  title: string;
@@ -9,6 +9,8 @@ unpredictable css rules order in build */
9
9
  align-items: center;
10
10
  height: var(--header-height);
11
11
  background-color: var(--yc-color-base-background);
12
+ }
13
+ .pc-header_with-border {
12
14
  box-shadow: inset 0 -1px 0 var(--yc-color-line-generic);
13
15
  }
14
16
  .pc-header__wrapper {
@@ -1,4 +1,5 @@
1
- import React, { useCallback, useMemo, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import _ from 'lodash';
2
3
  import Control from '../../../components/Control/Control';
3
4
  import OutsideClick from '../../../components/OutsideClick/OutsideClick';
4
5
  import { Col, Grid, Row } from '../../../grid';
@@ -24,9 +25,10 @@ const MobileMenuButton = ({ isSidebarOpened, onSidebarOpenedChange, }) => {
24
25
  };
25
26
  const iconSizeKey = 'iconSize';
26
27
  export const Header = ({ data, logo }) => {
27
- const { leftItems, rightItems, iconSize = 20 } = data;
28
+ const { leftItems, rightItems, iconSize = 20, withBorder = false } = data;
28
29
  const [isSidebarOpened, setIsSidebarOpened] = useState(false);
29
30
  const [activeItemId, setactiveItemId] = useState(undefined);
31
+ const [withHeaderBorder, setWithHeaderBorder] = useState(withBorder);
30
32
  const getNavigationItemWithIconSize = useCallback((item) => {
31
33
  if (!(iconSizeKey in item)) {
32
34
  return Object.assign(Object.assign({}, item), { iconSize });
@@ -47,7 +49,19 @@ export const Header = ({ data, logo }) => {
47
49
  const hideSidebar = useCallback(() => {
48
50
  setIsSidebarOpened(false);
49
51
  }, []);
50
- return (React.createElement(Grid, { className: b() },
52
+ useEffect(() => {
53
+ const handleScroll = () => {
54
+ if (window.scrollY > 0 && !withBorder) {
55
+ setWithHeaderBorder(true);
56
+ }
57
+ else if (window.scrollY === 0 && !withBorder) {
58
+ setWithHeaderBorder(false);
59
+ }
60
+ };
61
+ window.addEventListener('scroll', _.debounce(handleScroll, 5), { passive: true });
62
+ return () => window.removeEventListener('scroll', _.debounce(handleScroll, 5));
63
+ });
64
+ return (React.createElement(Grid, { className: b({ 'with-border': withHeaderBorder }) },
51
65
  React.createElement(Row, null,
52
66
  React.createElement(Col, null,
53
67
  React.createElement("header", { className: b('wrapper') },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/page-constructor",
3
- "version": "2.22.0",
3
+ "version": "2.23.0-alpha.0",
4
4
  "description": "Gravity UI Page Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -139,5 +139,8 @@
139
139
  "*.{json,yaml,yml,md}": [
140
140
  "prettier --write"
141
141
  ]
142
+ },
143
+ "publishConfig": {
144
+ "tag": "alpha"
142
145
  }
143
146
  }
@@ -246,7 +246,7 @@ export interface LinkTableBlockProps extends BlockHeaderProps {
246
246
  linkTheme?: LinkTheme;
247
247
  }
248
248
  export interface CardLayoutBlockProps extends Childable, Animatable, LoadableChildren {
249
- title: TitleProps | string;
249
+ title?: TitleProps | string;
250
250
  description?: string;
251
251
  colSizes?: GridColumnSizesType;
252
252
  }
@@ -63,6 +63,7 @@ export interface HeaderData {
63
63
  leftItems: NavigationItemModel[];
64
64
  rightItems?: NavigationItemModel[];
65
65
  iconSize?: number;
66
+ withBorder?: boolean;
66
67
  }
67
68
  export interface FooterColumn {
68
69
  title: string;