@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
@@ -4,19 +4,17 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
-
8
7
  import React from 'react';
9
8
  import clsx from 'clsx';
10
- import BlogPostAuthor from '@theme/BlogPostAuthor';
11
- import type {Props} from '@theme/BlogPostAuthors';
12
-
9
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
10
+ import BlogPostItemHeaderAuthor from '@theme/BlogPostItem/Header/Author';
13
11
  import styles from './styles.module.css';
14
-
15
12
  // Component responsible for the authors layout
16
- export default function BlogPostAuthors({
17
- authors,
18
- assets,
19
- }: Props): JSX.Element | null {
13
+ export default function BlogPostItemHeaderAuthors({className}) {
14
+ const {
15
+ metadata: {authors},
16
+ assets,
17
+ } = useBlogPost();
20
18
  const authorsCount = authors.length;
21
19
  if (authorsCount === 0) {
22
20
  return null;
@@ -27,6 +25,7 @@ export default function BlogPostAuthors({
27
25
  className={clsx(
28
26
  'margin-top--md margin-bottom--sm',
29
27
  imageOnly ? styles.imageOnlyAuthorRow : 'row',
28
+ className,
30
29
  )}>
31
30
  {authors.map((author, idx) => (
32
31
  <div
@@ -35,7 +34,7 @@ export default function BlogPostAuthors({
35
34
  imageOnly ? styles.imageOnlyAuthorCol : styles.authorCol,
36
35
  )}
37
36
  key={idx}>
38
- <BlogPostAuthor
37
+ <BlogPostItemHeaderAuthor
39
38
  author={{
40
39
  ...author,
41
40
  // Handle author images using relative paths
@@ -5,5 +5,5 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  /// <reference types="react" />
8
- import type { Props } from '@theme/BlogPostAuthors';
9
- export default function BlogPostAuthors({ authors, assets, }: Props): JSX.Element | null;
8
+ import type { Props } from '@theme/BlogPostItem/Header/Info';
9
+ export default function BlogPostItemHeaderInfo({ className, }: Props): JSX.Element;
@@ -0,0 +1,60 @@
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 {translate} from '@docusaurus/Translate';
10
+ import {usePluralForm} from '@docusaurus/theme-common';
11
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
12
+ import styles from './styles.module.css';
13
+ // Very simple pluralization: probably good enough for now
14
+ function useReadingTimePlural() {
15
+ const {selectMessage} = usePluralForm();
16
+ return (readingTimeFloat) => {
17
+ const readingTime = Math.ceil(readingTimeFloat);
18
+ return selectMessage(
19
+ readingTime,
20
+ translate(
21
+ {
22
+ id: 'theme.blog.post.readingTime.plurals',
23
+ description:
24
+ '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)',
25
+ message: 'One min read|{readingTime} min read',
26
+ },
27
+ {readingTime},
28
+ ),
29
+ );
30
+ };
31
+ }
32
+ function ReadingTime({readingTime}) {
33
+ const readingTimePlural = useReadingTimePlural();
34
+ return <>{readingTimePlural(readingTime)}</>;
35
+ }
36
+ function Date({date, formattedDate}) {
37
+ return (
38
+ <time dateTime={date} itemProp="datePublished">
39
+ {formattedDate}
40
+ </time>
41
+ );
42
+ }
43
+ function Spacer() {
44
+ return <>{' · '}</>;
45
+ }
46
+ export default function BlogPostItemHeaderInfo({className}) {
47
+ const {metadata} = useBlogPost();
48
+ const {date, formattedDate, readingTime} = metadata;
49
+ return (
50
+ <div className={clsx(styles.container, 'margin-vert--md', className)}>
51
+ <Date date={date} formattedDate={formattedDate} />
52
+ {typeof readingTime !== 'undefined' && (
53
+ <>
54
+ <Spacer />
55
+ <ReadingTime readingTime={readingTime} />
56
+ </>
57
+ )}
58
+ </div>
59
+ );
60
+ }
@@ -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,9 @@
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
+ /// <reference types="react" />
8
+ import type { Props } from '@theme/BlogPostItem/Header/Title';
9
+ export default function BlogPostItemHeaderTitle({ className, }: Props): JSX.Element;
@@ -0,0 +1,27 @@
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 Link from '@docusaurus/Link';
10
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
11
+ import styles from './styles.module.css';
12
+ export default function BlogPostItemHeaderTitle({className}) {
13
+ const {metadata, isBlogPostPage} = useBlogPost();
14
+ const {permalink, title} = metadata;
15
+ const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
16
+ return (
17
+ <TitleHeading className={clsx(styles.title, className)} itemProp="headline">
18
+ {isBlogPostPage ? (
19
+ title
20
+ ) : (
21
+ <Link itemProp="url" to={permalink}>
22
+ {title}
23
+ </Link>
24
+ )}
25
+ </TitleHeading>
26
+ );
27
+ }
@@ -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,8 @@
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
+ /// <reference types="react" />
8
+ export default function BlogPostItemHeader(): JSX.Element;
@@ -0,0 +1,19 @@
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 BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title';
9
+ import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info';
10
+ import BlogPostItemHeaderAuthors from '@theme/BlogPostItem/Header/Authors';
11
+ export default function BlogPostItemHeader() {
12
+ return (
13
+ <header>
14
+ <BlogPostItemHeaderTitle />
15
+ <BlogPostItemHeaderInfo />
16
+ <BlogPostItemHeaderAuthors />
17
+ </header>
18
+ );
19
+ }
@@ -6,4 +6,4 @@
6
6
  */
7
7
  /// <reference types="react" />
8
8
  import type { Props } from '@theme/BlogPostItem';
9
- export default function BlogPostItem(props: Props): JSX.Element;
9
+ export default function BlogPostItem({ children, className, }: Props): JSX.Element;
@@ -6,149 +6,23 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import clsx from 'clsx';
9
- import Translate, {translate} from '@docusaurus/Translate';
10
- import Link from '@docusaurus/Link';
11
- import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
12
- import {usePluralForm} from '@docusaurus/theme-common';
13
- import {blogPostContainerID} from '@docusaurus/utils-common';
14
- import MDXContent from '@theme/MDXContent';
15
- import EditThisPage from '@theme/EditThisPage';
16
- import TagsListInline from '@theme/TagsListInline';
17
- import BlogPostAuthors from '@theme/BlogPostAuthors';
18
- import styles from './styles.module.css';
19
- // Very simple pluralization: probably good enough for now
20
- function useReadingTimePlural() {
21
- const {selectMessage} = usePluralForm();
22
- return (readingTimeFloat) => {
23
- const readingTime = Math.ceil(readingTimeFloat);
24
- return selectMessage(
25
- readingTime,
26
- translate(
27
- {
28
- id: 'theme.blog.post.readingTime.plurals',
29
- description:
30
- '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)',
31
- message: 'One min read|{readingTime} min read',
32
- },
33
- {readingTime},
34
- ),
35
- );
36
- };
9
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
10
+ import BlogPostItemContainer from '@theme/BlogPostItem/Container';
11
+ import BlogPostItemHeader from '@theme/BlogPostItem/Header';
12
+ import BlogPostItemContent from '@theme/BlogPostItem/Content';
13
+ import BlogPostItemFooter from '@theme/BlogPostItem/Footer';
14
+ // apply a bottom margin in list view
15
+ function useContainerClassName() {
16
+ const {isBlogPostPage} = useBlogPost();
17
+ return !isBlogPostPage ? 'margin-bottom--xl' : undefined;
37
18
  }
38
- export default function BlogPostItem(props) {
39
- const readingTimePlural = useReadingTimePlural();
40
- const {withBaseUrl} = useBaseUrlUtils();
41
- const {
42
- children,
43
- frontMatter,
44
- assets,
45
- metadata,
46
- truncated,
47
- isBlogPostPage = false,
48
- } = props;
49
- const {
50
- date,
51
- formattedDate,
52
- permalink,
53
- tags,
54
- readingTime,
55
- title,
56
- editUrl,
57
- authors,
58
- } = metadata;
59
- const image = assets.image ?? frontMatter.image;
60
- const truncatedPost = !isBlogPostPage && truncated;
61
- const tagsExists = tags.length > 0;
62
- const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
19
+ export default function BlogPostItem({children, className}) {
20
+ const containerClassName = useContainerClassName();
63
21
  return (
64
- <article
65
- className={!isBlogPostPage ? 'margin-bottom--xl' : undefined}
66
- itemProp="blogPost"
67
- itemScope
68
- itemType="http://schema.org/BlogPosting">
69
- <header>
70
- <TitleHeading className={styles.blogPostTitle} itemProp="headline">
71
- {isBlogPostPage ? (
72
- title
73
- ) : (
74
- <Link itemProp="url" to={permalink}>
75
- {title}
76
- </Link>
77
- )}
78
- </TitleHeading>
79
- <div className={clsx(styles.blogPostData, 'margin-vert--md')}>
80
- <time dateTime={date} itemProp="datePublished">
81
- {formattedDate}
82
- </time>
83
-
84
- {typeof readingTime !== 'undefined' && (
85
- <>
86
- {' · '}
87
- {readingTimePlural(readingTime)}
88
- </>
89
- )}
90
- </div>
91
- <BlogPostAuthors authors={authors} assets={assets} />
92
- </header>
93
-
94
- {image && (
95
- <meta itemProp="image" content={withBaseUrl(image, {absolute: true})} />
96
- )}
97
-
98
- <div
99
- // This ID is used for the feed generation to locate the main content
100
- id={isBlogPostPage ? blogPostContainerID : undefined}
101
- className="markdown"
102
- itemProp="articleBody">
103
- <MDXContent>{children}</MDXContent>
104
- </div>
105
-
106
- {(tagsExists || truncated) && (
107
- <footer
108
- className={clsx(
109
- 'row docusaurus-mt-lg',
110
- isBlogPostPage && styles.blogPostDetailsFull,
111
- )}>
112
- {tagsExists && (
113
- <div className={clsx('col', {'col--9': truncatedPost})}>
114
- <TagsListInline tags={tags} />
115
- </div>
116
- )}
117
-
118
- {isBlogPostPage && editUrl && (
119
- <div className="col margin-top--sm">
120
- <EditThisPage editUrl={editUrl} />
121
- </div>
122
- )}
123
-
124
- {truncatedPost && (
125
- <div
126
- className={clsx('col text--right', {
127
- 'col--3': tagsExists,
128
- })}>
129
- <Link
130
- to={metadata.permalink}
131
- aria-label={translate(
132
- {
133
- message: 'Read more about {title}',
134
- id: 'theme.blog.post.readMoreLabel',
135
- description:
136
- 'The ARIA label for the link to full blog posts from excerpts',
137
- },
138
- {title},
139
- )}>
140
- <b>
141
- <Translate
142
- id="theme.blog.post.readMore"
143
- description="The label used in blog post item excerpts to link to full blog posts">
144
- Read More
145
- </Translate>
146
- </b>
147
- </Link>
148
- </div>
149
- )}
150
- </footer>
151
- )}
152
- </article>
22
+ <BlogPostItemContainer className={clsx(containerClassName, className)}>
23
+ <BlogPostItemHeader />
24
+ <BlogPostItemContent>{children}</BlogPostItemContent>
25
+ <BlogPostItemFooter />
26
+ </BlogPostItemContainer>
153
27
  );
154
28
  }
@@ -0,0 +1,9 @@
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
+ /// <reference types="react" />
8
+ import type { Props } from '@theme/BlogPostItems';
9
+ export default function BlogPostItems({ items, component: BlogPostItemComponent, }: Props): JSX.Element;
@@ -0,0 +1,27 @@
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 {BlogPostProvider} from '@docusaurus/theme-common/internal';
9
+ import BlogPostItem from '@theme/BlogPostItem';
10
+ export default function BlogPostItems({
11
+ items,
12
+ component: BlogPostItemComponent = BlogPostItem,
13
+ }) {
14
+ return (
15
+ <>
16
+ {items.map(({content: BlogPostContent}) => (
17
+ <BlogPostProvider
18
+ key={BlogPostContent.metadata.permalink}
19
+ content={BlogPostContent}>
20
+ <BlogPostItemComponent>
21
+ <BlogPostContent />
22
+ </BlogPostItemComponent>
23
+ </BlogPostProvider>
24
+ ))}
25
+ </>
26
+ );
27
+ }
@@ -0,0 +1,8 @@
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
+ /// <reference types="react" />
8
+ export default function BlogPostPageMetadata(): JSX.Element;
@@ -0,0 +1,41 @@
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 {PageMetadata} from '@docusaurus/theme-common';
9
+ import {useBlogPost} from '@docusaurus/theme-common/internal';
10
+ export default function BlogPostPageMetadata() {
11
+ const {assets, metadata} = useBlogPost();
12
+ const {title, description, date, tags, authors, frontMatter} = metadata;
13
+ const {keywords} = frontMatter;
14
+ const image = assets.image ?? frontMatter.image;
15
+ return (
16
+ <PageMetadata
17
+ title={title}
18
+ description={description}
19
+ keywords={keywords}
20
+ image={image}>
21
+ <meta property="og:type" content="article" />
22
+ <meta property="article:published_time" content={date} />
23
+ {/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
24
+ {authors.some((author) => author.url) && (
25
+ <meta
26
+ property="article:author"
27
+ content={authors
28
+ .map((author) => author.url)
29
+ .filter(Boolean)
30
+ .join(',')}
31
+ />
32
+ )}
33
+ {tags.length > 0 && (
34
+ <meta
35
+ property="article:tag"
36
+ content={tags.map((tag) => tag.label).join(',')}
37
+ />
38
+ )}
39
+ </PageMetadata>
40
+ );
41
+ }
@@ -6,51 +6,15 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import clsx from 'clsx';
9
- import {
10
- PageMetadata,
11
- HtmlClassNameProvider,
12
- ThemeClassNames,
13
- } from '@docusaurus/theme-common';
9
+ import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
10
+ import {BlogPostProvider, useBlogPost} from '@docusaurus/theme-common/internal';
14
11
  import BlogLayout from '@theme/BlogLayout';
15
12
  import BlogPostItem from '@theme/BlogPostItem';
16
13
  import BlogPostPaginator from '@theme/BlogPostPaginator';
14
+ import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata';
17
15
  import TOC from '@theme/TOC';
18
- function BlogPostPageMetadata(props) {
19
- const {content: BlogPostContents} = props;
20
- const {assets, metadata} = BlogPostContents;
21
- const {title, description, date, tags, authors, frontMatter} = metadata;
22
- const {keywords} = frontMatter;
23
- const image = assets.image ?? frontMatter.image;
24
- return (
25
- <PageMetadata
26
- title={title}
27
- description={description}
28
- keywords={keywords}
29
- image={image}>
30
- <meta property="og:type" content="article" />
31
- <meta property="article:published_time" content={date} />
32
- {/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
33
- {authors.some((author) => author.url) && (
34
- <meta
35
- property="article:author"
36
- content={authors
37
- .map((author) => author.url)
38
- .filter(Boolean)
39
- .join(',')}
40
- />
41
- )}
42
- {tags.length > 0 && (
43
- <meta
44
- property="article:tag"
45
- content={tags.map((tag) => tag.label).join(',')}
46
- />
47
- )}
48
- </PageMetadata>
49
- );
50
- }
51
- function BlogPostPageContent(props) {
52
- const {content: BlogPostContents, sidebar} = props;
53
- const {assets, metadata} = BlogPostContents;
16
+ function BlogPostPageContent({sidebar, children}) {
17
+ const {metadata, toc} = useBlogPost();
54
18
  const {nextItem, prevItem, frontMatter} = metadata;
55
19
  const {
56
20
  hide_table_of_contents: hideTableOfContents,
@@ -61,23 +25,15 @@ function BlogPostPageContent(props) {
61
25
  <BlogLayout
62
26
  sidebar={sidebar}
63
27
  toc={
64
- !hideTableOfContents &&
65
- BlogPostContents.toc &&
66
- BlogPostContents.toc.length > 0 ? (
28
+ !hideTableOfContents && toc.length > 0 ? (
67
29
  <TOC
68
- toc={BlogPostContents.toc}
30
+ toc={toc}
69
31
  minHeadingLevel={tocMinHeadingLevel}
70
32
  maxHeadingLevel={tocMaxHeadingLevel}
71
33
  />
72
34
  ) : undefined
73
35
  }>
74
- <BlogPostItem
75
- frontMatter={frontMatter}
76
- assets={assets}
77
- metadata={metadata}
78
- isBlogPostPage>
79
- <BlogPostContents />
80
- </BlogPostItem>
36
+ <BlogPostItem>{children}</BlogPostItem>
81
37
 
82
38
  {(nextItem || prevItem) && (
83
39
  <BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
@@ -86,14 +42,19 @@ function BlogPostPageContent(props) {
86
42
  );
87
43
  }
88
44
  export default function BlogPostPage(props) {
45
+ const BlogPostContent = props.content;
89
46
  return (
90
- <HtmlClassNameProvider
91
- className={clsx(
92
- ThemeClassNames.wrapper.blogPages,
93
- ThemeClassNames.page.blogPostPage,
94
- )}>
95
- <BlogPostPageMetadata {...props} />
96
- <BlogPostPageContent {...props} />
97
- </HtmlClassNameProvider>
47
+ <BlogPostProvider content={props.content} isBlogPostPage>
48
+ <HtmlClassNameProvider
49
+ className={clsx(
50
+ ThemeClassNames.wrapper.blogPages,
51
+ ThemeClassNames.page.blogPostPage,
52
+ )}>
53
+ <BlogPostPageMetadata />
54
+ <BlogPostPageContent sidebar={props.sidebar}>
55
+ <BlogPostContent />
56
+ </BlogPostPageContent>
57
+ </HtmlClassNameProvider>
58
+ </BlogPostProvider>
98
59
  );
99
60
  }
@@ -14,7 +14,7 @@ import {
14
14
  } from '@docusaurus/theme-common';
15
15
  import BlogLayout from '@theme/BlogLayout';
16
16
  import TagsListByLetter from '@theme/TagsListByLetter';
17
- import SearchMetadata from '../SearchMetadata';
17
+ import SearchMetadata from '@theme/SearchMetadata';
18
18
  export default function BlogTagsListPage({tags, sidebar}) {
19
19
  const title = translateTagsPageTitle();
20
20
  return (
@@ -7,4 +7,4 @@
7
7
  /// <reference types="@docusaurus/plugin-content-blog" />
8
8
  /// <reference types="react" />
9
9
  import type { Props } from '@theme/BlogTagsPostsPage';
10
- export default function BlogTagsPostsPage({ tag, items, sidebar, listMetadata, }: Props): JSX.Element;
10
+ export default function BlogTagsPostsPage(props: Props): JSX.Element;