@gravity-ui/blog-constructor 1.0.0-aplha.0 → 1.1.0-alpha.0

Sign up to get free protection for your applications and to get access to all the features.
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
- }