@docusaurus/theme-classic 2.0.0-beta.21 → 2.0.0-beta.22

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.
Files changed (240) hide show
  1. package/lib/getSwizzleConfig.js +5 -5
  2. package/lib/index.js +4 -2
  3. package/lib/theme/Admonition/index.d.ts +1 -1
  4. package/lib/theme/Admonition/index.js +139 -57
  5. package/lib/{admonitions.css → theme/Admonition/styles.module.css} +14 -15
  6. package/lib/theme/AnnouncementBar/index.js +3 -2
  7. package/lib/theme/BackToTopButton/index.js +2 -1
  8. package/lib/theme/BlogListPage/index.js +2 -11
  9. package/lib/theme/BlogPostItem/Container/index.d.ts +9 -0
  10. package/lib/theme/BlogPostItem/Container/index.js +26 -0
  11. package/lib/theme/BlogPostItem/Content/index.d.ts +9 -0
  12. package/lib/theme/BlogPostItem/Content/index.js +23 -0
  13. package/lib/theme/BlogPostItem/Footer/ReadMoreLink/index.d.ts +9 -0
  14. package/lib/theme/BlogPostItem/Footer/ReadMoreLink/index.js +38 -0
  15. package/lib/theme/BlogPostItem/Footer/index.d.ts +8 -0
  16. package/lib/theme/BlogPostItem/Footer/index.js +52 -0
  17. package/lib/theme/BlogPostItem/Footer/styles.module.css +10 -0
  18. package/lib/theme/BlogPostItem/Header/Author/index.d.ts +9 -0
  19. package/lib/theme/{BlogPostAuthor → BlogPostItem/Header/Author}/index.js +3 -2
  20. package/lib/theme/BlogPostItem/Header/Authors/index.d.ts +9 -0
  21. package/{src/theme/BlogPostAuthors/index.tsx → lib/theme/BlogPostItem/Header/Authors/index.js} +9 -10
  22. package/lib/theme/{BlogPostAuthors → BlogPostItem/Header/Authors}/styles.module.css +0 -0
  23. package/lib/theme/{BlogPostAuthors → BlogPostItem/Header/Info}/index.d.ts +2 -2
  24. package/lib/theme/BlogPostItem/Header/Info/index.js +60 -0
  25. package/lib/theme/BlogPostItem/Header/Info/styles.module.css +10 -0
  26. package/lib/theme/BlogPostItem/Header/Title/index.d.ts +9 -0
  27. package/lib/theme/BlogPostItem/Header/Title/index.js +27 -0
  28. package/{src/theme/BlogPostItem → lib/theme/BlogPostItem/Header/Title}/styles.module.css +2 -10
  29. package/lib/theme/BlogPostItem/Header/index.d.ts +8 -0
  30. package/lib/theme/BlogPostItem/Header/index.js +19 -0
  31. package/lib/theme/BlogPostItem/index.d.ts +1 -1
  32. package/lib/theme/BlogPostItem/index.js +16 -142
  33. package/lib/theme/BlogPostItems/index.d.ts +9 -0
  34. package/lib/theme/BlogPostItems/index.js +27 -0
  35. package/lib/theme/BlogPostPage/Metadata/index.d.ts +8 -0
  36. package/lib/theme/BlogPostPage/Metadata/index.js +41 -0
  37. package/lib/theme/BlogPostPage/index.js +21 -60
  38. package/lib/theme/BlogTagsListPage/index.js +1 -1
  39. package/lib/theme/BlogTagsPostsPage/index.d.ts +1 -1
  40. package/lib/theme/BlogTagsPostsPage/index.js +36 -30
  41. package/lib/theme/CodeBlock/Container/index.js +2 -5
  42. package/lib/theme/CodeBlock/Content/String.js +2 -3
  43. package/lib/theme/CodeBlock/CopyButton/index.js +1 -0
  44. package/lib/theme/CodeBlock/Line/styles.module.css +7 -7
  45. package/lib/theme/ColorModeToggle/index.js +2 -2
  46. package/lib/theme/DocBreadcrumbs/index.js +3 -3
  47. package/lib/theme/DocCard/index.js +4 -1
  48. package/lib/theme/DocCardList/index.js +2 -2
  49. package/lib/theme/DocItem/Content/index.d.ts +9 -0
  50. package/lib/theme/DocItem/Content/index.js +44 -0
  51. package/lib/theme/DocItem/Footer/index.d.ts +8 -0
  52. package/lib/theme/{DocItemFooter → DocItem/Footer}/index.js +3 -3
  53. package/lib/theme/{DocItemFooter → DocItem/Footer}/styles.module.css +0 -0
  54. package/lib/theme/{BlogPostAuthor → DocItem/Layout}/index.d.ts +2 -2
  55. package/lib/theme/DocItem/Layout/index.js +59 -0
  56. package/lib/theme/DocItem/Layout/styles.module.css +17 -0
  57. package/lib/theme/DocItem/Metadata/index.d.ts +8 -0
  58. package/lib/theme/DocItem/Metadata/index.js +20 -0
  59. package/lib/theme/{DocItemFooter → DocItem/Paginator}/index.d.ts +5 -3
  60. package/lib/theme/DocItem/Paginator/index.js +17 -0
  61. package/lib/theme/DocItem/TOC/Desktop/index.d.ts +8 -0
  62. package/lib/theme/DocItem/TOC/Desktop/index.js +21 -0
  63. package/lib/theme/DocItem/TOC/Mobile/index.d.ts +8 -0
  64. package/lib/theme/DocItem/TOC/Mobile/index.js +23 -0
  65. package/lib/theme/DocItem/{styles.module.css → TOC/Mobile/styles.module.css} +0 -9
  66. package/lib/theme/DocItem/index.js +13 -106
  67. package/lib/theme/DocPage/Layout/Main/index.js +1 -1
  68. package/lib/theme/DocPage/Layout/Sidebar/ExpandButton/index.js +1 -1
  69. package/lib/theme/DocPage/Layout/Sidebar/index.js +2 -1
  70. package/lib/theme/DocPage/Layout/index.js +1 -1
  71. package/lib/theme/DocPage/index.js +2 -3
  72. package/lib/theme/DocSidebar/Desktop/CollapseButton/index.js +1 -1
  73. package/lib/theme/DocSidebar/Desktop/Content/index.js +2 -2
  74. package/lib/theme/DocSidebar/Mobile/index.js +1 -1
  75. package/lib/theme/DocSidebarItem/Category/index.js +6 -4
  76. package/lib/theme/DocSidebarItem/Link/index.js +3 -2
  77. package/lib/theme/DocSidebarItems/index.js +1 -1
  78. package/lib/theme/DocVersionBadge/index.js +2 -1
  79. package/lib/theme/DocVersionBanner/index.js +2 -2
  80. package/lib/theme/EditThisPage/index.js +1 -1
  81. package/lib/theme/Footer/LinkItem/index.js +1 -1
  82. package/lib/theme/Footer/Logo/index.js +7 -2
  83. package/lib/theme/{IconArrow → Icon/Arrow}/index.d.ts +1 -1
  84. package/lib/theme/{IconArrow → Icon/Arrow}/index.js +0 -0
  85. package/lib/theme/{IconClose → Icon/Close}/index.d.ts +1 -1
  86. package/lib/theme/{IconClose → Icon/Close}/index.js +0 -0
  87. package/lib/theme/{IconDarkMode → Icon/DarkMode}/index.d.ts +1 -1
  88. package/lib/theme/{IconDarkMode → Icon/DarkMode}/index.js +0 -0
  89. package/lib/theme/{IconEdit → Icon/Edit}/index.d.ts +1 -1
  90. package/lib/theme/{IconEdit → Icon/Edit}/index.js +0 -0
  91. package/lib/theme/{IconEdit → Icon/Edit}/styles.module.css +0 -0
  92. package/lib/theme/{IconExternalLink → Icon/ExternalLink}/index.d.ts +1 -1
  93. package/lib/theme/{IconExternalLink → Icon/ExternalLink}/index.js +0 -0
  94. package/lib/theme/{IconExternalLink → Icon/ExternalLink}/styles.module.css +0 -0
  95. package/lib/theme/{IconHome → Icon/Home}/index.d.ts +1 -1
  96. package/lib/theme/{IconHome → Icon/Home}/index.js +0 -0
  97. package/lib/theme/{IconLanguage → Icon/Language}/index.d.ts +1 -1
  98. package/lib/theme/{IconLanguage → Icon/Language}/index.js +0 -0
  99. package/lib/theme/{IconLightMode → Icon/LightMode}/index.d.ts +1 -1
  100. package/lib/theme/{IconLightMode → Icon/LightMode}/index.js +0 -0
  101. package/lib/theme/{IconMenu → Icon/Menu}/index.d.ts +1 -1
  102. package/lib/theme/{IconMenu → Icon/Menu}/index.js +0 -0
  103. package/lib/theme/Layout/Provider/index.d.ts +9 -0
  104. package/lib/theme/Layout/Provider/index.js +29 -0
  105. package/lib/theme/Layout/index.d.ts +0 -1
  106. package/lib/theme/Layout/index.js +12 -10
  107. package/{src/theme/Layout/styles.css → lib/theme/Layout/styles.module.css} +10 -12
  108. package/lib/theme/Logo/index.js +35 -17
  109. package/lib/theme/MDXComponents/Code.js +1 -1
  110. package/lib/theme/MDXComponents/index.js +2 -0
  111. package/lib/theme/MDXPage/index.js +6 -4
  112. package/lib/theme/Navbar/Content/index.js +2 -2
  113. package/lib/theme/Navbar/Layout/index.js +2 -2
  114. package/lib/theme/Navbar/MobileSidebar/Header/index.js +2 -2
  115. package/lib/theme/Navbar/MobileSidebar/Layout/index.js +1 -1
  116. package/lib/theme/Navbar/MobileSidebar/PrimaryMenu/index.js +2 -1
  117. package/lib/theme/Navbar/MobileSidebar/SecondaryMenu/index.js +2 -1
  118. package/lib/theme/Navbar/MobileSidebar/Toggle/index.js +2 -2
  119. package/lib/theme/Navbar/MobileSidebar/index.js +1 -1
  120. package/lib/theme/NavbarItem/DocNavbarItem.js +1 -1
  121. package/lib/theme/NavbarItem/DocSidebarNavbarItem.js +1 -1
  122. package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +2 -4
  123. package/lib/theme/NavbarItem/DocsVersionNavbarItem.js +1 -1
  124. package/lib/theme/NavbarItem/DropdownNavbarItem.js +2 -3
  125. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/index.js +2 -2
  126. package/lib/theme/NavbarItem/NavbarNavLink.js +1 -1
  127. package/lib/theme/SiteMetadata/index.js +2 -3
  128. package/lib/theme/SkipToContent/index.js +1 -1
  129. package/lib/theme/TOCItems/index.js +2 -2
  130. package/lib/theme/Tabs/index.js +2 -2
  131. package/lib/validateThemeConfig.js +13 -18
  132. package/package.json +19 -15
  133. package/src/getSwizzleConfig.ts +5 -5
  134. package/src/index.ts +4 -2
  135. package/src/theme/Admonition/index.tsx +161 -58
  136. package/src/{admonitions.css → theme/Admonition/styles.module.css} +14 -15
  137. package/src/theme/AnnouncementBar/index.tsx +3 -2
  138. package/src/theme/BackToTopButton/index.tsx +2 -1
  139. package/src/theme/BlogListPage/index.tsx +2 -11
  140. package/src/theme/BlogPostItem/Container/index.tsx +32 -0
  141. package/src/theme/BlogPostItem/Content/index.tsx +29 -0
  142. package/src/theme/BlogPostItem/Footer/ReadMoreLink/index.tsx +44 -0
  143. package/src/theme/BlogPostItem/Footer/index.tsx +60 -0
  144. package/src/theme/BlogPostItem/Footer/styles.module.css +10 -0
  145. package/src/theme/{BlogPostAuthor → BlogPostItem/Header/Author}/index.tsx +8 -3
  146. package/{lib/theme/BlogPostAuthors/index.js → src/theme/BlogPostItem/Header/Authors/index.tsx} +14 -3
  147. package/src/theme/{BlogPostAuthors → BlogPostItem/Header/Authors}/styles.module.css +0 -0
  148. package/src/theme/BlogPostItem/Header/Info/index.tsx +71 -0
  149. package/src/theme/BlogPostItem/Header/Info/styles.module.css +10 -0
  150. package/src/theme/BlogPostItem/Header/Title/index.tsx +33 -0
  151. package/{lib/theme/BlogPostItem → src/theme/BlogPostItem/Header/Title}/styles.module.css +2 -10
  152. package/src/theme/BlogPostItem/Header/index.tsx +21 -0
  153. package/src/theme/BlogPostItem/index.tsx +19 -145
  154. package/src/theme/BlogPostItems/index.tsx +30 -0
  155. package/src/theme/BlogPostPage/Metadata/index.tsx +44 -0
  156. package/src/theme/BlogPostPage/index.tsx +29 -62
  157. package/src/theme/BlogTagsListPage/index.tsx +1 -1
  158. package/src/theme/BlogTagsPostsPage/index.tsx +42 -35
  159. package/src/theme/CodeBlock/Container/index.tsx +3 -6
  160. package/src/theme/CodeBlock/Content/String.tsx +2 -3
  161. package/src/theme/CodeBlock/CopyButton/index.tsx +1 -0
  162. package/src/theme/CodeBlock/Line/styles.module.css +7 -7
  163. package/src/theme/ColorModeToggle/index.tsx +2 -2
  164. package/src/theme/DocBreadcrumbs/index.tsx +3 -3
  165. package/src/theme/DocCard/index.tsx +4 -1
  166. package/src/theme/DocCardList/index.tsx +2 -2
  167. package/src/theme/DocItem/Content/index.tsx +48 -0
  168. package/src/theme/{DocItemFooter → DocItem/Footer}/index.tsx +4 -5
  169. package/src/theme/{DocItemFooter → DocItem/Footer}/styles.module.css +0 -0
  170. package/src/theme/DocItem/Layout/index.tsx +68 -0
  171. package/src/theme/DocItem/Layout/styles.module.css +17 -0
  172. package/src/theme/DocItem/Metadata/index.tsx +22 -0
  173. package/src/theme/DocItem/Paginator/index.tsx +19 -0
  174. package/src/theme/DocItem/TOC/Desktop/index.tsx +24 -0
  175. package/src/theme/DocItem/TOC/Mobile/index.tsx +27 -0
  176. package/src/theme/DocItem/{styles.module.css → TOC/Mobile/styles.module.css} +0 -9
  177. package/src/theme/DocItem/index.tsx +13 -115
  178. package/src/theme/DocPage/Layout/Main/index.tsx +1 -1
  179. package/src/theme/DocPage/Layout/Sidebar/ExpandButton/index.tsx +1 -1
  180. package/src/theme/DocPage/Layout/Sidebar/index.tsx +2 -1
  181. package/src/theme/DocPage/Layout/index.tsx +1 -1
  182. package/src/theme/DocPage/index.tsx +2 -3
  183. package/src/theme/DocPaginator/index.tsx +0 -1
  184. package/src/theme/DocSidebar/Desktop/CollapseButton/index.tsx +1 -1
  185. package/src/theme/DocSidebar/Desktop/Content/index.tsx +2 -2
  186. package/src/theme/DocSidebar/Mobile/index.tsx +1 -1
  187. package/src/theme/DocSidebarItem/Category/index.tsx +6 -4
  188. package/src/theme/DocSidebarItem/Link/index.tsx +3 -2
  189. package/src/theme/DocSidebarItems/index.tsx +1 -1
  190. package/src/theme/DocVersionBadge/index.tsx +2 -1
  191. package/src/theme/DocVersionBanner/index.tsx +2 -3
  192. package/src/theme/EditThisPage/index.tsx +1 -1
  193. package/src/theme/Footer/LinkItem/index.tsx +1 -1
  194. package/src/theme/Footer/Logo/index.tsx +7 -2
  195. package/src/theme/{IconArrow → Icon/Arrow}/index.tsx +1 -1
  196. package/src/theme/{IconClose → Icon/Close}/index.tsx +1 -1
  197. package/src/theme/{IconDarkMode → Icon/DarkMode}/index.tsx +1 -1
  198. package/src/theme/{IconEdit → Icon/Edit}/index.tsx +1 -1
  199. package/src/theme/{IconEdit → Icon/Edit}/styles.module.css +0 -0
  200. package/src/theme/{IconExternalLink → Icon/ExternalLink}/index.tsx +1 -1
  201. package/src/theme/{IconExternalLink → Icon/ExternalLink}/styles.module.css +0 -0
  202. package/src/theme/{IconHome → Icon/Home}/index.tsx +1 -1
  203. package/src/theme/{IconLanguage → Icon/Language}/index.tsx +1 -1
  204. package/src/theme/{IconLightMode → Icon/LightMode}/index.tsx +1 -1
  205. package/src/theme/{IconMenu → Icon/Menu}/index.tsx +1 -1
  206. package/src/theme/Layout/Provider/index.tsx +33 -0
  207. package/src/theme/Layout/index.tsx +12 -10
  208. package/{lib/theme/Layout/styles.css → src/theme/Layout/styles.module.css} +10 -12
  209. package/src/theme/Logo/index.tsx +49 -19
  210. package/src/theme/MDXComponents/Code.tsx +5 -2
  211. package/src/theme/MDXComponents/Details.tsx +2 -1
  212. package/src/theme/MDXComponents/Head.tsx +3 -5
  213. package/src/theme/MDXComponents/Pre.tsx +2 -1
  214. package/src/theme/MDXComponents/index.tsx +2 -0
  215. package/src/theme/MDXPage/index.tsx +6 -4
  216. package/src/theme/Navbar/Content/index.tsx +2 -2
  217. package/src/theme/Navbar/Layout/index.tsx +2 -2
  218. package/src/theme/Navbar/MobileSidebar/Header/index.tsx +2 -2
  219. package/src/theme/Navbar/MobileSidebar/Layout/index.tsx +1 -1
  220. package/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx +2 -1
  221. package/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx +2 -1
  222. package/src/theme/Navbar/MobileSidebar/Toggle/index.tsx +2 -2
  223. package/src/theme/Navbar/MobileSidebar/index.tsx +1 -1
  224. package/src/theme/NavbarItem/DocNavbarItem.tsx +1 -1
  225. package/src/theme/NavbarItem/DocSidebarNavbarItem.tsx +1 -1
  226. package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +2 -4
  227. package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +1 -1
  228. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +2 -3
  229. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx +2 -2
  230. package/src/theme/NavbarItem/NavbarNavLink.tsx +1 -1
  231. package/src/theme/NavbarItem/index.tsx +1 -1
  232. package/src/theme/SiteMetadata/index.tsx +2 -3
  233. package/src/theme/SkipToContent/index.tsx +1 -1
  234. package/src/theme/TOCItems/index.tsx +3 -3
  235. package/src/theme/Tabs/index.tsx +2 -2
  236. package/src/theme-classic.d.ts +128 -36
  237. package/src/validateThemeConfig.ts +14 -18
  238. package/lib/theme/LayoutProviders/index.d.ts +0 -9
  239. package/lib/theme/LayoutProviders/index.js +0 -33
  240. package/src/theme/LayoutProviders/index.tsx +0 -36
@@ -0,0 +1,71 @@
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 React from 'react';
9
+ import clsx from 'clsx';
10
+ import {translate} from '@docusaurus/Translate';
11
+ import {usePluralForm} from '@docusaurus/theme-common';
12
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
13
+ import type {Props} from '@theme/BlogPostItem/Header/Info';
14
+
15
+ import styles from './styles.module.css';
16
+
17
+ // Very simple pluralization: probably good enough for now
18
+ function useReadingTimePlural() {
19
+ const {selectMessage} = usePluralForm();
20
+ return (readingTimeFloat: number) => {
21
+ const readingTime = Math.ceil(readingTimeFloat);
22
+ return selectMessage(
23
+ readingTime,
24
+ translate(
25
+ {
26
+ id: 'theme.blog.post.readingTime.plurals',
27
+ description:
28
+ 'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',
29
+ message: 'One min read|{readingTime} min read',
30
+ },
31
+ {readingTime},
32
+ ),
33
+ );
34
+ };
35
+ }
36
+
37
+ function ReadingTime({readingTime}: {readingTime: number}) {
38
+ const readingTimePlural = useReadingTimePlural();
39
+ return <>{readingTimePlural(readingTime)}</>;
40
+ }
41
+
42
+ function Date({date, formattedDate}: {date: string; formattedDate: string}) {
43
+ return (
44
+ <time dateTime={date} itemProp="datePublished">
45
+ {formattedDate}
46
+ </time>
47
+ );
48
+ }
49
+
50
+ function Spacer() {
51
+ return <>{' · '}</>;
52
+ }
53
+
54
+ export default function BlogPostItemHeaderInfo({
55
+ className,
56
+ }: Props): JSX.Element {
57
+ const {metadata} = useBlogPost();
58
+ const {date, formattedDate, readingTime} = metadata;
59
+
60
+ return (
61
+ <div className={clsx(styles.container, 'margin-vert--md', className)}>
62
+ <Date date={date} formattedDate={formattedDate} />
63
+ {typeof readingTime !== 'undefined' && (
64
+ <>
65
+ <Spacer />
66
+ <ReadingTime readingTime={readingTime} />
67
+ </>
68
+ )}
69
+ </div>
70
+ );
71
+ }
@@ -0,0 +1,10 @@
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
+ .container {
9
+ font-size: 0.9rem;
10
+ }
@@ -0,0 +1,33 @@
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 React from 'react';
9
+ import clsx from 'clsx';
10
+ import Link from '@docusaurus/Link';
11
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
12
+ import type {Props} from '@theme/BlogPostItem/Header/Title';
13
+
14
+ import styles from './styles.module.css';
15
+
16
+ export default function BlogPostItemHeaderTitle({
17
+ className,
18
+ }: Props): JSX.Element {
19
+ const {metadata, isBlogPostPage} = useBlogPost();
20
+ const {permalink, title} = metadata;
21
+ const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
22
+ return (
23
+ <TitleHeading className={clsx(styles.title, className)} itemProp="headline">
24
+ {isBlogPostPage ? (
25
+ title
26
+ ) : (
27
+ <Link itemProp="url" to={permalink}>
28
+ {title}
29
+ </Link>
30
+ )}
31
+ </TitleHeading>
32
+ );
33
+ }
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- .blogPostTitle {
8
+ .title {
9
9
  font-size: 3rem;
10
10
  }
11
11
 
@@ -13,15 +13,7 @@
13
13
  Blog post title should be smaller on smaller devices
14
14
  **/
15
15
  @media (max-width: 576px) {
16
- .blogPostTitle {
16
+ .title {
17
17
  font-size: 2rem;
18
18
  }
19
19
  }
20
-
21
- .blogPostData {
22
- font-size: 0.9rem;
23
- }
24
-
25
- .blogPostDetailsFull {
26
- flex-direction: column;
27
- }
@@ -0,0 +1,21 @@
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 React from 'react';
9
+ import BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title';
10
+ import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info';
11
+ import BlogPostItemHeaderAuthors from '@theme/BlogPostItem/Header/Authors';
12
+
13
+ export default function BlogPostItemHeader(): JSX.Element {
14
+ return (
15
+ <header>
16
+ <BlogPostItemHeaderTitle />
17
+ <BlogPostItemHeaderInfo />
18
+ <BlogPostItemHeaderAuthors />
19
+ </header>
20
+ );
21
+ }
@@ -7,155 +7,29 @@
7
7
 
8
8
  import React from 'react';
9
9
  import clsx from 'clsx';
10
- import Translate, {translate} from '@docusaurus/Translate';
11
- import Link from '@docusaurus/Link';
12
- import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
13
- import {usePluralForm} from '@docusaurus/theme-common';
14
- import {blogPostContainerID} from '@docusaurus/utils-common';
15
- import MDXContent from '@theme/MDXContent';
16
- import EditThisPage from '@theme/EditThisPage';
17
- import TagsListInline from '@theme/TagsListInline';
18
- import BlogPostAuthors from '@theme/BlogPostAuthors';
10
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
11
+ import BlogPostItemContainer from '@theme/BlogPostItem/Container';
12
+ import BlogPostItemHeader from '@theme/BlogPostItem/Header';
13
+ import BlogPostItemContent from '@theme/BlogPostItem/Content';
14
+ import BlogPostItemFooter from '@theme/BlogPostItem/Footer';
19
15
  import type {Props} from '@theme/BlogPostItem';
20
16
 
21
- import styles from './styles.module.css';
22
-
23
- // Very simple pluralization: probably good enough for now
24
- function useReadingTimePlural() {
25
- const {selectMessage} = usePluralForm();
26
- return (readingTimeFloat: number) => {
27
- const readingTime = Math.ceil(readingTimeFloat);
28
- return selectMessage(
29
- readingTime,
30
- translate(
31
- {
32
- id: 'theme.blog.post.readingTime.plurals',
33
- description:
34
- 'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',
35
- message: 'One min read|{readingTime} min read',
36
- },
37
- {readingTime},
38
- ),
39
- );
40
- };
17
+ // apply a bottom margin in list view
18
+ function useContainerClassName() {
19
+ const {isBlogPostPage} = useBlogPost();
20
+ return !isBlogPostPage ? 'margin-bottom--xl' : undefined;
41
21
  }
42
22
 
43
- export default function BlogPostItem(props: Props): JSX.Element {
44
- const readingTimePlural = useReadingTimePlural();
45
- const {withBaseUrl} = useBaseUrlUtils();
46
- const {
47
- children,
48
- frontMatter,
49
- assets,
50
- metadata,
51
- truncated,
52
- isBlogPostPage = false,
53
- } = props;
54
- const {
55
- date,
56
- formattedDate,
57
- permalink,
58
- tags,
59
- readingTime,
60
- title,
61
- editUrl,
62
- authors,
63
- } = metadata;
64
-
65
- const image = assets.image ?? frontMatter.image;
66
- const truncatedPost = !isBlogPostPage && truncated;
67
- const tagsExists = tags.length > 0;
68
- const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
69
-
23
+ export default function BlogPostItem({
24
+ children,
25
+ className,
26
+ }: Props): JSX.Element {
27
+ const containerClassName = useContainerClassName();
70
28
  return (
71
- <article
72
- className={!isBlogPostPage ? 'margin-bottom--xl' : undefined}
73
- itemProp="blogPost"
74
- itemScope
75
- itemType="http://schema.org/BlogPosting">
76
- <header>
77
- <TitleHeading className={styles.blogPostTitle} itemProp="headline">
78
- {isBlogPostPage ? (
79
- title
80
- ) : (
81
- <Link itemProp="url" to={permalink}>
82
- {title}
83
- </Link>
84
- )}
85
- </TitleHeading>
86
- <div className={clsx(styles.blogPostData, 'margin-vert--md')}>
87
- <time dateTime={date} itemProp="datePublished">
88
- {formattedDate}
89
- </time>
90
-
91
- {typeof readingTime !== 'undefined' && (
92
- <>
93
- {' · '}
94
- {readingTimePlural(readingTime)}
95
- </>
96
- )}
97
- </div>
98
- <BlogPostAuthors authors={authors} assets={assets} />
99
- </header>
100
-
101
- {image && (
102
- <meta itemProp="image" content={withBaseUrl(image, {absolute: true})} />
103
- )}
104
-
105
- <div
106
- // This ID is used for the feed generation to locate the main content
107
- id={isBlogPostPage ? blogPostContainerID : undefined}
108
- className="markdown"
109
- itemProp="articleBody">
110
- <MDXContent>{children}</MDXContent>
111
- </div>
112
-
113
- {(tagsExists || truncated) && (
114
- <footer
115
- className={clsx(
116
- 'row docusaurus-mt-lg',
117
- isBlogPostPage && styles.blogPostDetailsFull,
118
- )}>
119
- {tagsExists && (
120
- <div className={clsx('col', {'col--9': truncatedPost})}>
121
- <TagsListInline tags={tags} />
122
- </div>
123
- )}
124
-
125
- {isBlogPostPage && editUrl && (
126
- <div className="col margin-top--sm">
127
- <EditThisPage editUrl={editUrl} />
128
- </div>
129
- )}
130
-
131
- {truncatedPost && (
132
- <div
133
- className={clsx('col text--right', {
134
- 'col--3': tagsExists,
135
- })}>
136
- <Link
137
- to={metadata.permalink}
138
- aria-label={translate(
139
- {
140
- message: 'Read more about {title}',
141
- id: 'theme.blog.post.readMoreLabel',
142
- description:
143
- 'The ARIA label for the link to full blog posts from excerpts',
144
- },
145
- {title},
146
- )}>
147
- <b>
148
- <Translate
149
- id="theme.blog.post.readMore"
150
- description="The label used in blog post item excerpts to link to full blog posts">
151
- Read More
152
- </Translate>
153
- </b>
154
- </Link>
155
- </div>
156
- )}
157
- </footer>
158
- )}
159
- </article>
29
+ <BlogPostItemContainer className={clsx(containerClassName, className)}>
30
+ <BlogPostItemHeader />
31
+ <BlogPostItemContent>{children}</BlogPostItemContent>
32
+ <BlogPostItemFooter />
33
+ </BlogPostItemContainer>
160
34
  );
161
35
  }
@@ -0,0 +1,30 @@
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 React from 'react';
9
+ import {BlogPostProvider} from '@docusaurus/theme-common/internal';
10
+ import BlogPostItem from '@theme/BlogPostItem';
11
+ import type {Props} from '@theme/BlogPostItems';
12
+
13
+ export default function BlogPostItems({
14
+ items,
15
+ component: BlogPostItemComponent = BlogPostItem,
16
+ }: Props): JSX.Element {
17
+ return (
18
+ <>
19
+ {items.map(({content: BlogPostContent}) => (
20
+ <BlogPostProvider
21
+ key={BlogPostContent.metadata.permalink}
22
+ content={BlogPostContent}>
23
+ <BlogPostItemComponent>
24
+ <BlogPostContent />
25
+ </BlogPostItemComponent>
26
+ </BlogPostProvider>
27
+ ))}
28
+ </>
29
+ );
30
+ }
@@ -0,0 +1,44 @@
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 React from 'react';
9
+ import {PageMetadata} from '@docusaurus/theme-common';
10
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
11
+
12
+ export default function BlogPostPageMetadata(): JSX.Element {
13
+ const {assets, metadata} = useBlogPost();
14
+ const {title, description, date, tags, authors, frontMatter} = metadata;
15
+
16
+ const {keywords} = frontMatter;
17
+ const image = assets.image ?? frontMatter.image;
18
+ return (
19
+ <PageMetadata
20
+ title={title}
21
+ description={description}
22
+ keywords={keywords}
23
+ image={image}>
24
+ <meta property="og:type" content="article" />
25
+ <meta property="article:published_time" content={date} />
26
+ {/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
27
+ {authors.some((author) => author.url) && (
28
+ <meta
29
+ property="article:author"
30
+ content={authors
31
+ .map((author) => author.url)
32
+ .filter(Boolean)
33
+ .join(',')}
34
+ />
35
+ )}
36
+ {tags.length > 0 && (
37
+ <meta
38
+ property="article:tag"
39
+ content={tags.map((tag) => tag.label).join(',')}
40
+ />
41
+ )}
42
+ </PageMetadata>
43
+ );
44
+ }
@@ -5,56 +5,26 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import React from 'react';
8
+ import React, {type ReactNode} from 'react';
9
9
  import clsx from 'clsx';
10
- import {
11
- PageMetadata,
12
- HtmlClassNameProvider,
13
- ThemeClassNames,
14
- } from '@docusaurus/theme-common';
10
+ import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
11
+ import {BlogPostProvider, useBlogPost} from '@docusaurus/theme-common/internal';
15
12
  import BlogLayout from '@theme/BlogLayout';
16
13
  import BlogPostItem from '@theme/BlogPostItem';
17
14
  import BlogPostPaginator from '@theme/BlogPostPaginator';
15
+ import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata';
18
16
  import TOC from '@theme/TOC';
19
17
  import type {Props} from '@theme/BlogPostPage';
18
+ import type {BlogSidebar} from '@docusaurus/plugin-content-blog';
20
19
 
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 {
56
- const {content: BlogPostContents, sidebar} = props;
57
- const {assets, metadata} = BlogPostContents;
20
+ function BlogPostPageContent({
21
+ sidebar,
22
+ children,
23
+ }: {
24
+ sidebar: BlogSidebar;
25
+ children: ReactNode;
26
+ }): JSX.Element {
27
+ const {metadata, toc} = useBlogPost();
58
28
  const {nextItem, prevItem, frontMatter} = metadata;
59
29
  const {
60
30
  hide_table_of_contents: hideTableOfContents,
@@ -65,23 +35,15 @@ function BlogPostPageContent(props: Props): JSX.Element {
65
35
  <BlogLayout
66
36
  sidebar={sidebar}
67
37
  toc={
68
- !hideTableOfContents &&
69
- BlogPostContents.toc &&
70
- BlogPostContents.toc.length > 0 ? (
38
+ !hideTableOfContents && toc.length > 0 ? (
71
39
  <TOC
72
- toc={BlogPostContents.toc}
40
+ toc={toc}
73
41
  minHeadingLevel={tocMinHeadingLevel}
74
42
  maxHeadingLevel={tocMaxHeadingLevel}
75
43
  />
76
44
  ) : undefined
77
45
  }>
78
- <BlogPostItem
79
- frontMatter={frontMatter}
80
- assets={assets}
81
- metadata={metadata}
82
- isBlogPostPage>
83
- <BlogPostContents />
84
- </BlogPostItem>
46
+ <BlogPostItem>{children}</BlogPostItem>
85
47
 
86
48
  {(nextItem || prevItem) && (
87
49
  <BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
@@ -91,14 +53,19 @@ function BlogPostPageContent(props: Props): JSX.Element {
91
53
  }
92
54
 
93
55
  export default function BlogPostPage(props: Props): JSX.Element {
56
+ const BlogPostContent = props.content;
94
57
  return (
95
- <HtmlClassNameProvider
96
- className={clsx(
97
- ThemeClassNames.wrapper.blogPages,
98
- ThemeClassNames.page.blogPostPage,
99
- )}>
100
- <BlogPostPageMetadata {...props} />
101
- <BlogPostPageContent {...props} />
102
- </HtmlClassNameProvider>
58
+ <BlogPostProvider content={props.content} isBlogPostPage>
59
+ <HtmlClassNameProvider
60
+ className={clsx(
61
+ ThemeClassNames.wrapper.blogPages,
62
+ ThemeClassNames.page.blogPostPage,
63
+ )}>
64
+ <BlogPostPageMetadata />
65
+ <BlogPostPageContent sidebar={props.sidebar}>
66
+ <BlogPostContent />
67
+ </BlogPostPageContent>
68
+ </HtmlClassNameProvider>
69
+ </BlogPostProvider>
103
70
  );
104
71
  }
@@ -16,7 +16,7 @@ import {
16
16
  import BlogLayout from '@theme/BlogLayout';
17
17
  import TagsListByLetter from '@theme/TagsListByLetter';
18
18
  import type {Props} from '@theme/BlogTagsListPage';
19
- import SearchMetadata from '../SearchMetadata';
19
+ import SearchMetadata from '@theme/SearchMetadata';
20
20
 
21
21
  export default function BlogTagsListPage({tags, sidebar}: Props): JSX.Element {
22
22
  const title = translateTagsPageTitle();
@@ -16,10 +16,10 @@ import {
16
16
  } from '@docusaurus/theme-common';
17
17
  import Link from '@docusaurus/Link';
18
18
  import BlogLayout from '@theme/BlogLayout';
19
- import BlogPostItem from '@theme/BlogPostItem';
20
19
  import BlogListPaginator from '@theme/BlogListPaginator';
21
20
  import SearchMetadata from '@theme/SearchMetadata';
22
21
  import type {Props} from '@theme/BlogTagsPostsPage';
22
+ import BlogPostItems from '@theme/BlogPostItems';
23
23
 
24
24
  // Very simple pluralization: probably good enough for now
25
25
  function useBlogPostsPlural() {
@@ -39,14 +39,9 @@ function useBlogPostsPlural() {
39
39
  );
40
40
  }
41
41
 
42
- export default function BlogTagsPostsPage({
43
- tag,
44
- items,
45
- sidebar,
46
- listMetadata,
47
- }: Props): JSX.Element {
42
+ function useBlogTagsPostsPageTitle(tag: Props['tag']): string {
48
43
  const blogPostsPlural = useBlogPostsPlural();
49
- const title = translate(
44
+ return translate(
50
45
  {
51
46
  id: 'theme.blog.tagTitle',
52
47
  description: 'The title of the page for a blog tag',
@@ -54,40 +49,52 @@ export default function BlogTagsPostsPage({
54
49
  },
55
50
  {nPosts: blogPostsPlural(tag.count), tagName: tag.label},
56
51
  );
52
+ }
57
53
 
54
+ function BlogTagsPostsPageMetadata({tag}: Props): JSX.Element {
55
+ const title = useBlogTagsPostsPageTitle(tag);
56
+ return (
57
+ <>
58
+ <PageMetadata title={title} />
59
+ <SearchMetadata tag="blog_tags_posts" />
60
+ </>
61
+ );
62
+ }
63
+
64
+ function BlogTagsPostsPageContent({
65
+ tag,
66
+ items,
67
+ sidebar,
68
+ listMetadata,
69
+ }: Props): JSX.Element {
70
+ const title = useBlogTagsPostsPageTitle(tag);
71
+ return (
72
+ <BlogLayout sidebar={sidebar}>
73
+ <header className="margin-bottom--xl">
74
+ <h1>{title}</h1>
75
+
76
+ <Link href={tag.allTagsPath}>
77
+ <Translate
78
+ id="theme.tags.tagsPageLink"
79
+ description="The label of the link targeting the tag list page">
80
+ View All Tags
81
+ </Translate>
82
+ </Link>
83
+ </header>
84
+ <BlogPostItems items={items} />
85
+ <BlogListPaginator metadata={listMetadata} />
86
+ </BlogLayout>
87
+ );
88
+ }
89
+ export default function BlogTagsPostsPage(props: Props): JSX.Element {
58
90
  return (
59
91
  <HtmlClassNameProvider
60
92
  className={clsx(
61
93
  ThemeClassNames.wrapper.blogPages,
62
94
  ThemeClassNames.page.blogTagPostListPage,
63
95
  )}>
64
- <PageMetadata title={title} />
65
- <SearchMetadata tag="blog_tags_posts" />
66
- <BlogLayout sidebar={sidebar}>
67
- <header className="margin-bottom--xl">
68
- <h1>{title}</h1>
69
-
70
- <Link href={tag.allTagsPath}>
71
- <Translate
72
- id="theme.tags.tagsPageLink"
73
- description="The label of the link targeting the tag list page">
74
- View All Tags
75
- </Translate>
76
- </Link>
77
- </header>
78
-
79
- {items.map(({content: BlogPostContent}) => (
80
- <BlogPostItem
81
- key={BlogPostContent.metadata.permalink}
82
- frontMatter={BlogPostContent.frontMatter}
83
- assets={BlogPostContent.assets}
84
- metadata={BlogPostContent.metadata}
85
- truncated>
86
- <BlogPostContent />
87
- </BlogPostItem>
88
- ))}
89
- <BlogListPaginator metadata={listMetadata} />
90
- </BlogLayout>
96
+ <BlogTagsPostsPageMetadata {...props} />
97
+ <BlogTagsPostsPageContent {...props} />
91
98
  </HtmlClassNameProvider>
92
99
  );
93
100
  }
@@ -7,11 +7,8 @@
7
7
 
8
8
  import React, {type ComponentProps} from 'react';
9
9
  import clsx from 'clsx';
10
- import {
11
- usePrismTheme,
12
- getPrismCssVariables,
13
- ThemeClassNames,
14
- } from '@docusaurus/theme-common';
10
+ import {ThemeClassNames, usePrismTheme} from '@docusaurus/theme-common';
11
+ import {getPrismCssVariables} from '@docusaurus/theme-common/internal';
15
12
  import styles from './styles.module.css';
16
13
 
17
14
  export default function CodeBlockContainer<T extends 'div' | 'pre'>({
@@ -23,7 +20,7 @@ export default function CodeBlockContainer<T extends 'div' | 'pre'>({
23
20
  return (
24
21
  <As
25
22
  // Polymorphic components are hard to type, without `oneOf` generics
26
- {...(props as never)}
23
+ {...(props as any)}
27
24
  style={prismCssVariables}
28
25
  className={clsx(
29
26
  props.className,