@gravity-ui/blog-constructor 1.0.0-alpha.1
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 +106 -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 +106 -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,52 @@
|
|
1
|
+
import React, { useMemo } from 'react';
|
2
|
+
import { Col, Row, } from '@gravity-ui/page-constructor';
|
3
|
+
import { Wrapper } from '../../components/Wrapper/Wrapper';
|
4
|
+
import { PaddingsDirections } from '../../models/paddings';
|
5
|
+
import { block } from '../../utils/cn';
|
6
|
+
import './Layout.css';
|
7
|
+
const b = block('layout');
|
8
|
+
export const Layout = ({ fullWidth, mobileOrder, children, paddingTop = 'xs', paddingBottom = 'xs', }) => {
|
9
|
+
const layout = useMemo(() => {
|
10
|
+
const layoutConfig = {
|
11
|
+
leftCol: {
|
12
|
+
sizes: { all: 12, lg: 8 },
|
13
|
+
orders: { all: 1, lg: 1 },
|
14
|
+
},
|
15
|
+
rightCol: {
|
16
|
+
sizes: { all: 12, lg: 3 },
|
17
|
+
offsets: {
|
18
|
+
all: 0,
|
19
|
+
lg: 1,
|
20
|
+
},
|
21
|
+
orders: { all: 2, lg: 2 },
|
22
|
+
},
|
23
|
+
};
|
24
|
+
if (fullWidth) {
|
25
|
+
layoutConfig.leftCol.sizes = { all: 12 };
|
26
|
+
layoutConfig.rightCol.sizes = { all: 12 };
|
27
|
+
layoutConfig.rightCol.offsets = { all: 0 };
|
28
|
+
}
|
29
|
+
if (mobileOrder === 'reverse') {
|
30
|
+
layoutConfig.leftCol.orders = { all: 3, lg: 1 };
|
31
|
+
}
|
32
|
+
return layoutConfig;
|
33
|
+
}, [fullWidth, mobileOrder]);
|
34
|
+
const renderChildren = (blockChildren) => React.Children.map(blockChildren, (child, i) => (React.createElement("div", { key: i, className: b('item') }, child)));
|
35
|
+
const { left, right } = useMemo(() => children === null || children === void 0 ? void 0 : children.reduce((sortedChildren, child) => {
|
36
|
+
var _a, _b;
|
37
|
+
if (((_b = (_a = child === null || child === void 0 ? void 0 : child.props) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.column) === 'left') {
|
38
|
+
sortedChildren.left.push(child);
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
sortedChildren.right.push(child);
|
42
|
+
}
|
43
|
+
return sortedChildren;
|
44
|
+
}, { left: [], right: [] }), [children]);
|
45
|
+
return (React.createElement(Wrapper, { paddings: {
|
46
|
+
[PaddingsDirections.top]: paddingTop,
|
47
|
+
[PaddingsDirections.bottom]: paddingBottom,
|
48
|
+
} },
|
49
|
+
React.createElement(Row, { className: b('row'), noGutter: true },
|
50
|
+
React.createElement(Col, Object.assign({ className: b('left-col') }, layout.leftCol), left && renderChildren(left)),
|
51
|
+
React.createElement(Col, Object.assign({ className: b('right-col') }, layout.rightCol), right && renderChildren(right)))));
|
52
|
+
};
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-media__text-content {
|
4
|
+
padding-top: 16px;
|
5
|
+
}
|
6
|
+
.bc-media__container {
|
7
|
+
position: relative;
|
8
|
+
height: 100%;
|
9
|
+
}
|
10
|
+
.bc-media__border {
|
11
|
+
position: relative;
|
12
|
+
height: 100%;
|
13
|
+
width: 100%;
|
14
|
+
border-radius: calc(var(--bc-border-radius) + 1px);
|
15
|
+
border: 1px solid var(--yc-color-line-generic);
|
16
|
+
overflow: hidden;
|
17
|
+
}
|
18
|
+
.bc-media__content {
|
19
|
+
position: relative;
|
20
|
+
top: 0;
|
21
|
+
right: 0;
|
22
|
+
width: 100%;
|
23
|
+
height: 100%;
|
24
|
+
overflow: hidden;
|
25
|
+
object-fit: cover;
|
26
|
+
border-radius: var(--bc-border-radius);
|
27
|
+
}
|
28
|
+
.bc-media__video {
|
29
|
+
height: 100%;
|
30
|
+
}
|
31
|
+
.bc-media__video > video {
|
32
|
+
width: 100%;
|
33
|
+
height: auto;
|
34
|
+
border-radius: var(--bc-border-radius);
|
35
|
+
}
|
36
|
+
.bc-media__image {
|
37
|
+
width: 100%;
|
38
|
+
height: 100%;
|
39
|
+
object-fit: cover;
|
40
|
+
border-radius: var(--bc-border-radius);
|
41
|
+
}
|
@@ -0,0 +1,32 @@
|
|
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 from 'react';
|
13
|
+
import { Media as PCMedia, YFMWrapper } from '@gravity-ui/page-constructor';
|
14
|
+
import { Wrapper } from '../../components/Wrapper/Wrapper';
|
15
|
+
import { PaddingsDirections } from '../../models/paddings';
|
16
|
+
import { block } from '../../utils/cn';
|
17
|
+
import './Media.css';
|
18
|
+
const b = block('media');
|
19
|
+
export const Media = (_a) => {
|
20
|
+
var { text, paddingTop, paddingBottom } = _a, mediaProps = __rest(_a, ["text", "paddingTop", "paddingBottom"]);
|
21
|
+
return (React.createElement(Wrapper, { paddings: {
|
22
|
+
[PaddingsDirections.top]: paddingTop,
|
23
|
+
[PaddingsDirections.bottom]: paddingBottom,
|
24
|
+
}, className: b('container') },
|
25
|
+
React.createElement("div", { className: b('border'), "data-qa": "blog-media-content" },
|
26
|
+
React.createElement(PCMedia, Object.assign({ className: b('content'), videoClassName: b('video'), imageClassName: b('image') }, mediaProps))),
|
27
|
+
text && (React.createElement("div", { className: b('text-content') },
|
28
|
+
React.createElement(YFMWrapper, { content: text, modifiers: {
|
29
|
+
blogMedia: true,
|
30
|
+
resetPaddings: true,
|
31
|
+
} })))));
|
32
|
+
};
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import React, { useContext } from 'react';
|
2
|
+
import { HeaderBreadcrumbs, YFMWrapper } from '@gravity-ui/page-constructor';
|
3
|
+
import { PostPageContext } from '../../contexts/PostPageContext';
|
4
|
+
import { LocaleContext } from '../../contexts/LocaleContext';
|
5
|
+
import { Wrapper } from '../../components/Wrapper/Wrapper';
|
6
|
+
import { PostInfo } from '../../components/PostInfo/PostInfo';
|
7
|
+
import { PaddingsDirections } from '../../models/paddings';
|
8
|
+
import { getBreadcrumbs } from '../../utils/common';
|
9
|
+
import { BlogMetrikaGoalIds } from '../../constants';
|
10
|
+
import { block } from '../../utils/cn';
|
11
|
+
import './Meta.css';
|
12
|
+
const b = block('meta');
|
13
|
+
const metrikaGoals = {
|
14
|
+
sharing: BlogMetrikaGoalIds.shareBottom,
|
15
|
+
save: BlogMetrikaGoalIds.saveBottom,
|
16
|
+
};
|
17
|
+
const breadcrumbsGoals = [
|
18
|
+
{
|
19
|
+
name: BlogMetrikaGoalIds.breadcrumbsBottom,
|
20
|
+
isCrossSite: true,
|
21
|
+
},
|
22
|
+
];
|
23
|
+
export const Meta = (props) => {
|
24
|
+
const { paddingTop = 'l', paddingBottom = 'l', theme = 'light' } = props;
|
25
|
+
const { post } = useContext(PostPageContext);
|
26
|
+
const { locale } = useContext(LocaleContext);
|
27
|
+
const { title, id, date, readingTime, tags } = post;
|
28
|
+
const breadcrumbs = getBreadcrumbs({ tags, pathPrefix: (locale === null || locale === void 0 ? void 0 : locale.pathPrefix) || '' });
|
29
|
+
breadcrumbs.metrikaGoals = breadcrumbsGoals;
|
30
|
+
return (React.createElement(Wrapper, { paddings: {
|
31
|
+
[PaddingsDirections.top]: paddingTop,
|
32
|
+
[PaddingsDirections.bottom]: paddingBottom,
|
33
|
+
}, dataQa: "blog-meta-content" },
|
34
|
+
breadcrumbs && (React.createElement(HeaderBreadcrumbs, { items: breadcrumbs.items, className: b('breadcrumbs'), theme: theme, metrikaGoals: breadcrumbs.metrikaGoals })),
|
35
|
+
title && (React.createElement(YFMWrapper, { content: title, modifiers: {
|
36
|
+
blogBreadcrumbs: true,
|
37
|
+
resetPaddings: true,
|
38
|
+
} })),
|
39
|
+
post && (React.createElement(PostInfo, { postId: id, date: date, readingTime: readingTime, metrikaGoals: metrikaGoals, dataQa: "blog-meta-block" }))));
|
40
|
+
};
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { SuggestProps } from '../../models/blocks';
|
3
|
+
/**
|
4
|
+
* Suggested posts block
|
5
|
+
*
|
6
|
+
* @param posts - suggested posts list
|
7
|
+
* @param paddingTop - padding top code
|
8
|
+
* @param paddingBottom - padding bottom code
|
9
|
+
*
|
10
|
+
* @returns -jsx
|
11
|
+
*/
|
12
|
+
export declare const Suggest: React.FC<SuggestProps>;
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import React, { useContext } from 'react';
|
2
|
+
import { SliderBlock } from '@gravity-ui/page-constructor';
|
3
|
+
import { i18, Keyset } from '../../i18n';
|
4
|
+
import { Wrapper } from '../../components/Wrapper/Wrapper';
|
5
|
+
import { PostCard } from '../../components/PostCard/PostCard';
|
6
|
+
import { PaddingsDirections } from '../../models/paddings';
|
7
|
+
import { PostPageContext } from '../../contexts/PostPageContext';
|
8
|
+
import { BlogMetrikaGoalIds } from '../../constants';
|
9
|
+
const metrikaGoals = [
|
10
|
+
{
|
11
|
+
name: BlogMetrikaGoalIds.suggest,
|
12
|
+
isCrossSite: true,
|
13
|
+
},
|
14
|
+
];
|
15
|
+
/**
|
16
|
+
* Suggested posts block
|
17
|
+
*
|
18
|
+
* @param posts - suggested posts list
|
19
|
+
* @param paddingTop - padding top code
|
20
|
+
* @param paddingBottom - padding bottom code
|
21
|
+
*
|
22
|
+
* @returns -jsx
|
23
|
+
*/
|
24
|
+
export const Suggest = ({ paddingTop = 'l', paddingBottom = 'l' }) => {
|
25
|
+
const { suggestedPosts } = useContext(PostPageContext);
|
26
|
+
if (suggestedPosts.length === 0) {
|
27
|
+
return null;
|
28
|
+
}
|
29
|
+
return (React.createElement(Wrapper, { paddings: {
|
30
|
+
[PaddingsDirections.top]: paddingTop,
|
31
|
+
[PaddingsDirections.bottom]: paddingBottom,
|
32
|
+
} },
|
33
|
+
React.createElement(SliderBlock, { slidesToShow: { xl: 3, lg: 2, sm: 1 }, title: { text: i18(Keyset.TitleSuggest) } }, suggestedPosts.map((post) => (React.createElement(PostCard, { key: post.id, metrikaGoals: metrikaGoals, post: post }))))));
|
34
|
+
};
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { YFMWrapper } from '@gravity-ui/page-constructor';
|
3
|
+
import block from 'bem-cn-lite';
|
4
|
+
import { Wrapper } from '../../components/Wrapper/Wrapper';
|
5
|
+
import { PaddingsDirections } from '../../models/paddings';
|
6
|
+
const b = block('yfm');
|
7
|
+
export const YFM = (props) => {
|
8
|
+
const { text, paddingTop, paddingBottom } = props;
|
9
|
+
return (React.createElement(Wrapper, { paddings: {
|
10
|
+
[PaddingsDirections.top]: paddingTop,
|
11
|
+
[PaddingsDirections.bottom]: paddingBottom,
|
12
|
+
} },
|
13
|
+
React.createElement(YFMWrapper, { content: text, modifiers: {
|
14
|
+
blog: true,
|
15
|
+
resetPaddings: true,
|
16
|
+
}, className: b({ 'no-list-reset': true }) })));
|
17
|
+
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export declare const CONTENT_DEFAULT_SIZE = "s";
|
2
|
+
export declare const CONTENT_DEFAULT_COL_SIZES: {
|
3
|
+
all: number;
|
4
|
+
md: number;
|
5
|
+
};
|
6
|
+
export declare const CONTENT_DEFAULT_THEME = "default";
|
7
|
+
export declare const DEFAULT_PAGE = 1;
|
8
|
+
export declare const DEFAULT_ROWS_PER_PAGE = 12;
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-button-with-icon {
|
4
|
+
display: inline-block;
|
5
|
+
margin: 0;
|
6
|
+
padding: 0;
|
7
|
+
font: inherit;
|
8
|
+
border: none;
|
9
|
+
outline: none;
|
10
|
+
color: inherit;
|
11
|
+
background: none;
|
12
|
+
cursor: pointer;
|
13
|
+
outline: none;
|
14
|
+
display: flex;
|
15
|
+
align-items: center;
|
16
|
+
justify-content: center;
|
17
|
+
transition: color 0.2s;
|
18
|
+
}
|
19
|
+
.utilityfocus .bc-button-with-icon:focus {
|
20
|
+
outline: 2px solid #ffdb4d;
|
21
|
+
}
|
22
|
+
.bc-button-with-icon_size_xs {
|
23
|
+
height: 24px;
|
24
|
+
width: 24px;
|
25
|
+
}
|
26
|
+
.bc-button-with-icon_size_s {
|
27
|
+
height: 28px;
|
28
|
+
width: 28px;
|
29
|
+
}
|
30
|
+
.bc-button-with-icon_size_m {
|
31
|
+
height: 32px;
|
32
|
+
width: 32px;
|
33
|
+
}
|
34
|
+
.bc-button-with-icon_size_n {
|
35
|
+
height: 36px;
|
36
|
+
width: 36px;
|
37
|
+
}
|
38
|
+
.bc-button-with-icon_theme_primary {
|
39
|
+
color: var(--www-text-content-color);
|
40
|
+
transition: color 0.2s;
|
41
|
+
}
|
42
|
+
.bc-button-with-icon_theme_primary:hover {
|
43
|
+
color: var(--yc-color-text-primary);
|
44
|
+
}
|
45
|
+
.bc-button-with-icon_theme_secondary {
|
46
|
+
color: var(--yc-color-text-secondary);
|
47
|
+
transition: color 0.2s;
|
48
|
+
}
|
49
|
+
.bc-button-with-icon_theme_secondary:hover {
|
50
|
+
color: var(--www-text-content-color);
|
51
|
+
}
|
52
|
+
.bc-button-with-icon_theme_link {
|
53
|
+
color: var(--www-text-content-color);
|
54
|
+
transition: color 0.2s;
|
55
|
+
}
|
56
|
+
.bc-button-with-icon_theme_link:hover {
|
57
|
+
color: var(--yc-color-text-link-hover);
|
58
|
+
}
|
59
|
+
.bc-button-with-icon_theme_accent {
|
60
|
+
color: var(--yc-color-text-yandex-red);
|
61
|
+
transition: opacity 0.2s;
|
62
|
+
opacity: 0.7;
|
63
|
+
}
|
64
|
+
.bc-button-with-icon_theme_accent:hover {
|
65
|
+
opacity: 1;
|
66
|
+
}
|
67
|
+
.bc-button-with-icon_disabled {
|
68
|
+
cursor: default;
|
69
|
+
color: var(--yc-color-text-secondary);
|
70
|
+
}
|
71
|
+
.bc-button-with-icon_disabled:hover {
|
72
|
+
color: var(--yc-color-text-secondary);
|
73
|
+
}
|
74
|
+
.mobile .bc-button-with-icon:hover {
|
75
|
+
color: inherit;
|
76
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { SVGIconData } from '@gravity-ui/uikit/build/esm/components/Icon/types';
|
3
|
+
import { ClassNameProps } from '../../models/common';
|
4
|
+
import './ButtonWithIcon.css';
|
5
|
+
export interface ButtonWithIconProps extends ClassNameProps {
|
6
|
+
icon: SVGIconData;
|
7
|
+
theme?: 'primary' | 'secondary' | 'link' | 'accent';
|
8
|
+
size?: 'xs' | 's' | 'm' | 'n';
|
9
|
+
iconSize?: number;
|
10
|
+
disabled?: boolean;
|
11
|
+
onClick?: (event: React.MouseEvent) => void;
|
12
|
+
}
|
13
|
+
export declare const ButtonWithIcon: React.FC<ButtonWithIconProps>;
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Icon } from '@gravity-ui/uikit';
|
3
|
+
import { block } from '../../utils/cn';
|
4
|
+
import './ButtonWithIcon.css';
|
5
|
+
const b = block('button-with-icon');
|
6
|
+
export const ButtonWithIcon = ({ icon, theme = 'primary', size = 's', iconSize = 16, disabled = false, onClick, className, }) => (React.createElement("button", { type: "button", className: b({ size, theme, disabled }, className), onClick: disabled ? undefined : onClick, disabled: disabled },
|
7
|
+
React.createElement(Icon, { data: icon, size: iconSize })));
|
@@ -0,0 +1,54 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-feed-header {
|
4
|
+
margin-top: 16px;
|
5
|
+
}
|
6
|
+
.bc-feed-header__header {
|
7
|
+
padding: 16px 0;
|
8
|
+
}
|
9
|
+
.bc-feed-header__content {
|
10
|
+
position: relative;
|
11
|
+
height: 100%;
|
12
|
+
padding-bottom: 0;
|
13
|
+
}
|
14
|
+
.bc-feed-header__content_offset_large {
|
15
|
+
padding: calc(128px - 96px) 0 16px;
|
16
|
+
margin-bottom: -48px;
|
17
|
+
}
|
18
|
+
.bc-feed-header__content_theme_dark.bc-feed-header__content_theme_dark .bc-feed-header__title,
|
19
|
+
.bc-feed-header__content_theme_dark.bc-feed-header__content_theme_dark .bc-feed-header__description * {
|
20
|
+
color: var(--yc-color-text-light-primary);
|
21
|
+
}
|
22
|
+
|
23
|
+
.bc-feed-header_has-background {
|
24
|
+
height: calc(100% + 96px);
|
25
|
+
}
|
26
|
+
.bc-feed-header__content {
|
27
|
+
position: relative;
|
28
|
+
z-index: 10;
|
29
|
+
}
|
30
|
+
.bc-feed-header__background, .bc-feed-header__background-media {
|
31
|
+
z-index: 5;
|
32
|
+
}
|
33
|
+
.bc-feed-header__background {
|
34
|
+
position: absolute;
|
35
|
+
top: 0;
|
36
|
+
left: 50%;
|
37
|
+
width: 1440px;
|
38
|
+
transform: translateX(-50%);
|
39
|
+
max-width: 100vw;
|
40
|
+
height: 100%;
|
41
|
+
border-radius: var(--bc-border-radius);
|
42
|
+
}
|
43
|
+
@media (max-width: 769px) {
|
44
|
+
.bc-feed-header_has-background .bc-feed-header__background-img {
|
45
|
+
display: none;
|
46
|
+
}
|
47
|
+
.bc-feed-header_has-background .bc-feed-header__content_vertical-offset_s, .bc-feed-header_has-background .bc-feed-header__content_vertical-offset_m, .bc-feed-header_has-background .bc-feed-header__content_vertical-offset_l, .bc-feed-header_has-background .bc-feed-header__content_vertical-offset_xl {
|
48
|
+
padding: calc(96px - 16px) 0;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
.mobile .bc-feed-header_has-background .bc-feed-header__title {
|
52
|
+
font-size: var(--yc-text-display-2-font-size);
|
53
|
+
line-height: var(--yc-text-display-2-line-height);
|
54
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { HeaderBlockProps, ClassNameProps } from '../../models/common';
|
3
|
+
import { ControlsProps } from './components/Controls/Controls';
|
4
|
+
import './FeedHeader.css';
|
5
|
+
type HeaderProps = Pick<HeaderBlockProps, 'background' | 'offset' | 'theme' | 'verticalOffset'>;
|
6
|
+
type FeedHeaderProps = HeaderProps & ControlsProps;
|
7
|
+
type FeedHeaderContainerProps = FeedHeaderProps & ClassNameProps;
|
8
|
+
export declare const FeedHeader: React.FC<FeedHeaderContainerProps>;
|
9
|
+
export {};
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { BackgroundImage, Grid, getThemedValue, FullWidthBackground, } from '@gravity-ui/page-constructor';
|
3
|
+
import { Controls } from './components/Controls/Controls';
|
4
|
+
import { block } from '../../utils/cn';
|
5
|
+
import './FeedHeader.css';
|
6
|
+
const b = block('feed-header');
|
7
|
+
export const FeedHeader = ({ tags, services, setIsFetching, offset = 'default', background, theme = 'default', verticalOffset = 'l', className, handleChangeQuery, queryParams, }) => {
|
8
|
+
const backgroundThemed = background && getThemedValue(background, theme);
|
9
|
+
return (React.createElement("header", { className: b('header', { ['has-background']: Boolean(background) }, className) },
|
10
|
+
(backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color) ? (React.createElement(FullWidthBackground, { style: { backgroundColor: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color }, theme: "rounded" })) : null,
|
11
|
+
React.createElement(Grid, { className: b('content', { offset, theme, 'vertical-offset': verticalOffset }) },
|
12
|
+
backgroundThemed ? (React.createElement(BackgroundImage, { src: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.url, className: b('background'), imageClassName: b('background-img'), style: {
|
13
|
+
backgroundColor: backgroundThemed.fullWidth
|
14
|
+
? ''
|
15
|
+
: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.color,
|
16
|
+
}, disableCompress: backgroundThemed === null || backgroundThemed === void 0 ? void 0 : backgroundThemed.disableCompress })) : null,
|
17
|
+
React.createElement(Controls, { tags: tags, services: services, setIsFetching: setIsFetching, handleChangeQuery: handleChangeQuery, queryParams: queryParams }))));
|
18
|
+
};
|
@@ -0,0 +1,106 @@
|
|
1
|
+
/* use this for style redefinitions to awoid problems with
|
2
|
+
unpredictable css rules order in build */
|
3
|
+
.bc-feed-controls__header {
|
4
|
+
position: relative;
|
5
|
+
display: flex;
|
6
|
+
flex-direction: column;
|
7
|
+
border-radius: var(--bc-border-radius);
|
8
|
+
padding-bottom: 20px;
|
9
|
+
z-index: 10;
|
10
|
+
}
|
11
|
+
.bc-feed-controls__header-item {
|
12
|
+
display: flex;
|
13
|
+
justify-content: center;
|
14
|
+
flex-wrap: wrap;
|
15
|
+
}
|
16
|
+
.bc-feed-controls__header-item_title {
|
17
|
+
font-size: var(--yc-text-display-4-font-size);
|
18
|
+
line-height: var(--yc-text-display-4-line-height);
|
19
|
+
padding-top: 112px;
|
20
|
+
padding-bottom: 96px;
|
21
|
+
}
|
22
|
+
.bc-feed-controls__search {
|
23
|
+
background-color: var(--yc-color-base-background);
|
24
|
+
border-radius: 10px;
|
25
|
+
width: 100%;
|
26
|
+
max-width: 100%;
|
27
|
+
}
|
28
|
+
.bc-feed-controls__search .yc-text-input_view_normal .yc-text-input__control {
|
29
|
+
border-color: var(--yc-color-base-background);
|
30
|
+
}
|
31
|
+
.bc-feed-controls__select {
|
32
|
+
background-color: var(--yc-color-base-background);
|
33
|
+
border-radius: 10px;
|
34
|
+
width: 100%;
|
35
|
+
}
|
36
|
+
.bc-feed-controls__popup.bc-feed-controls__popup {
|
37
|
+
border-radius: 12px;
|
38
|
+
}
|
39
|
+
.bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter + .yc-select-list {
|
40
|
+
margin-top: 0;
|
41
|
+
}
|
42
|
+
.bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter + .yc-select-list::-webkit-scrollbar {
|
43
|
+
display: none;
|
44
|
+
}
|
45
|
+
.bc-feed-controls__popup.bc-feed-controls__popup .yc-list__item {
|
46
|
+
margin: 4px;
|
47
|
+
border-radius: 8px;
|
48
|
+
}
|
49
|
+
.bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter {
|
50
|
+
margin-top: 4px;
|
51
|
+
padding: 4px;
|
52
|
+
border-bottom: 1px solid var(--yc-color-line-generic);
|
53
|
+
}
|
54
|
+
.bc-feed-controls__popup.bc-feed-controls__popup .yc-select-filter .yc-text-input__control.yc-text-input__control_type_input {
|
55
|
+
border: none;
|
56
|
+
}
|
57
|
+
|
58
|
+
.bc-feed-controls__popup-filter .yc-text-input__control {
|
59
|
+
font-size: var(--yc-text-body-2-font-size);
|
60
|
+
line-height: var(--yc-text-body-2-line-height);
|
61
|
+
border: none;
|
62
|
+
}
|
63
|
+
.bc-feed-controls__popup-filter .yc-text-input__control:hover, .bc-feed-controls__popup-filter .yc-text-input__control:focus {
|
64
|
+
border: none;
|
65
|
+
}
|
66
|
+
.bc-feed-controls__select:hover {
|
67
|
+
background-color: var(--yc-color-base-background);
|
68
|
+
width: 100%;
|
69
|
+
}
|
70
|
+
.bc-feed-controls__saved-only-button {
|
71
|
+
border-radius: 10px;
|
72
|
+
}
|
73
|
+
.bc-feed-controls__saved-only-button_savedOnly {
|
74
|
+
--yc-button-background-color: var(--pc-monochrome-button);
|
75
|
+
--yc-button-background-color-hover: var(--pc-monochrome-button-hover);
|
76
|
+
color: var(--yc-color-text-light-primary);
|
77
|
+
}
|
78
|
+
.bc-feed-controls__saved-only-button_savedOnly:hover {
|
79
|
+
color: var(--yc-color-text-light-primary);
|
80
|
+
}
|
81
|
+
.bc-feed-controls__saved-only-button_savedOnly:focus {
|
82
|
+
color: var(--yc-color-base-background);
|
83
|
+
}
|
84
|
+
.bc-feed-controls__filter-item {
|
85
|
+
margin-right: 8px;
|
86
|
+
margin-left: 8px;
|
87
|
+
margin-bottom: 12px;
|
88
|
+
min-width: 230px;
|
89
|
+
flex-grow: 1;
|
90
|
+
}
|
91
|
+
@media (min-width: 577px) {
|
92
|
+
.bc-feed-controls__filter-item {
|
93
|
+
max-width: 240px;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
.bc-feed-controls__filter-item_width-auto {
|
97
|
+
width: auto;
|
98
|
+
min-width: auto;
|
99
|
+
flex-grow: 0;
|
100
|
+
}
|
101
|
+
.bc-feed-controls__icon {
|
102
|
+
color: var(--yc-my-color-brand-normal);
|
103
|
+
}
|
104
|
+
.bc-feed-controls__icon_savedOnly {
|
105
|
+
color: var(--yc-color-base-background);
|
106
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import React, { ReactNode } from 'react';
|
2
|
+
import { HandleChangeQueryParams, SetQueryType, Query } from '../../../../models/common';
|
3
|
+
import './Controls.css';
|
4
|
+
export type SelectItem = {
|
5
|
+
content: string;
|
6
|
+
value: string;
|
7
|
+
icon?: ReactNode;
|
8
|
+
};
|
9
|
+
export type ControlsProps = {
|
10
|
+
setIsFetching: (value: boolean) => void;
|
11
|
+
tags?: SelectItem[];
|
12
|
+
services?: SelectItem[];
|
13
|
+
handleChangeQuery: HandleChangeQueryParams;
|
14
|
+
queryParams: Query;
|
15
|
+
setQuery?: SetQueryType;
|
16
|
+
};
|
17
|
+
export declare const Controls: React.FC<ControlsProps>;
|
@@ -0,0 +1,77 @@
|
|
1
|
+
import React, { useState, useContext, useMemo } from 'react';
|
2
|
+
import { Icon, Button, Select } from '@gravity-ui/uikit';
|
3
|
+
import { Search } from '../../../Search/Search';
|
4
|
+
import { renderSwitcher, renderFilter, renderOption } from './customRenders';
|
5
|
+
import { LikesContext } from '../../../../contexts/LikesContext';
|
6
|
+
import { BlogMetrikaGoalIds } from '../../../../constants';
|
7
|
+
import metrika from '../../../../counters/metrika.js';
|
8
|
+
import { MetrikaCounter } from '../../../../counters/utils';
|
9
|
+
import { Save } from '../../../../icons/Save';
|
10
|
+
import { i18, Keyset } from '../../../../i18n';
|
11
|
+
import { block } from '../../../../utils/cn';
|
12
|
+
import './Controls.css';
|
13
|
+
const b = block('feed-controls');
|
14
|
+
const ICON_SIZE = 16;
|
15
|
+
const DEFAULT_PAGE = 1;
|
16
|
+
export const Controls = ({ setIsFetching, tags = [], services = [], handleChangeQuery, queryParams, }) => {
|
17
|
+
const { hasLikes } = useContext(LikesContext);
|
18
|
+
const { savedOnly: savedOnlyInitial, search: searchInitial, tags: tagInitial, services: servicesInitial, } = queryParams || {};
|
19
|
+
const [savedOnly, setSavedOnly] = useState(savedOnlyInitial === 'true');
|
20
|
+
const [search, setSearch] = useState(searchInitial);
|
21
|
+
const handleSavedOnly = () => {
|
22
|
+
handleChangeQuery({ savedOnly: savedOnly ? '' : 'true' });
|
23
|
+
setSavedOnly(!savedOnly);
|
24
|
+
setIsFetching(true);
|
25
|
+
};
|
26
|
+
const handleSearch = (searchValue) => {
|
27
|
+
handleChangeQuery({ search: searchValue, page: DEFAULT_PAGE });
|
28
|
+
setSearch(searchValue);
|
29
|
+
setIsFetching(true);
|
30
|
+
};
|
31
|
+
const handleTagSelect = (selectedTags) => {
|
32
|
+
metrika.reachGoal(MetrikaCounter.CrossSite, BlogMetrikaGoalIds.tag, {
|
33
|
+
theme: selectedTags[0],
|
34
|
+
});
|
35
|
+
const isEmptyTag = selectedTags.some((tag) => tag === 'empty');
|
36
|
+
handleChangeQuery({
|
37
|
+
tags: isEmptyTag ? '' : selectedTags[0],
|
38
|
+
page: DEFAULT_PAGE,
|
39
|
+
});
|
40
|
+
setIsFetching(true);
|
41
|
+
};
|
42
|
+
const handleServicesSelect = (selectedServices) => {
|
43
|
+
const forMetrikaServices = services.filter((service) => {
|
44
|
+
return selectedServices.includes(service.value);
|
45
|
+
});
|
46
|
+
const metrikaAsString = forMetrikaServices.map((service) => service.content).join(',');
|
47
|
+
metrika.reachGoal(MetrikaCounter.CrossSite, BlogMetrikaGoalIds.service, {
|
48
|
+
service: metrikaAsString,
|
49
|
+
});
|
50
|
+
const servicesAsString = selectedServices.join(',');
|
51
|
+
handleChangeQuery({ services: servicesAsString, page: DEFAULT_PAGE });
|
52
|
+
setIsFetching(true);
|
53
|
+
};
|
54
|
+
const tagsItems = useMemo(() => [{ value: 'empty', content: i18(Keyset.AllTags) }, ...tags], [tags]);
|
55
|
+
const servicesItems = useMemo(() => (servicesInitial ? [...servicesInitial.split(',')] : []), [servicesInitial]);
|
56
|
+
return (React.createElement("div", { className: b('header') },
|
57
|
+
React.createElement("h1", { className: b('header-item', { title: true }) }, i18(Keyset.Title)),
|
58
|
+
React.createElement("div", { className: b('header-item', { filters: true }) },
|
59
|
+
React.createElement("div", { className: b('filter-item') },
|
60
|
+
React.createElement(Search, { className: b('search'), placeholder: i18(Keyset.Search), initialValue: search && typeof search === 'string' ? search : '', onSubmit: handleSearch })),
|
61
|
+
React.createElement("div", { className: b('filter-item') },
|
62
|
+
React.createElement(Select, { className: b('select'), size: "xl", options: tagsItems, defaultValue: [tagInitial], onUpdate: handleTagSelect, placeholder: i18(Keyset.AllTags), popupClassName: b('popup'), renderControl: renderSwitcher({
|
63
|
+
initial: [tagInitial],
|
64
|
+
list: tagsItems,
|
65
|
+
defaultLabel: i18(Keyset.AllTags),
|
66
|
+
}), renderOption: renderOption })),
|
67
|
+
services.length > 0 ? (React.createElement("div", { className: b('filter-item') },
|
68
|
+
React.createElement(Select, { className: b('select'), size: "xl", multiple: true, filterable: true, options: services, defaultValue: servicesItems, popupClassName: b('popup'), onUpdate: handleServicesSelect, placeholder: i18(Keyset.AllServices), renderControl: renderSwitcher({
|
69
|
+
initial: servicesItems,
|
70
|
+
list: services,
|
71
|
+
defaultLabel: i18(Keyset.AllServices),
|
72
|
+
}), renderOption: renderOption, renderFilter: renderFilter }))) : null,
|
73
|
+
hasLikes ? (React.createElement("div", { className: b('filter-item', { 'width-auto': true }) },
|
74
|
+
React.createElement(Button, { view: 'outlined', className: b('saved-only-button', { savedOnly }), size: "xl", onClick: handleSavedOnly },
|
75
|
+
React.createElement(Icon, { data: Save, size: ICON_SIZE, className: b('icon', { savedOnly }) }),
|
76
|
+
i18(Keyset.ActionSavedOnly)))) : null)));
|
77
|
+
};
|