@gravity-ui/blog-constructor 1.0.0-aplha.0 → 1.1.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.
Files changed (26) hide show
  1. package/README.md +61 -1
  2. package/build/cjs/blocks/YFM/__tests__/YFM.test.d.ts +1 -0
  3. package/build/cjs/blocks/YFM/__tests__/YFM.test.js +16 -0
  4. package/build/cjs/components/FeedHeader/components/Controls/Controls.css +10 -9
  5. package/build/cjs/components/FeedHeader/components/Controls/Controls.js +1 -1
  6. package/build/cjs/components/PostInfo/components/Sharing.js +1 -1
  7. package/build/cjs/components/Search/Search.css +0 -1
  8. package/build/cjs/containers/BlogPage/BlogPage.d.ts +3 -2
  9. package/build/cjs/containers/BlogPage/BlogPage.js +2 -2
  10. package/build/cjs/containers/BlogPostPage/BlogPostPage.d.ts +2 -1
  11. package/build/cjs/containers/BlogPostPage/BlogPostPage.js +2 -2
  12. package/build/cjs/models/blocks.d.ts +0 -1
  13. package/build/esm/blocks/YFM/__tests__/YFM.test.d.ts +1 -0
  14. package/build/esm/blocks/YFM/__tests__/YFM.test.js +11 -0
  15. package/build/esm/components/FeedHeader/components/Controls/Controls.css +10 -9
  16. package/build/esm/components/FeedHeader/components/Controls/Controls.js +1 -1
  17. package/build/esm/components/PostInfo/components/Sharing.js +2 -2
  18. package/build/esm/components/Search/Search.css +0 -1
  19. package/build/esm/containers/BlogPage/BlogPage.d.ts +3 -2
  20. package/build/esm/containers/BlogPage/BlogPage.js +2 -2
  21. package/build/esm/containers/BlogPostPage/BlogPostPage.d.ts +2 -1
  22. package/build/esm/containers/BlogPostPage/BlogPostPage.js +2 -2
  23. package/build/esm/models/blocks.d.ts +0 -1
  24. package/package.json +38 -31
  25. package/server/models/blocks.d.ts +0 -1
  26. package/styles/mixins.scss +0 -10
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @gravity-ui/blog-constructor ·
1
+ # @gravity-ui/blog-constructor · [![npm package](https://img.shields.io/npm/v/@gravity-ui/blog-constructor)](https://www.npmjs.com/package/@gravity-ui/blog-constructor)
2
2
 
3
3
  ## Install
4
4
 
@@ -6,6 +6,66 @@
6
6
  npm install @gravity-ui/blog-constructor
7
7
  ```
8
8
 
9
+ ## Blog-constructor
10
+
11
+ `Blog-constructor` is a library based on the [Page-constructor](https://github.com/gravity-ui/page-constructor) library for creating blog format web pages. Blog-constructor uses the [`custom`](https://github.com/gravity-ui/page-constructor#custom-blocks) prop from page-constructor to add the components needed for the blog.
12
+
13
+ ### Getting started
14
+
15
+ The blog-constructor has both client components and server components for import. The blog pages is imported as a React component. To make sure it runs properly, wrap it in `BlogConstructorProvider`:
16
+
17
+ ```jsx
18
+ import {BlogPage, BlogConstructorProvider} from '@gravity-ui/blog-constructor';
19
+
20
+ // Main blog page
21
+ <BlogConstructorProvider>
22
+ <BlogPage
23
+ content={content}
24
+ posts={posts}
25
+ tags={tags}
26
+ getPosts={handleGetPosts}
27
+ settings={settings}
28
+ />
29
+ </BlogConstructorProvider>
30
+
31
+ ---
32
+
33
+ import {BlogPostPage, BlogConstructorProvider} from '@gravity-ui/blog-constructor';
34
+
35
+ // Post page
36
+ <BlogConstructorProvider {...providerProps}>
37
+ <BlogPostPage
38
+ content={content}
39
+ post={post}
40
+ suggestedPosts={suggestedPosts}
41
+ settings={settings}
42
+ shareOptions={shareOptions}
43
+ />
44
+ </BlogConstructorProvider>
45
+
46
+ ```
47
+
48
+ Also blog-constructor have server components to help you transform your data if you need
49
+
50
+ ```jsx
51
+ import {
52
+ transformPost,
53
+ sanitizeMeta,
54
+ createReadableContent,
55
+ transformPageContent,
56
+ } from '@gravity-ui/blog-constructor/server';
57
+ ```
58
+
59
+ ## i18n
60
+
61
+ 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:
62
+
63
+ ```typescript
64
+ import {configure, Lang} from '@gravity-ui/blog-constructor';
65
+
66
+ configure({lang: Lang.En});
67
+ ```
68
+
9
69
  ## Development
10
70
 
11
71
  ```bash
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const react_2 = require("@testing-library/react");
8
+ const YFM_1 = require("../YFM");
9
+ const text = 'YFM block';
10
+ describe('YFM', () => {
11
+ test('Has id', async () => {
12
+ (0, react_2.render)(react_1.default.createElement(YFM_1.YFM, { text: text }));
13
+ const yfm = react_2.screen.getByText(text);
14
+ expect(yfm).toHaveClass('yfm');
15
+ });
16
+ });
@@ -36,23 +36,22 @@ unpredictable css rules order in build */
36
36
  .bc-feed-controls__popup.bc-feed-controls__popup {
37
37
  border-radius: 12px;
38
38
  }
39
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter + .g-select-list {
40
- max-height: 350px !important;
39
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter + .yc-select-list {
41
40
  margin-top: 0;
42
41
  }
43
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter + .g-select-list::-webkit-scrollbar {
42
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter + .yc-select-list::-webkit-scrollbar {
44
43
  display: none;
45
44
  }
46
45
  .bc-feed-controls__popup.bc-feed-controls__popup .yc-list__item {
47
46
  margin: 4px;
48
47
  border-radius: 8px;
49
48
  }
50
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter {
49
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter {
51
50
  margin-top: 4px;
52
51
  padding: 4px;
53
52
  border-bottom: 1px solid var(--yc-color-line-generic);
54
53
  }
55
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter .yc-text-input__control.yc-text-input__control_type_input {
54
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter .yc-text-input__control.yc-text-input__control_type_input {
56
55
  border: none;
57
56
  }
58
57
 
@@ -72,12 +71,14 @@ unpredictable css rules order in build */
72
71
  border-radius: 10px;
73
72
  }
74
73
  .bc-feed-controls__saved-only-button_savedOnly {
75
- --yc-button-background-color: var(--pc-monochrome-button);
76
- --yc-button-background-color-hover: var(--pc-monochrome-button-hover);
77
- color: var(--yc-color-text-light-primary);
74
+ --yc-button-background-color: var(--pc-monochrome-button-background-color);
75
+ --yc-button-background-color-hover: var(--pc-monochrome-button-background-color-hover);
76
+ }
77
+ .bc-feed-controls__saved-only-button_savedOnly, .bc-feed-controls__saved-only-button_savedOnly:link, .bc-feed-controls__saved-only-button_savedOnly:visited, .bc-feed-controls__saved-only-button_savedOnly:active, .bc-feed-controls__saved-only-button_savedOnly:focus {
78
+ color: var(--pc-monochrome-button-color);
78
79
  }
79
80
  .bc-feed-controls__saved-only-button_savedOnly:hover {
80
- color: var(--yc-color-text-light-primary);
81
+ color: var(--pc-monochrome-button-color);
81
82
  }
82
83
  .bc-feed-controls__saved-only-button_savedOnly:focus {
83
84
  color: var(--yc-color-base-background);
@@ -97,7 +97,7 @@ const Controls = ({ setIsFetching, tags = [], services = [], handleChangeQuery,
97
97
  initial: servicesItems,
98
98
  list: services,
99
99
  defaultLabel: (0, i18n_1.i18)(i18n_1.Keyset.AllServices),
100
- }), disablePortal: true, renderOption: customRenders_1.renderOption, renderFilter: customRenders_1.renderFilter }))) : null,
100
+ }), renderOption: customRenders_1.renderOption, renderFilter: customRenders_1.renderFilter }))) : null,
101
101
  hasLikes ? (react_1.default.createElement("div", { className: b('filter-item', { 'width-auto': true }) },
102
102
  react_1.default.createElement(uikit_1.Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly },
103
103
  react_1.default.createElement(uikit_1.Icon, { data: Save_1.Save, size: ICON_SIZE, className: b('icon', { savedOnly }) }),
@@ -49,6 +49,6 @@ const Sharing = ({ theme, metrikaGoal }) => {
49
49
  };
50
50
  return (react_1.default.createElement("div", { className: b('item') },
51
51
  react_1.default.createElement("span", { className: b('icon') },
52
- react_1.default.createElement(uikit_1.SharePopover, { url: (0, common_1.getAbsolutePath)(router), className: b('share'), iconClass: b('share-icon'), switcherClassName: b('switcher', { theme }), tooltipClassName: b('popup'), useWebShareApi: isMobile, direction: 'column', buttonTitle: (0, i18n_1.i18)(i18n_1.Keyset.ActionShare), customIcon: ShareArrowUp_1.ShareArrowUp, placement: "bottom", openByHover: false, shareOptions: shareOptions, handleMetrika: handleMetrika }))));
52
+ react_1.default.createElement(uikit_1.ShareTooltip, { url: (0, common_1.getAbsolutePath)(router), className: b('share'), iconClass: b('share-icon'), switcherClassName: b('switcher', { theme }), tooltipClassName: b('popup'), useWebShareApi: isMobile, direction: 'column', buttonTitle: (0, i18n_1.i18)(i18n_1.Keyset.ActionShare), customIcon: ShareArrowUp_1.ShareArrowUp, placement: "bottom", openByHover: false, socialNets: shareOptions, handleMetrika: handleMetrika }))));
53
53
  };
54
54
  exports.Sharing = Sharing;
@@ -7,7 +7,6 @@ unpredictable css rules order in build */
7
7
  display: flex;
8
8
  align-items: center;
9
9
  justify-content: flex-end;
10
- max-width: 376px;
11
10
  height: 44px;
12
11
  transition: width 0.3s;
13
12
  }
@@ -1,10 +1,11 @@
1
- import { PageContent, PageConstructorProviderProps } from '@gravity-ui/page-constructor';
1
+ import { PageContent, PageConstructorProviderProps, NavigationData } from '@gravity-ui/page-constructor';
2
2
  import { Tag, PostsProps, ToggleLikeCallbackType, MetaProps, GetPostsType, SetQueryType, Service } from '../../models/common';
3
3
  export type BlogPageProps = {
4
4
  content: PageContent;
5
5
  posts: PostsProps;
6
6
  tags: Tag[];
7
7
  services?: Service[];
8
+ navigation?: NavigationData;
8
9
  getPosts: GetPostsType;
9
10
  toggleLike?: ToggleLikeCallbackType;
10
11
  metaData?: MetaProps;
@@ -12,4 +13,4 @@ export type BlogPageProps = {
12
13
  settings?: PageConstructorProviderProps;
13
14
  pageCountForShowSupportButtons?: number;
14
15
  };
15
- export declare const BlogPage: ({ content, posts, tags, services, getPosts, metaData, toggleLike, settings, pageCountForShowSupportButtons, }: BlogPageProps) => JSX.Element;
16
+ export declare const BlogPage: ({ content, posts, tags, services, getPosts, metaData, toggleLike, navigation, settings, pageCountForShowSupportButtons, }: BlogPageProps) => JSX.Element;
@@ -10,7 +10,7 @@ const FeedContext_1 = require("../../contexts/FeedContext");
10
10
  const LikesContext_1 = require("../../contexts/LikesContext");
11
11
  const MetaWrapper_1 = require("../../components/MetaWrapper/MetaWrapper");
12
12
  const blocksMap_1 = __importDefault(require("../../constructor/blocksMap"));
13
- const BlogPage = ({ content, posts, tags, services, getPosts, metaData, toggleLike, settings, pageCountForShowSupportButtons, }) => (react_1.default.createElement("main", null,
13
+ const BlogPage = ({ content, posts, tags, services, getPosts, metaData, toggleLike, navigation, settings, pageCountForShowSupportButtons, }) => (react_1.default.createElement("main", null,
14
14
  react_1.default.createElement(LikesContext_1.LikesContext.Provider, { value: {
15
15
  toggleLike: toggleLike,
16
16
  hasLikes: Boolean(toggleLike),
@@ -26,5 +26,5 @@ const BlogPage = ({ content, posts, tags, services, getPosts, metaData, toggleLi
26
26
  } },
27
27
  react_1.default.createElement(page_constructor_1.PageConstructorProvider, Object.assign({}, settings),
28
28
  metaData ? react_1.default.createElement(MetaWrapper_1.MetaWrapper, Object.assign({}, metaData)) : null,
29
- react_1.default.createElement(page_constructor_1.PageConstructor, { content: content, custom: blocksMap_1.default }))))));
29
+ react_1.default.createElement(page_constructor_1.PageConstructor, { content: content, custom: blocksMap_1.default, navigation: navigation }))))));
30
30
  exports.BlogPage = BlogPage;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { PageContent, PageConstructorProviderProps } from '@gravity-ui/page-constructor';
2
+ import { PageContent, PageConstructorProviderProps, NavigationData } from '@gravity-ui/page-constructor';
3
3
  import { ShareOptions } from '@gravity-ui/uikit';
4
4
  import { PostData, ToggleLikeCallbackType, MetaProps } from '../../models/common';
5
5
  export interface BlogPostPageProps {
@@ -13,6 +13,7 @@ export interface BlogPostPageProps {
13
13
  content: PageContent;
14
14
  post: PostData;
15
15
  settings?: PageConstructorProviderProps;
16
+ navigation?: NavigationData;
16
17
  shareOptions?: ShareOptions[];
17
18
  }
18
19
  export declare const BlogPostPage: React.FC<BlogPostPageProps>;
@@ -11,7 +11,7 @@ const PostPageContext_1 = require("../../contexts/PostPageContext");
11
11
  const LikesContext_1 = require("../../contexts/LikesContext");
12
12
  const useLikes_1 = require("../../hooks/useLikes");
13
13
  const MetaWrapper_1 = require("../../components/MetaWrapper/MetaWrapper");
14
- const BlogPostPage = ({ metaData, suggestedPosts, likes, content, post, settings, shareOptions, }) => {
14
+ const BlogPostPage = ({ metaData, suggestedPosts, likes, content, post, settings, navigation, shareOptions, }) => {
15
15
  const { hasUserLike, likesCount, handleLike } = (0, useLikes_1.useLikes)({
16
16
  hasLike: likes === null || likes === void 0 ? void 0 : likes.hasUserLike,
17
17
  count: likes === null || likes === void 0 ? void 0 : likes.likesCount,
@@ -37,6 +37,6 @@ const BlogPostPage = ({ metaData, suggestedPosts, likes, content, post, settings
37
37
  } },
38
38
  react_1.default.createElement(page_constructor_1.PageConstructorProvider, Object.assign({}, settings),
39
39
  metaData ? react_1.default.createElement(MetaWrapper_1.MetaWrapper, Object.assign({}, metaData)) : null,
40
- react_1.default.createElement(page_constructor_1.PageConstructor, { content: content, custom: blocksMap_1.default }))))));
40
+ react_1.default.createElement(page_constructor_1.PageConstructor, { content: content, custom: blocksMap_1.default, navigation: navigation }))))));
41
41
  };
42
42
  exports.BlogPostPage = BlogPostPage;
@@ -7,7 +7,6 @@ export type AuthorProps = ClassNameProps & {
7
7
  image: string;
8
8
  } & PaddingsYFMProps;
9
9
  export type BannerProps = ContentBlockProps & {
10
- background?: string;
11
10
  color?: string;
12
11
  image?: string;
13
12
  imageSize?: 's' | 'm';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { YFM } from '../YFM';
4
+ const text = 'YFM block';
5
+ describe('YFM', () => {
6
+ test('Has id', async () => {
7
+ render(React.createElement(YFM, { text: text }));
8
+ const yfm = screen.getByText(text);
9
+ expect(yfm).toHaveClass('yfm');
10
+ });
11
+ });
@@ -36,23 +36,22 @@ unpredictable css rules order in build */
36
36
  .bc-feed-controls__popup.bc-feed-controls__popup {
37
37
  border-radius: 12px;
38
38
  }
39
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter + .g-select-list {
40
- max-height: 350px !important;
39
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter + .yc-select-list {
41
40
  margin-top: 0;
42
41
  }
43
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter + .g-select-list::-webkit-scrollbar {
42
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter + .yc-select-list::-webkit-scrollbar {
44
43
  display: none;
45
44
  }
46
45
  .bc-feed-controls__popup.bc-feed-controls__popup .yc-list__item {
47
46
  margin: 4px;
48
47
  border-radius: 8px;
49
48
  }
50
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter {
49
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter {
51
50
  margin-top: 4px;
52
51
  padding: 4px;
53
52
  border-bottom: 1px solid var(--yc-color-line-generic);
54
53
  }
55
- .bc-feed-controls__popup.bc-feed-controls__popup .g-select-filter .yc-text-input__control.yc-text-input__control_type_input {
54
+ .bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter .yc-text-input__control.yc-text-input__control_type_input {
56
55
  border: none;
57
56
  }
58
57
 
@@ -72,12 +71,14 @@ unpredictable css rules order in build */
72
71
  border-radius: 10px;
73
72
  }
74
73
  .bc-feed-controls__saved-only-button_savedOnly {
75
- --yc-button-background-color: var(--pc-monochrome-button);
76
- --yc-button-background-color-hover: var(--pc-monochrome-button-hover);
77
- color: var(--yc-color-text-light-primary);
74
+ --yc-button-background-color: var(--pc-monochrome-button-background-color);
75
+ --yc-button-background-color-hover: var(--pc-monochrome-button-background-color-hover);
76
+ }
77
+ .bc-feed-controls__saved-only-button_savedOnly, .bc-feed-controls__saved-only-button_savedOnly:link, .bc-feed-controls__saved-only-button_savedOnly:visited, .bc-feed-controls__saved-only-button_savedOnly:active, .bc-feed-controls__saved-only-button_savedOnly:focus {
78
+ color: var(--pc-monochrome-button-color);
78
79
  }
79
80
  .bc-feed-controls__saved-only-button_savedOnly:hover {
80
- color: var(--yc-color-text-light-primary);
81
+ color: var(--pc-monochrome-button-color);
81
82
  }
82
83
  .bc-feed-controls__saved-only-button_savedOnly:focus {
83
84
  color: var(--yc-color-base-background);
@@ -69,7 +69,7 @@ export const Controls = ({ setIsFetching, tags = [], services = [], handleChange
69
69
  initial: servicesItems,
70
70
  list: services,
71
71
  defaultLabel: i18(Keyset.AllServices),
72
- }), disablePortal: true, renderOption: renderOption, renderFilter: renderFilter }))) : null,
72
+ }), renderOption: renderOption, renderFilter: renderFilter }))) : null,
73
73
  hasLikes ? (React.createElement("div", { className: b('filter-item', { 'width-auto': true }) },
74
74
  React.createElement(Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly },
75
75
  React.createElement(Icon, { data: Save, size: ICON_SIZE, className: b('icon', { savedOnly }) }),
@@ -1,5 +1,5 @@
1
1
  import React, { useContext } from 'react';
2
- import { SharePopover } from '@gravity-ui/uikit';
2
+ import { ShareTooltip } from '@gravity-ui/uikit';
3
3
  import { MobileContext } from '../../../contexts/MobileContext';
4
4
  import { RouterContext } from '../../../contexts/RouterContext';
5
5
  import { PostPageContext } from '../../../contexts/PostPageContext';
@@ -21,5 +21,5 @@ export const Sharing = ({ theme, metrikaGoal }) => {
21
21
  };
22
22
  return (React.createElement("div", { className: b('item') },
23
23
  React.createElement("span", { className: b('icon') },
24
- React.createElement(SharePopover, { url: getAbsolutePath(router), className: b('share'), iconClass: b('share-icon'), switcherClassName: b('switcher', { theme }), tooltipClassName: b('popup'), useWebShareApi: isMobile, direction: 'column', buttonTitle: i18(Keyset.ActionShare), customIcon: ShareArrowUp, placement: "bottom", openByHover: false, shareOptions: shareOptions, handleMetrika: handleMetrika }))));
24
+ React.createElement(ShareTooltip, { url: getAbsolutePath(router), className: b('share'), iconClass: b('share-icon'), switcherClassName: b('switcher', { theme }), tooltipClassName: b('popup'), useWebShareApi: isMobile, direction: 'column', buttonTitle: i18(Keyset.ActionShare), customIcon: ShareArrowUp, placement: "bottom", openByHover: false, socialNets: shareOptions, handleMetrika: handleMetrika }))));
25
25
  };
@@ -7,7 +7,6 @@ unpredictable css rules order in build */
7
7
  display: flex;
8
8
  align-items: center;
9
9
  justify-content: flex-end;
10
- max-width: 376px;
11
10
  height: 44px;
12
11
  transition: width 0.3s;
13
12
  }
@@ -1,4 +1,4 @@
1
- import { PageContent, PageConstructorProviderProps } from '@gravity-ui/page-constructor';
1
+ import { PageContent, PageConstructorProviderProps, NavigationData } from '@gravity-ui/page-constructor';
2
2
  import { Tag, PostsProps, ToggleLikeCallbackType, MetaProps, GetPostsType, SetQueryType, Service } from '../../models/common';
3
3
  import './BlogPage.css';
4
4
  export type BlogPageProps = {
@@ -6,6 +6,7 @@ export type BlogPageProps = {
6
6
  posts: PostsProps;
7
7
  tags: Tag[];
8
8
  services?: Service[];
9
+ navigation?: NavigationData;
9
10
  getPosts: GetPostsType;
10
11
  toggleLike?: ToggleLikeCallbackType;
11
12
  metaData?: MetaProps;
@@ -13,4 +14,4 @@ export type BlogPageProps = {
13
14
  settings?: PageConstructorProviderProps;
14
15
  pageCountForShowSupportButtons?: number;
15
16
  };
16
- export declare const BlogPage: ({ content, posts, tags, services, getPosts, metaData, toggleLike, settings, pageCountForShowSupportButtons, }: BlogPageProps) => JSX.Element;
17
+ export declare const BlogPage: ({ content, posts, tags, services, getPosts, metaData, toggleLike, navigation, settings, pageCountForShowSupportButtons, }: BlogPageProps) => JSX.Element;
@@ -5,7 +5,7 @@ import { LikesContext } from '../../contexts/LikesContext';
5
5
  import { MetaWrapper } from '../../components/MetaWrapper/MetaWrapper';
6
6
  import componentMap from '../../constructor/blocksMap';
7
7
  import './BlogPage.css';
8
- export const BlogPage = ({ content, posts, tags, services, getPosts, metaData, toggleLike, settings, pageCountForShowSupportButtons, }) => (React.createElement("main", null,
8
+ export const BlogPage = ({ content, posts, tags, services, getPosts, metaData, toggleLike, navigation, settings, pageCountForShowSupportButtons, }) => (React.createElement("main", null,
9
9
  React.createElement(LikesContext.Provider, { value: {
10
10
  toggleLike: toggleLike,
11
11
  hasLikes: Boolean(toggleLike),
@@ -21,4 +21,4 @@ export const BlogPage = ({ content, posts, tags, services, getPosts, metaData, t
21
21
  } },
22
22
  React.createElement(PageConstructorProvider, Object.assign({}, settings),
23
23
  metaData ? React.createElement(MetaWrapper, Object.assign({}, metaData)) : null,
24
- React.createElement(PageConstructor, { content: content, custom: componentMap }))))));
24
+ React.createElement(PageConstructor, { content: content, custom: componentMap, navigation: navigation }))))));
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { PageContent, PageConstructorProviderProps } from '@gravity-ui/page-constructor';
2
+ import { PageContent, PageConstructorProviderProps, NavigationData } from '@gravity-ui/page-constructor';
3
3
  import { ShareOptions } from '@gravity-ui/uikit';
4
4
  import { PostData, ToggleLikeCallbackType, MetaProps } from '../../models/common';
5
5
  import './BlogPostPage.css';
@@ -14,6 +14,7 @@ export interface BlogPostPageProps {
14
14
  content: PageContent;
15
15
  post: PostData;
16
16
  settings?: PageConstructorProviderProps;
17
+ navigation?: NavigationData;
17
18
  shareOptions?: ShareOptions[];
18
19
  }
19
20
  export declare const BlogPostPage: React.FC<BlogPostPageProps>;
@@ -6,7 +6,7 @@ import { LikesContext } from '../../contexts/LikesContext';
6
6
  import { useLikes } from '../../hooks/useLikes';
7
7
  import { MetaWrapper } from '../../components/MetaWrapper/MetaWrapper';
8
8
  import './BlogPostPage.css';
9
- export const BlogPostPage = ({ metaData, suggestedPosts, likes, content, post, settings, shareOptions, }) => {
9
+ export const BlogPostPage = ({ metaData, suggestedPosts, likes, content, post, settings, navigation, shareOptions, }) => {
10
10
  const { hasUserLike, likesCount, handleLike } = useLikes({
11
11
  hasLike: likes === null || likes === void 0 ? void 0 : likes.hasUserLike,
12
12
  count: likes === null || likes === void 0 ? void 0 : likes.likesCount,
@@ -32,5 +32,5 @@ export const BlogPostPage = ({ metaData, suggestedPosts, likes, content, post, s
32
32
  } },
33
33
  React.createElement(PageConstructorProvider, Object.assign({}, settings),
34
34
  metaData ? React.createElement(MetaWrapper, Object.assign({}, metaData)) : null,
35
- React.createElement(PageConstructor, { content: content, custom: componentMap }))))));
35
+ React.createElement(PageConstructor, { content: content, custom: componentMap, navigation: navigation }))))));
36
36
  };
@@ -7,7 +7,6 @@ export type AuthorProps = ClassNameProps & {
7
7
  image: string;
8
8
  } & PaddingsYFMProps;
9
9
  export type BannerProps = ContentBlockProps & {
10
- background?: string;
11
10
  color?: string;
12
11
  image?: string;
13
12
  imageSize?: 's' | 'm';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/blog-constructor",
3
- "version": "1.0.0-aplha.0",
3
+ "version": "1.1.0-alpha.0",
4
4
  "description": "Gravity UI Blog Constructor",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -40,62 +40,57 @@
40
40
  "prepublishOnly": "npm run lint && npm run build",
41
41
  "prepare": "husky install",
42
42
  "svgo": "svgo --config svgo.config.js",
43
- "svgo:all": "svgo --config svgo.config.js -r -f assets"
43
+ "svgo:all": "svgo --config svgo.config.js -r -f assets",
44
+ "test": "jest --maxWorkers=50%",
45
+ "test:coverage": "jest --coverage",
46
+ "test:watch": "jest --watchAll --maxWorkers=25%"
44
47
  },
45
48
  "dependencies": {
46
49
  "@gravity-ui/i18n": "^1.0.0",
47
- "@gravity-ui/uikit": "^4.0.4",
48
- "@types/fast-html-parser": "^1.0.2",
49
- "@types/recompose": "^0.30.10",
50
50
  "bem-cn-lite": "^4.0.0",
51
51
  "fast-html-parser": "^1.0.1",
52
- "gulp": "^4.0.2",
53
- "gulp-dart-sass": "^1.0.2",
54
- "gulp-rename": "^2.0.0",
55
- "gulp-replace": "^1.1.3",
56
- "gulp-typescript": "^6.0.0-alpha.1",
57
- "html-loader": "^1.3.2",
58
52
  "isomorphic-dompurify": "^0.20.0",
59
53
  "lodash": "^4.17.21",
60
- "markdown-loader": "^6.0.0",
61
54
  "react-helmet": "^6.1.0",
62
55
  "react-player": "^2.9.0",
63
56
  "react-slick": "^0.28.1",
64
- "react-spring": "^9.3.0",
57
+ "react-spring": "~9.6.0",
65
58
  "react-transition-group": "^4.4.2",
66
59
  "react-waypoint": "^10.1.0",
67
- "recompose": "^0.30.0",
68
- "rimraf": "^3.0.2",
69
60
  "sanitize-html": "^2.6.1",
70
- "sass": "^1.54.4",
71
61
  "snakecase-keys": "^5.1.0",
72
62
  "typograf": "^6.14.0",
73
63
  "ua-parser-js": "^0.7.28",
74
64
  "url": "^0.11.0",
75
- "url-join": "^5.0.0",
76
- "webpack": "^4.46.0"
65
+ "url-join": "^5.0.0"
77
66
  },
78
67
  "peerDependencies": {
79
- "@doc-tools/components": "^2.0.0",
80
- "@doc-tools/transform": "^2.6.1",
81
- "@gravity-ui/page-constructor": "^1.1.0",
68
+ "@doc-tools/transform": "^2.9.0",
69
+ "@gravity-ui/uikit": "^3.20.0",
70
+ "@gravity-ui/page-constructor": "^1.22.0",
82
71
  "react": "^16.0.0 || ^17.0.0"
83
72
  },
84
73
  "devDependencies": {
85
74
  "@babel/core": "^7.15.8",
86
- "@doc-tools/components": "^2.1.0",
75
+ "@commitlint/config-conventional": "^17.4.3",
87
76
  "@doc-tools/transform": "^2.9.0",
88
77
  "@gravity-ui/eslint-config": "^1.0.2",
89
- "@gravity-ui/page-constructor": "^1.4.1",
78
+ "@gravity-ui/page-constructor": "^1.23.0",
90
79
  "@gravity-ui/prettier-config": "^1.0.1",
91
80
  "@gravity-ui/stylelint-config": "^1.0.0",
92
81
  "@gravity-ui/tsconfig": "^1.0.0",
82
+ "@gravity-ui/uikit": "^3.20.0",
93
83
  "@storybook/addon-actions": "^6.3.12",
94
84
  "@storybook/addon-essentials": "^6.5.10",
95
85
  "@storybook/addon-knobs": "^6.3.1",
96
86
  "@storybook/addon-viewport": "^6.3.12",
97
87
  "@storybook/preset-scss": "^1.0.3",
98
88
  "@storybook/react": "^6.5.10",
89
+ "@testing-library/jest-dom": "^5.16.5",
90
+ "@testing-library/react": "^12.1.5",
91
+ "@testing-library/user-event": "^14.4.3",
92
+ "@types/fast-html-parser": "^1.0.2",
93
+ "@types/jest": "^29.2.5",
99
94
  "@types/js-yaml": "^4.0.5",
100
95
  "@types/lodash": "^4.14.176",
101
96
  "@types/react": "^18.0.26",
@@ -104,22 +99,37 @@
104
99
  "@types/react-transition-group": "^4.4.4",
105
100
  "@types/sanitize-html": "^2.6.0",
106
101
  "@types/ua-parser-js": "^0.7.36",
107
- "eslint": "^7.32.0",
102
+ "eslint": "^8.0.0",
108
103
  "eslint-plugin-local": "./eslint-plugin-local",
104
+ "eslint-plugin-testing-library": "^5.9.1",
105
+ "gulp": "^4.0.2",
106
+ "gulp-dart-sass": "^1.0.2",
107
+ "gulp-rename": "^2.0.0",
108
+ "gulp-replace": "^1.1.3",
109
+ "gulp-typescript": "^6.0.0-alpha.1",
110
+ "html-loader": "^1.3.2",
109
111
  "husky": "^7.0.4",
112
+ "jest": "^29.3.1",
113
+ "jest-environment-jsdom": "^29.3.1",
114
+ "jest-transform-css": "^6.0.1",
110
115
  "js-yaml": "^3.14.1",
111
116
  "lint-staged": "^11.2.6",
117
+ "markdown-loader": "^6.0.0",
112
118
  "move-file-cli": "^3.0.0",
113
119
  "npm-run-all": "^4.1.5",
114
120
  "postcss": "^8.4.14",
115
121
  "prettier": "2.4.1",
116
- "react": "^18.2.0",
117
- "react-dom": "^18.2.0",
122
+ "react": "^17.0.0",
123
+ "react-dom": "^17.0.0",
124
+ "rimraf": "^3.0.2",
125
+ "sass": "^1.54.4",
118
126
  "sass-loader": "^10.3.1",
119
127
  "stylelint": "^14.11.0",
120
- "stylelint-scss": "^3.21.0",
128
+ "stylelint-scss": "^4.0.0",
121
129
  "svg-sprite-loader": "^6.0.11",
122
- "typescript": "^4.9.3"
130
+ "ts-jest": "^29.0.5",
131
+ "typescript": "^4.9.3",
132
+ "webpack": "^4.46.0"
123
133
  },
124
134
  "lint-staged": {
125
135
  "*.{css,scss}": [
@@ -133,8 +143,5 @@
133
143
  "*.{json,yaml,yml,md}": [
134
144
  "prettier --write"
135
145
  ]
136
- },
137
- "publishConfig": {
138
- "tag": "alpha"
139
146
  }
140
147
  }
@@ -7,7 +7,6 @@ export type AuthorProps = ClassNameProps & {
7
7
  image: string;
8
8
  } & PaddingsYFMProps;
9
9
  export type BannerProps = ContentBlockProps & {
10
- background?: string;
11
10
  color?: string;
12
11
  image?: string;
13
12
  imageSize?: 's' | 'm';
@@ -47,13 +47,3 @@
47
47
  }
48
48
  }
49
49
  }
50
-
51
- @mixin monochromeButton() {
52
- --yc-button-background-color: var(--pc-monochrome-button);
53
- --yc-button-background-color-hover: var(--pc-monochrome-button-hover);
54
- color: var(--yc-color-text-light-primary);
55
-
56
- &:hover {
57
- color: var(--yc-color-text-light-primary);
58
- }
59
- }