@gravity-ui/blog-constructor 5.16.1-alpha.1 → 6.0.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 (115) hide show
  1. package/README.md +5 -5
  2. package/build/cjs/blocks/Banner/Banner.js +7 -9
  3. package/build/cjs/blocks/CTA/CTA.js +7 -9
  4. package/build/cjs/blocks/Feed/Feed.js +6 -14
  5. package/build/cjs/blocks/Header/Header.js +10 -14
  6. package/build/cjs/blocks/Media/Media.js +1 -0
  7. package/build/cjs/blocks/Meta/Meta.js +11 -15
  8. package/build/cjs/blocks/Suggest/Suggest.js +8 -11
  9. package/build/cjs/components/FeedHeader/components/Controls/Controls.css +19 -5
  10. package/build/cjs/components/FeedHeader/components/Controls/Controls.js +22 -27
  11. package/build/cjs/components/FeedHeader/components/Controls/customRenders.js +1 -1
  12. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +4 -1
  13. package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +2 -2
  14. package/build/cjs/components/Paginator/Paginator.js +16 -19
  15. package/build/cjs/components/Paginator/components/NavigationButton.js +1 -1
  16. package/build/cjs/components/PostCard/PostCard.d.ts +3 -6
  17. package/build/cjs/components/PostCard/PostCard.js +2 -2
  18. package/build/cjs/components/PostInfo/PostInfo.css +8 -0
  19. package/build/cjs/components/PostInfo/PostInfo.d.ts +4 -10
  20. package/build/cjs/components/PostInfo/PostInfo.js +4 -4
  21. package/build/cjs/components/PostInfo/SuggestPostInfo.js +4 -1
  22. package/build/cjs/components/PostInfo/components/ReadingTime.js +1 -1
  23. package/build/cjs/components/PostInfo/components/Save.d.ts +4 -6
  24. package/build/cjs/components/PostInfo/components/Save.js +4 -7
  25. package/build/cjs/components/PostInfo/components/Sharing.d.ts +3 -5
  26. package/build/cjs/components/PostInfo/components/Sharing.js +4 -10
  27. package/build/cjs/components/Posts/Posts.js +3 -3
  28. package/build/cjs/components/PostsEmpty/PostsEmpty.js +2 -2
  29. package/build/cjs/components/PostsError/PostsError.js +3 -3
  30. package/build/cjs/components/PromptSignIn/PromptSignIn.js +2 -2
  31. package/build/cjs/components/Search/Search.css +3 -0
  32. package/build/cjs/components/Search/Search.js +2 -2
  33. package/build/cjs/constants.d.ts +2 -1
  34. package/build/cjs/constants.js +20 -19
  35. package/build/cjs/constructor/BlogConstructorProvider.js +1 -0
  36. package/build/cjs/containers/BlogPostPage/BlogPostPage.css +1 -1
  37. package/build/cjs/contexts/LocaleContext.js +2 -2
  38. package/build/cjs/counters/metrika.js +0 -3
  39. package/build/cjs/counters/utils.d.ts +1 -1
  40. package/build/cjs/counters/utils.js +7 -7
  41. package/build/cjs/i18n/index.d.ts +1 -3
  42. package/build/cjs/i18n/index.js +8 -10
  43. package/build/cjs/index.d.ts +0 -1
  44. package/build/cjs/index.js +1 -3
  45. package/build/cjs/models/common.d.ts +1 -1
  46. package/build/cjs/models/locale.d.ts +1 -4
  47. package/build/cjs/models/locale.js +1 -6
  48. package/build/cjs/utils/common.d.ts +15 -3
  49. package/build/cjs/utils/common.js +20 -19
  50. package/build/esm/blocks/Banner/Banner.js +8 -10
  51. package/build/esm/blocks/CTA/CTA.js +8 -10
  52. package/build/esm/blocks/Feed/Feed.js +9 -17
  53. package/build/esm/blocks/Header/Header.js +12 -16
  54. package/build/esm/blocks/Media/Media.js +1 -0
  55. package/build/esm/blocks/Meta/Meta.js +13 -17
  56. package/build/esm/blocks/Suggest/Suggest.js +9 -12
  57. package/build/esm/components/FeedHeader/components/Controls/Controls.css +19 -5
  58. package/build/esm/components/FeedHeader/components/Controls/Controls.js +25 -30
  59. package/build/esm/components/FeedHeader/components/Controls/customRenders.js +2 -2
  60. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +4 -1
  61. package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +2 -2
  62. package/build/esm/components/Paginator/Paginator.js +18 -21
  63. package/build/esm/components/Paginator/components/NavigationButton.js +2 -2
  64. package/build/esm/components/PostCard/PostCard.d.ts +3 -6
  65. package/build/esm/components/PostCard/PostCard.js +2 -2
  66. package/build/esm/components/PostInfo/PostInfo.css +8 -0
  67. package/build/esm/components/PostInfo/PostInfo.d.ts +4 -10
  68. package/build/esm/components/PostInfo/PostInfo.js +4 -4
  69. package/build/esm/components/PostInfo/SuggestPostInfo.js +4 -1
  70. package/build/esm/components/PostInfo/components/ReadingTime.js +2 -2
  71. package/build/esm/components/PostInfo/components/Save.d.ts +4 -6
  72. package/build/esm/components/PostInfo/components/Save.js +4 -7
  73. package/build/esm/components/PostInfo/components/Sharing.d.ts +3 -5
  74. package/build/esm/components/PostInfo/components/Sharing.js +5 -11
  75. package/build/esm/components/Posts/Posts.js +4 -4
  76. package/build/esm/components/PostsEmpty/PostsEmpty.js +3 -3
  77. package/build/esm/components/PostsError/PostsError.js +4 -4
  78. package/build/esm/components/PromptSignIn/PromptSignIn.js +3 -3
  79. package/build/esm/components/Search/Search.css +3 -0
  80. package/build/esm/components/Search/Search.js +3 -3
  81. package/build/esm/constants.d.ts +2 -1
  82. package/build/esm/constants.js +19 -18
  83. package/build/esm/constructor/BlogConstructorProvider.js +2 -1
  84. package/build/esm/containers/BlogPostPage/BlogPostPage.css +1 -1
  85. package/build/esm/contexts/LocaleContext.js +1 -1
  86. package/build/esm/counters/metrika.js +0 -3
  87. package/build/esm/counters/utils.d.ts +1 -1
  88. package/build/esm/counters/utils.js +6 -6
  89. package/build/esm/i18n/index.d.ts +1 -3
  90. package/build/esm/i18n/index.js +7 -9
  91. package/build/esm/index.d.ts +0 -1
  92. package/build/esm/index.js +0 -1
  93. package/build/esm/models/common.d.ts +1 -1
  94. package/build/esm/models/locale.d.ts +1 -4
  95. package/build/esm/models/locale.js +0 -5
  96. package/build/esm/utils/common.d.ts +15 -3
  97. package/build/esm/utils/common.js +18 -17
  98. package/package.json +15 -14
  99. package/server/data/contentFilter.d.ts +1 -1
  100. package/server/data/contentFilter.js +2 -1
  101. package/server/data/transformPageContent.d.ts +2 -2
  102. package/server/data/transformPost.d.ts +7 -2
  103. package/server/data/transformPost.js +1 -1
  104. package/server/index.d.ts +1 -1
  105. package/server/models/common.d.ts +1 -1
  106. package/server/models/locale.d.ts +1 -4
  107. package/server/models/locale.js +1 -6
  108. package/styles/storybook/common.scss +8 -0
  109. package/styles/storybook/index.scss +1 -1
  110. package/styles/styles.css +115 -0
  111. package/styles/styles.scss +1 -0
  112. package/build/cjs/configure.d.ts +0 -5
  113. package/build/cjs/configure.js +0 -8
  114. package/build/esm/configure.d.ts +0 -5
  115. package/build/esm/configure.js +0 -4
package/README.md CHANGED
@@ -60,14 +60,14 @@ import {
60
60
  } from '@gravity-ui/blog-constructor/server';
61
61
  ```
62
62
 
63
- ## i18n
64
-
65
- To make sure the i18n library used in your project runs properly, perform its initialization and set the project's current locale value in `lang`. For example:
63
+ The `blog-constructor` is a `uikit-based` library, and we use an instance of `i18n` from uikit. To set up internationalization, you just need to use the `configure` from uikit:
66
64
 
67
65
  ```typescript
68
- import {configure, Lang} from '@gravity-ui/blog-constructor';
66
+ import {configure} from '@gravity-ui/uikit';
69
67
 
70
- configure({lang: Lang.En});
68
+ configure({
69
+ lang: 'ru',
70
+ });
71
71
  ```
72
72
 
73
73
  ## Development
@@ -5,12 +5,17 @@ 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
7
  const Wrapper_1 = require("../../components/Wrapper/Wrapper");
8
- const constants_1 = require("../../constants");
9
8
  const paddings_1 = require("../../models/paddings");
10
9
  const cn_1 = require("../../utils/cn");
11
10
  const common_1 = require("../../utils/common");
11
+ const constants_1 = require("../../constants");
12
+ const utils_1 = require("../../counters/utils");
12
13
  const b = (0, cn_1.block)('banner');
13
14
  const BANNER_CUSTOM_QA_ATTRIBUTES = ['image-container'];
15
+ const buttonGoals = (0, common_1.prepareAnalyticsEvent)({
16
+ name: constants_1.DefaultGoalIds.bannerCommon,
17
+ counter: utils_1.AnalyticsCounter.CrossSite,
18
+ });
14
19
  const Banner = (_a) => {
15
20
  var _b;
16
21
  var { color, imageSize = 's', image, paddingTop, paddingBottom, qa } = _a, content = tslib_1.__rest(_a, ["color", "imageSize", "image", "paddingTop", "paddingBottom", "qa"]);
@@ -20,16 +25,9 @@ const Banner = (_a) => {
20
25
  contentStyle.backgroundColor = color;
21
26
  }
22
27
  const contentData = (0, common_1.updateContentSizes)(content);
23
- /**
24
- * @deprecated Metrika will be deleted after launch of analyticsEvents
25
- */
26
- const metrikaGoal = {
27
- name: constants_1.BlogMetrikaGoalIds.bannerCommon,
28
- isCrossSite: true,
29
- };
30
28
  (_b = contentData.buttons) === null || _b === void 0 ? void 0 : _b.forEach((button) => {
31
29
  // eslint-disable-next-line no-not-accumulator-reassign/no-not-accumulator-reassign
32
- button.metrikaGoals = (0, common_1.getBlogElementMetrika)(metrikaGoal, button.metrikaGoals);
30
+ button.analyticsEvents = (0, common_1.getMergedAnalyticsEvents)(buttonGoals, button.analyticsEvents);
33
31
  });
34
32
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
35
33
  [paddings_1.PaddingsDirections.top]: paddingTop,
@@ -5,19 +5,17 @@ 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
7
  const Wrapper_1 = require("../../components/Wrapper/Wrapper");
8
- const constants_1 = require("../../constants");
9
8
  const paddings_1 = require("../../models/paddings");
10
9
  const cn_1 = require("../../utils/cn");
11
10
  const common_1 = require("../../utils/common");
11
+ const constants_1 = require("../../constants");
12
+ const utils_1 = require("../../counters/utils");
12
13
  const b = (0, cn_1.block)('cta');
14
+ const linkGoals = (0, common_1.prepareAnalyticsEvent)({
15
+ name: constants_1.DefaultGoalIds.cta,
16
+ counter: utils_1.AnalyticsCounter.CrossSite,
17
+ });
13
18
  const CTA = ({ items, paddingTop, paddingBottom, qa }) => {
14
- /**
15
- * @deprecated Metrika will be deleted after launch of analyticsEvents
16
- */
17
- const metrikaGoal = {
18
- name: constants_1.BlogMetrikaGoalIds.cta,
19
- isCrossSite: true,
20
- };
21
19
  const qaAttributes = (0, common_1.getQaAttributes)(qa, 'card');
22
20
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
23
21
  [paddings_1.PaddingsDirections.top]: paddingTop,
@@ -27,7 +25,7 @@ const CTA = ({ items, paddingTop, paddingBottom, qa }) => {
27
25
  const contentData = (0, common_1.updateContentSizes)(content);
28
26
  (_a = contentData.links) === null || _a === void 0 ? void 0 : _a.forEach((link) => {
29
27
  // eslint-disable-next-line no-not-accumulator-reassign/no-not-accumulator-reassign
30
- link.metrikaGoals = (0, common_1.getBlogElementMetrika)(metrikaGoal, link.metrikaGoals);
28
+ link.analyticsEvents = (0, common_1.getMergedAnalyticsEvents)(linkGoals, link.analyticsEvents);
31
29
  });
32
30
  return (react_1.default.createElement("div", { key: index, className: b('card'), "data-qa": qaAttributes.card },
33
31
  react_1.default.createElement(page_constructor_1.Content, Object.assign({}, contentData, { qa: qaAttributes.content }))));
@@ -4,9 +4,6 @@ exports.Feed = void 0;
4
4
  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
- /**
8
- * @deprecated Metrika will be deleted after launch of analyticsEvents
9
- */
10
7
  const uikit_1 = require("@gravity-ui/uikit");
11
8
  const FeedHeader_1 = require("../../components/FeedHeader/FeedHeader");
12
9
  const Posts_1 = require("../../components/Posts/Posts");
@@ -14,10 +11,6 @@ const PostsError_1 = require("../../components/PostsError/PostsError");
14
11
  const constants_1 = require("../../constants");
15
12
  const FeedContext_1 = require("../../contexts/FeedContext");
16
13
  const RouterContext_1 = require("../../contexts/RouterContext");
17
- /**
18
- * @deprecated Metrika will be deleted after launch of analyticsEvents
19
- */
20
- const metrika_1 = tslib_1.__importDefault(require("../../counters/metrika"));
21
14
  const utils_1 = require("../../counters/utils");
22
15
  const common_1 = require("../../models/common");
23
16
  const common_2 = require("../../utils/common");
@@ -31,6 +24,10 @@ const Feed = ({ image }) => {
31
24
  const { posts, totalCount, tags, services, pinnedPost, getPosts, pageCountForShowSupportButtons, } = (0, react_1.useContext)(FeedContext_1.FeedContext);
32
25
  const router = (0, react_1.useContext)(RouterContext_1.RouterContext);
33
26
  const handleAnalytics = (0, page_constructor_1.useAnalytics)(common_1.DefaultEventNames.ShowMore);
27
+ const additionalAnalyticsEvent = (0, common_2.prepareAnalyticsEvent)({
28
+ name: constants_1.DefaultGoalIds.showMore,
29
+ counter: utils_1.AnalyticsCounter.CrossSite,
30
+ });
34
31
  const [{ errorLoad, errorShowMore, isFetching, isShowMoreVisible, lastLoadedCount, postCountOnPage, postsOnPage, pinnedPostOnPage, currentPage, queryParams, }, dispatch,] = (0, react_1.useReducer)(reducer_1.reducer, {
35
32
  errorLoad: false,
36
33
  errorShowMore: false,
@@ -56,12 +53,11 @@ const Feed = ({ image }) => {
56
53
  dispatch({ type: reducer_1.ActionTypes.SetErrorLoad, payload: value });
57
54
  };
58
55
  const handleChangeQueryParams = (0, react_1.useCallback)((value) => {
59
- var _a;
60
56
  dispatch({ type: reducer_1.ActionTypes.QueryParamsChange, payload: value });
61
57
  const hasFirstPageQuery = Object.keys(value).some((queryKey) => queryKey === PAGE_QUERY && value[queryKey] === FIRST_PAGE);
62
58
  const result = hasFirstPageQuery
63
59
  ? Object.assign(Object.assign({}, value), { [PAGE_QUERY]: null }) : Object.assign({}, value);
64
- (_a = router === null || router === void 0 ? void 0 : router.updateQueryCallback) === null || _a === void 0 ? void 0 : _a.call(router, result);
60
+ router.updateQueryCallback(result);
65
61
  }, [router]);
66
62
  const fetchData = (0, react_1.useCallback)(async ({ page, query }) => {
67
63
  if (query && getPosts) {
@@ -106,11 +102,7 @@ const Feed = ({ image }) => {
106
102
  });
107
103
  };
108
104
  const handleShowMore = async () => {
109
- /**
110
- * @deprecated Metrika will be deleted after launch of analyticsEvents
111
- */
112
- metrika_1.default.reachGoal(utils_1.MetrikaCounter.CrossSite, constants_1.BlogMetrikaGoalIds.showMore);
113
- handleAnalytics();
105
+ handleAnalytics(additionalAnalyticsEvent);
114
106
  const nextPage = currentPage + 1;
115
107
  try {
116
108
  setIsFetching(true);
@@ -12,19 +12,15 @@ const PostPageContext_1 = require("../../contexts/PostPageContext");
12
12
  const paddings_1 = require("../../models/paddings");
13
13
  const common_1 = require("../../utils/common");
14
14
  const SettingsContext_1 = require("../../contexts/SettingsContext");
15
- /**
16
- * @deprecated Metrika will be deleted after launch of analyticsEvents
17
- */
18
- const metrikaGoals = {
19
- sharing: constants_1.BlogMetrikaGoalIds.shareTop,
20
- save: constants_1.BlogMetrikaGoalIds.saveTop,
15
+ const utils_1 = require("../../counters/utils");
16
+ const analyticsEventsContainer = {
17
+ sharing: (0, common_1.prepareAnalyticsEvent)({ name: constants_1.DefaultGoalIds.shareTop }),
18
+ save: (0, common_1.prepareAnalyticsEvent)({ name: constants_1.DefaultGoalIds.saveTop }),
21
19
  };
22
- const breadcrumbsGoals = [
23
- {
24
- name: constants_1.BlogMetrikaGoalIds.breadcrumbsTop,
25
- isCrossSite: true,
26
- },
27
- ];
20
+ const breadcrumbsGoals = (0, common_1.prepareAnalyticsEvent)({
21
+ name: constants_1.DefaultGoalIds.breadcrumbsTop,
22
+ counter: utils_1.AnalyticsCounter.CrossSite,
23
+ });
28
24
  const Header = (props) => {
29
25
  const { theme, paddingTop, paddingBottom } = props;
30
26
  const { post } = (0, react_1.useContext)(PostPageContext_1.PostPageContext);
@@ -36,12 +32,12 @@ const Header = (props) => {
36
32
  if (theme === 'dark' && breadcrumbs) {
37
33
  breadcrumbs.theme = 'dark';
38
34
  }
39
- breadcrumbs.metrikaGoals = breadcrumbsGoals;
35
+ breadcrumbs.analyticsEvents = breadcrumbsGoals;
40
36
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
41
37
  [paddings_1.PaddingsDirections.top]: paddingTop,
42
38
  [paddings_1.PaddingsDirections.bottom]: paddingBottom,
43
39
  } },
44
40
  react_1.default.createElement(page_constructor_1.HeaderBlock, Object.assign({}, props, { title: title, description: description, breadcrumbs: breadcrumbs }),
45
- react_1.default.createElement(PostInfo_1.PostInfo, { postId: id, date: date, readingTime: readingTime, metrikaGoals: metrikaGoals, theme: theme, qa: "blog-header-meta-container" }))));
41
+ react_1.default.createElement(PostInfo_1.PostInfo, { postId: id, date: date, readingTime: readingTime, analyticsEventsContainer: analyticsEventsContainer, theme: theme, qa: "blog-header-meta-container" }))));
46
42
  };
47
43
  exports.Header = Header;
@@ -18,6 +18,7 @@ const Media = (_a) => {
18
18
  react_1.default.createElement(page_constructor_1.Media, Object.assign({ className: b('content'), videoClassName: b('video'), imageClassName: b('image') }, mediaProps))),
19
19
  text && (react_1.default.createElement("div", { className: b('text-content') },
20
20
  react_1.default.createElement(page_constructor_1.YFMWrapper, { content: text, modifiers: {
21
+ blog: true,
21
22
  blogMedia: true,
22
23
  resetPaddings: true,
23
24
  } })))));
@@ -13,20 +13,16 @@ const PostPageContext_1 = require("../../contexts/PostPageContext");
13
13
  const paddings_1 = require("../../models/paddings");
14
14
  const cn_1 = require("../../utils/cn");
15
15
  const common_1 = require("../../utils/common");
16
+ const utils_1 = require("../../counters/utils");
16
17
  const b = (0, cn_1.block)('meta');
17
- /**
18
- * @deprecated Metrika will be deleted after launch of analyticsEvents
19
- */
20
- const metrikaGoals = {
21
- sharing: constants_1.BlogMetrikaGoalIds.shareBottom,
22
- save: constants_1.BlogMetrikaGoalIds.saveBottom,
18
+ const analyticsEventsContainer = {
19
+ sharing: (0, common_1.prepareAnalyticsEvent)({ name: constants_1.DefaultGoalIds.shareBottom }),
20
+ save: (0, common_1.prepareAnalyticsEvent)({ name: constants_1.DefaultGoalIds.saveBottom }),
23
21
  };
24
- const breadcrumbsGoals = [
25
- {
26
- name: constants_1.BlogMetrikaGoalIds.breadcrumbsBottom,
27
- isCrossSite: true,
28
- },
29
- ];
22
+ const breadcrumbsGoals = (0, common_1.prepareAnalyticsEvent)({
23
+ name: constants_1.DefaultGoalIds.breadcrumbsBottom,
24
+ counter: utils_1.AnalyticsCounter.CrossSite,
25
+ });
30
26
  const Meta = (props) => {
31
27
  const { paddingTop = 'l', paddingBottom = 'l', theme = 'light', qa } = props;
32
28
  const { post } = (0, react_1.useContext)(PostPageContext_1.PostPageContext);
@@ -36,16 +32,16 @@ const Meta = (props) => {
36
32
  const blogPath = getBlogPath(locale.pathPrefix || '');
37
33
  const { title, id, date, readingTime, tags } = post;
38
34
  const breadcrumbs = (0, common_1.getBreadcrumbs)({ tags, blogPath });
39
- breadcrumbs.metrikaGoals = breadcrumbsGoals;
35
+ breadcrumbs.analyticsEvents = (0, common_1.getMergedAnalyticsEvents)(breadcrumbsGoals);
40
36
  return (react_1.default.createElement(Wrapper_1.Wrapper, { paddings: {
41
37
  [paddings_1.PaddingsDirections.top]: paddingTop,
42
38
  [paddings_1.PaddingsDirections.bottom]: paddingBottom,
43
39
  }, qa: qaAttributes.wrapper },
44
- breadcrumbs && (react_1.default.createElement(page_constructor_1.HeaderBreadcrumbs, { items: breadcrumbs.items, className: b('breadcrumbs'), theme: theme, metrikaGoals: breadcrumbs.metrikaGoals })),
40
+ breadcrumbs && (react_1.default.createElement(page_constructor_1.HeaderBreadcrumbs, { items: breadcrumbs.items, className: b('breadcrumbs'), theme: theme })),
45
41
  title && (react_1.default.createElement(page_constructor_1.YFMWrapper, { content: title, modifiers: {
46
42
  blogBreadcrumbs: true,
47
43
  resetPaddings: true,
48
44
  } })),
49
- post && (react_1.default.createElement(PostInfo_1.PostInfo, { postId: id, date: date, readingTime: readingTime, metrikaGoals: metrikaGoals, qa: qaAttributes.postInfo }))));
45
+ post && (react_1.default.createElement(PostInfo_1.PostInfo, { postId: id, date: date, readingTime: readingTime, analyticsEventsContainer: analyticsEventsContainer, qa: qaAttributes.postInfo }))));
50
46
  };
51
47
  exports.Meta = Meta;
@@ -6,19 +6,16 @@ const react_1 = tslib_1.__importStar(require("react"));
6
6
  const page_constructor_1 = require("@gravity-ui/page-constructor");
7
7
  const PostCard_1 = require("../../components/PostCard/PostCard");
8
8
  const Wrapper_1 = require("../../components/Wrapper/Wrapper");
9
- const constants_1 = require("../../constants");
10
9
  const PostPageContext_1 = require("../../contexts/PostPageContext");
11
10
  const i18n_1 = require("../../i18n");
12
11
  const paddings_1 = require("../../models/paddings");
13
- /**
14
- * @deprecated Metrika will be deleted after launch of analyticsEvents
15
- */
16
- const metrikaGoals = [
17
- {
18
- name: constants_1.BlogMetrikaGoalIds.suggest,
19
- isCrossSite: true,
20
- },
21
- ];
12
+ const common_1 = require("../../utils/common");
13
+ const constants_1 = require("../../constants");
14
+ const utils_1 = require("../../counters/utils");
15
+ const suggestGoals = (0, common_1.prepareAnalyticsEvent)({
16
+ name: constants_1.DefaultGoalIds.suggest,
17
+ counter: utils_1.AnalyticsCounter.CrossSite,
18
+ });
22
19
  /**
23
20
  * Suggested posts block
24
21
  *
@@ -37,6 +34,6 @@ const Suggest = ({ paddingTop = 'l', paddingBottom = 'l' }) => {
37
34
  [paddings_1.PaddingsDirections.top]: paddingTop,
38
35
  [paddings_1.PaddingsDirections.bottom]: paddingBottom,
39
36
  } },
40
- react_1.default.createElement(page_constructor_1.SliderBlock, { slidesToShow: { xl: 3, lg: 2, sm: 1 }, title: { text: (0, i18n_1.i18)(i18n_1.Keyset.TitleSuggest) }, lazyLoad: false }, suggestedPosts.map((post) => (react_1.default.createElement(PostCard_1.PostCard, { key: post.id, metrikaGoals: metrikaGoals, post: post }))))));
37
+ react_1.default.createElement(page_constructor_1.SliderBlock, { slidesToShow: { xl: 3, lg: 2, sm: 1 }, title: { text: (0, i18n_1.i18n)(i18n_1.Keyset.TitleSuggest) }, lazyLoad: false }, suggestedPosts.map((post) => (react_1.default.createElement(PostCard_1.PostCard, { key: post.id, analyticsEvents: suggestGoals, post: post }))))));
41
38
  };
42
39
  exports.Suggest = Suggest;
@@ -36,10 +36,10 @@ unpredictable css rules order in build */
36
36
  .bc-feed-controls__popup.bc-feed-controls__popup .g-select-list::-webkit-scrollbar {
37
37
  display: none;
38
38
  }
39
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-list .yc-list {
39
+ .bc-feed-controls__popup.bc-feed-controls__popup .g-select-list .g-list {
40
40
  max-height: calc(500px - var(--g-text-body-3-line-height) - 12px);
41
41
  }
42
- .bc-feed-controls__popup.bc-feed-controls__popup .yc-list__item {
42
+ .bc-feed-controls__popup.bc-feed-controls__popup .g-list__item {
43
43
  margin: 4px;
44
44
  border-radius: 8px;
45
45
  }
@@ -48,12 +48,28 @@ unpredictable css rules order in build */
48
48
  max-height: inherit;
49
49
  }
50
50
 
51
+ .bc-feed-controls__popup_isMobile .bc-feed-controls__popup-filter {
52
+ position: relative;
53
+ border: none;
54
+ }
55
+ .bc-feed-controls__popup_isMobile .bc-feed-controls__popup-filter::before {
56
+ content: "";
57
+ position: absolute;
58
+ left: 50%;
59
+ bottom: 0px;
60
+ border-bottom: 2px solid var(--g-color-line-generic);
61
+ border-bottom-right-radius: 0;
62
+ border-bottom-left-radius: 0;
63
+ width: 100vw;
64
+ height: 2px;
65
+ transform: translateX(-50%);
66
+ }
51
67
  .bc-feed-controls__popup-filter {
52
68
  font-size: var(--g-text-body-2-font-size);
53
69
  line-height: var(--g-text-body-2-line-height);
54
70
  padding: 4px 12px;
55
71
  border: none;
56
- border-bottom: 1px solid var(--yc-color-line-generic);
72
+ border-bottom: 1px solid var(--g-color-line-generic);
57
73
  border-bottom-right-radius: 0;
58
74
  border-bottom-left-radius: 0;
59
75
  }
@@ -63,8 +79,6 @@ unpredictable css rules order in build */
63
79
  .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly {
64
80
  --g-button-background-color: var(--pc-monochrome-button-background-color);
65
81
  --g-button-background-color-hover: var(--pc-monochrome-button-background-color-hover);
66
- --yc-button-background-color: var(--pc-monochrome-button-background-color);
67
- --yc-button-background-color-hover: var(--pc-monochrome-button-background-color-hover);
68
82
  }
69
83
  .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:link, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:visited, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:active, .bc-feed-controls__saved-only-button_savedOnly.bc-feed-controls__saved-only-button_savedOnly:focus {
70
84
  color: var(--pc-monochrome-button-color);
@@ -5,19 +5,16 @@ 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 uikit_1 = require("@gravity-ui/uikit");
8
- /**
9
- * @deprecated Metrika will be deleted after launch of analyticsEvents
10
- */
11
8
  const constants_1 = require("../../../../constants");
12
9
  const LikesContext_1 = require("../../../../contexts/LikesContext");
13
10
  const MobileContext_1 = require("../../../../contexts/MobileContext");
14
- const metrika_1 = tslib_1.__importDefault(require("../../../../counters/metrika"));
15
11
  const utils_1 = require("../../../../counters/utils");
16
12
  const i18n_1 = require("../../../../i18n");
17
13
  const Save_1 = require("../../../../icons/Save");
18
14
  const common_1 = require("../../../../models/common");
19
15
  const cn_1 = require("../../../../utils/cn");
20
16
  const Search_1 = require("../../../Search/Search");
17
+ const common_2 = require("../../../../utils/common");
21
18
  const customRenders_1 = require("./customRenders");
22
19
  const b = (0, cn_1.block)('feed-controls');
23
20
  const ICON_SIZE = 16;
@@ -54,13 +51,11 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, }) =>
54
51
  });
55
52
  };
56
53
  const handleTagSelect = (selectedTags) => {
57
- /**
58
- * @deprecated Metrika will be deleted after launch of analyticsEvents
59
- */
60
- metrika_1.default.reachGoal(utils_1.MetrikaCounter.CrossSite, constants_1.BlogMetrikaGoalIds.tag, {
61
- theme: selectedTags[0],
54
+ const event = (0, common_2.prepareAnalyticsEvent)({
55
+ name: constants_1.DefaultGoalIds.tag,
56
+ counter: utils_1.AnalyticsCounter.CrossSite,
62
57
  });
63
- handleAnalyticsTag(null, {
58
+ handleAnalyticsTag(event, {
64
59
  theme: selectedTags[0],
65
60
  });
66
61
  const isEmptyTag = selectedTags.some((tag) => tag === 'empty');
@@ -73,18 +68,18 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, }) =>
73
68
  });
74
69
  };
75
70
  const handleServicesSelect = (selectedServices) => {
76
- const forMetrikaServices = services.filter((service) => {
71
+ const forAnalyticsServices = services.filter((service) => {
77
72
  return selectedServices.includes(service.value);
78
73
  });
79
- const metrikaAsString = forMetrikaServices.map((service) => service.content).join(',');
80
- /**
81
- * @deprecated Metrika will be deleted after launch of analyticsEvents
82
- */
83
- metrika_1.default.reachGoal(utils_1.MetrikaCounter.CrossSite, constants_1.BlogMetrikaGoalIds.service, {
84
- service: metrikaAsString,
74
+ const servicesAsStringForAnalytics = forAnalyticsServices
75
+ .map((service) => service.content)
76
+ .join(',');
77
+ const event = (0, common_2.prepareAnalyticsEvent)({
78
+ name: constants_1.DefaultGoalIds.service,
79
+ counter: utils_1.AnalyticsCounter.CrossSite,
85
80
  });
86
- handleAnalyticsService(null, {
87
- service: metrikaAsString,
81
+ handleAnalyticsService(event, {
82
+ service: servicesAsStringForAnalytics,
88
83
  });
89
84
  const servicesAsString = selectedServices.join(',');
90
85
  handleLoadData({
@@ -92,28 +87,28 @@ const Controls = ({ handleLoadData, tags = [], services = [], queryParams, }) =>
92
87
  query: { services: servicesAsString, page: DEFAULT_PAGE },
93
88
  });
94
89
  };
95
- const tagsItems = (0, react_1.useMemo)(() => [{ value: 'empty', content: (0, i18n_1.i18)(i18n_1.Keyset.AllTags) }, ...tags], [tags]);
90
+ const tagsItems = (0, react_1.useMemo)(() => [{ value: 'empty', content: (0, i18n_1.i18n)(i18n_1.Keyset.AllTags) }, ...tags], [tags]);
96
91
  const servicesItems = (0, react_1.useMemo)(() => (servicesInitial ? [...servicesInitial.split(',')] : []), [servicesInitial]);
97
92
  return (react_1.default.createElement("div", { className: b('header') },
98
- react_1.default.createElement("h1", { className: b('header-item', { title: true }) }, (0, i18n_1.i18)(i18n_1.Keyset.Title)),
93
+ react_1.default.createElement("h1", { className: b('header-item', { title: true }) }, (0, i18n_1.i18n)(i18n_1.Keyset.Title)),
99
94
  react_1.default.createElement("div", { className: b('header-item', { filters: true }) },
100
95
  react_1.default.createElement("div", { className: b('filter-item') },
101
- react_1.default.createElement(Search_1.Search, { className: b('search'), placeholder: (0, i18n_1.i18)(i18n_1.Keyset.Search), initialValue: search && typeof search === 'string' ? search : '', onSubmit: handleSearch })),
96
+ react_1.default.createElement(Search_1.Search, { className: b('search'), placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.Search), initialValue: search && typeof search === 'string' ? search : '', onSubmit: handleSearch })),
102
97
  react_1.default.createElement("div", { className: b('filter-item') },
103
- react_1.default.createElement(uikit_1.Select, { className: b('select'), size: "xl", options: tagsItems, defaultValue: [tagInitial], onUpdate: handleTagSelect, placeholder: (0, i18n_1.i18)(i18n_1.Keyset.AllTags), popupClassName: b('popup', { isMobile }), renderControl: (0, customRenders_1.renderSwitcher)({
98
+ react_1.default.createElement(uikit_1.Select, { className: b('select'), size: "xl", options: tagsItems, defaultValue: [tagInitial], onUpdate: handleTagSelect, placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.AllTags), popupClassName: b('popup', { isMobile }), renderControl: (0, customRenders_1.renderSwitcher)({
104
99
  initial: [tagInitial],
105
100
  list: tagsItems,
106
- defaultLabel: (0, i18n_1.i18)(i18n_1.Keyset.AllTags),
101
+ defaultLabel: (0, i18n_1.i18n)(i18n_1.Keyset.AllTags),
107
102
  }), disablePortal: true, virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption })),
108
103
  services.length > 0 ? (react_1.default.createElement("div", { className: b('filter-item') },
109
- 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', { isMobile }), onUpdate: handleServicesSelect, placeholder: (0, i18n_1.i18)(i18n_1.Keyset.AllServices), renderControl: (0, customRenders_1.renderSwitcher)({
104
+ 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', { isMobile }), onUpdate: handleServicesSelect, placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.AllServices), renderControl: (0, customRenders_1.renderSwitcher)({
110
105
  initial: servicesItems,
111
106
  list: services,
112
- defaultLabel: (0, i18n_1.i18)(i18n_1.Keyset.AllServices),
107
+ defaultLabel: (0, i18n_1.i18n)(i18n_1.Keyset.AllServices),
113
108
  }), virtualizationThreshold: VIRTUALIZATION_THRESHOLD, renderOption: customRenders_1.renderOption, renderFilter: customRenders_1.renderFilter }))) : null,
114
109
  hasLikes ? (react_1.default.createElement("div", { className: b('filter-item', { 'width-auto': true }) },
115
110
  react_1.default.createElement(uikit_1.Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly },
116
111
  react_1.default.createElement(uikit_1.Icon, { data: Save_1.Save, size: ICON_SIZE, className: b('icon', { savedOnly }) }),
117
- (0, i18n_1.i18)(i18n_1.Keyset.ActionSavedOnly)))) : null)));
112
+ (0, i18n_1.i18n)(i18n_1.Keyset.ActionSavedOnly)))) : null)));
118
113
  };
119
114
  exports.Controls = Controls;
@@ -13,7 +13,7 @@ const renderSwitcher = ({ initial, list, defaultLabel }) =>
13
13
  // eslint-disable-next-line react/display-name
14
14
  ({ onClick, ref, onKeyDown, open, renderClear }) => (react_1.default.createElement(CustomSwitcher_1.CustomSwitcher, { initial: initial, defaultLabel: defaultLabel, list: list, controlRef: ref, onClick: onClick, onKeyDown: onKeyDown, renderClear: renderClear, open: open }));
15
15
  exports.renderSwitcher = renderSwitcher;
16
- const renderFilter = ({ value, onChange, onKeyDown }) => (react_1.default.createElement(uikit_1.TextInput, { controlProps: { size: 1 }, value: value, view: "clear", placeholder: (0, i18n_1.i18)(i18n_1.Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown, className: b('popup-filter') }));
16
+ const renderFilter = ({ value, onChange, onKeyDown }) => (react_1.default.createElement(uikit_1.TextInput, { controlProps: { size: 1 }, value: value, view: "clear", placeholder: (0, i18n_1.i18n)(i18n_1.Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown, className: b('popup-filter') }));
17
17
  exports.renderFilter = renderFilter;
18
18
  const renderOption = (option) => (react_1.default.createElement(CustomSelectOption_1.CustomSelectOption, { data: option }));
19
19
  exports.renderOption = renderOption;
@@ -24,7 +24,7 @@ unpredictable css rules order in build */
24
24
  .bc-feed-custom-switcher__custom-switcher:focus:not(:focus-visible) {
25
25
  outline: 0;
26
26
  }
27
- .bc-feed-custom-switcher__custom-switcher + .yc-popup.yc-popup_open {
27
+ .bc-feed-custom-switcher__custom-switcher + .g-popup.g-popup_open {
28
28
  position: absolute !important;
29
29
  inset: auto !important;
30
30
  transform: translate3d(0, 4px, 0) !important;
@@ -70,6 +70,9 @@ unpredictable css rules order in build */
70
70
  position: absolute;
71
71
  inset: 0;
72
72
  border-radius: var(--g-border-radius-xl);
73
+ background: transparent;
74
+ border: none;
75
+ cursor: pointer;
73
76
  }
74
77
  .bc-feed-custom-switcher__switcher-arrow {
75
78
  width: 16px;
@@ -18,8 +18,8 @@ const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRef, onKe
18
18
  return items.length ? items : [defaultLabel];
19
19
  }, [defaultLabel, initial, list]);
20
20
  const hasCounter = itemsNames.length > 1;
21
- return (react_1.default.createElement("button", { className: b('custom-switcher'), ref: controlRef, onKeyDown: onKeyDown, "aria-expanded": open },
22
- react_1.default.createElement("div", { onClick: onClick, className: b('custom-switcher-element', { overlay: true }) }),
21
+ return (react_1.default.createElement("div", { className: b('custom-switcher'), ref: controlRef },
22
+ react_1.default.createElement("button", { onClick: onClick, className: b('custom-switcher-element', { overlay: true }), onKeyDown: onKeyDown, "aria-expanded": open }),
23
23
  react_1.default.createElement("div", { className: b('custom-switcher-element', { content: true }) }, itemsNames === null || itemsNames === void 0 ? void 0 : itemsNames.join(', ')),
24
24
  renderClear &&
25
25
  renderClear({
@@ -5,10 +5,6 @@ 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 constants_1 = require("../../constants");
8
- /**
9
- * @deprecated Metrika will be deleted after launch of analyticsEvents
10
- */
11
- const metrika_1 = tslib_1.__importDefault(require("../../counters/metrika"));
12
8
  const utils_1 = require("../../counters/utils");
13
9
  const common_1 = require("../../models/common");
14
10
  const cn_1 = require("../../utils/cn");
@@ -16,6 +12,7 @@ const NavigationButton_1 = require("./components/NavigationButton");
16
12
  const PaginatorItem_1 = require("./components/PaginatorItem");
17
13
  const types_1 = require("./types");
18
14
  const utils_2 = require("./utils");
15
+ const common_2 = require("../../utils/common");
19
16
  const lodash_1 = tslib_1.__importDefault(require("lodash"));
20
17
  const b = (0, cn_1.block)('paginator');
21
18
  const DEFAULT_PAGE_COUNT_FOR_SHOW_SUPPORT_BUTTONS = 6;
@@ -39,19 +36,19 @@ const Paginator = ({ itemsPerPage, totalItems, maxPages, page, className, onPage
39
36
  const handleArrowClick = (type) => {
40
37
  let newPage = page;
41
38
  if (type === 'prev' && page > 1) {
42
- /**
43
- * @deprecated Metrika will be deleted after launch of analyticsEvents
44
- */
45
- metrika_1.default.reachGoal(utils_1.MetrikaCounter.CrossSite, constants_1.BlogMetrikaGoalIds.home);
46
- handleAnalyticsHome();
39
+ const event = (0, common_2.prepareAnalyticsEvent)({
40
+ name: constants_1.DefaultGoalIds.home,
41
+ counter: utils_1.AnalyticsCounter.CrossSite,
42
+ });
43
+ handleAnalyticsHome(event);
47
44
  newPage = 1;
48
45
  }
49
46
  else if (type === 'next' && page < pagesCount) {
50
- /**
51
- * @deprecated Metrika will be deleted after launch of analyticsEvents
52
- */
53
- handleAnalyticsNext();
54
- metrika_1.default.reachGoal(utils_1.MetrikaCounter.CrossSite, constants_1.BlogMetrikaGoalIds.next);
47
+ const event = (0, common_2.prepareAnalyticsEvent)({
48
+ name: constants_1.DefaultGoalIds.next,
49
+ counter: utils_1.AnalyticsCounter.CrossSite,
50
+ });
51
+ handleAnalyticsNext(event);
55
52
  newPage = page + 1;
56
53
  }
57
54
  if (newPage !== page) {
@@ -60,11 +57,11 @@ const Paginator = ({ itemsPerPage, totalItems, maxPages, page, className, onPage
60
57
  };
61
58
  const handlePageClick = (index) => {
62
59
  if (index !== page && typeof index === 'number') {
63
- /**
64
- * @deprecated Metrika will be deleted after launch of analyticsEvents
65
- */
66
- metrika_1.default.reachGoal(utils_1.MetrikaCounter.CrossSite, constants_1.BlogMetrikaGoalIds.page, { page: index });
67
- handleAnalyticsPage(null, { page: String(index) });
60
+ const event = (0, common_2.prepareAnalyticsEvent)({
61
+ name: constants_1.DefaultGoalIds.page,
62
+ counter: utils_1.AnalyticsCounter.CrossSite,
63
+ });
64
+ handleAnalyticsPage(event, { page: String(index) });
68
65
  handlePageChange(index);
69
66
  }
70
67
  };
@@ -7,5 +7,5 @@ const i18n_1 = require("../../../i18n");
7
7
  const cn_1 = require("../../../utils/cn");
8
8
  const types_1 = require("../types");
9
9
  const b = (0, cn_1.block)('paginator');
10
- const NavigationButton = ({ arrowType, disabled }) => disabled ? null : (react_1.default.createElement("div", { className: b('icon') }, arrowType === types_1.ArrowType.Prev ? (0, i18n_1.i18)(i18n_1.Keyset.ButtonBegin) : (0, i18n_1.i18)(i18n_1.Keyset.ButtonFarther)));
10
+ const NavigationButton = ({ arrowType, disabled }) => disabled ? null : (react_1.default.createElement("div", { className: b('icon') }, arrowType === types_1.ArrowType.Prev ? (0, i18n_1.i18n)(i18n_1.Keyset.ButtonBegin) : (0, i18n_1.i18n)(i18n_1.Keyset.ButtonFarther)));
11
11
  exports.NavigationButton = NavigationButton;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { MetrikaGoal } from '@gravity-ui/page-constructor';
2
+ import { AnalyticsEventsProp } from '@gravity-ui/page-constructor';
3
3
  import { PostCardSize, PostCardTitleHeadingLevel, PostData } from '../../models/common';
4
4
  type PostCardProps = {
5
5
  post: PostData;
@@ -7,10 +7,7 @@ type PostCardProps = {
7
7
  showTag?: boolean;
8
8
  size?: PostCardSize;
9
9
  titleHeadingLevel?: PostCardTitleHeadingLevel;
10
- /**
11
- * @deprecated Metrika will be deleted after launch of analyticsEvents
12
- */
13
- metrikaGoals?: MetrikaGoal;
10
+ analyticsEvents?: AnalyticsEventsProp;
14
11
  };
15
- export declare const PostCard: ({ post, metrikaGoals, fullWidth, size, showTag, titleHeadingLevel, }: PostCardProps) => React.JSX.Element;
12
+ export declare const PostCard: ({ post, fullWidth, size, showTag, titleHeadingLevel, analyticsEvents, }: PostCardProps) => React.JSX.Element;
16
13
  export {};
@@ -11,7 +11,7 @@ const cn_1 = require("../../utils/cn");
11
11
  const SuggestPostInfo_1 = require("../PostInfo/SuggestPostInfo");
12
12
  const useAriaAttributes_1 = require("../../hooks/useAriaAttributes");
13
13
  const b = (0, cn_1.block)('post-card');
14
- const PostCard = ({ post, metrikaGoals, fullWidth = false, size = common_1.PostCardSize.SMALL, showTag = false, titleHeadingLevel = common_1.PostCardTitleHeadingLevel.H3, }) => {
14
+ const PostCard = ({ post, fullWidth = false, size = common_1.PostCardSize.SMALL, showTag = false, titleHeadingLevel = common_1.PostCardTitleHeadingLevel.H3, analyticsEvents, }) => {
15
15
  var _a;
16
16
  const { title: postTitle, htmlTitle, textTitle, blogPostId, id, date, readingTime, hasUserLike, likes, image, description, tags, url, } = post;
17
17
  const title = postTitle || textTitle || htmlTitle;
@@ -37,7 +37,7 @@ const PostCard = ({ post, metrikaGoals, fullWidth = false, size = common_1.PostC
37
37
  readingTime && readingTimeId,
38
38
  ],
39
39
  });
40
- return (react_1.default.createElement(page_constructor_1.CardBase, { url: url, metrikaGoals: metrikaGoals, className: b('card', { fullWidth }), extraProps: ariaAttributes },
40
+ return (react_1.default.createElement(page_constructor_1.CardBase, { url: url, analyticsEvents: analyticsEvents, className: b('card', { fullWidth }), extraProps: ariaAttributes },
41
41
  react_1.default.createElement(page_constructor_1.CardBase.Header, { image: image, className: b('header', { fullWidth }) },
42
42
  react_1.default.createElement("div", { className: b('image-container'), "data-qa": "blog-suggest-header" })),
43
43
  react_1.default.createElement(page_constructor_1.CardBase.Content, null,
@@ -17,6 +17,14 @@ unpredictable css rules order in build */
17
17
  font-size: var(--g-text-body-3-font-size);
18
18
  line-height: var(--g-text-body-3-line-height);
19
19
  }
20
+ .bc-post-info__item_save {
21
+ background: none;
22
+ color: inherit;
23
+ border: none;
24
+ padding: 0;
25
+ font: inherit;
26
+ cursor: pointer;
27
+ }
20
28
  .bc-post-info__item:last-child {
21
29
  font-size: var(--g-text-body-2-font-size);
22
30
  line-height: var(--g-text-body-2-line-height);