@gravity-ui/blog-constructor 1.0.0-aplha.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +231 -0
- package/LICENSE +21 -0
- package/README.md +14 -0
- package/build/cjs/blocks/Author/Author.css +31 -0
- package/build/cjs/blocks/Author/Author.d.ts +3 -0
- package/build/cjs/blocks/Author/Author.js +60 -0
- package/build/cjs/blocks/Banner/Banner.css +58 -0
- package/build/cjs/blocks/Banner/Banner.d.ts +3 -0
- package/build/cjs/blocks/Banner/Banner.js +51 -0
- package/build/cjs/blocks/CTA/CTA.css +56 -0
- package/build/cjs/blocks/CTA/CTA.d.ts +3 -0
- package/build/cjs/blocks/CTA/CTA.js +44 -0
- package/build/cjs/blocks/ColoredText/ColoredText.css +28 -0
- package/build/cjs/blocks/ColoredText/ColoredText.d.ts +3 -0
- package/build/cjs/blocks/ColoredText/ColoredText.js +37 -0
- package/build/cjs/blocks/Feed/Feed.d.ts +3 -0
- package/build/cjs/blocks/Feed/Feed.js +183 -0
- package/build/cjs/blocks/Feed/reducer.d.ts +65 -0
- package/build/cjs/blocks/Feed/reducer.js +40 -0
- package/build/cjs/blocks/Header/Header.d.ts +3 -0
- package/build/cjs/blocks/Header/Header.js +63 -0
- package/build/cjs/blocks/Layout/Layout.css +22 -0
- package/build/cjs/blocks/Layout/Layout.d.ts +3 -0
- package/build/cjs/blocks/Layout/Layout.js +78 -0
- package/build/cjs/blocks/Media/Media.css +41 -0
- package/build/cjs/blocks/Media/Media.d.ts +3 -0
- package/build/cjs/blocks/Media/Media.js +38 -0
- package/build/cjs/blocks/Meta/Meta.css +7 -0
- package/build/cjs/blocks/Meta/Meta.d.ts +3 -0
- package/build/cjs/blocks/Meta/Meta.js +66 -0
- package/build/cjs/blocks/Suggest/Suggest.d.ts +12 -0
- package/build/cjs/blocks/Suggest/Suggest.js +61 -0
- package/build/cjs/blocks/YFM/YFM.d.ts +3 -0
- package/build/cjs/blocks/YFM/YFM.js +24 -0
- package/build/cjs/blocks/constants.d.ts +8 -0
- package/build/cjs/blocks/constants.js +8 -0
- package/build/cjs/components/ButtonWithIcon/ButtonWithIcon.css +76 -0
- package/build/cjs/components/ButtonWithIcon/ButtonWithIcon.d.ts +12 -0
- package/build/cjs/components/ButtonWithIcon/ButtonWithIcon.js +13 -0
- package/build/cjs/components/FeedHeader/FeedHeader.css +54 -0
- package/build/cjs/components/FeedHeader/FeedHeader.d.ts +8 -0
- package/build/cjs/components/FeedHeader/FeedHeader.js +24 -0
- package/build/cjs/components/FeedHeader/components/Controls/Controls.css +107 -0
- package/build/cjs/components/FeedHeader/components/Controls/Controls.d.ts +16 -0
- package/build/cjs/components/FeedHeader/components/Controls/Controls.js +106 -0
- package/build/cjs/components/FeedHeader/components/Controls/customRenders.d.ts +11 -0
- package/build/cjs/components/FeedHeader/components/Controls/customRenders.js +22 -0
- package/build/cjs/components/FeedHeader/components/CustomSelectOption/CustomSelectOption.css +14 -0
- package/build/cjs/components/FeedHeader/components/CustomSelectOption/CustomSelectOption.d.ts +8 -0
- package/build/cjs/components/FeedHeader/components/CustomSelectOption/CustomSelectOption.js +13 -0
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +53 -0
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +11 -0
- package/build/cjs/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +47 -0
- package/build/cjs/components/MetaWrapper/MetaWrapper.d.ts +10 -0
- package/build/cjs/components/MetaWrapper/MetaWrapper.js +18 -0
- package/build/cjs/components/Paginator/Paginator.css +54 -0
- package/build/cjs/components/Paginator/Paginator.d.ts +2 -0
- package/build/cjs/components/Paginator/Paginator.js +118 -0
- package/build/cjs/components/Paginator/components/NavigationButton.d.ts +6 -0
- package/build/cjs/components/Paginator/components/NavigationButton.js +13 -0
- package/build/cjs/components/Paginator/components/PaginatorItem.d.ts +2 -0
- package/build/cjs/components/Paginator/components/PaginatorItem.js +15 -0
- package/build/cjs/components/Paginator/types.d.ts +29 -0
- package/build/cjs/components/Paginator/types.js +8 -0
- package/build/cjs/components/Paginator/utils.d.ts +3 -0
- package/build/cjs/components/Paginator/utils.js +32 -0
- package/build/cjs/components/PostCard/PostCard.css +85 -0
- package/build/cjs/components/PostCard/PostCard.d.ts +12 -0
- package/build/cjs/components/PostCard/PostCard.js +60 -0
- package/build/cjs/components/PostInfo/PostInfo.css +88 -0
- package/build/cjs/components/PostInfo/PostInfo.d.ts +28 -0
- package/build/cjs/components/PostInfo/PostInfo.js +55 -0
- package/build/cjs/components/PostInfo/SuggestPostInfo.d.ts +27 -0
- package/build/cjs/components/PostInfo/SuggestPostInfo.js +41 -0
- package/build/cjs/components/PostInfo/components/Date.d.ts +7 -0
- package/build/cjs/components/PostInfo/components/Date.js +36 -0
- package/build/cjs/components/PostInfo/components/ReadingTime.d.ts +7 -0
- package/build/cjs/components/PostInfo/components/ReadingTime.js +18 -0
- package/build/cjs/components/PostInfo/components/Save.d.ts +25 -0
- package/build/cjs/components/PostInfo/components/Save.js +73 -0
- package/build/cjs/components/PostInfo/components/Sharing.d.ts +7 -0
- package/build/cjs/components/PostInfo/components/Sharing.js +54 -0
- package/build/cjs/components/Posts/Posts.css +28 -0
- package/build/cjs/components/Posts/Posts.d.ts +19 -0
- package/build/cjs/components/Posts/Posts.js +32 -0
- package/build/cjs/components/PostsEmpty/PostsEmpty.css +25 -0
- package/build/cjs/components/PostsEmpty/PostsEmpty.d.ts +2 -0
- package/build/cjs/components/PostsEmpty/PostsEmpty.js +14 -0
- package/build/cjs/components/PostsError/PostError.css +30 -0
- package/build/cjs/components/PostsError/PostsError.d.ts +6 -0
- package/build/cjs/components/PostsError/PostsError.js +20 -0
- package/build/cjs/components/Search/Search.css +33 -0
- package/build/cjs/components/Search/Search.d.ts +15 -0
- package/build/cjs/components/Search/Search.js +67 -0
- package/build/cjs/components/Wrapper/Wrapper.css +32 -0
- package/build/cjs/components/Wrapper/Wrapper.d.ts +10 -0
- package/build/cjs/components/Wrapper/Wrapper.js +17 -0
- package/build/cjs/configure.d.ts +5 -0
- package/build/cjs/configure.js +8 -0
- package/build/cjs/constants.d.ts +27 -0
- package/build/cjs/constants.js +34 -0
- package/build/cjs/constructor/BlogConstructorProvider.d.ts +16 -0
- package/build/cjs/constructor/BlogConstructorProvider.js +46 -0
- package/build/cjs/constructor/blocksMap.d.ts +18 -0
- package/build/cjs/constructor/blocksMap.js +30 -0
- package/build/cjs/containers/BlogPage/BlogPage.css +21 -0
- package/build/cjs/containers/BlogPage/BlogPage.d.ts +15 -0
- package/build/cjs/containers/BlogPage/BlogPage.js +30 -0
- package/build/cjs/containers/BlogPostPage/BlogPostPage.css +251 -0
- package/build/cjs/containers/BlogPostPage/BlogPostPage.d.ts +18 -0
- package/build/cjs/containers/BlogPostPage/BlogPostPage.js +42 -0
- package/build/cjs/contexts/DeviceContext.d.ts +4 -0
- package/build/cjs/contexts/DeviceContext.js +8 -0
- package/build/cjs/contexts/FeedContext.d.ts +13 -0
- package/build/cjs/contexts/FeedContext.js +8 -0
- package/build/cjs/contexts/LikesContext.d.ts +7 -0
- package/build/cjs/contexts/LikesContext.js +8 -0
- package/build/cjs/contexts/LocaleContext.d.ts +6 -0
- package/build/cjs/contexts/LocaleContext.js +16 -0
- package/build/cjs/contexts/MobileContext.d.ts +2 -0
- package/build/cjs/contexts/MobileContext.js +8 -0
- package/build/cjs/contexts/PostPageContext.d.ts +14 -0
- package/build/cjs/contexts/PostPageContext.js +8 -0
- package/build/cjs/contexts/RouterContext.d.ts +9 -0
- package/build/cjs/contexts/RouterContext.js +8 -0
- package/build/cjs/contexts/UserContext.d.ts +18 -0
- package/build/cjs/contexts/UserContext.js +8 -0
- package/build/cjs/contexts/theme/ThemeContext.d.ts +8 -0
- package/build/cjs/contexts/theme/ThemeContext.js +13 -0
- package/build/cjs/contexts/theme/ThemeProvider.d.ts +23 -0
- package/build/cjs/contexts/theme/ThemeProvider.js +51 -0
- package/build/cjs/contexts/theme/ThemeValueContext.d.ts +7 -0
- package/build/cjs/contexts/theme/ThemeValueContext.js +11 -0
- package/build/cjs/contexts/theme/index.d.ts +6 -0
- package/build/cjs/contexts/theme/index.js +22 -0
- package/build/cjs/contexts/theme/useTheme.d.ts +2 -0
- package/build/cjs/contexts/theme/useTheme.js +13 -0
- package/build/cjs/contexts/theme/useThemeValue.d.ts +2 -0
- package/build/cjs/contexts/theme/useThemeValue.js +13 -0
- package/build/cjs/contexts/theme/withTheme.d.ts +6 -0
- package/build/cjs/contexts/theme/withTheme.js +21 -0
- package/build/cjs/contexts/theme/withThemeValue.d.ts +6 -0
- package/build/cjs/contexts/theme/withThemeValue.js +21 -0
- package/build/cjs/counters/metrika.d.ts +59 -0
- package/build/cjs/counters/metrika.js +170 -0
- package/build/cjs/counters/utils.d.ts +5 -0
- package/build/cjs/counters/utils.js +9 -0
- package/build/cjs/hooks/useIsIPhone.d.ts +1 -0
- package/build/cjs/hooks/useIsIPhone.js +10 -0
- package/build/cjs/hooks/useLikes.d.ts +15 -0
- package/build/cjs/hooks/useLikes.js +35 -0
- package/build/cjs/i18n/index.d.ts +22 -0
- package/build/cjs/i18n/index.js +74 -0
- package/build/cjs/icons/Close.d.ts +2 -0
- package/build/cjs/icons/Close.js +11 -0
- package/build/cjs/icons/DropdownArrow.d.ts +2 -0
- package/build/cjs/icons/DropdownArrow.js +11 -0
- package/build/cjs/icons/Save.d.ts +2 -0
- package/build/cjs/icons/Save.js +11 -0
- package/build/cjs/icons/SaveFilled.d.ts +2 -0
- package/build/cjs/icons/SaveFilled.js +11 -0
- package/build/cjs/icons/SearchIcon.d.ts +2 -0
- package/build/cjs/icons/SearchIcon.js +11 -0
- package/build/cjs/icons/ShareArrowUp.d.ts +2 -0
- package/build/cjs/icons/ShareArrowUp.js +11 -0
- package/build/cjs/icons/Time.d.ts +2 -0
- package/build/cjs/icons/Time.js +11 -0
- package/build/cjs/index.d.ts +7 -0
- package/build/cjs/index.js +29 -0
- package/build/cjs/internal-typings/bem-cn-lite.d.ts +17 -0
- package/build/cjs/internal-typings/global.d.ts +5 -0
- package/build/cjs/models/blocks.d.ts +84 -0
- package/build/cjs/models/blocks.js +2 -0
- package/build/cjs/models/common.d.ts +151 -0
- package/build/cjs/models/common.js +22 -0
- package/build/cjs/models/locale.d.ts +29 -0
- package/build/cjs/models/locale.js +14 -0
- package/build/cjs/models/paddings.d.ts +16 -0
- package/build/cjs/models/paddings.js +10 -0
- package/build/cjs/utils/cn.d.ts +4 -0
- package/build/cjs/utils/cn.js +12 -0
- package/build/cjs/utils/common.d.ts +42 -0
- package/build/cjs/utils/common.js +120 -0
- package/build/cjs/utils/date.d.ts +13 -0
- package/build/cjs/utils/date.js +59 -0
- package/build/cjs/utils/svg.d.ts +3 -0
- package/build/cjs/utils/svg.js +7 -0
- package/build/esm/blocks/Author/Author.css +31 -0
- package/build/esm/blocks/Author/Author.d.ts +4 -0
- package/build/esm/blocks/Author/Author.js +34 -0
- package/build/esm/blocks/Banner/Banner.css +58 -0
- package/build/esm/blocks/Banner/Banner.d.ts +4 -0
- package/build/esm/blocks/Banner/Banner.js +45 -0
- package/build/esm/blocks/CTA/CTA.css +56 -0
- package/build/esm/blocks/CTA/CTA.d.ts +4 -0
- package/build/esm/blocks/CTA/CTA.js +38 -0
- package/build/esm/blocks/ColoredText/ColoredText.css +28 -0
- package/build/esm/blocks/ColoredText/ColoredText.d.ts +4 -0
- package/build/esm/blocks/ColoredText/ColoredText.js +31 -0
- package/build/esm/blocks/Feed/Feed.d.ts +3 -0
- package/build/esm/blocks/Feed/Feed.js +153 -0
- package/build/esm/blocks/Feed/reducer.d.ts +65 -0
- package/build/esm/blocks/Feed/reducer.js +36 -0
- package/build/esm/blocks/Header/Header.d.ts +3 -0
- package/build/esm/blocks/Header/Header.js +36 -0
- package/build/esm/blocks/Layout/Layout.css +22 -0
- package/build/esm/blocks/Layout/Layout.d.ts +4 -0
- package/build/esm/blocks/Layout/Layout.js +52 -0
- package/build/esm/blocks/Media/Media.css +41 -0
- package/build/esm/blocks/Media/Media.d.ts +4 -0
- package/build/esm/blocks/Media/Media.js +32 -0
- package/build/esm/blocks/Meta/Meta.css +7 -0
- package/build/esm/blocks/Meta/Meta.d.ts +4 -0
- package/build/esm/blocks/Meta/Meta.js +40 -0
- package/build/esm/blocks/Suggest/Suggest.d.ts +12 -0
- package/build/esm/blocks/Suggest/Suggest.js +34 -0
- package/build/esm/blocks/YFM/YFM.d.ts +3 -0
- package/build/esm/blocks/YFM/YFM.js +17 -0
- package/build/esm/blocks/constants.d.ts +8 -0
- package/build/esm/blocks/constants.js +5 -0
- package/build/esm/components/ButtonWithIcon/ButtonWithIcon.css +76 -0
- package/build/esm/components/ButtonWithIcon/ButtonWithIcon.d.ts +13 -0
- package/build/esm/components/ButtonWithIcon/ButtonWithIcon.js +7 -0
- package/build/esm/components/FeedHeader/FeedHeader.css +54 -0
- package/build/esm/components/FeedHeader/FeedHeader.d.ts +9 -0
- package/build/esm/components/FeedHeader/FeedHeader.js +18 -0
- package/build/esm/components/FeedHeader/components/Controls/Controls.css +107 -0
- package/build/esm/components/FeedHeader/components/Controls/Controls.d.ts +17 -0
- package/build/esm/components/FeedHeader/components/Controls/Controls.js +77 -0
- package/build/esm/components/FeedHeader/components/Controls/customRenders.d.ts +12 -0
- package/build/esm/components/FeedHeader/components/Controls/customRenders.js +14 -0
- package/build/esm/components/FeedHeader/components/CustomSelectOption/CustomSelectOption.css +14 -0
- package/build/esm/components/FeedHeader/components/CustomSelectOption/CustomSelectOption.d.ts +9 -0
- package/build/esm/components/FeedHeader/components/CustomSelectOption/CustomSelectOption.js +7 -0
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.css +53 -0
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.d.ts +12 -0
- package/build/esm/components/FeedHeader/components/CustomSwitcher/CustomSwitcher.js +21 -0
- package/build/esm/components/MetaWrapper/MetaWrapper.d.ts +10 -0
- package/build/esm/components/MetaWrapper/MetaWrapper.js +11 -0
- package/build/esm/components/Paginator/Paginator.css +54 -0
- package/build/esm/components/Paginator/Paginator.d.ts +3 -0
- package/build/esm/components/Paginator/Paginator.js +89 -0
- package/build/esm/components/Paginator/components/NavigationButton.d.ts +7 -0
- package/build/esm/components/Paginator/components/NavigationButton.js +7 -0
- package/build/esm/components/Paginator/components/PaginatorItem.d.ts +3 -0
- package/build/esm/components/Paginator/components/PaginatorItem.js +9 -0
- package/build/esm/components/Paginator/types.d.ts +29 -0
- package/build/esm/components/Paginator/types.js +5 -0
- package/build/esm/components/Paginator/utils.d.ts +3 -0
- package/build/esm/components/Paginator/utils.js +27 -0
- package/build/esm/components/PostCard/PostCard.css +85 -0
- package/build/esm/components/PostCard/PostCard.d.ts +13 -0
- package/build/esm/components/PostCard/PostCard.js +34 -0
- package/build/esm/components/PostInfo/PostInfo.css +88 -0
- package/build/esm/components/PostInfo/PostInfo.d.ts +29 -0
- package/build/esm/components/PostInfo/PostInfo.js +29 -0
- package/build/esm/components/PostInfo/SuggestPostInfo.d.ts +28 -0
- package/build/esm/components/PostInfo/SuggestPostInfo.js +35 -0
- package/build/esm/components/PostInfo/components/Date.d.ts +8 -0
- package/build/esm/components/PostInfo/components/Date.js +10 -0
- package/build/esm/components/PostInfo/components/ReadingTime.d.ts +8 -0
- package/build/esm/components/PostInfo/components/ReadingTime.js +12 -0
- package/build/esm/components/PostInfo/components/Save.d.ts +26 -0
- package/build/esm/components/PostInfo/components/Save.js +44 -0
- package/build/esm/components/PostInfo/components/Sharing.d.ts +8 -0
- package/build/esm/components/PostInfo/components/Sharing.js +25 -0
- package/build/esm/components/Posts/Posts.css +28 -0
- package/build/esm/components/Posts/Posts.d.ts +20 -0
- package/build/esm/components/Posts/Posts.js +26 -0
- package/build/esm/components/PostsEmpty/PostsEmpty.css +25 -0
- package/build/esm/components/PostsEmpty/PostsEmpty.d.ts +3 -0
- package/build/esm/components/PostsEmpty/PostsEmpty.js +8 -0
- package/build/esm/components/PostsError/PostError.css +30 -0
- package/build/esm/components/PostsError/PostsError.d.ts +7 -0
- package/build/esm/components/PostsError/PostsError.js +14 -0
- package/build/esm/components/Search/Search.css +33 -0
- package/build/esm/components/Search/Search.d.ts +16 -0
- package/build/esm/components/Search/Search.js +41 -0
- package/build/esm/components/Wrapper/Wrapper.css +32 -0
- package/build/esm/components/Wrapper/Wrapper.d.ts +11 -0
- package/build/esm/components/Wrapper/Wrapper.js +11 -0
- package/build/esm/configure.d.ts +5 -0
- package/build/esm/configure.js +4 -0
- package/build/esm/constants.d.ts +27 -0
- package/build/esm/constants.js +31 -0
- package/build/esm/constructor/BlogConstructorProvider.d.ts +16 -0
- package/build/esm/constructor/BlogConstructorProvider.js +19 -0
- package/build/esm/constructor/blocksMap.d.ts +18 -0
- package/build/esm/constructor/blocksMap.js +28 -0
- package/build/esm/containers/BlogPage/BlogPage.css +21 -0
- package/build/esm/containers/BlogPage/BlogPage.d.ts +16 -0
- package/build/esm/containers/BlogPage/BlogPage.js +24 -0
- package/build/esm/containers/BlogPostPage/BlogPostPage.css +251 -0
- package/build/esm/containers/BlogPostPage/BlogPostPage.d.ts +19 -0
- package/build/esm/containers/BlogPostPage/BlogPostPage.js +36 -0
- package/build/esm/contexts/DeviceContext.d.ts +4 -0
- package/build/esm/contexts/DeviceContext.js +2 -0
- package/build/esm/contexts/FeedContext.d.ts +13 -0
- package/build/esm/contexts/FeedContext.js +2 -0
- package/build/esm/contexts/LikesContext.d.ts +7 -0
- package/build/esm/contexts/LikesContext.js +2 -0
- package/build/esm/contexts/LocaleContext.d.ts +6 -0
- package/build/esm/contexts/LocaleContext.js +10 -0
- package/build/esm/contexts/MobileContext.d.ts +2 -0
- package/build/esm/contexts/MobileContext.js +2 -0
- package/build/esm/contexts/PostPageContext.d.ts +14 -0
- package/build/esm/contexts/PostPageContext.js +2 -0
- package/build/esm/contexts/RouterContext.d.ts +9 -0
- package/build/esm/contexts/RouterContext.js +2 -0
- package/build/esm/contexts/UserContext.d.ts +18 -0
- package/build/esm/contexts/UserContext.js +2 -0
- package/build/esm/contexts/theme/ThemeContext.d.ts +8 -0
- package/build/esm/contexts/theme/ThemeContext.js +7 -0
- package/build/esm/contexts/theme/ThemeProvider.d.ts +23 -0
- package/build/esm/contexts/theme/ThemeProvider.js +44 -0
- package/build/esm/contexts/theme/ThemeValueContext.d.ts +7 -0
- package/build/esm/contexts/theme/ThemeValueContext.js +5 -0
- package/build/esm/contexts/theme/index.d.ts +6 -0
- package/build/esm/contexts/theme/index.js +6 -0
- package/build/esm/contexts/theme/useTheme.d.ts +2 -0
- package/build/esm/contexts/theme/useTheme.js +6 -0
- package/build/esm/contexts/theme/useThemeValue.d.ts +2 -0
- package/build/esm/contexts/theme/useThemeValue.js +6 -0
- package/build/esm/contexts/theme/withTheme.d.ts +6 -0
- package/build/esm/contexts/theme/withTheme.js +14 -0
- package/build/esm/contexts/theme/withThemeValue.d.ts +6 -0
- package/build/esm/contexts/theme/withThemeValue.js +14 -0
- package/build/esm/counters/metrika.d.ts +59 -0
- package/build/esm/counters/metrika.js +166 -0
- package/build/esm/counters/utils.d.ts +5 -0
- package/build/esm/counters/utils.js +6 -0
- package/build/esm/hooks/useIsIPhone.d.ts +1 -0
- package/build/esm/hooks/useIsIPhone.js +6 -0
- package/build/esm/hooks/useLikes.d.ts +15 -0
- package/build/esm/hooks/useLikes.js +31 -0
- package/build/esm/i18n/index.d.ts +22 -0
- package/build/esm/i18n/index.js +71 -0
- package/build/esm/icons/Close.d.ts +2 -0
- package/build/esm/icons/Close.js +4 -0
- package/build/esm/icons/DropdownArrow.d.ts +2 -0
- package/build/esm/icons/DropdownArrow.js +4 -0
- package/build/esm/icons/Save.d.ts +2 -0
- package/build/esm/icons/Save.js +4 -0
- package/build/esm/icons/SaveFilled.d.ts +2 -0
- package/build/esm/icons/SaveFilled.js +4 -0
- package/build/esm/icons/SearchIcon.d.ts +2 -0
- package/build/esm/icons/SearchIcon.js +4 -0
- package/build/esm/icons/ShareArrowUp.d.ts +2 -0
- package/build/esm/icons/ShareArrowUp.js +4 -0
- package/build/esm/icons/Time.d.ts +2 -0
- package/build/esm/icons/Time.js +4 -0
- package/build/esm/index.d.ts +7 -0
- package/build/esm/index.js +7 -0
- package/build/esm/internal-typings/bem-cn-lite.d.ts +17 -0
- package/build/esm/internal-typings/global.d.ts +5 -0
- package/build/esm/models/blocks.d.ts +84 -0
- package/build/esm/models/blocks.js +1 -0
- package/build/esm/models/common.d.ts +151 -0
- package/build/esm/models/common.js +19 -0
- package/build/esm/models/locale.d.ts +29 -0
- package/build/esm/models/locale.js +11 -0
- package/build/esm/models/paddings.d.ts +16 -0
- package/build/esm/models/paddings.js +7 -0
- package/build/esm/utils/cn.d.ts +4 -0
- package/build/esm/utils/cn.js +5 -0
- package/build/esm/utils/common.d.ts +42 -0
- package/build/esm/utils/common.js +107 -0
- package/build/esm/utils/date.d.ts +13 -0
- package/build/esm/utils/date.js +55 -0
- package/build/esm/utils/svg.d.ts +3 -0
- package/build/esm/utils/svg.js +4 -0
- package/package.json +140 -0
- package/server/data/config.d.ts +32 -0
- package/server/data/config.js +39 -0
- package/server/data/contentFilter.d.ts +27 -0
- package/server/data/contentFilter.js +61 -0
- package/server/data/createReadableContent.d.ts +17 -0
- package/server/data/createReadableContent.js +47 -0
- package/server/data/sanitizeMeta.d.ts +24 -0
- package/server/data/sanitizeMeta.js +18 -0
- package/server/data/transformPageContent.d.ts +21 -0
- package/server/data/transformPageContent.js +35 -0
- package/server/data/transformPost.d.ts +11 -0
- package/server/data/transformPost.js +34 -0
- package/server/index.d.ts +4 -0
- package/server/index.js +11 -0
- package/server/models/blocks.d.ts +84 -0
- package/server/models/blocks.js +2 -0
- package/server/models/common.d.ts +151 -0
- package/server/models/common.js +22 -0
- package/server/models/locale.d.ts +29 -0
- package/server/models/locale.js +14 -0
- package/server/models/paddings.d.ts +16 -0
- package/server/models/paddings.js +10 -0
- package/styles/fonts.css +195 -0
- package/styles/fonts.scss +223 -0
- package/styles/mixins.css +2 -0
- package/styles/mixins.scss +59 -0
- package/styles/root.css +21 -0
- package/styles/root.scss +25 -0
- package/styles/storybook/common.scss +29 -0
- package/styles/storybook/index.scss +21 -0
- package/styles/storybook/palette.scss +75 -0
- package/styles/storybook/typography.scss +139 -0
- package/styles/styles.css +196 -0
- package/styles/styles.scss +2 -0
- package/styles/variables.css +0 -0
- package/styles/variables.scss +7 -0
- package/styles/yfm.css +103 -0
- package/styles/yfm.scss +123 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
import { SelectProps, SelectOption } from '@gravity-ui/uikit';
|
2
|
+
import { CustomSwitcherProps } from '../CustomSwitcher/CustomSwitcher';
|
3
|
+
import './Controls.css';
|
4
|
+
type RenderSwitcherType = ({ initial, list, defaultLabel, }: {
|
5
|
+
initial: CustomSwitcherProps['initial'];
|
6
|
+
list: CustomSwitcherProps['list'];
|
7
|
+
defaultLabel: string;
|
8
|
+
}) => SelectProps['renderControl'];
|
9
|
+
export declare const renderSwitcher: RenderSwitcherType;
|
10
|
+
export declare const renderFilter: SelectProps['renderFilter'];
|
11
|
+
export declare const renderOption: (option: SelectOption) => JSX.Element;
|
12
|
+
export {};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { TextInput } from '@gravity-ui/uikit';
|
3
|
+
import { i18, Keyset } from '../../../../i18n';
|
4
|
+
import { block } from '../../../../utils/cn';
|
5
|
+
import { CustomSwitcher } from '../CustomSwitcher/CustomSwitcher';
|
6
|
+
import { CustomSelectOption, } from '../CustomSelectOption/CustomSelectOption';
|
7
|
+
import './Controls.css';
|
8
|
+
const b = block('feed-controls');
|
9
|
+
export const renderSwitcher = ({ initial, list, defaultLabel }) =>
|
10
|
+
// eslint-disable-next-line react/display-name
|
11
|
+
({ onClick, ref }) => (React.createElement(CustomSwitcher, { initial: initial, defaultLabel: defaultLabel, list: list, controlRef: ref, onClick: onClick }));
|
12
|
+
export const renderFilter = ({ value, ref, onChange, onKeyDown }) => (React.createElement("div", { className: b('popup-filter') },
|
13
|
+
React.createElement(TextInput, { controlRef: ref, controlProps: { size: 1 }, value: value, placeholder: i18(Keyset.Search), onUpdate: onChange, onKeyDown: onKeyDown })));
|
14
|
+
export const renderOption = (option) => (React.createElement(CustomSelectOption, { data: option }));
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-feed-custom-select-option {
|
4
|
+
font-size: var(--yc-text-body-2-font-size);
|
5
|
+
line-height: var(--yc-text-body-2-line-height);
|
6
|
+
display: flex;
|
7
|
+
}
|
8
|
+
.bc-feed-custom-select-option__icon {
|
9
|
+
margin-right: 6px;
|
10
|
+
}
|
11
|
+
.bc-feed-custom-select-option__icon > svg {
|
12
|
+
width: 20px;
|
13
|
+
height: 20px;
|
14
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { SelectOption as SelectOptionType } from '@gravity-ui/uikit';
|
3
|
+
import './CustomSelectOption.css';
|
4
|
+
export type CustomSelectOptionProps = {
|
5
|
+
data: {
|
6
|
+
icon?: React.ReactElement;
|
7
|
+
} & SelectOptionType;
|
8
|
+
};
|
9
|
+
export declare const CustomSelectOption: ({ data }: CustomSelectOptionProps) => JSX.Element;
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { block } from '../../../../utils/cn';
|
3
|
+
import './CustomSelectOption.css';
|
4
|
+
const b = block('feed-custom-select-option');
|
5
|
+
export const CustomSelectOption = ({ data }) => (React.createElement("div", { className: b() },
|
6
|
+
React.createElement("span", { className: b('icon') }, data.icon),
|
7
|
+
React.createElement("span", null, data.content)));
|
@@ -0,0 +1,53 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-feed-custom-switcher__custom-switcher {
|
4
|
+
font-size: var(--yc-text-body-2-font-size);
|
5
|
+
line-height: var(--yc-text-body-2-line-height);
|
6
|
+
position: relative;
|
7
|
+
display: flex;
|
8
|
+
flex-direction: row;
|
9
|
+
align-items: center;
|
10
|
+
background-color: var(--yc-color-base-background);
|
11
|
+
border: 1px solid var(--yc-color-base-background);
|
12
|
+
border-radius: 10px;
|
13
|
+
width: 100%;
|
14
|
+
line-height: 42px;
|
15
|
+
}
|
16
|
+
.bc-feed-custom-switcher__custom-switcher + .yc-popup-wrapper.yc-popup-wrapper_open {
|
17
|
+
position: absolute !important;
|
18
|
+
inset: auto !important;
|
19
|
+
transform: translate3d(0, 4px, 0) !important;
|
20
|
+
}
|
21
|
+
.bc-feed-custom-switcher__custom-switcher:hover {
|
22
|
+
border-color: var(--yc-color-base-generic-hover);
|
23
|
+
cursor: pointer;
|
24
|
+
}
|
25
|
+
.bc-feed-custom-switcher__custom-switcher-element_content {
|
26
|
+
display: inline-block;
|
27
|
+
flex-grow: 1;
|
28
|
+
overflow: hidden;
|
29
|
+
text-overflow: ellipsis;
|
30
|
+
white-space: nowrap;
|
31
|
+
padding: 0 12px;
|
32
|
+
}
|
33
|
+
.bc-feed-custom-switcher__custom-switcher-element_counter {
|
34
|
+
align-items: center;
|
35
|
+
height: 20px;
|
36
|
+
padding: 0 6px;
|
37
|
+
background-color: var(--yc-color-base-selection);
|
38
|
+
border-radius: 4px;
|
39
|
+
transition: backgound-color 0.1s linear;
|
40
|
+
font-size: var(--yc-text-body-1-font-size);
|
41
|
+
line-height: var(--yc-text-body-1-line-height);
|
42
|
+
}
|
43
|
+
.bc-feed-custom-switcher__custom-switcher-element_arrow {
|
44
|
+
display: flex;
|
45
|
+
align-items: center;
|
46
|
+
justify-content: center;
|
47
|
+
min-width: 30px;
|
48
|
+
height: 100%;
|
49
|
+
}
|
50
|
+
.bc-feed-custom-switcher__switcher-arrow {
|
51
|
+
width: 16px;
|
52
|
+
height: 16px;
|
53
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { SelectProps } from '@gravity-ui/uikit';
|
2
|
+
import { SelectItem } from '../Controls/Controls';
|
3
|
+
import './CustomSwitcher.css';
|
4
|
+
type RenderControlParameters = Partial<Parameters<Required<SelectProps>['renderControl']>[0]>;
|
5
|
+
export type CustomSwitcherProps = {
|
6
|
+
initial: (string | number | null)[];
|
7
|
+
defaultLabel: string;
|
8
|
+
list: SelectItem[];
|
9
|
+
controlRef: RenderControlParameters['ref'];
|
10
|
+
} & Omit<RenderControlParameters, 'ref'>;
|
11
|
+
export declare const CustomSwitcher: ({ initial, defaultLabel, list, onClick, controlRef, }: CustomSwitcherProps) => JSX.Element;
|
12
|
+
export {};
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import React, { useMemo } from 'react';
|
2
|
+
import { Icon } from '@gravity-ui/uikit';
|
3
|
+
import { DropdownArrow } from '../../../../icons/DropdownArrow';
|
4
|
+
import { block } from '../../../../utils/cn';
|
5
|
+
import './CustomSwitcher.css';
|
6
|
+
const b = block('feed-custom-switcher');
|
7
|
+
const ICON_SIZE = 12;
|
8
|
+
export const CustomSwitcher = ({ initial, defaultLabel, list, onClick, controlRef, }) => {
|
9
|
+
const itemsNames = useMemo(() => {
|
10
|
+
const items = list
|
11
|
+
.filter((item) => initial.includes(item.value))
|
12
|
+
.map((item) => item.content);
|
13
|
+
return items.length ? items : [defaultLabel];
|
14
|
+
}, [defaultLabel, initial, list]);
|
15
|
+
const hasCounter = itemsNames.length > 1;
|
16
|
+
return (React.createElement("div", { className: b('custom-switcher'), onClick: onClick, ref: controlRef },
|
17
|
+
React.createElement("div", { className: b('custom-switcher-element', { content: true }) }, itemsNames === null || itemsNames === void 0 ? void 0 : itemsNames.join(', ')),
|
18
|
+
hasCounter && (React.createElement("div", { className: b('custom-switcher-element', { counter: true }) }, itemsNames.length)),
|
19
|
+
React.createElement("div", { className: b('custom-switcher-element', { arrow: true }) },
|
20
|
+
React.createElement(Icon, { data: DropdownArrow, size: ICON_SIZE, className: b('switcher-arrow') }))));
|
21
|
+
};
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { MetaProps } from '../../models/common';
|
2
|
+
/**
|
3
|
+
* Wrapper on meta data of page
|
4
|
+
*
|
5
|
+
* @param needHelmetWrapper - component needs helmet wrapper
|
6
|
+
* @param metaComponent - meta data component
|
7
|
+
*
|
8
|
+
* @returns jsx
|
9
|
+
*/
|
10
|
+
export declare const MetaWrapper: ({ needHelmetWrapper, metaComponent }: MetaProps) => JSX.Element;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Helmet } from 'react-helmet';
|
3
|
+
/**
|
4
|
+
* Wrapper on meta data of page
|
5
|
+
*
|
6
|
+
* @param needHelmetWrapper - component needs helmet wrapper
|
7
|
+
* @param metaComponent - meta data component
|
8
|
+
*
|
9
|
+
* @returns jsx
|
10
|
+
*/
|
11
|
+
export const MetaWrapper = ({ needHelmetWrapper = false, metaComponent }) => needHelmetWrapper ? React.createElement(Helmet, null, metaComponent) : metaComponent;
|
@@ -0,0 +1,54 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-paginator {
|
4
|
+
margin: 0;
|
5
|
+
padding: 0;
|
6
|
+
list-style: none;
|
7
|
+
display: flex;
|
8
|
+
align-items: center;
|
9
|
+
}
|
10
|
+
.bc-paginator__item {
|
11
|
+
display: inline-flex;
|
12
|
+
align-items: center;
|
13
|
+
justify-content: center;
|
14
|
+
min-width: 44px;
|
15
|
+
min-height: 44px;
|
16
|
+
margin-left: 4px;
|
17
|
+
padding: 12px 0px;
|
18
|
+
color: var(--yc-color-text-primary);
|
19
|
+
font-size: var(--yc-text-body-2-font-size);
|
20
|
+
line-height: var(--yc-text-body-2-line-height);
|
21
|
+
}
|
22
|
+
.bc-paginator__item_type_page {
|
23
|
+
--bc-border-radius: 10px;
|
24
|
+
width: 44px;
|
25
|
+
height: 44px;
|
26
|
+
cursor: pointer;
|
27
|
+
border-radius: var(--bc-border-radius);
|
28
|
+
}
|
29
|
+
.bc-paginator__item_type_page:hover {
|
30
|
+
background: var(--yc-color-base-simple-hover);
|
31
|
+
}
|
32
|
+
.bc-paginator__item_type_page.bc-paginator__item_active {
|
33
|
+
background: var(--yc-color-base-simple-hover);
|
34
|
+
cursor: default;
|
35
|
+
}
|
36
|
+
.bc-paginator__pagination {
|
37
|
+
display: flex;
|
38
|
+
flex-direction: row;
|
39
|
+
justify-content: center;
|
40
|
+
align-items: center;
|
41
|
+
width: 100%;
|
42
|
+
}
|
43
|
+
@media (max-width: 577px) {
|
44
|
+
.bc-paginator__pagination {
|
45
|
+
flex-direction: column;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
.bc-paginator__pagination-block {
|
49
|
+
display: flex;
|
50
|
+
flex-direction: row;
|
51
|
+
justify-content: center;
|
52
|
+
align-items: center;
|
53
|
+
margin-bottom: 4px;
|
54
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
2
|
+
var t = {};
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
4
|
+
t[p] = s[p];
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
8
|
+
t[p[i]] = s[p[i]];
|
9
|
+
}
|
10
|
+
return t;
|
11
|
+
};
|
12
|
+
import React, { useEffect, useState, useMemo } from 'react';
|
13
|
+
import { BlogMetrikaGoalIds } from '../../constants';
|
14
|
+
import metrika from '../../counters/metrika.js';
|
15
|
+
import { MetrikaCounter } from '../../counters/utils';
|
16
|
+
import { getPageConfigs, getPagesCount } from './utils';
|
17
|
+
import { ArrowType } from './types';
|
18
|
+
import { block } from '../../utils/cn';
|
19
|
+
import { NavigationButton } from './components/NavigationButton';
|
20
|
+
import { PaginatorItem } from './components/PaginatorItem';
|
21
|
+
import './Paginator.css';
|
22
|
+
const b = block('paginator');
|
23
|
+
const DEFAULT_PAGE_COUNT_FOR_SHOW_SUPPORT_BUTTONS = 6;
|
24
|
+
export const Paginator = ({ itemsPerPage, totalItems, maxPages, page, className, loading, onPageChange, pageCountForShowSupportButtons = DEFAULT_PAGE_COUNT_FOR_SHOW_SUPPORT_BUTTONS, }) => {
|
25
|
+
const [pagesCount, setPagesCount] = useState(getPagesCount({ itemsPerPage, totalItems, maxPages }));
|
26
|
+
useEffect(() => {
|
27
|
+
const count = getPagesCount({ itemsPerPage, totalItems, maxPages });
|
28
|
+
setPagesCount(count);
|
29
|
+
}, [itemsPerPage, totalItems, maxPages]);
|
30
|
+
const handlePageChange = (pageIndex) => onPageChange === null || onPageChange === void 0 ? void 0 : onPageChange(pageIndex);
|
31
|
+
const isShowSupportButtons = useMemo(() => pagesCount > pageCountForShowSupportButtons, [pageCountForShowSupportButtons, pagesCount]);
|
32
|
+
if (pagesCount <= 1) {
|
33
|
+
return null;
|
34
|
+
}
|
35
|
+
const handleArrowClick = (type) => {
|
36
|
+
let newPage = page;
|
37
|
+
if (type === 'prev' && page > 1) {
|
38
|
+
metrika.reachGoal(MetrikaCounter.CrossSite, BlogMetrikaGoalIds.home);
|
39
|
+
newPage = 1;
|
40
|
+
}
|
41
|
+
else if (type === 'next' && page < pagesCount) {
|
42
|
+
metrika.reachGoal(MetrikaCounter.CrossSite, BlogMetrikaGoalIds.next);
|
43
|
+
newPage = page + 1;
|
44
|
+
}
|
45
|
+
if (newPage !== page) {
|
46
|
+
handlePageChange(newPage);
|
47
|
+
}
|
48
|
+
};
|
49
|
+
const handlePageClick = (index) => {
|
50
|
+
if (index !== page && typeof index === 'number') {
|
51
|
+
metrika.reachGoal(MetrikaCounter.CrossSite, BlogMetrikaGoalIds.page, { page: index });
|
52
|
+
handlePageChange(index);
|
53
|
+
}
|
54
|
+
};
|
55
|
+
const paginatorItems = getPageConfigs({ page, pagesCount, handlePageClick });
|
56
|
+
if (page > 1 && isShowSupportButtons) {
|
57
|
+
paginatorItems.unshift({
|
58
|
+
key: ArrowType.Prev,
|
59
|
+
dataKey: ArrowType.Prev,
|
60
|
+
mods: { type: ArrowType.Prev },
|
61
|
+
onClick: handleArrowClick,
|
62
|
+
content: React.createElement(NavigationButton, { arrowType: ArrowType.Prev }),
|
63
|
+
});
|
64
|
+
}
|
65
|
+
if (page < pagesCount && isShowSupportButtons) {
|
66
|
+
paginatorItems.push({
|
67
|
+
key: ArrowType.Next,
|
68
|
+
dataKey: ArrowType.Next,
|
69
|
+
mods: { type: ArrowType.Next },
|
70
|
+
onClick: handleArrowClick,
|
71
|
+
content: React.createElement(NavigationButton, { arrowType: ArrowType.Next }),
|
72
|
+
});
|
73
|
+
}
|
74
|
+
const renderPaginatorItem = (item) => {
|
75
|
+
const { key } = item, rest = __rest(item, ["key"]);
|
76
|
+
return React.createElement(PaginatorItem, Object.assign({ key: `page_${key}` }, rest, { loading: loading }));
|
77
|
+
};
|
78
|
+
return (React.createElement("div", { className: b('pagination') },
|
79
|
+
page > 1 && (React.createElement("div", { className: b('pagination-block') },
|
80
|
+
React.createElement("ul", { className: b(null, className) }, paginatorItems.slice(0, 1).map(renderPaginatorItem)))),
|
81
|
+
React.createElement("div", { className: b('pagination-block') },
|
82
|
+
React.createElement("ul", { className: b(null, className) }, paginatorItems
|
83
|
+
.slice(page > 1 ? 1 : 0, page < pagesCount ? paginatorItems.length - 1 : paginatorItems.length)
|
84
|
+
.map(renderPaginatorItem))),
|
85
|
+
page < pagesCount && (React.createElement("div", { className: b('pagination-block') },
|
86
|
+
React.createElement("ul", { className: b(null, className) }, paginatorItems
|
87
|
+
.slice(paginatorItems.length - 1, paginatorItems.length)
|
88
|
+
.map(renderPaginatorItem))))));
|
89
|
+
};
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { ArrowType } from '../types';
|
2
|
+
import '../Paginator.css';
|
3
|
+
export type NavigationButtonProps = {
|
4
|
+
arrowType: ArrowType;
|
5
|
+
disabled?: boolean;
|
6
|
+
};
|
7
|
+
export declare const NavigationButton: ({ arrowType, disabled }: NavigationButtonProps) => JSX.Element | null;
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { ArrowType } from '../types';
|
3
|
+
import { i18, Keyset } from '../../../i18n';
|
4
|
+
import { block } from '../../../utils/cn';
|
5
|
+
import '../Paginator.css';
|
6
|
+
const b = block('paginator');
|
7
|
+
export const NavigationButton = ({ arrowType, disabled }) => disabled ? null : (React.createElement("div", { className: b('icon') }, arrowType === ArrowType.Prev ? i18(Keyset.ButtonBegin) : i18(Keyset.ButtonFarther)));
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Button } from '@gravity-ui/uikit';
|
3
|
+
import { block } from '../../../utils/cn';
|
4
|
+
import '../Paginator.css';
|
5
|
+
const b = block('paginator');
|
6
|
+
export const PaginatorItem = ({ dataKey, mods, content, onClick, loading = false, }) => {
|
7
|
+
const itemKey = Number(dataKey) > 0 ? Number(dataKey) : dataKey;
|
8
|
+
return (React.createElement(Button, { view: "flat", size: "xl", className: b('item', mods), onClick: () => onClick === null || onClick === void 0 ? void 0 : onClick(itemKey), loading: loading && Boolean(mods.active) }, content));
|
9
|
+
};
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { ReactNode } from 'react';
|
2
|
+
import { Modifications } from 'bem-cn-lite';
|
3
|
+
import { ClassNameProps } from '../../models/common';
|
4
|
+
export interface PaginatorItemProps {
|
5
|
+
key: string | ArrowType;
|
6
|
+
dataKey: string | ArrowType;
|
7
|
+
mods: Modifications;
|
8
|
+
content: ReactNode;
|
9
|
+
onClick?: (key: number | ArrowType) => void;
|
10
|
+
loading?: boolean;
|
11
|
+
}
|
12
|
+
export type PaginatorProps = {
|
13
|
+
page: number;
|
14
|
+
totalItems: number;
|
15
|
+
itemsPerPage: number;
|
16
|
+
maxPages: number;
|
17
|
+
loading: boolean;
|
18
|
+
onPageChange: (page: number) => void;
|
19
|
+
pageCountForShowSupportButtons?: number;
|
20
|
+
} & ClassNameProps;
|
21
|
+
export declare enum ArrowType {
|
22
|
+
Prev = "prev",
|
23
|
+
Next = "next"
|
24
|
+
}
|
25
|
+
export type GetPageConfigParams = {
|
26
|
+
page: number;
|
27
|
+
pagesCount: number;
|
28
|
+
handlePageClick: (key: number | ArrowType) => void;
|
29
|
+
};
|
@@ -0,0 +1,3 @@
|
|
1
|
+
import { GetPageConfigParams, PaginatorItemProps, PaginatorProps } from './types';
|
2
|
+
export declare const getPageConfigs: ({ page, pagesCount, handlePageClick }: GetPageConfigParams) => PaginatorItemProps[];
|
3
|
+
export declare const getPagesCount: (props: Pick<PaginatorProps, 'totalItems' | 'itemsPerPage' | 'maxPages'>) => number;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
const MAX_VISIBLE_PAGES = 5;
|
2
|
+
export const getPageConfigs = ({ page, pagesCount, handlePageClick }) => {
|
3
|
+
const paginatorItems = [];
|
4
|
+
// it is calculating the middle of visible pages below
|
5
|
+
const pageOffset = (MAX_VISIBLE_PAGES - 1) / 2;
|
6
|
+
let startPage = page - pageOffset;
|
7
|
+
let endPage = page + pageOffset;
|
8
|
+
if (startPage < 1) {
|
9
|
+
endPage = page + pageOffset - startPage + 1;
|
10
|
+
startPage = 1;
|
11
|
+
}
|
12
|
+
endPage = Math.min(endPage, pagesCount);
|
13
|
+
for (let i = startPage; i <= endPage; i++) {
|
14
|
+
paginatorItems.push({
|
15
|
+
key: String(i),
|
16
|
+
dataKey: String(i),
|
17
|
+
mods: { type: 'page', active: page === i },
|
18
|
+
onClick: handlePageClick,
|
19
|
+
content: i,
|
20
|
+
});
|
21
|
+
}
|
22
|
+
return paginatorItems;
|
23
|
+
};
|
24
|
+
export const getPagesCount = (props) => {
|
25
|
+
const totalPages = Math.ceil(props.totalItems / props.itemsPerPage);
|
26
|
+
return Math.min(totalPages, props.maxPages);
|
27
|
+
};
|
@@ -0,0 +1,85 @@
|
|
1
|
+
.bc-post-card__title_size_m, .bc-post-card__title_size_s {
|
2
|
+
margin: 0;
|
3
|
+
}
|
4
|
+
|
5
|
+
/* use this for style redefinitions to awoid problems with
|
6
|
+
unpredictable css rules order in build */
|
7
|
+
.bc-post-card__card {
|
8
|
+
display: flex;
|
9
|
+
flex-direction: column;
|
10
|
+
min-height: 400px;
|
11
|
+
}
|
12
|
+
.bc-post-card__card_fullWidth {
|
13
|
+
flex-direction: row;
|
14
|
+
}
|
15
|
+
@media (max-width: 1081px) {
|
16
|
+
.bc-post-card__card_fullWidth {
|
17
|
+
flex-direction: column;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
.bc-post-card__header_fullWidth {
|
21
|
+
width: 66%;
|
22
|
+
min-height: 480px;
|
23
|
+
height: 100%;
|
24
|
+
}
|
25
|
+
@media (max-width: 1081px) {
|
26
|
+
.bc-post-card__header_fullWidth {
|
27
|
+
width: 100%;
|
28
|
+
min-height: auto;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
.bc-post-card__title {
|
32
|
+
margin-bottom: 8px;
|
33
|
+
}
|
34
|
+
.bc-post-card__title_size_s {
|
35
|
+
font-size: var(--yc-text-header-1-font-size);
|
36
|
+
line-height: var(--yc-text-header-1-line-height);
|
37
|
+
color: var(--pc-text-header-color);
|
38
|
+
font-weight: var(--yc-text-accent-font-weight);
|
39
|
+
}
|
40
|
+
.bc-post-card__title_size_m {
|
41
|
+
font-size: var(--yc-text-display-2-font-size);
|
42
|
+
line-height: var(--yc-text-display-2-line-height);
|
43
|
+
color: var(--pc-text-header-color);
|
44
|
+
font-weight: var(--yc-text-accent-font-weight);
|
45
|
+
}
|
46
|
+
@media (max-width: 576px) {
|
47
|
+
.bc-post-card__title_size_m {
|
48
|
+
font-size: var(--yc-text-display-1-font-size);
|
49
|
+
line-height: var(--yc-text-display-1-line-height);
|
50
|
+
}
|
51
|
+
}
|
52
|
+
.bc-post-card__image-container {
|
53
|
+
height: 156px;
|
54
|
+
}
|
55
|
+
.bc-post-card__tag {
|
56
|
+
color: var(--yc-color-text-secondary);
|
57
|
+
font-weight: var(--yc-text-accent-font-weight);
|
58
|
+
}
|
59
|
+
.bc-post-card__tag_size_s {
|
60
|
+
font-size: var(--yc-text-body-2-font-size);
|
61
|
+
line-height: var(--yc-text-body-2-line-height);
|
62
|
+
padding-bottom: 4px;
|
63
|
+
}
|
64
|
+
.bc-post-card__tag_size_m {
|
65
|
+
font-size: var(--yc-text-body-3-font-size);
|
66
|
+
line-height: var(--yc-text-body-3-line-height);
|
67
|
+
padding-bottom: 8px;
|
68
|
+
}
|
69
|
+
.bc-post-card__description {
|
70
|
+
word-wrap: break-word;
|
71
|
+
overflow: hidden;
|
72
|
+
text-overflow: ellipsis;
|
73
|
+
max-height: 96px;
|
74
|
+
white-space: initial;
|
75
|
+
color: var(--yc-color-text-primary);
|
76
|
+
}
|
77
|
+
@supports (-webkit-line-clamp: 5) {
|
78
|
+
.bc-post-card__description {
|
79
|
+
max-height: auto;
|
80
|
+
-webkit-line-clamp: 5;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
.bc-post-card__description_size_m {
|
84
|
+
max-height: 128px;
|
85
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { MetrikaGoal } from '@gravity-ui/page-constructor';
|
3
|
+
import { PostData } from '../../models/common';
|
4
|
+
import './PostCard.css';
|
5
|
+
type PostCardProps = {
|
6
|
+
post: PostData;
|
7
|
+
fullWidth?: boolean;
|
8
|
+
showTag?: boolean;
|
9
|
+
size?: 's' | 'm';
|
10
|
+
metrikaGoals?: MetrikaGoal;
|
11
|
+
};
|
12
|
+
export declare const PostCard: React.FC<PostCardProps>;
|
13
|
+
export {};
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import React, { useMemo, useContext } from 'react';
|
2
|
+
import { CardBase, YFMWrapper, HTML } from '@gravity-ui/page-constructor';
|
3
|
+
import { LikesContext } from '../../contexts/LikesContext';
|
4
|
+
import { SuggestPostInfo } from '../PostInfo/SuggestPostInfo';
|
5
|
+
import { block } from '../../utils/cn';
|
6
|
+
import './PostCard.css';
|
7
|
+
const b = block('post-card');
|
8
|
+
export const PostCard = ({ post, metrikaGoals, fullWidth = false, size = 's', showTag = false, }) => {
|
9
|
+
var _a;
|
10
|
+
const { title: postTitle, htmlTitle, textTitle, blogPostId, id, date, readingTime, hasUserLike, likes, image, description, tags, url, } = post;
|
11
|
+
const title = postTitle || textTitle || htmlTitle;
|
12
|
+
const { toggleLike, hasLikes } = useContext(LikesContext);
|
13
|
+
const likesProps = useMemo(() => hasLikes
|
14
|
+
? {
|
15
|
+
hasUserLike,
|
16
|
+
likesCount: likes,
|
17
|
+
toggleLike,
|
18
|
+
}
|
19
|
+
: undefined, [hasUserLike, likes, toggleLike, hasLikes]);
|
20
|
+
return (React.createElement(CardBase, { url: url, metrikaGoals: metrikaGoals, className: b('card', { fullWidth }) },
|
21
|
+
React.createElement(CardBase.Header, { image: image, className: b('header', { fullWidth }) },
|
22
|
+
React.createElement("div", { className: b('image-container'), "data-qa": "blog-suggest-header" })),
|
23
|
+
React.createElement(CardBase.Content, null,
|
24
|
+
showTag && ((_a = tags === null || tags === void 0 ? void 0 : tags[0]) === null || _a === void 0 ? void 0 : _a.name) && (React.createElement("div", { className: b('tag', { size }) }, tags[0].name)),
|
25
|
+
title && (React.createElement("h4", { className: b('title', { size }) },
|
26
|
+
React.createElement("span", null,
|
27
|
+
React.createElement(HTML, null, title)))),
|
28
|
+
description && (React.createElement(YFMWrapper, { className: b('description'), content: description, modifiers: {
|
29
|
+
blog: size === 'm',
|
30
|
+
blogCard: true,
|
31
|
+
} }))),
|
32
|
+
React.createElement(CardBase.Footer, null,
|
33
|
+
React.createElement(SuggestPostInfo, { postId: blogPostId || id, date: date, readingTime: readingTime, hasUserLike: hasUserLike, likes: likesProps, size: size, dataQa: "blog-suggest-block" }))));
|
34
|
+
};
|
@@ -0,0 +1,88 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-post-info__item {
|
4
|
+
font-size: var(--yc-text-body-2-font-size);
|
5
|
+
line-height: var(--yc-text-body-2-line-height);
|
6
|
+
display: flex;
|
7
|
+
padding-right: 24px;
|
8
|
+
padding-top: 12px;
|
9
|
+
flex-wrap: nowrap;
|
10
|
+
align-items: center;
|
11
|
+
}
|
12
|
+
.bc-post-info__item_size_s {
|
13
|
+
font-size: var(--yc-text-body-2-font-size);
|
14
|
+
line-height: var(--yc-text-body-2-line-height);
|
15
|
+
}
|
16
|
+
.bc-post-info__item_size_m {
|
17
|
+
font-size: var(--yc-text-body-3-font-size);
|
18
|
+
line-height: var(--yc-text-body-3-line-height);
|
19
|
+
}
|
20
|
+
.bc-post-info__item:last-child {
|
21
|
+
font-size: var(--yc-text-body-2-font-size);
|
22
|
+
line-height: var(--yc-text-body-2-line-height);
|
23
|
+
display: flex;
|
24
|
+
padding-right: 0px;
|
25
|
+
padding-top: 12px;
|
26
|
+
flex-wrap: nowrap;
|
27
|
+
align-items: center;
|
28
|
+
}
|
29
|
+
.bc-post-info__switcher {
|
30
|
+
color: var(--yc-color-text-secondary);
|
31
|
+
}
|
32
|
+
.bc-post-info__switcher:hover {
|
33
|
+
color: var(--yc-color-text-primary);
|
34
|
+
}
|
35
|
+
.bc-post-info__switcher_theme_dark {
|
36
|
+
color: var(--yc-color-text-light-secondary);
|
37
|
+
}
|
38
|
+
.bc-post-info__switcher_theme_dark.yc-share-tooltip__container, .bc-post-info__switcher_theme_dark.yc-share-popover__container {
|
39
|
+
color: var(--yc-color-text-light-secondary);
|
40
|
+
}
|
41
|
+
.bc-post-info__switcher_theme_dark:hover {
|
42
|
+
color: var(--yc-color-text-light-primary);
|
43
|
+
}
|
44
|
+
.bc-post-info__switcher_theme_dark:hover.yc-share-tooltip__container, .bc-post-info__switcher_theme_dark:hover.yc-share-popover__container {
|
45
|
+
color: var(--yc-color-text-light-primary);
|
46
|
+
}
|
47
|
+
.bc-post-info__container {
|
48
|
+
display: flex;
|
49
|
+
align-items: flex-start;
|
50
|
+
flex-wrap: wrap;
|
51
|
+
padding-top: 12px;
|
52
|
+
color: var(--yc-color-text-secondary);
|
53
|
+
}
|
54
|
+
.bc-post-info__container_theme_dark {
|
55
|
+
color: var(--yc-color-text-light-secondary);
|
56
|
+
}
|
57
|
+
.bc-post-info__icon {
|
58
|
+
margin-right: 6px;
|
59
|
+
display: flex;
|
60
|
+
align-items: center;
|
61
|
+
}
|
62
|
+
.bc-post-info__title {
|
63
|
+
width: auto;
|
64
|
+
overflow: hidden;
|
65
|
+
}
|
66
|
+
.bc-post-info__title_cursor {
|
67
|
+
cursor: pointer;
|
68
|
+
}
|
69
|
+
.bc-post-info__content {
|
70
|
+
display: flex;
|
71
|
+
}
|
72
|
+
.bc-post-info__content_cursor {
|
73
|
+
cursor: pointer;
|
74
|
+
}
|
75
|
+
.bc-post-info__content_cursor:hover {
|
76
|
+
color: var(--yc-color-text-primary);
|
77
|
+
}
|
78
|
+
.bc-post-info__content_cursor.bc-post-info__content_theme_dark:hover {
|
79
|
+
color: var(--yc-color-text-light-primary);
|
80
|
+
}
|
81
|
+
.bc-post-info__likes {
|
82
|
+
display: flex;
|
83
|
+
}
|
84
|
+
.bc-post-info__suggest-container {
|
85
|
+
display: flex;
|
86
|
+
flex-grow: 1;
|
87
|
+
flex-wrap: wrap;
|
88
|
+
}
|