@docusaurus/theme-classic 2.0.0-beta.8bda3b2db → 2.0.0-beta.9
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/README.md +1 -1
- package/codeTranslations/ar.json +12 -7
- package/codeTranslations/base.json +17 -7
- package/codeTranslations/bn.json +11 -5
- package/codeTranslations/cs.json +62 -0
- package/codeTranslations/da.json +8 -3
- package/codeTranslations/de.json +8 -3
- package/codeTranslations/es.json +15 -10
- package/codeTranslations/fa.json +31 -26
- package/codeTranslations/fil.json +8 -3
- package/codeTranslations/fr.json +8 -3
- package/codeTranslations/he.json +9 -4
- package/codeTranslations/hi.json +9 -4
- package/codeTranslations/ja.json +8 -3
- package/codeTranslations/ko.json +8 -3
- package/codeTranslations/pl.json +8 -3
- package/codeTranslations/pt-BR.json +16 -11
- package/codeTranslations/pt-PT.json +8 -3
- package/codeTranslations/ru.json +10 -5
- package/codeTranslations/sr.json +62 -0
- package/codeTranslations/tr.json +9 -4
- package/codeTranslations/vi.json +10 -5
- package/codeTranslations/zh-Hans.json +9 -4
- package/codeTranslations/zh-Hant.json +9 -4
- package/lib/__tests__/validateThemeConfig.test.js +277 -3
- package/lib/admonitions.css +35 -0
- package/lib/index.js +31 -8
- package/lib/prism-include-languages.js +9 -5
- package/lib/theme/AnnouncementBar/index.js +10 -16
- package/lib/theme/AnnouncementBar/styles.module.css +25 -30
- package/lib/theme/BackToTopButton/index.js +140 -0
- package/lib/theme/BackToTopButton/styles.module.css +42 -0
- package/lib/theme/BlogArchivePage/index.js +89 -0
- package/lib/theme/BlogLayout/index.js +51 -0
- package/lib/theme/BlogListPage/index.js +10 -21
- package/lib/theme/BlogPostAuthor/index.js +51 -0
- package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
- package/lib/theme/BlogPostAuthors/index.js +47 -0
- package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
- package/lib/theme/BlogPostItem/index.js +58 -67
- package/lib/theme/BlogPostPage/index.js +37 -24
- package/lib/theme/BlogSidebar/styles.module.css +2 -2
- package/lib/theme/BlogTagsListPage/index.js +8 -44
- package/lib/theme/BlogTagsPostsPage/index.js +24 -38
- package/lib/theme/CodeBlock/index.js +45 -41
- package/lib/theme/CodeBlock/styles.module.css +6 -9
- package/lib/theme/Details/index.js +30 -0
- package/lib/theme/Details/styles.module.css +13 -0
- package/lib/theme/DocItem/index.js +29 -45
- package/lib/theme/DocItem/styles.module.css +5 -9
- package/lib/theme/DocItemFooter/index.js +79 -0
- package/lib/theme/DocItemFooter/styles.module.css +18 -0
- package/lib/theme/DocPage/index.js +25 -49
- package/lib/theme/DocPage/styles.module.css +8 -23
- package/lib/theme/DocSidebar/index.js +45 -227
- package/lib/theme/DocSidebar/styles.module.css +0 -18
- package/lib/theme/DocSidebarItem/index.js +177 -0
- package/lib/theme/DocSidebarItem/styles.module.css +15 -0
- package/lib/theme/DocTagDocListPage/index.js +89 -0
- package/lib/theme/DocTagsListPage/index.js +44 -0
- package/lib/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +37 -18
- package/lib/theme/EditThisPage/index.js +3 -1
- package/lib/theme/Footer/index.js +13 -4
- package/lib/theme/Heading/index.js +7 -9
- package/lib/theme/Heading/styles.css +4 -6
- package/lib/theme/Heading/styles.module.css +9 -5
- package/lib/theme/IconClose/index.js +31 -0
- package/lib/theme/LastUpdated/index.js +4 -2
- package/lib/theme/LayoutHead/index.js +13 -11
- package/lib/theme/LayoutProviders/index.js +11 -5
- package/lib/theme/Logo/index.js +14 -12
- package/lib/theme/MDXComponents/index.js +45 -4
- package/lib/theme/MDXComponents/styles.css +11 -0
- package/lib/theme/MDXPage/index.js +2 -1
- package/lib/theme/Navbar/index.js +164 -42
- package/lib/theme/Navbar/styles.module.css +10 -3
- package/lib/theme/NavbarItem/DefaultNavbarItem.js +27 -123
- package/lib/theme/NavbarItem/DocNavbarItem.js +6 -5
- package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +19 -12
- package/lib/theme/NavbarItem/DropdownNavbarItem.js +155 -0
- package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +5 -6
- package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib/theme/NavbarItem/index.js +31 -11
- package/lib/theme/Seo/index.js +10 -7
- package/lib/theme/SkipToContent/index.js +9 -3
- package/lib/theme/SkipToContent/styles.module.css +1 -0
- package/lib/theme/TOC/index.js +9 -29
- package/lib/theme/TOC/styles.module.css +1 -1
- package/lib/theme/TOCCollapsible/index.js +53 -0
- package/lib/theme/TOCCollapsible/styles.module.css +50 -0
- package/lib/theme/TOCInline/index.js +7 -27
- package/lib/theme/TOCItems/index.js +78 -0
- package/lib/theme/Tabs/__tests__/index.test.js +123 -0
- package/lib/theme/Tabs/index.js +73 -50
- package/lib/theme/Tabs/styles.module.css +0 -13
- package/lib/theme/Tag/index.js +40 -0
- package/lib/theme/Tag/styles.module.css +70 -0
- package/lib/theme/TagsListByLetter/index.js +48 -0
- package/lib/theme/TagsListByLetter/styles.module.css +11 -0
- package/lib/theme/TagsListInline/index.js +44 -0
- package/lib/theme/TagsListInline/styles.module.css +15 -0
- package/lib/theme/ThemedImage/index.js +4 -5
- package/lib/theme/Toggle/index.js +23 -18
- package/lib/theme/Toggle/styles.module.css +91 -0
- package/lib/theme/UserPreferencesProvider/index.js +1 -9
- package/lib/theme/hooks/useHideableNavbar.js +14 -32
- package/lib/theme/hooks/useTabGroupChoice.js +2 -4
- package/lib/theme/hooks/useTheme.js +2 -2
- package/lib/theme/hooks/useWindowSize.js +33 -20
- package/lib/theme/prism-include-languages.js +4 -3
- package/lib/translations.js +4 -4
- package/lib/types.d.ts +338 -138
- package/lib/validateThemeConfig.js +226 -245
- package/lib-next/__tests__/validateThemeConfig.test.js +277 -3
- package/lib-next/admonitions.css +35 -0
- package/lib-next/index.js +33 -7
- package/lib-next/prism-include-languages.js +0 -2
- package/lib-next/theme/AnnouncementBar/index.js +9 -18
- package/lib-next/theme/AnnouncementBar/styles.module.css +25 -30
- package/lib-next/theme/BackToTopButton/index.js +131 -0
- package/lib-next/theme/BackToTopButton/styles.module.css +42 -0
- package/lib-next/theme/BlogArchivePage/index.js +80 -0
- package/lib-next/theme/BlogLayout/index.js +40 -0
- package/lib-next/theme/BlogListPage/index.js +16 -24
- package/lib-next/theme/BlogPostAuthor/index.js +46 -0
- package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
- package/lib-next/theme/BlogPostAuthors/index.js +34 -0
- package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
- package/lib-next/theme/BlogPostItem/index.js +79 -86
- package/lib-next/theme/BlogPostPage/index.js +70 -35
- package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
- package/lib-next/theme/BlogTagsListPage/index.js +13 -54
- package/lib-next/theme/BlogTagsPostsPage/index.js +28 -38
- package/lib-next/theme/CodeBlock/index.js +54 -53
- package/lib-next/theme/CodeBlock/styles.module.css +6 -9
- package/lib-next/theme/Details/index.js +20 -0
- package/lib-next/theme/Details/styles.module.css +13 -0
- package/lib-next/theme/DocItem/index.js +46 -55
- package/lib-next/theme/DocItem/styles.module.css +5 -9
- package/lib-next/theme/DocItemFooter/index.js +79 -0
- package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
- package/lib-next/theme/DocPage/index.js +25 -43
- package/lib-next/theme/DocPage/styles.module.css +8 -23
- package/lib-next/theme/DocSidebar/index.js +59 -288
- package/lib-next/theme/DocSidebar/styles.module.css +0 -18
- package/lib-next/theme/DocSidebarItem/index.js +181 -0
- package/lib-next/theme/DocSidebarItem/styles.module.css +15 -0
- package/lib-next/theme/DocTagDocListPage/index.js +89 -0
- package/lib-next/theme/DocTagsListPage/index.js +38 -0
- package/lib-next/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +44 -36
- package/lib-next/theme/EditThisPage/index.js +6 -1
- package/lib-next/theme/Footer/index.js +24 -4
- package/lib-next/theme/Heading/index.js +10 -13
- package/lib-next/theme/Heading/styles.css +4 -6
- package/lib-next/theme/Heading/styles.module.css +9 -5
- package/lib-next/theme/IconClose/index.js +23 -0
- package/lib-next/theme/LastUpdated/index.js +3 -2
- package/lib-next/theme/LayoutHead/index.js +9 -15
- package/lib-next/theme/LayoutProviders/index.js +17 -6
- package/lib-next/theme/Logo/index.js +23 -19
- package/lib-next/theme/MDXComponents/index.js +34 -7
- package/lib-next/theme/MDXComponents/styles.css +11 -0
- package/lib-next/theme/MDXPage/index.js +10 -2
- package/lib-next/theme/Navbar/index.js +192 -56
- package/lib-next/theme/Navbar/styles.module.css +10 -3
- package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +45 -147
- package/lib-next/theme/NavbarItem/DocNavbarItem.js +6 -5
- package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +31 -19
- package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +158 -0
- package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +4 -8
- package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib-next/theme/NavbarItem/index.js +25 -12
- package/lib-next/theme/Seo/index.js +11 -7
- package/lib-next/theme/SkipToContent/index.js +5 -6
- package/lib-next/theme/SkipToContent/styles.module.css +1 -0
- package/lib-next/theme/TOC/index.js +12 -36
- package/lib-next/theme/TOC/styles.module.css +1 -1
- package/lib-next/theme/TOCCollapsible/index.js +54 -0
- package/lib-next/theme/TOCCollapsible/styles.module.css +50 -0
- package/lib-next/theme/TOCInline/index.js +10 -28
- package/lib-next/theme/TOCItems/index.js +85 -0
- package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
- package/lib-next/theme/Tabs/index.js +91 -43
- package/lib-next/theme/Tabs/styles.module.css +0 -13
- package/lib-next/theme/Tag/index.js +27 -0
- package/lib-next/theme/Tag/styles.module.css +70 -0
- package/lib-next/theme/TagsListByLetter/index.js +42 -0
- package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
- package/lib-next/theme/TagsListInline/index.js +31 -0
- package/lib-next/theme/TagsListInline/styles.module.css +15 -0
- package/lib-next/theme/ThemedImage/index.js +5 -6
- package/lib-next/theme/Toggle/index.js +20 -15
- package/lib-next/theme/Toggle/styles.module.css +91 -0
- package/lib-next/theme/UserPreferencesProvider/index.js +0 -4
- package/lib-next/theme/hooks/useHideableNavbar.js +31 -44
- package/lib-next/theme/hooks/useTabGroupChoice.js +2 -4
- package/lib-next/theme/hooks/useTheme.js +2 -2
- package/lib-next/theme/hooks/useWindowSize.js +34 -20
- package/lib-next/theme/prism-include-languages.js +2 -1
- package/lib-next/translations.js +6 -10
- package/lib-next/types.d.ts +338 -138
- package/lib-next/validateThemeConfig.js +134 -110
- package/package.json +24 -19
- package/src/__tests__/validateThemeConfig.test.js +277 -3
- package/src/admonitions.css +35 -0
- package/src/index.ts +44 -14
- package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
- package/src/theme/AnnouncementBar/index.tsx +10 -17
- package/src/theme/AnnouncementBar/styles.module.css +25 -30
- package/src/theme/BackToTopButton/index.tsx +142 -0
- package/src/theme/BackToTopButton/styles.module.css +42 -0
- package/src/theme/BlogArchivePage/index.tsx +91 -0
- package/src/theme/BlogLayout/index.tsx +44 -0
- package/src/theme/BlogListPage/index.tsx +17 -24
- package/src/theme/BlogPostAuthor/index.tsx +49 -0
- package/src/theme/BlogPostAuthor/styles.module.css +12 -0
- package/src/theme/BlogPostAuthors/index.tsx +36 -0
- package/src/theme/BlogPostAuthors/styles.module.css +11 -0
- package/src/theme/BlogPostItem/index.tsx +70 -80
- package/src/theme/BlogPostPage/index.tsx +72 -35
- package/src/theme/BlogSidebar/styles.module.css +2 -2
- package/src/theme/BlogTagsListPage/index.tsx +13 -56
- package/src/theme/BlogTagsPostsPage/index.tsx +28 -38
- package/src/theme/CodeBlock/index.tsx +70 -55
- package/src/theme/CodeBlock/styles.module.css +6 -9
- package/src/theme/Details/index.tsx +24 -0
- package/src/theme/Details/styles.module.css +13 -0
- package/src/theme/DocItem/index.tsx +49 -55
- package/src/theme/DocItem/styles.module.css +5 -9
- package/src/theme/DocItemFooter/index.tsx +91 -0
- package/src/theme/DocItemFooter/styles.module.css +18 -0
- package/src/theme/DocPage/index.tsx +24 -38
- package/src/theme/DocPage/styles.module.css +8 -23
- package/src/theme/DocSidebar/index.tsx +70 -300
- package/src/theme/DocSidebar/styles.module.css +0 -18
- package/src/theme/DocSidebarItem/index.tsx +206 -0
- package/src/theme/DocSidebarItem/styles.module.css +15 -0
- package/src/theme/DocTagDocListPage/index.tsx +89 -0
- package/src/theme/DocTagsListPage/index.tsx +41 -0
- package/src/theme/{DocVersionSuggestions → DocVersionBanner}/index.tsx +58 -44
- package/src/theme/EditThisPage/index.tsx +6 -1
- package/src/theme/Footer/index.tsx +26 -4
- package/src/theme/Heading/index.tsx +10 -13
- package/src/theme/Heading/styles.css +4 -6
- package/src/theme/Heading/styles.module.css +9 -5
- package/src/theme/IconClose/index.tsx +26 -0
- package/src/theme/LastUpdated/index.tsx +3 -2
- package/src/theme/LayoutHead/index.tsx +9 -9
- package/src/theme/LayoutProviders/index.tsx +17 -6
- package/src/theme/Logo/index.tsx +19 -15
- package/src/theme/MDXComponents/index.tsx +39 -5
- package/src/theme/MDXComponents/styles.css +11 -0
- package/src/theme/MDXPage/index.tsx +10 -2
- package/src/theme/Navbar/index.tsx +202 -61
- package/src/theme/Navbar/styles.module.css +10 -3
- package/src/theme/NavbarItem/DefaultNavbarItem.tsx +42 -154
- package/src/theme/NavbarItem/DocNavbarItem.tsx +11 -14
- package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +33 -21
- package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
- package/src/theme/NavbarItem/DropdownNavbarItem.tsx +180 -0
- package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +8 -7
- package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/src/theme/NavbarItem/index.tsx +41 -16
- package/src/theme/Seo/index.tsx +7 -4
- package/src/theme/SkipToContent/index.tsx +5 -6
- package/src/theme/SkipToContent/styles.module.css +1 -0
- package/src/theme/TOC/index.tsx +12 -41
- package/src/theme/TOC/styles.module.css +1 -1
- package/src/theme/TOCCollapsible/index.tsx +58 -0
- package/src/theme/TOCCollapsible/styles.module.css +50 -0
- package/src/theme/TOCInline/index.tsx +13 -32
- package/src/theme/TOCItems/index.tsx +96 -0
- package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
- package/src/theme/Tabs/index.tsx +93 -49
- package/src/theme/Tabs/styles.module.css +0 -13
- package/src/theme/Tag/index.tsx +31 -0
- package/src/theme/Tag/styles.module.css +70 -0
- package/src/theme/TagsListByLetter/index.tsx +45 -0
- package/src/theme/TagsListByLetter/styles.module.css +11 -0
- package/src/theme/TagsListInline/index.tsx +35 -0
- package/src/theme/TagsListInline/styles.module.css +15 -0
- package/src/theme/ThemedImage/index.tsx +6 -6
- package/src/theme/Toggle/index.tsx +20 -15
- package/src/theme/Toggle/styles.module.css +91 -0
- package/src/theme/UserPreferencesProvider/index.tsx +0 -5
- package/src/theme/hooks/useContextualSearchFilters.ts +1 -1
- package/src/theme/hooks/useHideableNavbar.ts +32 -45
- package/src/theme/hooks/useTabGroupChoice.ts +4 -4
- package/src/theme/hooks/useTheme.ts +2 -2
- package/src/theme/hooks/useWindowSize.ts +38 -20
- package/src/theme/prism-include-languages.ts +3 -2
- package/src/translations.ts +6 -10
- package/src/types.d.ts +338 -138
- package/src/{validateThemeConfig.js → validateThemeConfig.ts} +144 -90
- package/tsconfig.json +1 -2
- package/update-code-translations.js +10 -6
- package/update-code-translations.test.js +1 -1
- package/update.js +151 -0
- package/lib/theme/Toggle/styles.css +0 -103
- package/lib/theme/hooks/useAnnouncementBar.js +0 -63
- package/lib/theme/hooks/useScrollPosition.js +0 -49
- package/lib/theme/hooks/useTOCHighlight.js +0 -87
- package/lib-next/theme/Toggle/styles.css +0 -103
- package/lib-next/theme/hooks/useAnnouncementBar.js +0 -49
- package/lib-next/theme/hooks/useScrollPosition.js +0 -38
- package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
- package/src/theme/Toggle/styles.css +0 -103
- package/src/theme/hooks/useAnnouncementBar.ts +0 -58
- package/src/theme/hooks/useScrollPosition.ts +0 -45
- package/src/theme/hooks/useTOCHighlight.ts +0 -98
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
import React, {useRef, useState} from 'react';
|
|
8
|
+
import clsx from 'clsx';
|
|
9
|
+
import {translate} from '@docusaurus/Translate';
|
|
10
|
+
import styles from './styles.module.css';
|
|
11
|
+
import {
|
|
12
|
+
ThemeClassNames,
|
|
13
|
+
useScrollPosition,
|
|
14
|
+
useLocationChange,
|
|
15
|
+
} from '@docusaurus/theme-common';
|
|
16
|
+
const threshold = 300; // Not all have support for smooth scrolling (particularly Safari mobile iOS)
|
|
17
|
+
// TODO proper detection is currently unreliable!
|
|
18
|
+
// see https://github.com/wessberg/scroll-behavior-polyfill/issues/16
|
|
19
|
+
|
|
20
|
+
const SupportsNativeSmoothScrolling = false; // const SupportsNativeSmoothScrolling = ExecutionEnvironment.canUseDOM && 'scrollBehavior' in document.documentElement.style;
|
|
21
|
+
|
|
22
|
+
function smoothScrollTopNative() {
|
|
23
|
+
window.scrollTo({
|
|
24
|
+
top: 0,
|
|
25
|
+
behavior: 'smooth',
|
|
26
|
+
});
|
|
27
|
+
return () => {
|
|
28
|
+
// Nothing to cancel, it's natively cancelled if user tries to scroll down
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function smoothScrollTopPolyfill() {
|
|
33
|
+
let raf = null;
|
|
34
|
+
|
|
35
|
+
function rafRecursion() {
|
|
36
|
+
const currentScroll = document.documentElement.scrollTop;
|
|
37
|
+
|
|
38
|
+
if (currentScroll > 0) {
|
|
39
|
+
raf = requestAnimationFrame(rafRecursion);
|
|
40
|
+
window.scrollTo(0, Math.floor(currentScroll * 0.85));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
rafRecursion(); // Break the recursion
|
|
45
|
+
// Prevents the user from "fighting" against that recursion producing a weird UX
|
|
46
|
+
|
|
47
|
+
return () => raf && cancelAnimationFrame(raf);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function useSmoothScrollToTop() {
|
|
51
|
+
const lastCancelRef = useRef(null);
|
|
52
|
+
|
|
53
|
+
function smoothScrollTop() {
|
|
54
|
+
lastCancelRef.current = SupportsNativeSmoothScrolling
|
|
55
|
+
? smoothScrollTopNative()
|
|
56
|
+
: smoothScrollTopPolyfill();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
smoothScrollTop,
|
|
61
|
+
cancelScrollToTop: () => lastCancelRef.current?.(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function BackToTopButton() {
|
|
66
|
+
const [show, setShow] = useState(false);
|
|
67
|
+
const isFocusedAnchor = useRef(false);
|
|
68
|
+
const {smoothScrollTop, cancelScrollToTop} = useSmoothScrollToTop();
|
|
69
|
+
useScrollPosition(({scrollY: scrollTop}, lastPosition) => {
|
|
70
|
+
const lastScrollTop = lastPosition?.scrollY; // No lastScrollTop means component is just being mounted.
|
|
71
|
+
// Not really a scroll event from the user, so we ignore it
|
|
72
|
+
|
|
73
|
+
if (!lastScrollTop) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (isFocusedAnchor.current) {
|
|
78
|
+
isFocusedAnchor.current = false;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const isScrollingUp = scrollTop < lastScrollTop;
|
|
83
|
+
|
|
84
|
+
if (!isScrollingUp) {
|
|
85
|
+
cancelScrollToTop();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (scrollTop < threshold) {
|
|
89
|
+
setShow(false);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (isScrollingUp) {
|
|
94
|
+
const documentHeight = document.documentElement.scrollHeight;
|
|
95
|
+
const windowHeight = window.innerHeight;
|
|
96
|
+
|
|
97
|
+
if (scrollTop + windowHeight < documentHeight) {
|
|
98
|
+
setShow(true);
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
setShow(false);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
useLocationChange((locationChangeEvent) => {
|
|
105
|
+
if (locationChangeEvent.location.hash) {
|
|
106
|
+
isFocusedAnchor.current = true;
|
|
107
|
+
setShow(false);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return (
|
|
111
|
+
<button
|
|
112
|
+
aria-label={translate({
|
|
113
|
+
id: 'theme.BackToTopButton.buttonAriaLabel',
|
|
114
|
+
message: 'Scroll back to top',
|
|
115
|
+
description: 'The ARIA label for the back to top button',
|
|
116
|
+
})}
|
|
117
|
+
className={clsx(
|
|
118
|
+
'clean-btn',
|
|
119
|
+
ThemeClassNames.common.backToTopButton,
|
|
120
|
+
styles.backToTopButton,
|
|
121
|
+
{
|
|
122
|
+
[styles.backToTopButtonShow]: show,
|
|
123
|
+
},
|
|
124
|
+
)}
|
|
125
|
+
type="button"
|
|
126
|
+
onClick={() => smoothScrollTop()}
|
|
127
|
+
/>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export default BackToTopButton;
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
.backToTopButton {
|
|
9
|
+
position: fixed;
|
|
10
|
+
right: 1.3rem;
|
|
11
|
+
bottom: 1.3rem;
|
|
12
|
+
border-radius: 50%;
|
|
13
|
+
background-color: var(--ifm-color-emphasis-200);
|
|
14
|
+
width: 3rem;
|
|
15
|
+
height: 3rem;
|
|
16
|
+
z-index: var(--ifm-z-index-fixed);
|
|
17
|
+
box-shadow: var(--ifm-global-shadow-lw);
|
|
18
|
+
transition: all var(--ifm-transition-fast)
|
|
19
|
+
var(--ifm-transition-timing-default);
|
|
20
|
+
opacity: 0;
|
|
21
|
+
transform: scale(0);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.backToTopButton:after {
|
|
25
|
+
content: ' ';
|
|
26
|
+
display: inline-block;
|
|
27
|
+
mask: var(--ifm-menu-link-sublist-icon) 50% / 2rem 2rem no-repeat;
|
|
28
|
+
background-color: var(--ifm-color-emphasis-1000);
|
|
29
|
+
width: 100%;
|
|
30
|
+
height: 100%;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@media (hover: hover) {
|
|
34
|
+
.backToTopButton:hover {
|
|
35
|
+
background-color: var(--ifm-color-emphasis-300);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.backToTopButtonShow {
|
|
40
|
+
opacity: 1;
|
|
41
|
+
transform: scale(1);
|
|
42
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
import React from 'react';
|
|
8
|
+
import Layout from '@theme/Layout';
|
|
9
|
+
import Link from '@docusaurus/Link';
|
|
10
|
+
import {translate} from '@docusaurus/Translate';
|
|
11
|
+
|
|
12
|
+
function Year({year, posts}) {
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
<h3>{year}</h3>
|
|
16
|
+
<ul>
|
|
17
|
+
{posts.map((post) => (
|
|
18
|
+
<li key={post.metadata.date}>
|
|
19
|
+
<Link to={post.metadata.permalink}>
|
|
20
|
+
{post.metadata.formattedDate} - {post.metadata.title}
|
|
21
|
+
</Link>
|
|
22
|
+
</li>
|
|
23
|
+
))}
|
|
24
|
+
</ul>
|
|
25
|
+
</>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function YearsSection({years}) {
|
|
30
|
+
return (
|
|
31
|
+
<section className="margin-vert--lg">
|
|
32
|
+
<div className="container">
|
|
33
|
+
<div className="row">
|
|
34
|
+
{years.map((_props, idx) => (
|
|
35
|
+
<div key={idx} className="col col--4 margin-vert--lg">
|
|
36
|
+
<Year {..._props} />
|
|
37
|
+
</div>
|
|
38
|
+
))}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</section>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function listPostsByYears(blogPosts) {
|
|
46
|
+
const postsByYear = blogPosts.reduceRight((posts, post) => {
|
|
47
|
+
const year = post.metadata.date.split('-')[0];
|
|
48
|
+
const yearPosts = posts.get(year) || [];
|
|
49
|
+
return posts.set(year, [post, ...yearPosts]);
|
|
50
|
+
}, new Map());
|
|
51
|
+
return Array.from(postsByYear, ([year, posts]) => ({
|
|
52
|
+
year,
|
|
53
|
+
posts,
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export default function BlogArchive({archive}) {
|
|
58
|
+
const title = translate({
|
|
59
|
+
id: 'theme.blog.archive.title',
|
|
60
|
+
message: 'Archive',
|
|
61
|
+
description: 'The page & hero title of the blog archive page',
|
|
62
|
+
});
|
|
63
|
+
const description = translate({
|
|
64
|
+
id: 'theme.blog.archive.description',
|
|
65
|
+
message: 'Archive',
|
|
66
|
+
description: 'The page & hero description of the blog archive page',
|
|
67
|
+
});
|
|
68
|
+
const years = listPostsByYears(archive.blogPosts);
|
|
69
|
+
return (
|
|
70
|
+
<Layout title={title} description={description}>
|
|
71
|
+
<header className="hero hero--primary">
|
|
72
|
+
<div className="container">
|
|
73
|
+
<h1 className="hero__title">{title}</h1>
|
|
74
|
+
<p className="hero__subtitle">{description}</p>
|
|
75
|
+
</div>
|
|
76
|
+
</header>
|
|
77
|
+
<main>{years.length > 0 && <YearsSection years={years} />}</main>
|
|
78
|
+
</Layout>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
import React from 'react';
|
|
8
|
+
import clsx from 'clsx';
|
|
9
|
+
import Layout from '@theme/Layout';
|
|
10
|
+
import BlogSidebar from '@theme/BlogSidebar';
|
|
11
|
+
|
|
12
|
+
function BlogLayout(props) {
|
|
13
|
+
const {sidebar, toc, children, ...layoutProps} = props;
|
|
14
|
+
const hasSidebar = sidebar && sidebar.items.length > 0;
|
|
15
|
+
return (
|
|
16
|
+
<Layout {...layoutProps}>
|
|
17
|
+
<div className="container margin-vert--lg">
|
|
18
|
+
<div className="row">
|
|
19
|
+
{hasSidebar && (
|
|
20
|
+
<aside className="col col--3">
|
|
21
|
+
<BlogSidebar sidebar={sidebar} />
|
|
22
|
+
</aside>
|
|
23
|
+
)}
|
|
24
|
+
<main
|
|
25
|
+
className={clsx('col', {
|
|
26
|
+
'col--7': hasSidebar,
|
|
27
|
+
'col--9 col--offset-1': !hasSidebar,
|
|
28
|
+
})}
|
|
29
|
+
itemScope
|
|
30
|
+
itemType="http://schema.org/Blog">
|
|
31
|
+
{children}
|
|
32
|
+
</main>
|
|
33
|
+
{toc && <div className="col col--2">{toc}</div>}
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</Layout>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default BlogLayout;
|
|
@@ -6,10 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import React from 'react';
|
|
8
8
|
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
|
9
|
-
import
|
|
9
|
+
import BlogLayout from '@theme/BlogLayout';
|
|
10
10
|
import BlogPostItem from '@theme/BlogPostItem';
|
|
11
11
|
import BlogListPaginator from '@theme/BlogListPaginator';
|
|
12
|
-
import BlogSidebar from '@theme/BlogSidebar';
|
|
13
12
|
import {ThemeClassNames} from '@docusaurus/theme-common';
|
|
14
13
|
|
|
15
14
|
function BlogListPage(props) {
|
|
@@ -21,7 +20,7 @@ function BlogListPage(props) {
|
|
|
21
20
|
const isBlogOnlyMode = permalink === '/';
|
|
22
21
|
const title = isBlogOnlyMode ? siteTitle : blogTitle;
|
|
23
22
|
return (
|
|
24
|
-
<
|
|
23
|
+
<BlogLayout
|
|
25
24
|
title={title}
|
|
26
25
|
description={blogDescription}
|
|
27
26
|
wrapperClassName={ThemeClassNames.wrapper.blogPages}
|
|
@@ -29,27 +28,20 @@ function BlogListPage(props) {
|
|
|
29
28
|
searchMetadatas={{
|
|
30
29
|
// assign unique search tag to exclude this page from search results!
|
|
31
30
|
tag: 'blog_posts_list',
|
|
32
|
-
}}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
</BlogPostItem>
|
|
47
|
-
))}
|
|
48
|
-
<BlogListPaginator metadata={metadata} />
|
|
49
|
-
</main>
|
|
50
|
-
</div>
|
|
51
|
-
</div>
|
|
52
|
-
</Layout>
|
|
31
|
+
}}
|
|
32
|
+
sidebar={sidebar}>
|
|
33
|
+
{items.map(({content: BlogPostContent}) => (
|
|
34
|
+
<BlogPostItem
|
|
35
|
+
key={BlogPostContent.metadata.permalink}
|
|
36
|
+
frontMatter={BlogPostContent.frontMatter}
|
|
37
|
+
assets={BlogPostContent.assets}
|
|
38
|
+
metadata={BlogPostContent.metadata}
|
|
39
|
+
truncated={BlogPostContent.metadata.truncated}>
|
|
40
|
+
<BlogPostContent />
|
|
41
|
+
</BlogPostItem>
|
|
42
|
+
))}
|
|
43
|
+
<BlogListPaginator metadata={metadata} />
|
|
44
|
+
</BlogLayout>
|
|
53
45
|
);
|
|
54
46
|
}
|
|
55
47
|
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
import React from 'react';
|
|
8
|
+
import Link from '@docusaurus/Link';
|
|
9
|
+
import styles from './styles.module.css';
|
|
10
|
+
|
|
11
|
+
function BlogPostAuthor({author}) {
|
|
12
|
+
const {name, title, url, imageURL} = author;
|
|
13
|
+
return (
|
|
14
|
+
<div className="avatar margin-bottom--sm">
|
|
15
|
+
{imageURL && (
|
|
16
|
+
<Link className="avatar__photo-link avatar__photo" href={url}>
|
|
17
|
+
<img className={styles.image} src={imageURL} alt={name} />
|
|
18
|
+
</Link>
|
|
19
|
+
)}
|
|
20
|
+
|
|
21
|
+
{
|
|
22
|
+
// Note: only legacy author frontmatter allow empty name (not frontMatter.authors)
|
|
23
|
+
name && (
|
|
24
|
+
<div
|
|
25
|
+
className="avatar__intro"
|
|
26
|
+
itemProp="author"
|
|
27
|
+
itemScope
|
|
28
|
+
itemType="https://schema.org/Person">
|
|
29
|
+
<div className="avatar__name">
|
|
30
|
+
<Link href={url} itemProp="url">
|
|
31
|
+
<span itemProp="name">{name}</span>
|
|
32
|
+
</Link>
|
|
33
|
+
</div>
|
|
34
|
+
{title && (
|
|
35
|
+
<small className="avatar__subtitle" itemProp="description">
|
|
36
|
+
{title}
|
|
37
|
+
</small>
|
|
38
|
+
)}
|
|
39
|
+
</div>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
</div>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default BlogPostAuthor;
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
.image {
|
|
9
|
+
width: 100%;
|
|
10
|
+
height: 100%;
|
|
11
|
+
object-fit: cover;
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
import React from 'react';
|
|
8
|
+
import clsx from 'clsx';
|
|
9
|
+
import BlogPostAuthor from '@theme/BlogPostAuthor';
|
|
10
|
+
import styles from './styles.module.css'; // Component responsible for the authors layout
|
|
11
|
+
|
|
12
|
+
export default function BlogPostAuthors({authors, assets}) {
|
|
13
|
+
const authorsCount = authors.length;
|
|
14
|
+
|
|
15
|
+
if (authorsCount === 0) {
|
|
16
|
+
return <></>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div className="row margin-top--md margin-bottom--sm">
|
|
21
|
+
{authors.map((author, idx) => (
|
|
22
|
+
<div className={clsx('col col--6', styles.authorCol)} key={idx}>
|
|
23
|
+
<BlogPostAuthor
|
|
24
|
+
author={{
|
|
25
|
+
...author,
|
|
26
|
+
// Handle author images using relative paths
|
|
27
|
+
imageURL: assets.authorsImageUrls[idx] ?? author.imageURL,
|
|
28
|
+
}}
|
|
29
|
+
/>
|
|
30
|
+
</div>
|
|
31
|
+
))}
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
.authorCol {
|
|
9
|
+
max-width: inherit !important;
|
|
10
|
+
flex-grow: 1 !important;
|
|
11
|
+
}
|
|
@@ -9,11 +9,13 @@ import clsx from 'clsx';
|
|
|
9
9
|
import {MDXProvider} from '@mdx-js/react';
|
|
10
10
|
import Translate, {translate} from '@docusaurus/Translate';
|
|
11
11
|
import Link from '@docusaurus/Link';
|
|
12
|
+
import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
|
|
12
13
|
import {usePluralForm} from '@docusaurus/theme-common';
|
|
13
14
|
import MDXComponents from '@theme/MDXComponents';
|
|
14
|
-
import Seo from '@theme/Seo';
|
|
15
15
|
import EditThisPage from '@theme/EditThisPage';
|
|
16
|
-
import styles from './styles.module.css';
|
|
16
|
+
import styles from './styles.module.css';
|
|
17
|
+
import TagsListInline from '@theme/TagsListInline';
|
|
18
|
+
import BlogPostAuthors from '@theme/BlogPostAuthors'; // Very simple pluralization: probably good enough for now
|
|
17
19
|
|
|
18
20
|
function useReadingTimePlural() {
|
|
19
21
|
const {selectMessage} = usePluralForm();
|
|
@@ -38,9 +40,11 @@ function useReadingTimePlural() {
|
|
|
38
40
|
|
|
39
41
|
function BlogPostItem(props) {
|
|
40
42
|
const readingTimePlural = useReadingTimePlural();
|
|
43
|
+
const {withBaseUrl} = useBaseUrlUtils();
|
|
41
44
|
const {
|
|
42
45
|
children,
|
|
43
46
|
frontMatter,
|
|
47
|
+
assets,
|
|
44
48
|
metadata,
|
|
45
49
|
truncated,
|
|
46
50
|
isBlogPostPage = false,
|
|
@@ -53,115 +57,104 @@ function BlogPostItem(props) {
|
|
|
53
57
|
readingTime,
|
|
54
58
|
title,
|
|
55
59
|
editUrl,
|
|
60
|
+
authors,
|
|
56
61
|
} = metadata;
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const authorImageURL =
|
|
61
|
-
frontMatter.author_image_url || frontMatter.authorImageURL;
|
|
62
|
+
const image = assets.image ?? frontMatter.image;
|
|
63
|
+
const truncatedPost = !isBlogPostPage && truncated;
|
|
64
|
+
const tagsExists = tags.length > 0;
|
|
62
65
|
|
|
63
66
|
const renderPostHeader = () => {
|
|
64
67
|
const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
|
|
65
68
|
return (
|
|
66
69
|
<header>
|
|
67
|
-
<TitleHeading className={styles.blogPostTitle}>
|
|
68
|
-
{isBlogPostPage ?
|
|
70
|
+
<TitleHeading className={styles.blogPostTitle} itemProp="headline">
|
|
71
|
+
{isBlogPostPage ? (
|
|
72
|
+
title
|
|
73
|
+
) : (
|
|
74
|
+
<Link itemProp="url" to={permalink}>
|
|
75
|
+
{title}
|
|
76
|
+
</Link>
|
|
77
|
+
)}
|
|
69
78
|
</TitleHeading>
|
|
70
79
|
<div className={clsx(styles.blogPostData, 'margin-vert--md')}>
|
|
71
|
-
<time dateTime={date}>
|
|
80
|
+
<time dateTime={date} itemProp="datePublished">
|
|
81
|
+
{formattedDate}
|
|
82
|
+
</time>
|
|
72
83
|
|
|
73
|
-
{readingTime && (
|
|
84
|
+
{typeof readingTime !== 'undefined' && (
|
|
74
85
|
<>
|
|
75
86
|
{' · '}
|
|
76
87
|
{readingTimePlural(readingTime)}
|
|
77
88
|
</>
|
|
78
89
|
)}
|
|
79
90
|
</div>
|
|
80
|
-
<
|
|
81
|
-
{authorImageURL && (
|
|
82
|
-
<Link className="avatar__photo-link avatar__photo" href={authorURL}>
|
|
83
|
-
<img src={authorImageURL} alt={author} />
|
|
84
|
-
</Link>
|
|
85
|
-
)}
|
|
86
|
-
<div className="avatar__intro">
|
|
87
|
-
{author && (
|
|
88
|
-
<>
|
|
89
|
-
<div className="avatar__name">
|
|
90
|
-
<Link href={authorURL}>{author}</Link>
|
|
91
|
-
</div>
|
|
92
|
-
<small className="avatar__subtitle">{authorTitle}</small>
|
|
93
|
-
</>
|
|
94
|
-
)}
|
|
95
|
-
</div>
|
|
96
|
-
</div>
|
|
91
|
+
<BlogPostAuthors authors={authors} assets={assets} />
|
|
97
92
|
</header>
|
|
98
93
|
);
|
|
99
94
|
};
|
|
100
95
|
|
|
101
96
|
return (
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
/>
|
|
97
|
+
<article
|
|
98
|
+
className={!isBlogPostPage ? 'margin-bottom--xl' : undefined}
|
|
99
|
+
itemProp="blogPost"
|
|
100
|
+
itemScope
|
|
101
|
+
itemType="http://schema.org/BlogPosting">
|
|
102
|
+
{renderPostHeader()}
|
|
109
103
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
104
|
+
{image && (
|
|
105
|
+
<meta
|
|
106
|
+
itemProp="image"
|
|
107
|
+
content={withBaseUrl(image, {
|
|
108
|
+
absolute: true,
|
|
109
|
+
})}
|
|
110
|
+
/>
|
|
111
|
+
)}
|
|
112
|
+
|
|
113
|
+
<div className="markdown" itemProp="articleBody">
|
|
114
|
+
<MDXProvider components={MDXComponents}>{children}</MDXProvider>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
{(tagsExists || truncated) && (
|
|
118
|
+
<footer
|
|
119
|
+
className={clsx('row docusaurus-mt-lg', {
|
|
120
|
+
[styles.blogPostDetailsFull]: isBlogPostPage,
|
|
121
|
+
})}>
|
|
122
|
+
{tagsExists && (
|
|
123
|
+
<div
|
|
124
|
+
className={clsx('col', {
|
|
125
|
+
'col--9': truncatedPost,
|
|
126
|
+
})}>
|
|
127
|
+
<TagsListInline tags={tags} />
|
|
128
|
+
</div>
|
|
129
|
+
)}
|
|
130
|
+
|
|
131
|
+
{isBlogPostPage && editUrl && (
|
|
132
|
+
<div className="col margin-top--sm">
|
|
133
|
+
<EditThisPage editUrl={editUrl} />
|
|
134
|
+
</div>
|
|
135
|
+
)}
|
|
136
|
+
|
|
137
|
+
{truncatedPost && (
|
|
138
|
+
<div
|
|
139
|
+
className={clsx('col text--right', {
|
|
140
|
+
'col--3': tagsExists,
|
|
141
|
+
})}>
|
|
142
|
+
<Link
|
|
143
|
+
to={metadata.permalink}
|
|
144
|
+
aria-label={`Read more about ${title}`}>
|
|
122
145
|
<b>
|
|
123
146
|
<Translate
|
|
124
|
-
id="theme.
|
|
125
|
-
description="The label
|
|
126
|
-
|
|
147
|
+
id="theme.blog.post.readMore"
|
|
148
|
+
description="The label used in blog post item excerpts to link to full blog posts">
|
|
149
|
+
Read More
|
|
127
150
|
</Translate>
|
|
128
151
|
</b>
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
</Link>
|
|
136
|
-
))}
|
|
137
|
-
</div>
|
|
138
|
-
)}
|
|
139
|
-
|
|
140
|
-
{isBlogPostPage && editUrl && (
|
|
141
|
-
<div className="col margin-top--sm">
|
|
142
|
-
<EditThisPage editUrl={editUrl} />
|
|
143
|
-
</div>
|
|
144
|
-
)}
|
|
145
|
-
|
|
146
|
-
{!isBlogPostPage && truncated && (
|
|
147
|
-
<div className="col text--right">
|
|
148
|
-
<Link
|
|
149
|
-
to={metadata.permalink}
|
|
150
|
-
aria-label={`Read more about ${title}`}>
|
|
151
|
-
<b>
|
|
152
|
-
<Translate
|
|
153
|
-
id="theme.blog.post.readMore"
|
|
154
|
-
description="The label used in blog post item excerpts to link to full blog posts">
|
|
155
|
-
Read More
|
|
156
|
-
</Translate>
|
|
157
|
-
</b>
|
|
158
|
-
</Link>
|
|
159
|
-
</div>
|
|
160
|
-
)}
|
|
161
|
-
</footer>
|
|
162
|
-
)}
|
|
163
|
-
</article>
|
|
164
|
-
</>
|
|
152
|
+
</Link>
|
|
153
|
+
</div>
|
|
154
|
+
)}
|
|
155
|
+
</footer>
|
|
156
|
+
)}
|
|
157
|
+
</article>
|
|
165
158
|
);
|
|
166
159
|
}
|
|
167
160
|
|