@gravity-ui/blog-constructor 5.0.2 → 5.2.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.
Files changed (124) hide show
  1. package/build/cjs/blocks/Author/Author.d.ts +1 -1
  2. package/build/cjs/blocks/Author/Author.js +2 -2
  3. package/build/cjs/blocks/Banner/Banner.d.ts +1 -1
  4. package/build/cjs/blocks/Banner/Banner.js +7 -5
  5. package/build/cjs/blocks/CTA/CTA.d.ts +1 -1
  6. package/build/cjs/blocks/ColoredText/ColoredText.d.ts +1 -1
  7. package/build/cjs/blocks/ColoredText/ColoredText.js +5 -4
  8. package/build/cjs/blocks/Feed/Feed.d.ts +1 -1
  9. package/build/cjs/blocks/Header/Header.d.ts +1 -1
  10. package/build/cjs/blocks/Layout/Layout.d.ts +2 -2
  11. package/build/cjs/blocks/Media/Media.d.ts +1 -1
  12. package/build/cjs/blocks/Meta/Meta.d.ts +1 -1
  13. package/build/cjs/blocks/Suggest/Suggest.d.ts +1 -1
  14. package/build/cjs/blocks/YFM/YFM.d.ts +1 -1
  15. package/build/cjs/blocks/YFM/YFM.js +6 -4
  16. package/build/cjs/components/FeedHeader/FeedHeader.d.ts +1 -1
  17. package/build/cjs/components/FeedHeader/components/Controls/Controls.css +5 -23
  18. package/build/cjs/components/FeedHeader/components/Controls/Controls.d.ts +1 -1
  19. package/build/cjs/components/FeedHeader/components/Controls/Controls.js +1 -1
  20. package/build/cjs/components/FeedHeader/components/Controls/customRenders.js +1 -2
  21. package/build/cjs/components/Paginator/types.d.ts +4 -4
  22. package/build/cjs/components/PostCard/PostCard.d.ts +4 -3
  23. package/build/cjs/components/PostCard/PostCard.js +5 -4
  24. package/build/cjs/components/PostInfo/PostInfo.d.ts +1 -1
  25. package/build/cjs/components/PostInfo/SuggestPostInfo.d.ts +3 -3
  26. package/build/cjs/components/PostInfo/SuggestPostInfo.js +2 -1
  27. package/build/cjs/components/PostInfo/components/Date.d.ts +3 -2
  28. package/build/cjs/components/PostInfo/components/Date.js +2 -1
  29. package/build/cjs/components/PostInfo/components/ReadingTime.d.ts +1 -1
  30. package/build/cjs/components/PostInfo/components/Save.d.ts +1 -1
  31. package/build/cjs/components/PostInfo/components/Sharing.d.ts +1 -1
  32. package/build/cjs/components/Posts/Posts.d.ts +1 -1
  33. package/build/cjs/components/Posts/Posts.js +5 -2
  34. package/build/cjs/components/PostsEmpty/PostsEmpty.d.ts +1 -1
  35. package/build/cjs/components/PostsError/PostsError.d.ts +1 -1
  36. package/build/cjs/components/Search/Search.css +13 -15
  37. package/build/cjs/components/Search/Search.d.ts +7 -1
  38. package/build/cjs/components/Search/Search.js +26 -14
  39. package/build/cjs/constructor/BlogConstructorProvider.d.ts +2 -2
  40. package/build/cjs/constructor/blocksMap.d.ts +11 -11
  41. package/build/cjs/containers/BlogPostPage/BlogPostPage.d.ts +1 -1
  42. package/build/cjs/icons/Close.d.ts +1 -1
  43. package/build/cjs/icons/DropdownArrow.d.ts +1 -1
  44. package/build/cjs/icons/Save.d.ts +1 -1
  45. package/build/cjs/icons/SaveFilled.d.ts +1 -1
  46. package/build/cjs/icons/SearchIcon.d.ts +1 -1
  47. package/build/cjs/icons/ShareArrowUp.d.ts +1 -1
  48. package/build/cjs/icons/Time.d.ts +1 -1
  49. package/build/cjs/models/blocks.d.ts +5 -5
  50. package/build/cjs/models/common.d.ts +8 -0
  51. package/build/cjs/models/common.js +12 -2
  52. package/build/cjs/utils/cn.d.ts +2 -3
  53. package/build/cjs/utils/cn.js +4 -7
  54. package/build/cjs/utils/common.d.ts +1 -0
  55. package/build/cjs/utils/common.js +15 -2
  56. package/build/esm/blocks/Author/Author.d.ts +1 -1
  57. package/build/esm/blocks/Author/Author.js +2 -2
  58. package/build/esm/blocks/Banner/Banner.d.ts +1 -1
  59. package/build/esm/blocks/Banner/Banner.js +8 -6
  60. package/build/esm/blocks/CTA/CTA.d.ts +1 -1
  61. package/build/esm/blocks/ColoredText/ColoredText.d.ts +1 -1
  62. package/build/esm/blocks/ColoredText/ColoredText.js +6 -5
  63. package/build/esm/blocks/Feed/Feed.d.ts +1 -1
  64. package/build/esm/blocks/Header/Header.d.ts +1 -1
  65. package/build/esm/blocks/Layout/Layout.d.ts +2 -2
  66. package/build/esm/blocks/Media/Media.d.ts +1 -1
  67. package/build/esm/blocks/Meta/Meta.d.ts +1 -1
  68. package/build/esm/blocks/Suggest/Suggest.d.ts +1 -1
  69. package/build/esm/blocks/YFM/YFM.d.ts +1 -1
  70. package/build/esm/blocks/YFM/YFM.js +6 -4
  71. package/build/esm/components/FeedHeader/FeedHeader.d.ts +1 -1
  72. package/build/esm/components/FeedHeader/components/Controls/Controls.css +5 -23
  73. package/build/esm/components/FeedHeader/components/Controls/Controls.d.ts +1 -1
  74. package/build/esm/components/FeedHeader/components/Controls/Controls.js +1 -1
  75. package/build/esm/components/FeedHeader/components/Controls/customRenders.js +1 -2
  76. package/build/esm/components/Paginator/types.d.ts +4 -4
  77. package/build/esm/components/PostCard/PostCard.d.ts +4 -3
  78. package/build/esm/components/PostCard/PostCard.js +5 -4
  79. package/build/esm/components/PostInfo/PostInfo.d.ts +1 -1
  80. package/build/esm/components/PostInfo/SuggestPostInfo.d.ts +3 -3
  81. package/build/esm/components/PostInfo/SuggestPostInfo.js +2 -1
  82. package/build/esm/components/PostInfo/components/Date.d.ts +3 -2
  83. package/build/esm/components/PostInfo/components/Date.js +2 -1
  84. package/build/esm/components/PostInfo/components/ReadingTime.d.ts +1 -1
  85. package/build/esm/components/PostInfo/components/Save.d.ts +1 -1
  86. package/build/esm/components/PostInfo/components/Sharing.d.ts +1 -1
  87. package/build/esm/components/Posts/Posts.d.ts +1 -1
  88. package/build/esm/components/Posts/Posts.js +5 -2
  89. package/build/esm/components/PostsEmpty/PostsEmpty.d.ts +1 -1
  90. package/build/esm/components/PostsError/PostsError.d.ts +1 -1
  91. package/build/esm/components/Search/Search.css +13 -15
  92. package/build/esm/components/Search/Search.d.ts +7 -1
  93. package/build/esm/components/Search/Search.js +28 -16
  94. package/build/esm/constructor/BlogConstructorProvider.d.ts +2 -2
  95. package/build/esm/constructor/blocksMap.d.ts +11 -11
  96. package/build/esm/containers/BlogPostPage/BlogPostPage.d.ts +1 -1
  97. package/build/esm/icons/Close.d.ts +1 -1
  98. package/build/esm/icons/DropdownArrow.d.ts +1 -1
  99. package/build/esm/icons/Save.d.ts +1 -1
  100. package/build/esm/icons/SaveFilled.d.ts +1 -1
  101. package/build/esm/icons/SearchIcon.d.ts +1 -1
  102. package/build/esm/icons/ShareArrowUp.d.ts +1 -1
  103. package/build/esm/icons/Time.d.ts +1 -1
  104. package/build/esm/models/blocks.d.ts +5 -5
  105. package/build/esm/models/common.d.ts +8 -0
  106. package/build/esm/models/common.js +11 -1
  107. package/build/esm/utils/cn.d.ts +2 -3
  108. package/build/esm/utils/cn.js +3 -4
  109. package/build/esm/utils/common.d.ts +1 -0
  110. package/build/esm/utils/common.js +13 -1
  111. package/package.json +18 -6
  112. package/server/models/blocks.d.ts +5 -5
  113. package/server/models/common.d.ts +8 -0
  114. package/server/models/common.js +12 -2
  115. package/build/cjs/components/ButtonWithIcon/ButtonWithIcon.css +0 -76
  116. package/build/cjs/components/ButtonWithIcon/ButtonWithIcon.d.ts +0 -12
  117. package/build/cjs/components/ButtonWithIcon/ButtonWithIcon.js +0 -11
  118. package/build/cjs/demo/DocsDecorator/DocsDecorator.css +0 -14
  119. package/build/cjs/internal-typings/bem-cn-lite.d.ts +0 -17
  120. package/build/esm/components/ButtonWithIcon/ButtonWithIcon.css +0 -76
  121. package/build/esm/components/ButtonWithIcon/ButtonWithIcon.d.ts +0 -13
  122. package/build/esm/components/ButtonWithIcon/ButtonWithIcon.js +0 -7
  123. package/build/esm/demo/DocsDecorator/DocsDecorator.css +0 -14
  124. package/build/esm/internal-typings/bem-cn-lite.d.ts +0 -17
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { AuthorProps } from '../../models/blocks';
3
- export declare const Author: React.FC<AuthorProps>;
3
+ export declare const Author: (props: AuthorProps) => React.JSX.Element | null;
@@ -11,7 +11,7 @@ const cn_1 = require("../../utils/cn");
11
11
  const b = (0, cn_1.block)('author');
12
12
  const Author = (props) => {
13
13
  var _a;
14
- const { image, paddingTop, paddingBottom, authorId } = props;
14
+ const { image, paddingTop, paddingBottom, authorId, qa } = props;
15
15
  const { post } = (0, react_1.useContext)(PostPageContext_1.PostPageContext);
16
16
  const author = (_a = post === null || post === void 0 ? void 0 : post.authors) === null || _a === void 0 ? void 0 : _a.find(({ id }) => id === authorId);
17
17
  const authorItem = (0, react_1.useMemo)(() => {
@@ -31,7 +31,7 @@ const Author = (props) => {
31
31
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
32
32
  [paddings_1.PaddingsDirections.top]: paddingTop,
33
33
  [paddings_1.PaddingsDirections.bottom]: paddingBottom,
34
- }, className: b('content') },
34
+ }, className: b('content'), qa: qa },
35
35
  react_1.default.createElement("div", { className: b('layout'), "data-qa": "blog-author-layout" },
36
36
  react_1.default.createElement(page_constructor_1.Author, { type: page_constructor_1.AuthorType.Column, author: authorItem, authorContainerClassName: b('container') }))));
37
37
  };
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { BannerProps } from '../../models/blocks';
3
- export declare const Banner: React.FC<BannerProps>;
3
+ export declare const Banner: ({ color, imageSize, image, paddingTop, paddingBottom, qa, ...content }: BannerProps) => React.JSX.Element;
@@ -10,10 +10,12 @@ const paddings_1 = require("../../models/paddings");
10
10
  const cn_1 = require("../../utils/cn");
11
11
  const common_1 = require("../../utils/common");
12
12
  const b = (0, cn_1.block)('banner');
13
+ const BANNER_CUSTOM_QA_ATTRIBUTES = ['image-container'];
13
14
  const Banner = (_a) => {
14
15
  var _b;
15
- var { color, imageSize = 's', image, paddingTop, paddingBottom } = _a, content = tslib_1.__rest(_a, ["color", "imageSize", "image", "paddingTop", "paddingBottom"]);
16
+ var { color, imageSize = 's', image, paddingTop, paddingBottom, qa } = _a, content = tslib_1.__rest(_a, ["color", "imageSize", "image", "paddingTop", "paddingBottom", "qa"]);
16
17
  const contentStyle = {};
18
+ const qaAttributes = (0, common_1.getQaAttributes)(qa, BANNER_CUSTOM_QA_ATTRIBUTES);
17
19
  if (color) {
18
20
  contentStyle.backgroundColor = color;
19
21
  }
@@ -32,11 +34,11 @@ const Banner = (_a) => {
32
34
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
33
35
  [paddings_1.PaddingsDirections.top]: paddingTop,
34
36
  [paddings_1.PaddingsDirections.bottom]: paddingBottom,
35
- }, className: b('container') },
36
- react_1.default.createElement("div", { className: b('content'), style: contentStyle, "data-qa": "blog-banner-content" },
37
+ }, qa: qaAttributes.wrapper, className: b('container') },
38
+ react_1.default.createElement("div", { className: b('content'), style: contentStyle, "data-qa": qaAttributes.content },
37
39
  react_1.default.createElement("div", { className: b('info') },
38
- react_1.default.createElement(page_constructor_1.Content, Object.assign({}, contentData))),
39
- image && (react_1.default.createElement("div", { className: b('image-container', { ['image-size']: imageSize }) },
40
+ react_1.default.createElement(page_constructor_1.Content, Object.assign({}, contentData, { qa: qaAttributes.content }))),
41
+ image && (react_1.default.createElement("div", { className: b('image-container', { ['image-size']: imageSize }), "data-qa": qaAttributes.imageContainer },
40
42
  react_1.default.createElement(page_constructor_1.Image, { className: b('image'), src: image }))))));
41
43
  };
42
44
  exports.Banner = Banner;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { CTAProps } from '../../models/blocks';
3
- export declare const CTA: React.FC<CTAProps>;
3
+ export declare const CTA: ({ items, paddingTop, paddingBottom }: CTAProps) => React.JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { ColoredTextProps } from '../../models/blocks';
3
- export declare const ColoredText: React.FC<ColoredTextProps>;
3
+ export declare const ColoredText: ({ background, paddingTop, paddingBottom, qa, ...content }: ColoredTextProps) => React.JSX.Element;
@@ -10,15 +10,16 @@ const cn_1 = require("../../utils/cn");
10
10
  const common_1 = require("../../utils/common");
11
11
  const b = (0, cn_1.block)('colored-text');
12
12
  const ColoredText = (_a) => {
13
- var { background, paddingTop, paddingBottom } = _a, content = tslib_1.__rest(_a, ["background", "paddingTop", "paddingBottom"]);
13
+ var { background, paddingTop, paddingBottom, qa } = _a, content = tslib_1.__rest(_a, ["background", "paddingTop", "paddingBottom", "qa"]);
14
14
  const contentData = (0, common_1.updateContentSizes)(content);
15
+ const qaAttributes = (0, common_1.getQaAttributes)(qa);
15
16
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
16
17
  [paddings_1.PaddingsDirections.top]: paddingTop,
17
18
  [paddings_1.PaddingsDirections.bottom]: paddingBottom,
18
- } },
19
- react_1.default.createElement("div", { className: b('container'), style: { backgroundColor: (background === null || background === void 0 ? void 0 : background.color) || 'none' }, "data-qa": "blog-colored-text-content" },
19
+ }, qa: qaAttributes.wrapper },
20
+ react_1.default.createElement("div", { className: b('container'), style: { backgroundColor: (background === null || background === void 0 ? void 0 : background.color) || 'none' }, "data-qa": qaAttributes.container },
20
21
  react_1.default.createElement("div", { className: b('picture-container') }, (background === null || background === void 0 ? void 0 : background.image) && (react_1.default.createElement(page_constructor_1.BackgroundImage, { className: b('picture'), alt: background === null || background === void 0 ? void 0 : background.altText, src: background === null || background === void 0 ? void 0 : background.image }))),
21
22
  react_1.default.createElement("div", { className: b('text-content') },
22
- react_1.default.createElement(page_constructor_1.Content, Object.assign({}, contentData))))));
23
+ react_1.default.createElement(page_constructor_1.Content, Object.assign({}, contentData, { qa: qaAttributes.content }))))));
23
24
  };
24
25
  exports.ColoredText = ColoredText;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { FeedProps } from '../../models/blocks';
3
- export declare const Feed: React.FC<FeedProps>;
3
+ export declare const Feed: ({ image }: FeedProps) => React.JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { HeaderProps } from '../../models/blocks';
3
- export declare const Header: React.FC<HeaderProps>;
3
+ export declare const Header: (props: HeaderProps) => React.JSX.Element;
@@ -1,3 +1,3 @@
1
- import React from 'react';
1
+ import React, { PropsWithChildren } from 'react';
2
2
  import { LayoutProps } from '../../models/blocks';
3
- export declare const Layout: React.FC<LayoutProps>;
3
+ export declare const Layout: ({ fullWidth, mobileOrder, children, paddingTop, paddingBottom, }: PropsWithChildren<LayoutProps>) => React.JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { MediaProps } from '../../models/blocks';
3
- export declare const Media: React.FC<MediaProps>;
3
+ export declare const Media: ({ text, paddingTop, paddingBottom, ...mediaProps }: MediaProps) => React.JSX.Element;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { MetaProps } from '../../models/blocks';
3
- export declare const Meta: React.FC<MetaProps>;
3
+ export declare const Meta: (props: MetaProps) => React.JSX.Element;
@@ -9,4 +9,4 @@ import { SuggestProps } from '../../models/blocks';
9
9
  *
10
10
  * @returns -jsx
11
11
  */
12
- export declare const Suggest: React.FC<SuggestProps>;
12
+ export declare const Suggest: ({ paddingTop, paddingBottom }: SuggestProps) => React.JSX.Element | null;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
2
  import { YFMProps } from '../../models/blocks';
3
- export declare const YFM: React.FC<YFMProps>;
3
+ export declare const YFM: (props: YFMProps) => React.JSX.Element;
@@ -4,16 +4,18 @@ exports.YFM = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
6
  const page_constructor_1 = require("@gravity-ui/page-constructor");
7
- const bem_cn_lite_1 = tslib_1.__importDefault(require("bem-cn-lite"));
8
7
  const Wrapper_1 = require("../../components/Wrapper/Wrapper");
9
8
  const paddings_1 = require("../../models/paddings");
10
- const b = (0, bem_cn_lite_1.default)('yfm');
9
+ const cn_1 = require("../../utils/cn");
10
+ const common_1 = require("../../utils/common");
11
+ const b = (0, cn_1.cn)('yfm');
11
12
  const YFM = (props) => {
12
- const { text, paddingTop, paddingBottom } = props;
13
+ const { text, paddingTop, paddingBottom, qa } = props;
14
+ const qaAttributes = (0, common_1.getQaAttributes)(qa);
13
15
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
14
16
  [paddings_1.PaddingsDirections.top]: paddingTop,
15
17
  [paddings_1.PaddingsDirections.bottom]: paddingBottom,
16
- } },
18
+ }, qa: qaAttributes.wrapper },
17
19
  react_1.default.createElement(page_constructor_1.YFMWrapper, { content: text, modifiers: {
18
20
  blog: true,
19
21
  resetPaddings: true,
@@ -4,5 +4,5 @@ import { ControlsProps } from './components/Controls/Controls';
4
4
  type HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;
5
5
  type FeedHeaderProps = HeaderProps & ControlsProps;
6
6
  type FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;
7
- export declare const FeedHeader: React.FC<FeedHeaderContainerProps>;
7
+ export declare const FeedHeader: ({ tags, services, handleLoadData, offset, background, theme, verticalOffset, className, queryParams, }: FeedHeaderContainerProps) => React.JSX.Element;
8
8
  export {};
@@ -23,9 +23,6 @@ unpredictable css rules order in build */
23
23
  width: 100%;
24
24
  max-width: 100%;
25
25
  }
26
- .bc-feed-controls__search .yc-text-input_view_normal .yc-text-input__control {
27
- border-color: var(--g-color-base-background);
28
- }
29
26
  .bc-feed-controls__select {
30
27
  width: 100%;
31
28
  }
@@ -33,9 +30,6 @@ unpredictable css rules order in build */
33
30
  max-height: 500px;
34
31
  border-radius: 12px;
35
32
  }
36
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter + .g-select-list {
37
- margin-top: 0;
38
- }
39
33
  .bc-feed-controls__popup.bc-feed-controls__popup .g-select-list {
40
34
  overflow: scroll;
41
35
  }
@@ -49,27 +43,15 @@ unpredictable css rules order in build */
49
43
  margin: 4px;
50
44
  border-radius: 8px;
51
45
  }
52
- .bc-feed-controls__popup.bc-feed-controls__popup .yc-text-input__content {
53
- padding: 4px;
54
- border: none;
55
- border-bottom: 1px solid var(--yc-color-line-generic);
56
- border-bottom-right-radius: 0;
57
- border-bottom-left-radius: 0;
58
- }
59
- .bc-feed-controls__popup.bc-feed-controls__popup .yc-text-input__content .yc-text-input__control.yc-text-input__control_type_input {
60
- border: none;
61
- }
62
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-list_size_xl .g-select-list__option {
63
- padding: 0 16px;
64
- }
65
46
 
66
- .bc-feed-controls__popup-filter .yc-text-input__control {
47
+ .bc-feed-controls__popup-filter {
67
48
  font-size: var(--g-text-body-2-font-size);
68
49
  line-height: var(--g-text-body-2-line-height);
50
+ padding: 4px 12px;
69
51
  border: none;
70
- }
71
- .bc-feed-controls__popup-filter .yc-text-input__control:hover, .bc-feed-controls__popup-filter .yc-text-input__control:focus {
72
- border: none;
52
+ border-bottom: 1px solid var(--yc-color-line-generic);
53
+ border-bottom-right-radius: 0;
54
+ border-bottom-left-radius: 0;
73
55
  }
74
56
  .bc-feed-controls__select:hover {
75
57
  width: 100%;
@@ -12,4 +12,4 @@ export type ControlsProps = {
12
12
  queryParams: Query;
13
13
  setQuery?: SetQueryType;
14
14
  };
15
- export declare const Controls: React.FC<ControlsProps>;
15
+ export declare const Controls: ({ handleLoadData, tags, services, queryParams, }: ControlsProps) => React.JSX.Element;
@@ -104,7 +104,7 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, }) =>
104
104
  defaultLabel: (0, i18n_1.i18)(i18n_1.Keyset.AllTags),
105
105
  }), disablePortal: true, virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption })),
106
106
  services.length > 0 ? (react_1.default.createElement("div", { className: b('filter-item') },
107
- react_1.default.createElement(uikit_1.Select, { className: b('select'), size: "xl", multiple: true, filterable: true, disablePortal: true, options: services, defaultValue: servicesItems, popupClassName: b('popup'), onUpdate: handleServicesSelect, placeholder: (0, i18n_1.i18)(i18n_1.Keyset.AllServices), renderControl: (0, customRenders_1.renderSwitcher)({
107
+ react_1.default.createElement(uikit_1.Select, { className: b('select'), size: "xl", multiple: true, filterable: true, hasClear: true, disablePortal: true, options: services, defaultValue: servicesItems, popupClassName: b('popup'), onUpdate: handleServicesSelect, placeholder: (0, i18n_1.i18)(i18n_1.Keyset.AllServices), renderControl: (0, customRenders_1.renderSwitcher)({
108
108
  initial: servicesItems,
109
109
  list: services,
110
110
  defaultLabel: (0, i18n_1.i18)(i18n_1.Keyset.AllServices),
@@ -13,8 +13,7 @@ const renderSwitcher = ({ initial, list, defaultLabel }) =>
13
13
  // eslint-disable-next-line react/display-name
14
14
  ({ onClick, ref }) => (react_1.default.createElement(CustomSwitcher_1.CustomSwitcher, { initial: initial, defaultLabel: defaultLabel, list: list, controlRef: ref, onClick: onClick }));
15
15
  exports.renderSwitcher = renderSwitcher;
16
- const renderFilter = ({ value, ref, onChange, onKeyDown }) => (react_1.default.createElement("div", { className: b('popup-filter') },
17
- react_1.default.createElement(uikit_1.TextInput, { controlRef: ref, controlProps: { size: 1 }, value: value, placeholder: (0, i18n_1.i18)(i18n_1.Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown })));
16
+ const renderFilter = ({ value, ref, onChange, onKeyDown }) => (react_1.default.createElement(uikit_1.TextInput, { controlRef: ref, controlProps: { size: 1 }, value: value, view: "clear", placeholder: (0, i18n_1.i18)(i18n_1.Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown, className: b('popup-filter') }));
18
17
  exports.renderFilter = renderFilter;
19
18
  const renderOption = (option) => (react_1.default.createElement(CustomSelectOption_1.CustomSelectOption, { data: option }));
20
19
  exports.renderOption = renderOption;
@@ -1,10 +1,10 @@
1
- import { ReactNode } from 'react';
2
- import { Modifications } from 'bem-cn-lite';
3
- import { ClassNameProps } from '../../models/common';
1
+ import type { ReactNode } from 'react';
2
+ import type { NoStrictEntityMods } from '@bem-react/classname';
3
+ import type { ClassNameProps } from '../../models/common';
4
4
  export interface PaginatorItemProps {
5
5
  key: string | ArrowType;
6
6
  dataKey: string | ArrowType;
7
- mods: Modifications;
7
+ mods: NoStrictEntityMods;
8
8
  content: ReactNode;
9
9
  onClick?: (key: number | ArrowType) => void;
10
10
  loading?: boolean;
@@ -1,15 +1,16 @@
1
1
  import React from 'react';
2
2
  import { MetrikaGoal } from '@gravity-ui/page-constructor';
3
- import { PostData } from '../../models/common';
3
+ import { PostCardSize, PostCardTitleHeadingLevel, PostData } from '../../models/common';
4
4
  type PostCardProps = {
5
5
  post: PostData;
6
6
  fullWidth?: boolean;
7
7
  showTag?: boolean;
8
- size?: 's' | 'm';
8
+ size?: PostCardSize;
9
+ titleHeadingLevel?: PostCardTitleHeadingLevel;
9
10
  /**
10
11
  * @deprecated Metrika will be deleted after launch of analyticsEvents
11
12
  */
12
13
  metrikaGoals?: MetrikaGoal;
13
14
  };
14
- export declare const PostCard: React.FC<PostCardProps>;
15
+ export declare const PostCard: ({ post, metrikaGoals, fullWidth, size, showTag, titleHeadingLevel, }: PostCardProps) => React.JSX.Element;
15
16
  export {};
@@ -5,10 +5,11 @@ const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importStar(require("react"));
6
6
  const page_constructor_1 = require("@gravity-ui/page-constructor");
7
7
  const LikesContext_1 = require("../../contexts/LikesContext");
8
+ const common_1 = require("../../models/common");
8
9
  const cn_1 = require("../../utils/cn");
9
10
  const SuggestPostInfo_1 = require("../PostInfo/SuggestPostInfo");
10
11
  const b = (0, cn_1.block)('post-card');
11
- const PostCard = ({ post, metrikaGoals, fullWidth = false, size = 's', showTag = false, }) => {
12
+ const PostCard = ({ post, metrikaGoals, fullWidth = false, size = common_1.PostCardSize.SMALL, showTag = false, titleHeadingLevel = common_1.PostCardTitleHeadingLevel.H3, }) => {
12
13
  var _a;
13
14
  const { title: postTitle, htmlTitle, textTitle, blogPostId, id, date, readingTime, hasUserLike, likes, image, description, tags, url, } = post;
14
15
  const title = postTitle || textTitle || htmlTitle;
@@ -25,9 +26,9 @@ const PostCard = ({ post, metrikaGoals, fullWidth = false, size = 's', showTag =
25
26
  react_1.default.createElement("div", { className: b('image-container'), "data-qa": "blog-suggest-header" })),
26
27
  react_1.default.createElement(page_constructor_1.CardBase.Content, null,
27
28
  showTag && ((_a = tags === null || tags === void 0 ? void 0 : tags[0]) === null || _a === void 0 ? void 0 : _a.name) && (react_1.default.createElement("div", { className: b('tag', { size }) }, tags[0].name)),
28
- title && (react_1.default.createElement("h4", { className: b('title', { size }) },
29
- react_1.default.createElement("span", null,
30
- react_1.default.createElement(page_constructor_1.HTML, null, title)))),
29
+ title &&
30
+ react_1.default.createElement(titleHeadingLevel, { className: b('title', { size }) }, react_1.default.createElement("span", null,
31
+ react_1.default.createElement(page_constructor_1.HTML, null, title))),
31
32
  description && (react_1.default.createElement(page_constructor_1.YFMWrapper, { className: b('description'), content: description, modifiers: {
32
33
  blog: size === 'm',
33
34
  blogCard: true,
@@ -26,5 +26,5 @@ type PostInfoProps = QAProps & {
26
26
  *
27
27
  * @returns jsx
28
28
  */
29
- export declare const PostInfo: React.FC<PostInfoProps>;
29
+ export declare const PostInfo: ({ date, readingTime, postId, theme, metrikaGoals, qa, }: PostInfoProps) => React.JSX.Element;
30
30
  export {};
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- import { PostData, QAProps, ToggleLikeCallbackType } from '../../models/common';
2
+ import { PostCardSize, PostData, QAProps, ToggleLikeCallbackType } from '../../models/common';
3
3
  export interface SuggestPostInfoProps extends Pick<PostData, 'date' | 'readingTime' | 'hasUserLike'>, QAProps {
4
4
  postId: PostData['blogPostId'];
5
- size?: 's' | 'm';
5
+ size?: PostCardSize;
6
6
  likes?: {
7
7
  likesCount?: number;
8
8
  hasUserLike?: boolean;
@@ -23,4 +23,4 @@ export interface SuggestPostInfoProps extends Pick<PostData, 'date' | 'readingTi
23
23
  *
24
24
  * @returns jsx
25
25
  */
26
- export declare const SuggestPostInfo: React.FC<SuggestPostInfoProps>;
26
+ export declare const SuggestPostInfo: ({ postId, date, readingTime, likes, size, qa, }: SuggestPostInfoProps) => React.JSX.Element;
@@ -4,6 +4,7 @@ exports.SuggestPostInfo = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
6
  const useLikes_1 = require("../../hooks/useLikes");
7
+ const common_1 = require("../../models/common");
7
8
  const cn_1 = require("../../utils/cn");
8
9
  const Date_1 = require("./components/Date");
9
10
  const ReadingTime_1 = require("./components/ReadingTime");
@@ -23,7 +24,7 @@ const b = (0, cn_1.block)('post-info');
23
24
  *
24
25
  * @returns jsx
25
26
  */
26
- const SuggestPostInfo = ({ postId, date, readingTime, likes, size = 's', qa, }) => {
27
+ const SuggestPostInfo = ({ postId, date, readingTime, likes, size = common_1.PostCardSize.SMALL, qa, }) => {
27
28
  const { hasUserLike, likesCount, handleLike } = (0, useLikes_1.useLikes)({
28
29
  hasLike: likes === null || likes === void 0 ? void 0 : likes.hasUserLike,
29
30
  count: likes === null || likes === void 0 ? void 0 : likes.likesCount,
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
+ import { PostCardSize } from '../../../models/common';
2
3
  type DateProps = {
3
4
  date: string | number;
4
- size?: 's' | 'm';
5
+ size?: PostCardSize;
5
6
  };
6
- export declare const Date: React.FC<DateProps>;
7
+ export declare const Date: ({ date, size }: DateProps) => React.JSX.Element;
7
8
  export {};
@@ -4,10 +4,11 @@ exports.Date = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importStar(require("react"));
6
6
  const LocaleContext_1 = require("../../../contexts/LocaleContext");
7
+ const common_1 = require("../../../models/common");
7
8
  const cn_1 = require("../../../utils/cn");
8
9
  const date_1 = require("../../../utils/date");
9
10
  const b = (0, cn_1.block)('post-info');
10
- const Date = ({ date, size = 's' }) => {
11
+ const Date = ({ date, size = common_1.PostCardSize.SMALL }) => {
11
12
  const { locale } = (0, react_1.useContext)(LocaleContext_1.LocaleContext);
12
13
  return react_1.default.createElement("div", { className: b('item', { size }) }, (0, date_1.format)(date, 'longDate', locale === null || locale === void 0 ? void 0 : locale.code));
13
14
  };
@@ -3,5 +3,5 @@ type ReadingTimeProps = {
3
3
  readingTime: number;
4
4
  size?: 's' | 'm';
5
5
  };
6
- export declare const ReadingTime: React.FC<ReadingTimeProps>;
6
+ export declare const ReadingTime: ({ readingTime, size }: ReadingTimeProps) => React.JSX.Element;
7
7
  export {};
@@ -24,5 +24,5 @@ type SaveProps = QAProps & {
24
24
  *
25
25
  * @returns jsx
26
26
  */
27
- export declare const Save: React.FC<SaveProps>;
27
+ export declare const Save: ({ title, postId, hasUserLike, handleUserLike, metrikaGoal, size, theme, qa, }: SaveProps) => React.JSX.Element;
28
28
  export {};
@@ -6,5 +6,5 @@ type SharingProps = {
6
6
  */
7
7
  metrikaGoal?: string;
8
8
  };
9
- export declare const Sharing: React.FC<SharingProps>;
9
+ export declare const Sharing: ({ theme, metrikaGoal }: SharingProps) => React.JSX.Element;
10
10
  export {};
@@ -14,5 +14,5 @@ type PostCardProps = {
14
14
  pinnedPostOnPage?: PostData;
15
15
  pageCountForShowSupportButtons?: number;
16
16
  };
17
- export declare const Posts: React.FC<PostCardProps>;
17
+ export declare const Posts: ({ containerId, pinnedPostOnPage, currentPage, postsOnPage, isShowMoreVisible, errorShowMore, postCountOnPage, perPageInQuery, isFetching, handleShowMore, handlePageChange, pageCountForShowSupportButtons, }: PostCardProps) => React.JSX.Element;
18
18
  export {};
@@ -6,6 +6,7 @@ const react_1 = tslib_1.__importDefault(require("react"));
6
6
  const page_constructor_1 = require("@gravity-ui/page-constructor");
7
7
  const uikit_1 = require("@gravity-ui/uikit");
8
8
  const i18n_1 = require("../../i18n");
9
+ const common_1 = require("../../models/common");
9
10
  const cn_1 = require("../../utils/cn");
10
11
  const Paginator_1 = require("../Paginator/Paginator");
11
12
  const PostCard_1 = require("../PostCard/PostCard");
@@ -15,12 +16,14 @@ const Posts = ({ containerId, pinnedPostOnPage, currentPage, postsOnPage, isShow
15
16
  isFetching && react_1.default.createElement("div", { className: b('loaderContainer') }),
16
17
  react_1.default.createElement("div", { id: containerId, className: b('cards-container', { isLoading: isFetching }) },
17
18
  pinnedPostOnPage && currentPage === 1 && (react_1.default.createElement("div", { className: b('pinned-container') },
18
- react_1.default.createElement(PostCard_1.PostCard, { post: pinnedPostOnPage, size: "m", fullWidth: true, showTag: true }))),
19
+ react_1.default.createElement(PostCard_1.PostCard, { post: pinnedPostOnPage, size: common_1.PostCardSize.MEDIUM, fullWidth: true, showTag: true, titleHeadingLevel: common_1.PostCardTitleHeadingLevel.H2 }))),
19
20
  (postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.length) ? (react_1.default.createElement(page_constructor_1.CardLayoutBlock, { title: '', colSizes: {
20
21
  all: 12,
21
22
  lg: 4,
22
23
  md: 6,
23
- } }, postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.map((post) => (react_1.default.createElement(PostCard_1.PostCard, { key: post.id, post: post, showTag: true }))))) : (react_1.default.createElement(PostsEmpty_1.PostsEmpty, null))),
24
+ } }, postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.map((post) => (react_1.default.createElement(PostCard_1.PostCard, { key: post.id, post: post, showTag: true, titleHeadingLevel: pinnedPostOnPage
25
+ ? common_1.PostCardTitleHeadingLevel.H3
26
+ : common_1.PostCardTitleHeadingLevel.H2 }))))) : (react_1.default.createElement(PostsEmpty_1.PostsEmpty, null))),
24
27
  react_1.default.createElement("div", { className: b('pagination') },
25
28
  Boolean(isShowMoreVisible && (postsOnPage === null || postsOnPage === void 0 ? void 0 : postsOnPage.length)) && (react_1.default.createElement(uikit_1.Button, { view: "outlined", size: "xl", className: b('more-button'), onClick: handleShowMore }, (0, i18n_1.i18)(i18n_1.Keyset.ActionLoadMore))),
26
29
  errorShowMore && (react_1.default.createElement("div", { className: b('error-show-more') },
@@ -1,2 +1,2 @@
1
1
  import React from 'react';
2
- export declare const PostsEmpty: React.FC;
2
+ export declare const PostsEmpty: () => React.JSX.Element;
@@ -2,5 +2,5 @@ import React from 'react';
2
2
  type PostsErrorContainerProps = {
3
3
  onButtonClick?: () => void | Promise<void>;
4
4
  };
5
- export declare const PostsError: React.FC<PostsErrorContainerProps>;
5
+ export declare const PostsError: ({ onButtonClick }: PostsErrorContainerProps) => React.JSX.Element;
6
6
  export {};
@@ -7,30 +7,28 @@ unpredictable css rules order in build */
7
7
  display: flex;
8
8
  align-items: center;
9
9
  justify-content: flex-end;
10
- height: 44px;
11
10
  transition: width 0.3s;
12
11
  }
13
- .bc-search__close-button, .bc-search__search-button {
14
- position: absolute;
15
- z-index: 2;
16
- right: 10px;
12
+ .bc-search__input-icon {
13
+ display: flex;
14
+ padding-right: 7px;
17
15
  color: var(--g-color-text-hint);
16
+ cursor: pointer;
18
17
  }
19
- .bc-search__search-button:hover {
20
- color: var(--g-color-text-secondary);
18
+ .bc-search__search-suggest {
19
+ display: flex;
20
+ align-items: center;
21
+ height: 44px;
22
+ background-color: var(--g-color-base-background);
23
+ border-radius: var(--bc-text-input-border-radius);
24
+ border: 1px solid var(--g-color-base-background);
21
25
  }
22
- .bc-search__search-suggest-container {
23
- width: 100%;
26
+ .bc-search__search-suggest:hover, .bc-search__search-suggest:focus {
27
+ border: 1px solid var(--g-color-base-generic-hover);
24
28
  }
25
29
  .bc-search .bc-search__search-suggest-control {
26
- background-color: var(--g-color-base-background);
27
30
  padding-left: 12px;
28
31
  padding-right: 32px;
29
- border-radius: var(--bc-text-input-border-radius);
30
- border: 1px solid transparent;
31
- }
32
- .bc-search .bc-search__search-suggest-control:hover, .bc-search .bc-search__search-suggest-control:focus {
33
- border: 1px solid var(--g-color-base-generic-hover);
34
32
  }
35
33
  .bc-search_size_s {
36
34
  --bc-text-input-border-radius: var(--g-border-radius-l);
@@ -11,5 +11,11 @@ interface SearchProps extends ClassNameProps {
11
11
  autoFocus?: boolean;
12
12
  className?: string;
13
13
  }
14
- export declare const Search: React.FC<SearchProps>;
14
+ /**
15
+ * Search component, placed on blog main page,
16
+ * based on TextInput from uikit
17
+ *
18
+ * @returns {JSX|null}
19
+ */
20
+ export declare const Search: ({ className, initialValue, onSubmit, debounce, placeholder, size, autoFocus, value: externalValue, }: SearchProps) => React.JSX.Element;
15
21
  export {};
@@ -10,12 +10,17 @@ const i18n_1 = require("../../i18n");
10
10
  const Close_1 = require("../../icons/Close");
11
11
  const SearchIcon_1 = require("../../icons/SearchIcon");
12
12
  const cn_1 = require("../../utils/cn");
13
- const ButtonWithIcon_1 = require("../ButtonWithIcon/ButtonWithIcon");
14
13
  const b = (0, cn_1.block)('search');
15
14
  const SEARCH_ICON_SIZE = 16;
16
15
  const CLOSE_ICON_SIZE = 12;
17
- const Search = (props) => {
18
- const { className, initialValue, onSubmit, debounce = 300, placeholder = (0, i18n_1.i18)(i18n_1.Keyset.Search), size = 'm', autoFocus = false, value: externalValue, } = props;
16
+ const AUTOFOCUS_TIMEOUT = 0;
17
+ /**
18
+ * Search component, placed on blog main page,
19
+ * based on TextInput from uikit
20
+ *
21
+ * @returns {JSX|null}
22
+ */
23
+ const Search = ({ className, initialValue, onSubmit, debounce = 300, placeholder = (0, i18n_1.i18)(i18n_1.Keyset.Search), size = 'm', autoFocus = false, value: externalValue, }) => {
19
24
  const handleChange = (0, lodash_1.debounce)(onSubmit, debounce);
20
25
  const [value, setValue] = (0, react_1.useState)(initialValue);
21
26
  const inputRef = (0, react_1.useRef)(null);
@@ -27,21 +32,28 @@ const Search = (props) => {
27
32
  }, [externalValue]);
28
33
  (0, react_1.useEffect)(() => {
29
34
  if (autoFocus && !isIPhone) {
30
- setTimeout(() => { var _a; return (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus({ preventScroll: true }); }, 0);
35
+ setTimeout(() => { var _a; return (_a = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) === null || _a === void 0 ? void 0 : _a.focus({ preventScroll: true }); }, AUTOFOCUS_TIMEOUT);
31
36
  }
32
37
  }, [autoFocus, inputRef, isIPhone]);
33
- return (react_1.default.createElement("div", { className: b({ size }, className) },
34
- react_1.default.createElement("div", { className: b('search-suggest-container') },
35
- react_1.default.createElement(uikit_1.TextInput, { className: b('search-suggest'), value: value, onUpdate: (query) => {
36
- setValue(query);
37
- handleChange(query);
38
- }, placeholder: placeholder, size: size === 'm' ? 'xl' : 'l', controlRef: inputRef, view: "clear", controlProps: {
39
- className: b('search-suggest-control'),
40
- } })),
41
- value ? (react_1.default.createElement(ButtonWithIcon_1.ButtonWithIcon, { className: b('close-button'), icon: Close_1.Close, iconSize: CLOSE_ICON_SIZE, size: "xs", onClick: () => {
38
+ const rightContent = (0, react_1.useMemo)(() => {
39
+ const iconData = value ? Close_1.Close : SearchIcon_1.SearchIcon;
40
+ const iconSize = value ? CLOSE_ICON_SIZE : SEARCH_ICON_SIZE;
41
+ const handleClick = () => {
42
+ if (value) {
42
43
  handleChange.cancel();
43
44
  setValue('');
44
45
  onSubmit('');
45
- } })) : (react_1.default.createElement(ButtonWithIcon_1.ButtonWithIcon, { className: b('search-button'), icon: SearchIcon_1.SearchIcon, iconSize: SEARCH_ICON_SIZE, size: "xs", disabled: true }))));
46
+ }
47
+ };
48
+ return (react_1.default.createElement("div", { className: b('input-icon'), onClick: handleClick },
49
+ react_1.default.createElement(uikit_1.Icon, { size: iconSize, data: iconData })));
50
+ }, [handleChange, onSubmit, value]);
51
+ return (react_1.default.createElement("div", { className: b({ size }, className) },
52
+ react_1.default.createElement(uikit_1.TextInput, { className: b('search-suggest'), value: value, onUpdate: (query) => {
53
+ setValue(query);
54
+ handleChange(query);
55
+ }, placeholder: placeholder, size: size === 'm' ? 'xl' : 'l', controlRef: inputRef, view: "clear", controlProps: {
56
+ className: b('search-suggest-control'),
57
+ }, rightContent: rightContent })));
46
58
  };
47
59
  exports.Search = Search;
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { PropsWithChildren } from 'react';
2
2
  import { AnalyticsContextProps } from '@gravity-ui/page-constructor';
3
3
  import { DeviceContextProps } from '../contexts/DeviceContext';
4
4
  import { RouterContextProps } from '../contexts/RouterContext';
@@ -15,4 +15,4 @@ export interface BlogConstructorProviderProps {
15
15
  settings?: SettingsContextProps;
16
16
  children?: React.ReactNode;
17
17
  }
18
- export declare const BlogConstructorProvider: React.FC<BlogConstructorProviderProps>;
18
+ export declare const BlogConstructorProvider: ({ isMobile, locale, router, theme, device, analytics, settings, children, }: PropsWithChildren<BlogConstructorProviderProps>) => React.JSX.Element;