@docusaurus/theme-classic 2.0.0-beta.16 → 2.0.0-beta.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/admonitions.css +4 -0
- package/lib/default.css +3038 -0
- package/lib/getSwizzleConfig.js +177 -36
- package/lib/index.js +10 -15
- package/lib/nprogress.css +41 -0
- package/lib/nprogress.js +46 -0
- package/lib/theme-classic.d.ts +600 -76
- package/lib/translations.js +12 -2
- package/lib/validateThemeConfig.js +77 -28
- package/lib-next/theme/BackToTopButton/index.js +6 -104
- package/lib-next/theme/BlogArchivePage/index.js +14 -10
- package/lib-next/theme/BlogLayout/index.js +1 -5
- package/lib-next/theme/BlogListPage/index.js +34 -13
- package/lib-next/theme/BlogListPaginator/index.js +25 -28
- package/lib-next/theme/BlogPostAuthor/index.js +16 -7
- package/lib-next/theme/BlogPostItem/index.js +6 -6
- package/lib-next/theme/BlogPostItem/styles.module.css +9 -0
- package/lib-next/theme/BlogPostPage/index.js +56 -45
- package/lib-next/theme/BlogPostPaginator/index.js +25 -28
- package/lib-next/theme/BlogSidebar/Desktop/index.js +41 -0
- package/lib-next/theme/BlogSidebar/{styles.module.css → Desktop/styles.module.css} +1 -2
- package/lib-next/theme/BlogSidebar/Mobile/index.js +36 -0
- package/lib-next/theme/BlogSidebar/index.js +11 -31
- package/lib-next/theme/BlogTagsListPage/index.js +17 -14
- package/lib-next/theme/BlogTagsPostsPage/index.js +43 -38
- package/lib-next/theme/CodeBlock/Container/index.js +29 -0
- package/lib-next/theme/CodeBlock/Container/styles.module.css +14 -0
- package/lib-next/theme/CodeBlock/Content/Element.js +23 -0
- package/lib-next/theme/CodeBlock/Content/String.js +104 -0
- package/lib-next/theme/CodeBlock/{styles.module.css → Content/styles.module.css} +39 -29
- package/lib-next/theme/CodeBlock/CopyButton/index.js +61 -0
- package/lib-next/theme/CodeBlock/CopyButton/styles.module.css +47 -0
- package/lib-next/theme/CodeBlock/Line/index.js +49 -0
- package/lib-next/theme/CodeBlock/Line/styles.module.css +51 -0
- package/lib-next/theme/CodeBlock/WordWrapButton/index.js +40 -0
- package/lib-next/theme/CodeBlock/WordWrapButton/styles.module.css +15 -0
- package/lib-next/theme/CodeBlock/index.js +26 -164
- package/lib-next/theme/ColorModeToggle/index.js +62 -0
- package/lib-next/theme/ColorModeToggle/styles.module.css +35 -0
- package/lib-next/theme/Details/index.js +1 -1
- package/lib-next/theme/DocBreadcrumbs/index.js +63 -19
- package/lib-next/theme/DocBreadcrumbs/styles.module.css +8 -15
- package/lib-next/theme/DocCard/index.js +17 -15
- package/lib-next/theme/DocCard/styles.module.css +8 -17
- package/lib-next/theme/DocCardList/index.js +20 -6
- package/lib-next/theme/DocCategoryGeneratedIndexPage/index.js +30 -9
- package/lib-next/theme/DocCategoryGeneratedIndexPage/styles.module.css +8 -0
- package/lib-next/theme/DocItem/index.js +85 -67
- package/lib-next/theme/DocItem/styles.module.css +6 -0
- package/lib-next/theme/DocPage/Layout/Main/index.js +29 -0
- package/lib-next/theme/DocPage/Layout/Main/styles.module.css +28 -0
- package/lib-next/theme/DocPage/Layout/Sidebar/ExpandButton/index.js +34 -0
- package/lib-next/theme/DocPage/Layout/Sidebar/ExpandButton/styles.module.css +33 -0
- package/lib-next/theme/DocPage/Layout/Sidebar/index.js +68 -0
- package/lib-next/theme/DocPage/Layout/Sidebar/index.module.css +32 -0
- package/lib-next/theme/DocPage/Layout/index.js +34 -0
- package/lib-next/theme/{BlogPostAuthor/styles.module.css → DocPage/Layout/index.module.css} +6 -3
- package/lib-next/theme/DocPage/index.js +30 -149
- package/lib-next/theme/DocPaginator/index.js +25 -28
- package/lib-next/theme/DocSidebar/Desktop/CollapseButton/index.js +34 -0
- package/lib-next/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +46 -0
- package/lib-next/theme/DocSidebar/Desktop/Content/index.js +46 -0
- package/lib-next/theme/DocSidebar/Desktop/Content/styles.module.css +23 -0
- package/lib-next/theme/DocSidebar/Desktop/index.js +36 -0
- package/lib-next/theme/DocSidebar/Desktop/styles.module.css +50 -0
- package/lib-next/theme/DocSidebar/Mobile/index.js +49 -0
- package/lib-next/theme/DocSidebar/index.js +6 -113
- package/lib-next/theme/DocSidebarItem/Category.js +197 -0
- package/lib-next/theme/DocSidebarItem/Html.js +27 -0
- package/lib-next/theme/DocSidebarItem/{styles.module.css → Html.module.css} +0 -0
- package/lib-next/theme/DocSidebarItem/Link.js +53 -0
- package/lib-next/theme/DocSidebarItem/Link.module.css +10 -0
- package/lib-next/theme/DocSidebarItem/index.js +4 -245
- package/lib-next/theme/DocSidebarItems/index.js +1 -6
- package/lib-next/theme/DocTagDocListPage/index.js +40 -33
- package/lib-next/theme/DocTagsListPage/index.js +21 -16
- package/lib-next/theme/DocVersionBanner/index.js +2 -2
- package/lib-next/theme/Footer/Copyright/index.js +18 -0
- package/lib-next/theme/Footer/Layout/index.js +26 -0
- package/lib-next/theme/Footer/LinkItem/index.js +33 -0
- package/lib-next/theme/Footer/Links/MultiColumn/index.js +47 -0
- package/lib-next/theme/Footer/Links/Simple/index.js +41 -0
- package/lib-next/theme/Footer/Links/index.js +17 -0
- package/lib-next/theme/Footer/Logo/index.js +38 -0
- package/lib-next/theme/Footer/{styles.module.css → Logo/styles.module.css} +0 -0
- package/lib-next/theme/Footer/index.js +11 -163
- package/lib-next/theme/Heading/index.js +10 -24
- package/lib-next/theme/IconDarkMode/index.js +17 -0
- package/lib-next/theme/IconExternalLink/styles.module.css +0 -2
- package/lib-next/theme/IconHome/index.js +17 -0
- package/lib-next/theme/IconLanguage/index.js +3 -3
- package/lib-next/theme/IconLightMode/index.js +17 -0
- package/lib-next/theme/LastUpdated/index.js +1 -0
- package/lib-next/theme/Layout/index.js +15 -10
- package/lib-next/theme/LayoutProviders/index.js +5 -4
- package/lib-next/theme/MDXComponents/A.js +11 -0
- package/lib-next/theme/MDXComponents/Code.js +28 -0
- package/lib-next/theme/MDXComponents/Details.js +20 -0
- package/lib-next/theme/MDXComponents/Head.js +26 -0
- package/lib-next/theme/MDXComponents/Heading.js +11 -0
- package/lib-next/theme/MDXComponents/Img.js +24 -0
- package/{src/theme/MDXComponents/styles.css → lib-next/theme/MDXComponents/Img.module.css} +1 -6
- package/lib-next/theme/MDXComponents/Pre.js +18 -0
- package/lib-next/theme/MDXComponents/Ul.js +21 -0
- package/lib-next/theme/MDXComponents/index.js +22 -57
- package/lib-next/theme/MDXContent/index.js +12 -0
- package/lib-next/theme/MDXPage/index.js +33 -28
- package/lib-next/theme/Navbar/ColorModeToggle/index.js +25 -0
- package/lib-next/theme/Navbar/Content/index.js +75 -0
- package/lib-next/theme/Navbar/Content/styles.module.css +15 -0
- package/lib-next/theme/Navbar/Layout/index.js +54 -0
- package/{src/theme/Navbar → lib-next/theme/Navbar/Layout}/styles.module.css +0 -13
- package/lib-next/theme/Navbar/Logo/index.js +17 -0
- package/lib-next/theme/Navbar/MobileSidebar/Header/index.js +33 -0
- package/lib-next/theme/Navbar/MobileSidebar/Layout/index.js +28 -0
- package/lib-next/theme/Navbar/MobileSidebar/PrimaryMenu/index.js +33 -0
- package/lib-next/theme/Navbar/MobileSidebar/SecondaryMenu/index.js +36 -0
- package/lib-next/theme/Navbar/MobileSidebar/Toggle/index.js +23 -0
- package/lib-next/theme/Navbar/MobileSidebar/index.js +31 -0
- package/lib-next/theme/Navbar/Search/index.js +11 -0
- package/lib-next/theme/Navbar/Search/styles.module.css +20 -0
- package/lib-next/theme/Navbar/index.js +6 -271
- package/lib-next/theme/NavbarItem/ComponentTypes.js +27 -0
- package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +2 -6
- package/lib-next/theme/NavbarItem/DocNavbarItem.js +11 -28
- package/lib-next/theme/NavbarItem/DocSidebarNavbarItem.js +10 -42
- package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +25 -29
- package/lib-next/theme/NavbarItem/DocsVersionNavbarItem.js +2 -9
- package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +14 -3
- package/lib-next/theme/NavbarItem/HtmlNavbarItem.js +30 -0
- package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/index.js +5 -10
- package/lib-next/theme/NavbarItem/NavbarNavLink.js +49 -35
- package/lib-next/theme/NavbarItem/SearchNavbarItem.js +6 -1
- package/lib-next/theme/NavbarItem/index.js +4 -23
- package/lib-next/theme/NavbarItem/utils.js +2 -1
- package/lib-next/theme/NotFound.js +38 -33
- package/lib-next/theme/PaginatorNavLink/index.js +8 -2
- package/lib-next/theme/SearchMetadata/index.js +9 -0
- package/lib-next/theme/{LayoutHead → SiteMetadata}/index.js +19 -33
- package/lib-next/theme/SkipToContent/index.js +3 -29
- package/lib-next/theme/TOCCollapsible/CollapseButton.js +29 -0
- package/{src/theme/TOCCollapsible/styles.module.css → lib-next/theme/TOCCollapsible/CollapseButton.module.css} +1 -22
- package/lib-next/theme/TOCCollapsible/index.js +4 -16
- package/lib-next/theme/TOCCollapsible/index.module.css +31 -0
- package/lib-next/theme/TOCItems/Tree.js +40 -0
- package/lib-next/theme/TOCItems/index.js +3 -34
- package/lib-next/theme/TabItem/index.js +3 -1
- package/lib-next/theme/TabItem/styles.module.css +10 -0
- package/lib-next/theme/Tabs/__tests__/index.test.js +8 -8
- package/lib-next/theme/Tabs/index.js +5 -5
- package/lib-next/theme/Tabs/styles.module.css +4 -0
- package/lib-next/theme/Tag/index.js +6 -7
- package/lib-next/theme/TagsListInline/index.js +1 -1
- package/lib-next/theme/ThemedImage/index.js +3 -3
- package/package.json +25 -20
- package/src/admonitions.css +4 -0
- package/src/getSwizzleConfig.ts +173 -22
- package/src/index.ts +14 -15
- package/src/nprogress.css +41 -0
- package/src/nprogress.ts +31 -0
- package/src/theme/BackToTopButton/index.tsx +5 -114
- package/src/theme/BlogArchivePage/index.tsx +18 -17
- package/src/theme/BlogLayout/index.tsx +1 -5
- package/src/theme/BlogListPage/index.tsx +32 -13
- package/src/theme/BlogListPaginator/index.tsx +25 -28
- package/src/theme/BlogPostAuthor/index.tsx +14 -8
- package/src/theme/BlogPostItem/index.tsx +6 -6
- package/src/theme/BlogPostItem/styles.module.css +9 -0
- package/src/theme/BlogPostPage/index.tsx +55 -48
- package/src/theme/BlogPostPaginator/index.tsx +25 -28
- package/src/theme/BlogSidebar/Desktop/index.tsx +45 -0
- package/src/theme/BlogSidebar/{styles.module.css → Desktop/styles.module.css} +1 -2
- package/src/theme/BlogSidebar/Mobile/index.tsx +38 -0
- package/src/theme/BlogSidebar/index.tsx +10 -31
- package/src/theme/BlogTagsListPage/index.tsx +17 -14
- package/src/theme/BlogTagsPostsPage/index.tsx +46 -36
- package/src/theme/CodeBlock/Container/index.tsx +35 -0
- package/src/theme/CodeBlock/Container/styles.module.css +14 -0
- package/src/theme/CodeBlock/Content/Element.tsx +30 -0
- package/src/theme/CodeBlock/Content/String.tsx +111 -0
- package/src/theme/CodeBlock/{styles.module.css → Content/styles.module.css} +39 -29
- package/src/theme/CodeBlock/CopyButton/index.tsx +67 -0
- package/src/theme/CodeBlock/CopyButton/styles.module.css +47 -0
- package/src/theme/CodeBlock/Line/index.tsx +48 -0
- package/src/theme/CodeBlock/Line/styles.module.css +51 -0
- package/src/theme/CodeBlock/WordWrapButton/index.tsx +49 -0
- package/src/theme/CodeBlock/WordWrapButton/styles.module.css +15 -0
- package/src/theme/CodeBlock/index.tsx +29 -165
- package/src/theme/ColorModeToggle/index.tsx +67 -0
- package/src/theme/ColorModeToggle/styles.module.css +35 -0
- package/src/theme/Details/index.tsx +1 -1
- package/src/theme/DocBreadcrumbs/index.tsx +65 -16
- package/src/theme/DocBreadcrumbs/styles.module.css +8 -15
- package/src/theme/DocCard/index.tsx +24 -17
- package/src/theme/DocCard/styles.module.css +8 -17
- package/src/theme/DocCardList/index.tsx +19 -10
- package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +34 -7
- package/src/theme/DocCategoryGeneratedIndexPage/styles.module.css +8 -0
- package/src/theme/DocItem/index.tsx +72 -56
- package/src/theme/DocItem/styles.module.css +6 -0
- package/src/theme/DocPage/Layout/Main/index.tsx +37 -0
- package/src/theme/DocPage/Layout/Main/styles.module.css +28 -0
- package/src/theme/DocPage/Layout/Sidebar/ExpandButton/index.tsx +40 -0
- package/src/theme/DocPage/Layout/Sidebar/ExpandButton/styles.module.css +33 -0
- package/src/theme/DocPage/Layout/Sidebar/index.module.css +32 -0
- package/src/theme/DocPage/Layout/Sidebar/index.tsx +74 -0
- package/src/theme/{BlogPostAuthor/styles.module.css → DocPage/Layout/index.module.css} +6 -3
- package/src/theme/DocPage/Layout/index.tsx +39 -0
- package/src/theme/DocPage/index.tsx +30 -160
- package/src/theme/DocPaginator/index.tsx +25 -28
- package/src/theme/DocSidebar/Desktop/CollapseButton/index.tsx +38 -0
- package/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +46 -0
- package/src/theme/DocSidebar/Desktop/Content/index.tsx +55 -0
- package/src/theme/DocSidebar/Desktop/Content/styles.module.css +23 -0
- package/src/theme/DocSidebar/Desktop/index.tsx +40 -0
- package/src/theme/DocSidebar/Desktop/styles.module.css +50 -0
- package/src/theme/DocSidebar/Mobile/index.tsx +54 -0
- package/src/theme/DocSidebar/index.tsx +6 -121
- package/src/theme/DocSidebarItem/Category.tsx +210 -0
- package/src/theme/DocSidebarItem/{styles.module.css → Html.module.css} +0 -0
- package/src/theme/DocSidebarItem/Html.tsx +34 -0
- package/src/theme/DocSidebarItem/Link.module.css +10 -0
- package/src/theme/DocSidebarItem/Link.tsx +58 -0
- package/src/theme/DocSidebarItem/index.tsx +4 -260
- package/src/theme/DocSidebarItems/index.tsx +1 -6
- package/src/theme/DocTagDocListPage/index.tsx +40 -33
- package/src/theme/DocTagsListPage/index.tsx +21 -16
- package/src/theme/DocVersionBanner/index.tsx +5 -6
- package/src/theme/Footer/Copyright/index.tsx +20 -0
- package/src/theme/Footer/Layout/index.tsx +34 -0
- package/src/theme/Footer/LinkItem/index.tsx +36 -0
- package/src/theme/Footer/Links/MultiColumn/index.tsx +51 -0
- package/src/theme/Footer/Links/Simple/index.tsx +42 -0
- package/src/theme/Footer/Links/index.tsx +21 -0
- package/src/theme/Footer/Logo/index.tsx +41 -0
- package/src/theme/Footer/{styles.module.css → Logo/styles.module.css} +0 -0
- package/src/theme/Footer/index.tsx +12 -186
- package/src/theme/Heading/index.tsx +10 -22
- package/src/theme/IconDarkMode/index.tsx +20 -0
- package/src/theme/IconExternalLink/styles.module.css +0 -2
- package/src/theme/IconHome/index.tsx +20 -0
- package/src/theme/IconLanguage/index.tsx +3 -3
- package/src/theme/IconLightMode/index.tsx +20 -0
- package/src/theme/LastUpdated/index.tsx +1 -0
- package/src/theme/Layout/index.tsx +15 -10
- package/src/theme/LayoutProviders/index.tsx +5 -4
- package/src/theme/MDXComponents/A.tsx +14 -0
- package/src/theme/MDXComponents/Code.tsx +37 -0
- package/src/theme/MDXComponents/Details.tsx +25 -0
- package/src/theme/MDXComponents/Head.tsx +29 -0
- package/src/theme/MDXComponents/Heading.tsx +14 -0
- package/{lib-next/theme/MDXComponents/styles.css → src/theme/MDXComponents/Img.module.css} +1 -6
- package/src/theme/MDXComponents/Img.tsx +26 -0
- package/src/theme/MDXComponents/Pre.tsx +22 -0
- package/src/theme/MDXComponents/Ul.tsx +24 -0
- package/src/theme/MDXComponents/index.tsx +23 -66
- package/src/theme/MDXContent/index.tsx +15 -0
- package/src/theme/MDXPage/index.tsx +33 -28
- package/src/theme/Navbar/ColorModeToggle/index.tsx +30 -0
- package/src/theme/Navbar/Content/index.tsx +86 -0
- package/src/theme/Navbar/Content/styles.module.css +15 -0
- package/src/theme/Navbar/Layout/index.tsx +57 -0
- package/{lib-next/theme/Navbar → src/theme/Navbar/Layout}/styles.module.css +0 -13
- package/src/theme/Navbar/Logo/index.tsx +19 -0
- package/src/theme/Navbar/MobileSidebar/Header/index.tsx +34 -0
- package/src/theme/Navbar/MobileSidebar/Layout/index.tsx +31 -0
- package/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx +38 -0
- package/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx +38 -0
- package/src/theme/Navbar/MobileSidebar/Toggle/index.tsx +25 -0
- package/src/theme/Navbar/MobileSidebar/index.tsx +33 -0
- package/src/theme/Navbar/Search/index.tsx +15 -0
- package/src/theme/Navbar/Search/styles.module.css +20 -0
- package/src/theme/Navbar/index.tsx +6 -286
- package/src/theme/NavbarItem/ComponentTypes.tsx +32 -0
- package/src/theme/NavbarItem/DefaultNavbarItem.tsx +2 -2
- package/src/theme/NavbarItem/DocNavbarItem.tsx +13 -32
- package/src/theme/NavbarItem/DocSidebarNavbarItem.tsx +9 -49
- package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +26 -33
- package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +3 -10
- package/src/theme/NavbarItem/DropdownNavbarItem.tsx +15 -3
- package/src/theme/NavbarItem/HtmlNavbarItem.tsx +32 -0
- package/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx +5 -9
- package/src/theme/NavbarItem/NavbarNavLink.tsx +41 -29
- package/src/theme/NavbarItem/SearchNavbarItem.tsx +6 -1
- package/src/theme/NavbarItem/index.tsx +9 -39
- package/src/theme/NavbarItem/utils.ts +5 -2
- package/src/theme/NotFound.tsx +38 -33
- package/src/theme/PaginatorNavLink/index.tsx +8 -2
- package/src/theme/SearchMetadata/index.tsx +9 -0
- package/src/theme/{LayoutHead → SiteMetadata}/index.tsx +19 -33
- package/src/theme/SkipToContent/index.tsx +3 -29
- package/{lib-next/theme/TOCCollapsible/styles.module.css → src/theme/TOCCollapsible/CollapseButton.module.css} +1 -22
- package/src/theme/TOCCollapsible/CollapseButton.tsx +35 -0
- package/src/theme/TOCCollapsible/index.module.css +31 -0
- package/src/theme/TOCCollapsible/index.tsx +4 -17
- package/src/theme/TOCItems/Tree.tsx +46 -0
- package/src/theme/TOCItems/index.tsx +2 -41
- package/src/theme/TabItem/index.tsx +7 -1
- package/src/theme/TabItem/styles.module.css +10 -0
- package/src/theme/Tabs/index.tsx +8 -9
- package/src/theme/Tabs/styles.module.css +4 -0
- package/src/theme/Tag/index.tsx +6 -8
- package/src/theme/TagsListInline/index.tsx +1 -1
- package/src/theme/ThemedImage/index.tsx +4 -3
- package/src/theme-classic.d.ts +600 -76
- package/src/translations.ts +12 -6
- package/src/validateThemeConfig.ts +90 -39
- package/lib/types.d.ts +0 -11
- package/lib-next/theme/DocPage/styles.module.css +0 -86
- package/lib-next/theme/DocSidebar/styles.module.css +0 -107
- package/lib-next/theme/Seo/index.js +0 -40
- package/lib-next/theme/Toggle/index.js +0 -100
- package/lib-next/theme/Toggle/styles.module.css +0 -106
- package/src/theme/DocPage/styles.module.css +0 -86
- package/src/theme/DocSidebar/styles.module.css +0 -107
- package/src/theme/Seo/index.tsx +0 -49
- package/src/theme/Toggle/index.tsx +0 -117
- package/src/theme/Toggle/styles.module.css +0 -106
- package/src/types.d.ts +0 -11
package/src/nprogress.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import nprogress from 'nprogress';
|
|
9
|
+
import './nprogress.css';
|
|
10
|
+
import type {ClientModule} from '@docusaurus/types';
|
|
11
|
+
|
|
12
|
+
nprogress.configure({showSpinner: false});
|
|
13
|
+
|
|
14
|
+
const delay = 200;
|
|
15
|
+
|
|
16
|
+
const clientModule: ClientModule = {
|
|
17
|
+
onRouteUpdate({location, previousLocation}) {
|
|
18
|
+
if (previousLocation && location.pathname !== previousLocation.pathname) {
|
|
19
|
+
const progressBarTimeout = window.setTimeout(() => {
|
|
20
|
+
nprogress.start();
|
|
21
|
+
}, delay);
|
|
22
|
+
return () => window.clearTimeout(progressBarTimeout);
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
},
|
|
26
|
+
onRouteDidUpdate() {
|
|
27
|
+
nprogress.done();
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default clientModule;
|
|
@@ -5,122 +5,15 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import React
|
|
8
|
+
import React from 'react';
|
|
9
9
|
import clsx from 'clsx';
|
|
10
10
|
import {translate} from '@docusaurus/Translate';
|
|
11
|
+
import {ThemeClassNames, useBackToTopButton} from '@docusaurus/theme-common';
|
|
11
12
|
|
|
12
13
|
import styles from './styles.module.css';
|
|
13
|
-
import {
|
|
14
|
-
ThemeClassNames,
|
|
15
|
-
useScrollPosition,
|
|
16
|
-
useLocationChange,
|
|
17
|
-
} from '@docusaurus/theme-common';
|
|
18
|
-
|
|
19
|
-
const threshold = 300;
|
|
20
|
-
|
|
21
|
-
// Not all have support for smooth scrolling (particularly Safari mobile iOS)
|
|
22
|
-
// TODO proper detection is currently unreliable!
|
|
23
|
-
// see https://github.com/wessberg/scroll-behavior-polyfill/issues/16
|
|
24
|
-
const SupportsNativeSmoothScrolling = false;
|
|
25
|
-
// const SupportsNativeSmoothScrolling =
|
|
26
|
-
// ExecutionEnvironment.canUseDOM &&
|
|
27
|
-
// 'scrollBehavior' in document.documentElement.style;
|
|
28
|
-
|
|
29
|
-
type CancelScrollTop = () => void;
|
|
30
|
-
|
|
31
|
-
function smoothScrollTopNative(): CancelScrollTop {
|
|
32
|
-
window.scrollTo({top: 0, behavior: 'smooth'});
|
|
33
|
-
return () => {
|
|
34
|
-
// Nothing to cancel, it's natively cancelled if user tries to scroll down
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function smoothScrollTopPolyfill(): CancelScrollTop {
|
|
39
|
-
let raf: number | null = null;
|
|
40
|
-
function rafRecursion() {
|
|
41
|
-
const currentScroll = document.documentElement.scrollTop;
|
|
42
|
-
if (currentScroll > 0) {
|
|
43
|
-
raf = requestAnimationFrame(rafRecursion);
|
|
44
|
-
window.scrollTo(0, Math.floor(currentScroll * 0.85));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
rafRecursion();
|
|
48
|
-
|
|
49
|
-
// Break the recursion. Prevents the user from "fighting" against that
|
|
50
|
-
// recursion producing a weird UX
|
|
51
|
-
return () => raf && cancelAnimationFrame(raf);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
type UseSmoothScrollTopReturn = {
|
|
55
|
-
// We use a cancel function because the non-native smooth scroll-top
|
|
56
|
-
// implementation must be interrupted if user scroll down
|
|
57
|
-
smoothScrollTop: () => void;
|
|
58
|
-
cancelScrollToTop: CancelScrollTop;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
function useSmoothScrollToTop(): UseSmoothScrollTopReturn {
|
|
62
|
-
const lastCancelRef = useRef<CancelScrollTop | null>(null);
|
|
63
|
-
|
|
64
|
-
function smoothScrollTop(): void {
|
|
65
|
-
lastCancelRef.current = SupportsNativeSmoothScrolling
|
|
66
|
-
? smoothScrollTopNative()
|
|
67
|
-
: smoothScrollTopPolyfill();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
smoothScrollTop,
|
|
72
|
-
cancelScrollToTop: () => lastCancelRef.current?.(),
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
14
|
|
|
76
15
|
export default function BackToTopButton(): JSX.Element {
|
|
77
|
-
const
|
|
78
|
-
const isFocusedAnchor = useRef(false);
|
|
79
|
-
const {smoothScrollTop, cancelScrollToTop} = useSmoothScrollToTop();
|
|
80
|
-
|
|
81
|
-
useScrollPosition(({scrollY: scrollTop}, lastPosition) => {
|
|
82
|
-
const lastScrollTop = lastPosition?.scrollY;
|
|
83
|
-
|
|
84
|
-
// No lastScrollTop means component is just being mounted.
|
|
85
|
-
// Not really a scroll event from the user, so we ignore it
|
|
86
|
-
if (!lastScrollTop) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (isFocusedAnchor.current) {
|
|
91
|
-
isFocusedAnchor.current = false;
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const isScrollingUp = scrollTop < lastScrollTop;
|
|
96
|
-
|
|
97
|
-
if (!isScrollingUp) {
|
|
98
|
-
cancelScrollToTop();
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (scrollTop < threshold) {
|
|
102
|
-
setShow(false);
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (isScrollingUp) {
|
|
107
|
-
const documentHeight = document.documentElement.scrollHeight;
|
|
108
|
-
const windowHeight = window.innerHeight;
|
|
109
|
-
if (scrollTop + windowHeight < documentHeight) {
|
|
110
|
-
setShow(true);
|
|
111
|
-
}
|
|
112
|
-
} else {
|
|
113
|
-
setShow(false);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
useLocationChange((locationChangeEvent) => {
|
|
118
|
-
if (locationChangeEvent.location.hash) {
|
|
119
|
-
isFocusedAnchor.current = true;
|
|
120
|
-
setShow(false);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
|
|
16
|
+
const {shown, scrollToTop} = useBackToTopButton({threshold: 300});
|
|
124
17
|
return (
|
|
125
18
|
<button
|
|
126
19
|
aria-label={translate({
|
|
@@ -132,12 +25,10 @@ export default function BackToTopButton(): JSX.Element {
|
|
|
132
25
|
'clean-btn',
|
|
133
26
|
ThemeClassNames.common.backToTopButton,
|
|
134
27
|
styles.backToTopButton,
|
|
135
|
-
|
|
136
|
-
[styles.backToTopButtonShow]: show,
|
|
137
|
-
},
|
|
28
|
+
shown && styles.backToTopButtonShow,
|
|
138
29
|
)}
|
|
139
30
|
type="button"
|
|
140
|
-
onClick={
|
|
31
|
+
onClick={scrollToTop}
|
|
141
32
|
/>
|
|
142
33
|
);
|
|
143
34
|
}
|
|
@@ -10,6 +10,7 @@ import Layout from '@theme/Layout';
|
|
|
10
10
|
import Link from '@docusaurus/Link';
|
|
11
11
|
import type {ArchiveBlogPost, Props} from '@theme/BlogArchivePage';
|
|
12
12
|
import {translate} from '@docusaurus/Translate';
|
|
13
|
+
import {PageMetadata} from '@docusaurus/theme-common';
|
|
13
14
|
|
|
14
15
|
type YearProp = {
|
|
15
16
|
year: string;
|
|
@@ -50,14 +51,11 @@ function YearsSection({years}: {years: YearProp[]}) {
|
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
function listPostsByYears(blogPosts: readonly ArchiveBlogPost[]): YearProp[] {
|
|
53
|
-
const postsByYear
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
},
|
|
59
|
-
new Map(),
|
|
60
|
-
);
|
|
54
|
+
const postsByYear = blogPosts.reduceRight((posts, post) => {
|
|
55
|
+
const year = post.metadata.date.split('-')[0]!;
|
|
56
|
+
const yearPosts = posts.get(year) ?? [];
|
|
57
|
+
return posts.set(year, [post, ...yearPosts]);
|
|
58
|
+
}, new Map<string, ArchiveBlogPost[]>());
|
|
61
59
|
|
|
62
60
|
return Array.from(postsByYear, ([year, posts]) => ({
|
|
63
61
|
year,
|
|
@@ -78,14 +76,17 @@ export default function BlogArchive({archive}: Props): JSX.Element {
|
|
|
78
76
|
});
|
|
79
77
|
const years = listPostsByYears(archive.blogPosts);
|
|
80
78
|
return (
|
|
81
|
-
|
|
82
|
-
<
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
79
|
+
<>
|
|
80
|
+
<PageMetadata title={title} description={description} />
|
|
81
|
+
<Layout>
|
|
82
|
+
<header className="hero hero--primary">
|
|
83
|
+
<div className="container">
|
|
84
|
+
<h1 className="hero__title">{title}</h1>
|
|
85
|
+
<p className="hero__subtitle">{description}</p>
|
|
86
|
+
</div>
|
|
87
|
+
</header>
|
|
88
|
+
<main>{years.length > 0 && <YearsSection years={years} />}</main>
|
|
89
|
+
</Layout>
|
|
90
|
+
</>
|
|
90
91
|
);
|
|
91
92
|
}
|
|
@@ -20,11 +20,7 @@ export default function BlogLayout(props: Props): JSX.Element {
|
|
|
20
20
|
<Layout {...layoutProps}>
|
|
21
21
|
<div className="container margin-vert--lg">
|
|
22
22
|
<div className="row">
|
|
23
|
-
{
|
|
24
|
-
<aside className="col col--3">
|
|
25
|
-
<BlogSidebar sidebar={sidebar!} />
|
|
26
|
-
</aside>
|
|
27
|
-
)}
|
|
23
|
+
<BlogSidebar sidebar={sidebar} />
|
|
28
24
|
<main
|
|
29
25
|
className={clsx('col', {
|
|
30
26
|
'col--7': hasSidebar,
|
|
@@ -12,28 +12,34 @@ import BlogLayout from '@theme/BlogLayout';
|
|
|
12
12
|
import BlogPostItem from '@theme/BlogPostItem';
|
|
13
13
|
import BlogListPaginator from '@theme/BlogListPaginator';
|
|
14
14
|
import type {Props} from '@theme/BlogListPage';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
PageMetadata,
|
|
17
|
+
HtmlClassNameProvider,
|
|
18
|
+
ThemeClassNames,
|
|
19
|
+
} from '@docusaurus/theme-common';
|
|
20
|
+
import SearchMetadata from '@theme/SearchMetadata';
|
|
21
|
+
import clsx from 'clsx';
|
|
16
22
|
|
|
17
|
-
|
|
18
|
-
const {metadata
|
|
23
|
+
function BlogListPageMetadata(props: Props): JSX.Element {
|
|
24
|
+
const {metadata} = props;
|
|
19
25
|
const {
|
|
20
26
|
siteConfig: {title: siteTitle},
|
|
21
27
|
} = useDocusaurusContext();
|
|
22
28
|
const {blogDescription, blogTitle, permalink} = metadata;
|
|
23
29
|
const isBlogOnlyMode = permalink === '/';
|
|
24
30
|
const title = isBlogOnlyMode ? siteTitle : blogTitle;
|
|
31
|
+
return (
|
|
32
|
+
<>
|
|
33
|
+
<PageMetadata title={title} description={blogDescription} />
|
|
34
|
+
<SearchMetadata tag="blog_posts_list" />
|
|
35
|
+
</>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
25
38
|
|
|
39
|
+
function BlogListPageContent(props: Props): JSX.Element {
|
|
40
|
+
const {metadata, items, sidebar} = props;
|
|
26
41
|
return (
|
|
27
|
-
<BlogLayout
|
|
28
|
-
title={title}
|
|
29
|
-
description={blogDescription}
|
|
30
|
-
wrapperClassName={ThemeClassNames.wrapper.blogPages}
|
|
31
|
-
pageClassName={ThemeClassNames.page.blogListPage}
|
|
32
|
-
searchMetadata={{
|
|
33
|
-
// assign unique search tag to exclude this page from search results!
|
|
34
|
-
tag: 'blog_posts_list',
|
|
35
|
-
}}
|
|
36
|
-
sidebar={sidebar}>
|
|
42
|
+
<BlogLayout sidebar={sidebar}>
|
|
37
43
|
{items.map(({content: BlogPostContent}) => (
|
|
38
44
|
<BlogPostItem
|
|
39
45
|
key={BlogPostContent.metadata.permalink}
|
|
@@ -48,3 +54,16 @@ export default function BlogListPage(props: Props): JSX.Element {
|
|
|
48
54
|
</BlogLayout>
|
|
49
55
|
);
|
|
50
56
|
}
|
|
57
|
+
|
|
58
|
+
export default function BlogListPage(props: Props): JSX.Element {
|
|
59
|
+
return (
|
|
60
|
+
<HtmlClassNameProvider
|
|
61
|
+
className={clsx(
|
|
62
|
+
ThemeClassNames.wrapper.blogPages,
|
|
63
|
+
ThemeClassNames.page.blogListPage,
|
|
64
|
+
)}>
|
|
65
|
+
<BlogListPageMetadata {...props} />
|
|
66
|
+
<BlogListPageContent {...props} />
|
|
67
|
+
</HtmlClassNameProvider>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
@@ -22,34 +22,31 @@ export default function BlogListPaginator(props: Props): JSX.Element {
|
|
|
22
22
|
message: 'Blog list page navigation',
|
|
23
23
|
description: 'The ARIA label for the blog pagination',
|
|
24
24
|
})}>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
/>
|
|
51
|
-
)}
|
|
52
|
-
</div>
|
|
25
|
+
{previousPage && (
|
|
26
|
+
<PaginatorNavLink
|
|
27
|
+
permalink={previousPage}
|
|
28
|
+
title={
|
|
29
|
+
<Translate
|
|
30
|
+
id="theme.blog.paginator.newerEntries"
|
|
31
|
+
description="The label used to navigate to the newer blog posts page (previous page)">
|
|
32
|
+
Newer Entries
|
|
33
|
+
</Translate>
|
|
34
|
+
}
|
|
35
|
+
/>
|
|
36
|
+
)}
|
|
37
|
+
{nextPage && (
|
|
38
|
+
<PaginatorNavLink
|
|
39
|
+
permalink={nextPage}
|
|
40
|
+
title={
|
|
41
|
+
<Translate
|
|
42
|
+
id="theme.blog.paginator.olderEntries"
|
|
43
|
+
description="The label used to navigate to the older blog posts page (next page)">
|
|
44
|
+
Older Entries
|
|
45
|
+
</Translate>
|
|
46
|
+
}
|
|
47
|
+
isNext
|
|
48
|
+
/>
|
|
49
|
+
)}
|
|
53
50
|
</nav>
|
|
54
51
|
);
|
|
55
52
|
}
|
|
@@ -6,19 +6,25 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import React from 'react';
|
|
9
|
-
import Link from '@docusaurus/Link';
|
|
9
|
+
import Link, {type Props as LinkProps} from '@docusaurus/Link';
|
|
10
10
|
import type {Props} from '@theme/BlogPostAuthor';
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
function MaybeLink(props: LinkProps): JSX.Element {
|
|
13
|
+
if (props.href) {
|
|
14
|
+
return <Link {...props} />;
|
|
15
|
+
}
|
|
16
|
+
return <>{props.children}</>;
|
|
17
|
+
}
|
|
13
18
|
|
|
14
19
|
export default function BlogPostAuthor({author}: Props): JSX.Element {
|
|
15
|
-
const {name, title, url, imageURL} = author;
|
|
20
|
+
const {name, title, url, imageURL, email} = author;
|
|
21
|
+
const link = url || (email && `mailto:${email}`) || undefined;
|
|
16
22
|
return (
|
|
17
23
|
<div className="avatar margin-bottom--sm">
|
|
18
24
|
{imageURL && (
|
|
19
|
-
<
|
|
20
|
-
<img className=
|
|
21
|
-
</
|
|
25
|
+
<MaybeLink href={link} className="avatar__photo-link">
|
|
26
|
+
<img className="avatar__photo" src={imageURL} alt={name} />
|
|
27
|
+
</MaybeLink>
|
|
22
28
|
)}
|
|
23
29
|
|
|
24
30
|
{name && (
|
|
@@ -28,9 +34,9 @@ export default function BlogPostAuthor({author}: Props): JSX.Element {
|
|
|
28
34
|
itemScope
|
|
29
35
|
itemType="https://schema.org/Person">
|
|
30
36
|
<div className="avatar__name">
|
|
31
|
-
<
|
|
37
|
+
<MaybeLink href={link} itemProp="url">
|
|
32
38
|
<span itemProp="name">{name}</span>
|
|
33
|
-
</
|
|
39
|
+
</MaybeLink>
|
|
34
40
|
</div>
|
|
35
41
|
{title && (
|
|
36
42
|
<small className="avatar__subtitle" itemProp="description">
|
|
@@ -7,13 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
import React from 'react';
|
|
9
9
|
import clsx from 'clsx';
|
|
10
|
-
import {MDXProvider} from '@mdx-js/react';
|
|
11
10
|
import Translate, {translate} from '@docusaurus/Translate';
|
|
12
11
|
import Link from '@docusaurus/Link';
|
|
13
12
|
import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
|
|
14
13
|
import {usePluralForm} from '@docusaurus/theme-common';
|
|
15
14
|
import {blogPostContainerID} from '@docusaurus/utils-common';
|
|
16
|
-
import
|
|
15
|
+
import MDXContent from '@theme/MDXContent';
|
|
17
16
|
import EditThisPage from '@theme/EditThisPage';
|
|
18
17
|
import type {Props} from '@theme/BlogPostItem';
|
|
19
18
|
|
|
@@ -108,14 +107,15 @@ export default function BlogPostItem(props: Props): JSX.Element {
|
|
|
108
107
|
id={isBlogPostPage ? blogPostContainerID : undefined}
|
|
109
108
|
className="markdown"
|
|
110
109
|
itemProp="articleBody">
|
|
111
|
-
<
|
|
110
|
+
<MDXContent>{children}</MDXContent>
|
|
112
111
|
</div>
|
|
113
112
|
|
|
114
113
|
{(tagsExists || truncated) && (
|
|
115
114
|
<footer
|
|
116
|
-
className={clsx(
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
className={clsx(
|
|
116
|
+
'row docusaurus-mt-lg',
|
|
117
|
+
isBlogPostPage && styles.blogPostDetailsFull,
|
|
118
|
+
)}>
|
|
119
119
|
{tagsExists && (
|
|
120
120
|
<div className={clsx('col', {'col--9': truncatedPost})}>
|
|
121
121
|
<TagsListInline tags={tags} />
|
|
@@ -6,40 +6,63 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import React from 'react';
|
|
9
|
-
import Seo from '@theme/Seo';
|
|
10
9
|
import BlogLayout from '@theme/BlogLayout';
|
|
11
10
|
import BlogPostItem from '@theme/BlogPostItem';
|
|
12
11
|
import BlogPostPaginator from '@theme/BlogPostPaginator';
|
|
13
12
|
import type {Props} from '@theme/BlogPostPage';
|
|
14
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
PageMetadata,
|
|
15
|
+
HtmlClassNameProvider,
|
|
16
|
+
ThemeClassNames,
|
|
17
|
+
} from '@docusaurus/theme-common';
|
|
15
18
|
import TOC from '@theme/TOC';
|
|
19
|
+
import clsx from 'clsx';
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
function BlogPostPageMetadata(props: Props): JSX.Element {
|
|
22
|
+
const {content: BlogPostContents} = props;
|
|
23
|
+
const {assets, metadata} = BlogPostContents;
|
|
24
|
+
const {title, description, date, tags, authors, frontMatter} = metadata;
|
|
25
|
+
const {keywords} = frontMatter;
|
|
26
|
+
const image = assets.image ?? frontMatter.image;
|
|
27
|
+
return (
|
|
28
|
+
<PageMetadata
|
|
29
|
+
title={title}
|
|
30
|
+
description={description}
|
|
31
|
+
keywords={keywords}
|
|
32
|
+
image={image}>
|
|
33
|
+
<meta property="og:type" content="article" />
|
|
34
|
+
<meta property="article:published_time" content={date} />
|
|
35
|
+
{/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
|
|
36
|
+
{authors.some((author) => author.url) && (
|
|
37
|
+
<meta
|
|
38
|
+
property="article:author"
|
|
39
|
+
content={authors
|
|
40
|
+
.map((author) => author.url)
|
|
41
|
+
.filter(Boolean)
|
|
42
|
+
.join(',')}
|
|
43
|
+
/>
|
|
44
|
+
)}
|
|
45
|
+
{tags.length > 0 && (
|
|
46
|
+
<meta
|
|
47
|
+
property="article:tag"
|
|
48
|
+
content={tags.map((tag) => tag.label).join(',')}
|
|
49
|
+
/>
|
|
50
|
+
)}
|
|
51
|
+
</PageMetadata>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function BlogPostPageContent(props: Props): JSX.Element {
|
|
18
56
|
const {content: BlogPostContents, sidebar} = props;
|
|
19
57
|
const {assets, metadata} = BlogPostContents;
|
|
20
|
-
const {
|
|
21
|
-
title,
|
|
22
|
-
description,
|
|
23
|
-
nextItem,
|
|
24
|
-
prevItem,
|
|
25
|
-
date,
|
|
26
|
-
tags,
|
|
27
|
-
authors,
|
|
28
|
-
frontMatter,
|
|
29
|
-
} = metadata;
|
|
58
|
+
const {nextItem, prevItem, frontMatter} = metadata;
|
|
30
59
|
const {
|
|
31
60
|
hide_table_of_contents: hideTableOfContents,
|
|
32
|
-
keywords,
|
|
33
61
|
toc_min_heading_level: tocMinHeadingLevel,
|
|
34
62
|
toc_max_heading_level: tocMaxHeadingLevel,
|
|
35
63
|
} = frontMatter;
|
|
36
|
-
|
|
37
|
-
const image = assets.image ?? frontMatter.image;
|
|
38
|
-
|
|
39
64
|
return (
|
|
40
65
|
<BlogLayout
|
|
41
|
-
wrapperClassName={ThemeClassNames.wrapper.blogPages}
|
|
42
|
-
pageClassName={ThemeClassNames.page.blogPostPage}
|
|
43
66
|
sidebar={sidebar}
|
|
44
67
|
toc={
|
|
45
68
|
!hideTableOfContents &&
|
|
@@ -52,35 +75,6 @@ export default function BlogPostPage(props: Props): JSX.Element {
|
|
|
52
75
|
/>
|
|
53
76
|
) : undefined
|
|
54
77
|
}>
|
|
55
|
-
<Seo
|
|
56
|
-
// TODO refactor needed: it's a bit annoying but Seo MUST be inside
|
|
57
|
-
// BlogLayout, otherwise default image (set by BlogLayout) would shadow
|
|
58
|
-
// the custom blog post image
|
|
59
|
-
title={title}
|
|
60
|
-
description={description}
|
|
61
|
-
keywords={keywords}
|
|
62
|
-
image={image}>
|
|
63
|
-
<meta property="og:type" content="article" />
|
|
64
|
-
<meta property="article:published_time" content={date} />
|
|
65
|
-
|
|
66
|
-
{/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
|
|
67
|
-
{authors.some((author) => author.url) && (
|
|
68
|
-
<meta
|
|
69
|
-
property="article:author"
|
|
70
|
-
content={authors
|
|
71
|
-
.map((author) => author.url)
|
|
72
|
-
.filter(Boolean)
|
|
73
|
-
.join(',')}
|
|
74
|
-
/>
|
|
75
|
-
)}
|
|
76
|
-
{tags.length > 0 && (
|
|
77
|
-
<meta
|
|
78
|
-
property="article:tag"
|
|
79
|
-
content={tags.map((tag) => tag.label).join(',')}
|
|
80
|
-
/>
|
|
81
|
-
)}
|
|
82
|
-
</Seo>
|
|
83
|
-
|
|
84
78
|
<BlogPostItem
|
|
85
79
|
frontMatter={frontMatter}
|
|
86
80
|
assets={assets}
|
|
@@ -95,3 +89,16 @@ export default function BlogPostPage(props: Props): JSX.Element {
|
|
|
95
89
|
</BlogLayout>
|
|
96
90
|
);
|
|
97
91
|
}
|
|
92
|
+
|
|
93
|
+
export default function BlogPostPage(props: Props): JSX.Element {
|
|
94
|
+
return (
|
|
95
|
+
<HtmlClassNameProvider
|
|
96
|
+
className={clsx(
|
|
97
|
+
ThemeClassNames.wrapper.blogPages,
|
|
98
|
+
ThemeClassNames.page.blogPostPage,
|
|
99
|
+
)}>
|
|
100
|
+
<BlogPostPageMetadata {...props} />
|
|
101
|
+
<BlogPostPageContent {...props} />
|
|
102
|
+
</HtmlClassNameProvider>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
@@ -21,34 +21,31 @@ export default function BlogPostPaginator(props: Props): JSX.Element {
|
|
|
21
21
|
message: 'Blog post page navigation',
|
|
22
22
|
description: 'The ARIA label for the blog posts pagination',
|
|
23
23
|
})}>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
/>
|
|
50
|
-
)}
|
|
51
|
-
</div>
|
|
24
|
+
{prevItem && (
|
|
25
|
+
<PaginatorNavLink
|
|
26
|
+
{...prevItem}
|
|
27
|
+
subLabel={
|
|
28
|
+
<Translate
|
|
29
|
+
id="theme.blog.post.paginator.newerPost"
|
|
30
|
+
description="The blog post button label to navigate to the newer/previous post">
|
|
31
|
+
Newer Post
|
|
32
|
+
</Translate>
|
|
33
|
+
}
|
|
34
|
+
/>
|
|
35
|
+
)}
|
|
36
|
+
{nextItem && (
|
|
37
|
+
<PaginatorNavLink
|
|
38
|
+
{...nextItem}
|
|
39
|
+
subLabel={
|
|
40
|
+
<Translate
|
|
41
|
+
id="theme.blog.post.paginator.olderPost"
|
|
42
|
+
description="The blog post button label to navigate to the older/next post">
|
|
43
|
+
Older Post
|
|
44
|
+
</Translate>
|
|
45
|
+
}
|
|
46
|
+
isNext
|
|
47
|
+
/>
|
|
48
|
+
)}
|
|
52
49
|
</nav>
|
|
53
50
|
);
|
|
54
51
|
}
|