@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.
Files changed (310) hide show
  1. package/README.md +1 -1
  2. package/codeTranslations/ar.json +12 -7
  3. package/codeTranslations/base.json +17 -7
  4. package/codeTranslations/bn.json +11 -5
  5. package/codeTranslations/cs.json +62 -0
  6. package/codeTranslations/da.json +8 -3
  7. package/codeTranslations/de.json +8 -3
  8. package/codeTranslations/es.json +15 -10
  9. package/codeTranslations/fa.json +31 -26
  10. package/codeTranslations/fil.json +8 -3
  11. package/codeTranslations/fr.json +8 -3
  12. package/codeTranslations/he.json +9 -4
  13. package/codeTranslations/hi.json +9 -4
  14. package/codeTranslations/ja.json +8 -3
  15. package/codeTranslations/ko.json +8 -3
  16. package/codeTranslations/pl.json +8 -3
  17. package/codeTranslations/pt-BR.json +16 -11
  18. package/codeTranslations/pt-PT.json +8 -3
  19. package/codeTranslations/ru.json +10 -5
  20. package/codeTranslations/sr.json +62 -0
  21. package/codeTranslations/tr.json +9 -4
  22. package/codeTranslations/vi.json +10 -5
  23. package/codeTranslations/zh-Hans.json +9 -4
  24. package/codeTranslations/zh-Hant.json +9 -4
  25. package/lib/__tests__/validateThemeConfig.test.js +277 -3
  26. package/lib/admonitions.css +35 -0
  27. package/lib/index.js +31 -8
  28. package/lib/prism-include-languages.js +9 -5
  29. package/lib/theme/AnnouncementBar/index.js +10 -16
  30. package/lib/theme/AnnouncementBar/styles.module.css +25 -30
  31. package/lib/theme/BackToTopButton/index.js +140 -0
  32. package/lib/theme/BackToTopButton/styles.module.css +42 -0
  33. package/lib/theme/BlogArchivePage/index.js +89 -0
  34. package/lib/theme/BlogLayout/index.js +51 -0
  35. package/lib/theme/BlogListPage/index.js +10 -21
  36. package/lib/theme/BlogPostAuthor/index.js +51 -0
  37. package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
  38. package/lib/theme/BlogPostAuthors/index.js +47 -0
  39. package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
  40. package/lib/theme/BlogPostItem/index.js +58 -67
  41. package/lib/theme/BlogPostPage/index.js +37 -24
  42. package/lib/theme/BlogSidebar/styles.module.css +2 -2
  43. package/lib/theme/BlogTagsListPage/index.js +8 -44
  44. package/lib/theme/BlogTagsPostsPage/index.js +24 -38
  45. package/lib/theme/CodeBlock/index.js +45 -41
  46. package/lib/theme/CodeBlock/styles.module.css +6 -9
  47. package/lib/theme/Details/index.js +30 -0
  48. package/lib/theme/Details/styles.module.css +13 -0
  49. package/lib/theme/DocItem/index.js +29 -45
  50. package/lib/theme/DocItem/styles.module.css +5 -9
  51. package/lib/theme/DocItemFooter/index.js +79 -0
  52. package/lib/theme/DocItemFooter/styles.module.css +18 -0
  53. package/lib/theme/DocPage/index.js +25 -49
  54. package/lib/theme/DocPage/styles.module.css +8 -23
  55. package/lib/theme/DocSidebar/index.js +45 -227
  56. package/lib/theme/DocSidebar/styles.module.css +0 -18
  57. package/lib/theme/DocSidebarItem/index.js +177 -0
  58. package/lib/theme/DocSidebarItem/styles.module.css +15 -0
  59. package/lib/theme/DocTagDocListPage/index.js +89 -0
  60. package/lib/theme/DocTagsListPage/index.js +44 -0
  61. package/lib/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +37 -18
  62. package/lib/theme/EditThisPage/index.js +3 -1
  63. package/lib/theme/Footer/index.js +13 -4
  64. package/lib/theme/Heading/index.js +7 -9
  65. package/lib/theme/Heading/styles.css +4 -6
  66. package/lib/theme/Heading/styles.module.css +9 -5
  67. package/lib/theme/IconClose/index.js +31 -0
  68. package/lib/theme/LastUpdated/index.js +4 -2
  69. package/lib/theme/LayoutHead/index.js +13 -11
  70. package/lib/theme/LayoutProviders/index.js +11 -5
  71. package/lib/theme/Logo/index.js +14 -12
  72. package/lib/theme/MDXComponents/index.js +45 -4
  73. package/lib/theme/MDXComponents/styles.css +11 -0
  74. package/lib/theme/MDXPage/index.js +2 -1
  75. package/lib/theme/Navbar/index.js +164 -42
  76. package/lib/theme/Navbar/styles.module.css +10 -3
  77. package/lib/theme/NavbarItem/DefaultNavbarItem.js +27 -123
  78. package/lib/theme/NavbarItem/DocNavbarItem.js +6 -5
  79. package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +19 -12
  80. package/lib/theme/NavbarItem/DropdownNavbarItem.js +155 -0
  81. package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +5 -6
  82. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  83. package/lib/theme/NavbarItem/index.js +31 -11
  84. package/lib/theme/Seo/index.js +10 -7
  85. package/lib/theme/SkipToContent/index.js +9 -3
  86. package/lib/theme/SkipToContent/styles.module.css +1 -0
  87. package/lib/theme/TOC/index.js +9 -29
  88. package/lib/theme/TOC/styles.module.css +1 -1
  89. package/lib/theme/TOCCollapsible/index.js +53 -0
  90. package/lib/theme/TOCCollapsible/styles.module.css +50 -0
  91. package/lib/theme/TOCInline/index.js +7 -27
  92. package/lib/theme/TOCItems/index.js +78 -0
  93. package/lib/theme/Tabs/__tests__/index.test.js +123 -0
  94. package/lib/theme/Tabs/index.js +73 -50
  95. package/lib/theme/Tabs/styles.module.css +0 -13
  96. package/lib/theme/Tag/index.js +40 -0
  97. package/lib/theme/Tag/styles.module.css +70 -0
  98. package/lib/theme/TagsListByLetter/index.js +48 -0
  99. package/lib/theme/TagsListByLetter/styles.module.css +11 -0
  100. package/lib/theme/TagsListInline/index.js +44 -0
  101. package/lib/theme/TagsListInline/styles.module.css +15 -0
  102. package/lib/theme/ThemedImage/index.js +4 -5
  103. package/lib/theme/Toggle/index.js +23 -18
  104. package/lib/theme/Toggle/styles.module.css +91 -0
  105. package/lib/theme/UserPreferencesProvider/index.js +1 -9
  106. package/lib/theme/hooks/useHideableNavbar.js +14 -32
  107. package/lib/theme/hooks/useTabGroupChoice.js +2 -4
  108. package/lib/theme/hooks/useTheme.js +2 -2
  109. package/lib/theme/hooks/useWindowSize.js +33 -20
  110. package/lib/theme/prism-include-languages.js +4 -3
  111. package/lib/translations.js +4 -4
  112. package/lib/types.d.ts +338 -138
  113. package/lib/validateThemeConfig.js +226 -245
  114. package/lib-next/__tests__/validateThemeConfig.test.js +277 -3
  115. package/lib-next/admonitions.css +35 -0
  116. package/lib-next/index.js +33 -7
  117. package/lib-next/prism-include-languages.js +0 -2
  118. package/lib-next/theme/AnnouncementBar/index.js +9 -18
  119. package/lib-next/theme/AnnouncementBar/styles.module.css +25 -30
  120. package/lib-next/theme/BackToTopButton/index.js +131 -0
  121. package/lib-next/theme/BackToTopButton/styles.module.css +42 -0
  122. package/lib-next/theme/BlogArchivePage/index.js +80 -0
  123. package/lib-next/theme/BlogLayout/index.js +40 -0
  124. package/lib-next/theme/BlogListPage/index.js +16 -24
  125. package/lib-next/theme/BlogPostAuthor/index.js +46 -0
  126. package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
  127. package/lib-next/theme/BlogPostAuthors/index.js +34 -0
  128. package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
  129. package/lib-next/theme/BlogPostItem/index.js +79 -86
  130. package/lib-next/theme/BlogPostPage/index.js +70 -35
  131. package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
  132. package/lib-next/theme/BlogTagsListPage/index.js +13 -54
  133. package/lib-next/theme/BlogTagsPostsPage/index.js +28 -38
  134. package/lib-next/theme/CodeBlock/index.js +54 -53
  135. package/lib-next/theme/CodeBlock/styles.module.css +6 -9
  136. package/lib-next/theme/Details/index.js +20 -0
  137. package/lib-next/theme/Details/styles.module.css +13 -0
  138. package/lib-next/theme/DocItem/index.js +46 -55
  139. package/lib-next/theme/DocItem/styles.module.css +5 -9
  140. package/lib-next/theme/DocItemFooter/index.js +79 -0
  141. package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
  142. package/lib-next/theme/DocPage/index.js +25 -43
  143. package/lib-next/theme/DocPage/styles.module.css +8 -23
  144. package/lib-next/theme/DocSidebar/index.js +59 -288
  145. package/lib-next/theme/DocSidebar/styles.module.css +0 -18
  146. package/lib-next/theme/DocSidebarItem/index.js +181 -0
  147. package/lib-next/theme/DocSidebarItem/styles.module.css +15 -0
  148. package/lib-next/theme/DocTagDocListPage/index.js +89 -0
  149. package/lib-next/theme/DocTagsListPage/index.js +38 -0
  150. package/lib-next/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +44 -36
  151. package/lib-next/theme/EditThisPage/index.js +6 -1
  152. package/lib-next/theme/Footer/index.js +24 -4
  153. package/lib-next/theme/Heading/index.js +10 -13
  154. package/lib-next/theme/Heading/styles.css +4 -6
  155. package/lib-next/theme/Heading/styles.module.css +9 -5
  156. package/lib-next/theme/IconClose/index.js +23 -0
  157. package/lib-next/theme/LastUpdated/index.js +3 -2
  158. package/lib-next/theme/LayoutHead/index.js +9 -15
  159. package/lib-next/theme/LayoutProviders/index.js +17 -6
  160. package/lib-next/theme/Logo/index.js +23 -19
  161. package/lib-next/theme/MDXComponents/index.js +34 -7
  162. package/lib-next/theme/MDXComponents/styles.css +11 -0
  163. package/lib-next/theme/MDXPage/index.js +10 -2
  164. package/lib-next/theme/Navbar/index.js +192 -56
  165. package/lib-next/theme/Navbar/styles.module.css +10 -3
  166. package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +45 -147
  167. package/lib-next/theme/NavbarItem/DocNavbarItem.js +6 -5
  168. package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +31 -19
  169. package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +158 -0
  170. package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +4 -8
  171. package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  172. package/lib-next/theme/NavbarItem/index.js +25 -12
  173. package/lib-next/theme/Seo/index.js +11 -7
  174. package/lib-next/theme/SkipToContent/index.js +5 -6
  175. package/lib-next/theme/SkipToContent/styles.module.css +1 -0
  176. package/lib-next/theme/TOC/index.js +12 -36
  177. package/lib-next/theme/TOC/styles.module.css +1 -1
  178. package/lib-next/theme/TOCCollapsible/index.js +54 -0
  179. package/lib-next/theme/TOCCollapsible/styles.module.css +50 -0
  180. package/lib-next/theme/TOCInline/index.js +10 -28
  181. package/lib-next/theme/TOCItems/index.js +85 -0
  182. package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
  183. package/lib-next/theme/Tabs/index.js +91 -43
  184. package/lib-next/theme/Tabs/styles.module.css +0 -13
  185. package/lib-next/theme/Tag/index.js +27 -0
  186. package/lib-next/theme/Tag/styles.module.css +70 -0
  187. package/lib-next/theme/TagsListByLetter/index.js +42 -0
  188. package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
  189. package/lib-next/theme/TagsListInline/index.js +31 -0
  190. package/lib-next/theme/TagsListInline/styles.module.css +15 -0
  191. package/lib-next/theme/ThemedImage/index.js +5 -6
  192. package/lib-next/theme/Toggle/index.js +20 -15
  193. package/lib-next/theme/Toggle/styles.module.css +91 -0
  194. package/lib-next/theme/UserPreferencesProvider/index.js +0 -4
  195. package/lib-next/theme/hooks/useHideableNavbar.js +31 -44
  196. package/lib-next/theme/hooks/useTabGroupChoice.js +2 -4
  197. package/lib-next/theme/hooks/useTheme.js +2 -2
  198. package/lib-next/theme/hooks/useWindowSize.js +34 -20
  199. package/lib-next/theme/prism-include-languages.js +2 -1
  200. package/lib-next/translations.js +6 -10
  201. package/lib-next/types.d.ts +338 -138
  202. package/lib-next/validateThemeConfig.js +134 -110
  203. package/package.json +24 -19
  204. package/src/__tests__/validateThemeConfig.test.js +277 -3
  205. package/src/admonitions.css +35 -0
  206. package/src/index.ts +44 -14
  207. package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
  208. package/src/theme/AnnouncementBar/index.tsx +10 -17
  209. package/src/theme/AnnouncementBar/styles.module.css +25 -30
  210. package/src/theme/BackToTopButton/index.tsx +142 -0
  211. package/src/theme/BackToTopButton/styles.module.css +42 -0
  212. package/src/theme/BlogArchivePage/index.tsx +91 -0
  213. package/src/theme/BlogLayout/index.tsx +44 -0
  214. package/src/theme/BlogListPage/index.tsx +17 -24
  215. package/src/theme/BlogPostAuthor/index.tsx +49 -0
  216. package/src/theme/BlogPostAuthor/styles.module.css +12 -0
  217. package/src/theme/BlogPostAuthors/index.tsx +36 -0
  218. package/src/theme/BlogPostAuthors/styles.module.css +11 -0
  219. package/src/theme/BlogPostItem/index.tsx +70 -80
  220. package/src/theme/BlogPostPage/index.tsx +72 -35
  221. package/src/theme/BlogSidebar/styles.module.css +2 -2
  222. package/src/theme/BlogTagsListPage/index.tsx +13 -56
  223. package/src/theme/BlogTagsPostsPage/index.tsx +28 -38
  224. package/src/theme/CodeBlock/index.tsx +70 -55
  225. package/src/theme/CodeBlock/styles.module.css +6 -9
  226. package/src/theme/Details/index.tsx +24 -0
  227. package/src/theme/Details/styles.module.css +13 -0
  228. package/src/theme/DocItem/index.tsx +49 -55
  229. package/src/theme/DocItem/styles.module.css +5 -9
  230. package/src/theme/DocItemFooter/index.tsx +91 -0
  231. package/src/theme/DocItemFooter/styles.module.css +18 -0
  232. package/src/theme/DocPage/index.tsx +24 -38
  233. package/src/theme/DocPage/styles.module.css +8 -23
  234. package/src/theme/DocSidebar/index.tsx +70 -300
  235. package/src/theme/DocSidebar/styles.module.css +0 -18
  236. package/src/theme/DocSidebarItem/index.tsx +206 -0
  237. package/src/theme/DocSidebarItem/styles.module.css +15 -0
  238. package/src/theme/DocTagDocListPage/index.tsx +89 -0
  239. package/src/theme/DocTagsListPage/index.tsx +41 -0
  240. package/src/theme/{DocVersionSuggestions → DocVersionBanner}/index.tsx +58 -44
  241. package/src/theme/EditThisPage/index.tsx +6 -1
  242. package/src/theme/Footer/index.tsx +26 -4
  243. package/src/theme/Heading/index.tsx +10 -13
  244. package/src/theme/Heading/styles.css +4 -6
  245. package/src/theme/Heading/styles.module.css +9 -5
  246. package/src/theme/IconClose/index.tsx +26 -0
  247. package/src/theme/LastUpdated/index.tsx +3 -2
  248. package/src/theme/LayoutHead/index.tsx +9 -9
  249. package/src/theme/LayoutProviders/index.tsx +17 -6
  250. package/src/theme/Logo/index.tsx +19 -15
  251. package/src/theme/MDXComponents/index.tsx +39 -5
  252. package/src/theme/MDXComponents/styles.css +11 -0
  253. package/src/theme/MDXPage/index.tsx +10 -2
  254. package/src/theme/Navbar/index.tsx +202 -61
  255. package/src/theme/Navbar/styles.module.css +10 -3
  256. package/src/theme/NavbarItem/DefaultNavbarItem.tsx +42 -154
  257. package/src/theme/NavbarItem/DocNavbarItem.tsx +11 -14
  258. package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +33 -21
  259. package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
  260. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +180 -0
  261. package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +8 -7
  262. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  263. package/src/theme/NavbarItem/index.tsx +41 -16
  264. package/src/theme/Seo/index.tsx +7 -4
  265. package/src/theme/SkipToContent/index.tsx +5 -6
  266. package/src/theme/SkipToContent/styles.module.css +1 -0
  267. package/src/theme/TOC/index.tsx +12 -41
  268. package/src/theme/TOC/styles.module.css +1 -1
  269. package/src/theme/TOCCollapsible/index.tsx +58 -0
  270. package/src/theme/TOCCollapsible/styles.module.css +50 -0
  271. package/src/theme/TOCInline/index.tsx +13 -32
  272. package/src/theme/TOCItems/index.tsx +96 -0
  273. package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
  274. package/src/theme/Tabs/index.tsx +93 -49
  275. package/src/theme/Tabs/styles.module.css +0 -13
  276. package/src/theme/Tag/index.tsx +31 -0
  277. package/src/theme/Tag/styles.module.css +70 -0
  278. package/src/theme/TagsListByLetter/index.tsx +45 -0
  279. package/src/theme/TagsListByLetter/styles.module.css +11 -0
  280. package/src/theme/TagsListInline/index.tsx +35 -0
  281. package/src/theme/TagsListInline/styles.module.css +15 -0
  282. package/src/theme/ThemedImage/index.tsx +6 -6
  283. package/src/theme/Toggle/index.tsx +20 -15
  284. package/src/theme/Toggle/styles.module.css +91 -0
  285. package/src/theme/UserPreferencesProvider/index.tsx +0 -5
  286. package/src/theme/hooks/useContextualSearchFilters.ts +1 -1
  287. package/src/theme/hooks/useHideableNavbar.ts +32 -45
  288. package/src/theme/hooks/useTabGroupChoice.ts +4 -4
  289. package/src/theme/hooks/useTheme.ts +2 -2
  290. package/src/theme/hooks/useWindowSize.ts +38 -20
  291. package/src/theme/prism-include-languages.ts +3 -2
  292. package/src/translations.ts +6 -10
  293. package/src/types.d.ts +338 -138
  294. package/src/{validateThemeConfig.js → validateThemeConfig.ts} +144 -90
  295. package/tsconfig.json +1 -2
  296. package/update-code-translations.js +10 -6
  297. package/update-code-translations.test.js +1 -1
  298. package/update.js +151 -0
  299. package/lib/theme/Toggle/styles.css +0 -103
  300. package/lib/theme/hooks/useAnnouncementBar.js +0 -63
  301. package/lib/theme/hooks/useScrollPosition.js +0 -49
  302. package/lib/theme/hooks/useTOCHighlight.js +0 -87
  303. package/lib-next/theme/Toggle/styles.css +0 -103
  304. package/lib-next/theme/hooks/useAnnouncementBar.js +0 -49
  305. package/lib-next/theme/hooks/useScrollPosition.js +0 -38
  306. package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
  307. package/src/theme/Toggle/styles.css +0 -103
  308. package/src/theme/hooks/useAnnouncementBar.ts +0 -58
  309. package/src/theme/hooks/useScrollPosition.ts +0 -45
  310. package/src/theme/hooks/useTOCHighlight.ts +0 -98
@@ -10,13 +10,15 @@ import clsx from 'clsx';
10
10
  import {MDXProvider} from '@mdx-js/react';
11
11
  import Translate, {translate} from '@docusaurus/Translate';
12
12
  import Link from '@docusaurus/Link';
13
+ import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
13
14
  import {usePluralForm} from '@docusaurus/theme-common';
14
15
  import MDXComponents from '@theme/MDXComponents';
15
- import Seo from '@theme/Seo';
16
16
  import EditThisPage from '@theme/EditThisPage';
17
17
  import type {Props} from '@theme/BlogPostItem';
18
18
 
19
19
  import styles from './styles.module.css';
20
+ import TagsListInline from '@theme/TagsListInline';
21
+ import BlogPostAuthors from '@theme/BlogPostAuthors';
20
22
 
21
23
  // Very simple pluralization: probably good enough for now
22
24
  function useReadingTimePlural() {
@@ -40,9 +42,11 @@ function useReadingTimePlural() {
40
42
 
41
43
  function BlogPostItem(props: Props): JSX.Element {
42
44
  const readingTimePlural = useReadingTimePlural();
45
+ const {withBaseUrl} = useBaseUrlUtils();
43
46
  const {
44
47
  children,
45
48
  frontMatter,
49
+ assets,
46
50
  metadata,
47
51
  truncated,
48
52
  isBlogPostPage = false,
@@ -55,112 +59,98 @@ function BlogPostItem(props: Props): JSX.Element {
55
59
  readingTime,
56
60
  title,
57
61
  editUrl,
62
+ authors,
58
63
  } = metadata;
59
- const {author, image, keywords} = frontMatter;
60
64
 
61
- const authorURL = frontMatter.author_url || frontMatter.authorURL;
62
- const authorTitle = frontMatter.author_title || frontMatter.authorTitle;
63
- const authorImageURL =
64
- frontMatter.author_image_url || frontMatter.authorImageURL;
65
+ const image = assets.image ?? frontMatter.image;
66
+ const truncatedPost = !isBlogPostPage && truncated;
67
+ const tagsExists = tags.length > 0;
65
68
 
66
69
  const renderPostHeader = () => {
67
70
  const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
68
71
 
69
72
  return (
70
73
  <header>
71
- <TitleHeading className={styles.blogPostTitle}>
72
- {isBlogPostPage ? title : <Link to={permalink}>{title}</Link>}
74
+ <TitleHeading className={styles.blogPostTitle} itemProp="headline">
75
+ {isBlogPostPage ? (
76
+ title
77
+ ) : (
78
+ <Link itemProp="url" to={permalink}>
79
+ {title}
80
+ </Link>
81
+ )}
73
82
  </TitleHeading>
74
83
  <div className={clsx(styles.blogPostData, 'margin-vert--md')}>
75
- <time dateTime={date}>{formattedDate}</time>
84
+ <time dateTime={date} itemProp="datePublished">
85
+ {formattedDate}
86
+ </time>
76
87
 
77
- {readingTime && (
88
+ {typeof readingTime !== 'undefined' && (
78
89
  <>
79
90
  {' · '}
80
91
  {readingTimePlural(readingTime)}
81
92
  </>
82
93
  )}
83
94
  </div>
84
- <div className="avatar margin-vert--md">
85
- {authorImageURL && (
86
- <Link className="avatar__photo-link avatar__photo" href={authorURL}>
87
- <img src={authorImageURL} alt={author} />
88
- </Link>
89
- )}
90
- <div className="avatar__intro">
91
- {author && (
92
- <>
93
- <div className="avatar__name">
94
- <Link href={authorURL}>{author}</Link>
95
- </div>
96
- <small className="avatar__subtitle">{authorTitle}</small>
97
- </>
98
- )}
99
- </div>
100
- </div>
95
+ <BlogPostAuthors authors={authors} assets={assets} />
101
96
  </header>
102
97
  );
103
98
  };
104
99
 
105
100
  return (
106
- <>
107
- <Seo {...{keywords, image}} />
101
+ <article
102
+ className={!isBlogPostPage ? 'margin-bottom--xl' : undefined}
103
+ itemProp="blogPost"
104
+ itemScope
105
+ itemType="http://schema.org/BlogPosting">
106
+ {renderPostHeader()}
108
107
 
109
- <article className={!isBlogPostPage ? 'margin-bottom--xl' : undefined}>
110
- {renderPostHeader()}
111
- <div className="markdown">
112
- <MDXProvider components={MDXComponents}>{children}</MDXProvider>
113
- </div>
114
- {(tags.length > 0 || truncated) && (
115
- <footer
116
- className={clsx('row docusaurus-mt-lg', {
117
- [styles.blogPostDetailsFull]: isBlogPostPage,
118
- })}>
119
- {tags.length > 0 && (
120
- <div className="col">
108
+ {image && (
109
+ <meta itemProp="image" content={withBaseUrl(image, {absolute: true})} />
110
+ )}
111
+
112
+ <div className="markdown" itemProp="articleBody">
113
+ <MDXProvider components={MDXComponents}>{children}</MDXProvider>
114
+ </div>
115
+
116
+ {(tagsExists || truncated) && (
117
+ <footer
118
+ className={clsx('row docusaurus-mt-lg', {
119
+ [styles.blogPostDetailsFull]: isBlogPostPage,
120
+ })}>
121
+ {tagsExists && (
122
+ <div className={clsx('col', {'col--9': truncatedPost})}>
123
+ <TagsListInline tags={tags} />
124
+ </div>
125
+ )}
126
+
127
+ {isBlogPostPage && editUrl && (
128
+ <div className="col margin-top--sm">
129
+ <EditThisPage editUrl={editUrl} />
130
+ </div>
131
+ )}
132
+
133
+ {truncatedPost && (
134
+ <div
135
+ className={clsx('col text--right', {
136
+ 'col--3': tagsExists,
137
+ })}>
138
+ <Link
139
+ to={metadata.permalink}
140
+ aria-label={`Read more about ${title}`}>
121
141
  <b>
122
142
  <Translate
123
- id="theme.tags.tagsListLabel"
124
- description="The label alongside a tag list">
125
- Tags:
143
+ id="theme.blog.post.readMore"
144
+ description="The label used in blog post item excerpts to link to full blog posts">
145
+ Read More
126
146
  </Translate>
127
147
  </b>
128
- {tags.map(({label, permalink: tagPermalink}) => (
129
- <Link
130
- key={tagPermalink}
131
- className="margin-horiz--sm"
132
- to={tagPermalink}>
133
- {label}
134
- </Link>
135
- ))}
136
- </div>
137
- )}
138
-
139
- {isBlogPostPage && editUrl && (
140
- <div className="col margin-top--sm">
141
- <EditThisPage editUrl={editUrl} />
142
- </div>
143
- )}
144
-
145
- {!isBlogPostPage && truncated && (
146
- <div className="col text--right">
147
- <Link
148
- to={metadata.permalink}
149
- aria-label={`Read more about ${title}`}>
150
- <b>
151
- <Translate
152
- id="theme.blog.post.readMore"
153
- description="The label used in blog post item excerpts to link to full blog posts">
154
- Read More
155
- </Translate>
156
- </b>
157
- </Link>
158
- </div>
159
- )}
160
- </footer>
161
- )}
162
- </article>
163
- </>
148
+ </Link>
149
+ </div>
150
+ )}
151
+ </footer>
152
+ )}
153
+ </article>
164
154
  );
165
155
  }
166
156
 
@@ -6,52 +6,89 @@
6
6
  */
7
7
 
8
8
  import React from 'react';
9
- import Layout from '@theme/Layout';
9
+ import Seo from '@theme/Seo';
10
+ import BlogLayout from '@theme/BlogLayout';
10
11
  import BlogPostItem from '@theme/BlogPostItem';
11
12
  import BlogPostPaginator from '@theme/BlogPostPaginator';
12
13
  import type {Props} from '@theme/BlogPostPage';
13
- import BlogSidebar from '@theme/BlogSidebar';
14
- import TOC from '@theme/TOC';
15
14
  import {ThemeClassNames} from '@docusaurus/theme-common';
15
+ import TOC from '@theme/TOC';
16
16
 
17
17
  function BlogPostPage(props: Props): JSX.Element {
18
18
  const {content: BlogPostContents, sidebar} = props;
19
- const {frontMatter, metadata} = BlogPostContents;
20
- const {title, description, nextItem, prevItem} = metadata;
21
- const {hide_table_of_contents: hideTableOfContents} = frontMatter;
19
+ const {
20
+ // TODO this frontmatter is not validated/normalized, it's the raw user-provided one. We should expose normalized one too!
21
+ frontMatter,
22
+ assets,
23
+ metadata,
24
+ } = BlogPostContents;
25
+ const {title, description, nextItem, prevItem, date, tags, authors} =
26
+ metadata;
27
+ const {
28
+ hide_table_of_contents: hideTableOfContents,
29
+ keywords,
30
+ toc_min_heading_level: tocMinHeadingLevel,
31
+ toc_max_heading_level: tocMaxHeadingLevel,
32
+ } = frontMatter;
33
+
34
+ const image = assets.image ?? frontMatter.image;
22
35
 
23
36
  return (
24
- <Layout
25
- title={title}
26
- description={description}
37
+ <BlogLayout
27
38
  wrapperClassName={ThemeClassNames.wrapper.blogPages}
28
- pageClassName={ThemeClassNames.page.blogPostPage}>
29
- {BlogPostContents && (
30
- <div className="container margin-vert--lg">
31
- <div className="row">
32
- <aside className="col col--3">
33
- <BlogSidebar sidebar={sidebar} />
34
- </aside>
35
- <main className="col col--7">
36
- <BlogPostItem
37
- frontMatter={frontMatter}
38
- metadata={metadata}
39
- isBlogPostPage>
40
- <BlogPostContents />
41
- </BlogPostItem>
42
- {(nextItem || prevItem) && (
43
- <BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
44
- )}
45
- </main>
46
- {!hideTableOfContents && BlogPostContents.toc && (
47
- <div className="col col--2">
48
- <TOC toc={BlogPostContents.toc} />
49
- </div>
50
- )}
51
- </div>
52
- </div>
39
+ pageClassName={ThemeClassNames.page.blogPostPage}
40
+ sidebar={sidebar}
41
+ toc={
42
+ !hideTableOfContents &&
43
+ BlogPostContents.toc &&
44
+ BlogPostContents.toc.length > 0 ? (
45
+ <TOC
46
+ toc={BlogPostContents.toc}
47
+ minHeadingLevel={tocMinHeadingLevel}
48
+ maxHeadingLevel={tocMaxHeadingLevel}
49
+ />
50
+ ) : undefined
51
+ }>
52
+ <Seo
53
+ // TODO refactor needed: it's a bit annoying but Seo MUST be inside BlogLayout
54
+ // otherwise default image (set by BlogLayout) would shadow the custom blog post image
55
+ title={title}
56
+ description={description}
57
+ keywords={keywords}
58
+ image={image}>
59
+ <meta property="og:type" content="article" />
60
+ <meta property="article:published_time" content={date} />
61
+
62
+ {/* TODO double check those article metas array syntaxes, see https://ogp.me/#array */}
63
+ {authors.some((author) => author.url) && (
64
+ <meta
65
+ property="article:author"
66
+ content={authors
67
+ .map((author) => author.url)
68
+ .filter(Boolean)
69
+ .join(',')}
70
+ />
71
+ )}
72
+ {tags.length > 0 && (
73
+ <meta
74
+ property="article:tag"
75
+ content={tags.map((tag) => tag.label).join(',')}
76
+ />
77
+ )}
78
+ </Seo>
79
+
80
+ <BlogPostItem
81
+ frontMatter={frontMatter}
82
+ assets={assets}
83
+ metadata={metadata}
84
+ isBlogPostPage>
85
+ <BlogPostContents />
86
+ </BlogPostItem>
87
+
88
+ {(nextItem || prevItem) && (
89
+ <BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
53
90
  )}
54
- </Layout>
91
+ </BlogLayout>
55
92
  );
56
93
  }
57
94
 
@@ -34,10 +34,10 @@
34
34
  text-decoration: none;
35
35
  }
36
36
  .sidebarItemLinkActive {
37
- color: var(--ifm-color-primary);
37
+ color: var(--ifm-color-primary) !important;
38
38
  }
39
39
 
40
- @media only screen and (max-width: 996px) {
40
+ @media (max-width: 996px) {
41
41
  .sidebar {
42
42
  display: none;
43
43
  }
@@ -7,73 +7,30 @@
7
7
 
8
8
  import React from 'react';
9
9
 
10
- import Layout from '@theme/Layout';
11
- import Link from '@docusaurus/Link';
10
+ import BlogLayout from '@theme/BlogLayout';
11
+ import TagsListByLetter from '@theme/TagsListByLetter';
12
12
  import type {Props} from '@theme/BlogTagsListPage';
13
- import BlogSidebar from '@theme/BlogSidebar';
14
- import {translate} from '@docusaurus/Translate';
15
- import {ThemeClassNames} from '@docusaurus/theme-common';
16
-
17
- function getCategoryOfTag(tag: string) {
18
- // tag's category should be customizable
19
- return tag[0].toUpperCase();
20
- }
13
+ import {
14
+ ThemeClassNames,
15
+ translateTagsPageTitle,
16
+ } from '@docusaurus/theme-common';
21
17
 
22
18
  function BlogTagsListPage(props: Props): JSX.Element {
23
19
  const {tags, sidebar} = props;
24
- const title = translate({
25
- id: 'theme.tags.tagsPageTitle',
26
- message: 'Tags',
27
- description: 'The title of the tag list page',
28
- });
29
-
30
- const tagCategories: {[category: string]: string[]} = {};
31
- Object.keys(tags).forEach((tag) => {
32
- const category = getCategoryOfTag(tag);
33
- tagCategories[category] = tagCategories[category] || [];
34
- tagCategories[category].push(tag);
35
- });
36
- const tagsList = Object.entries(tagCategories).sort(([a], [b]) =>
37
- a.localeCompare(b),
38
- );
39
- const tagsSection = tagsList
40
- .map(([category, tagsForCategory]) => (
41
- <article key={category}>
42
- <h2>{category}</h2>
43
- {tagsForCategory.map((tag) => (
44
- <Link
45
- className="padding-right--md"
46
- href={tags[tag].permalink}
47
- key={tag}>
48
- {tags[tag].name} ({tags[tag].count})
49
- </Link>
50
- ))}
51
- <hr />
52
- </article>
53
- ))
54
- .filter((item) => item != null);
55
-
20
+ const title = translateTagsPageTitle();
56
21
  return (
57
- <Layout
22
+ <BlogLayout
58
23
  title={title}
59
24
  wrapperClassName={ThemeClassNames.wrapper.blogPages}
60
25
  pageClassName={ThemeClassNames.page.blogTagsListPage}
61
26
  searchMetadatas={{
62
27
  // assign unique search tag to exclude this page from search results!
63
28
  tag: 'blog_tags_list',
64
- }}>
65
- <div className="container margin-vert--lg">
66
- <div className="row">
67
- <aside className="col col--3">
68
- <BlogSidebar sidebar={sidebar} />
69
- </aside>
70
- <main className="col col--7">
71
- <h1>{title}</h1>
72
- <section className="margin-vert--lg">{tagsSection}</section>
73
- </main>
74
- </div>
75
- </div>
76
- </Layout>
29
+ }}
30
+ sidebar={sidebar}>
31
+ <h1>{title}</h1>
32
+ <TagsListByLetter tags={Object.values(tags)} />
33
+ </BlogLayout>
77
34
  );
78
35
  }
79
36
 
@@ -7,11 +7,10 @@
7
7
 
8
8
  import React from 'react';
9
9
 
10
- import Layout from '@theme/Layout';
11
- import BlogPostItem from '@theme/BlogPostItem';
12
10
  import Link from '@docusaurus/Link';
11
+ import BlogLayout from '@theme/BlogLayout';
12
+ import BlogPostItem from '@theme/BlogPostItem';
13
13
  import type {Props} from '@theme/BlogTagsPostsPage';
14
- import BlogSidebar from '@theme/BlogSidebar';
15
14
  import Translate, {translate} from '@docusaurus/Translate';
16
15
  import {ThemeClassNames, usePluralForm} from '@docusaurus/theme-common';
17
16
 
@@ -33,7 +32,7 @@ function useBlogPostsPlural() {
33
32
  );
34
33
  }
35
34
 
36
- function BlogTagsPostPage(props: Props): JSX.Element {
35
+ export default function BlogTagsPostsPage(props: Props): JSX.Element {
37
36
  const {metadata, items, sidebar} = props;
38
37
  const {allTagsPath, name: tagName, count} = metadata;
39
38
  const blogPostsPlural = useBlogPostsPlural();
@@ -47,46 +46,37 @@ function BlogTagsPostPage(props: Props): JSX.Element {
47
46
  );
48
47
 
49
48
  return (
50
- <Layout
49
+ <BlogLayout
51
50
  title={title}
52
51
  wrapperClassName={ThemeClassNames.wrapper.blogPages}
53
- pageClassName={ThemeClassNames.page.blogTagsPostPage}
52
+ pageClassName={ThemeClassNames.page.blogTagPostListPage}
54
53
  searchMetadatas={{
55
54
  // assign unique search tag to exclude this page from search results!
56
55
  tag: 'blog_tags_posts',
57
- }}>
58
- <div className="container margin-vert--lg">
59
- <div className="row">
60
- <aside className="col col--3">
61
- <BlogSidebar sidebar={sidebar} />
62
- </aside>
63
- <main className="col col--7">
64
- <header className="margin-bottom--xl">
65
- <h1>{title}</h1>
56
+ }}
57
+ sidebar={sidebar}>
58
+ <header className="margin-bottom--xl">
59
+ <h1>{title}</h1>
66
60
 
67
- <Link href={allTagsPath}>
68
- <Translate
69
- id="theme.tags.tagsPageLink"
70
- description="The label of the link targeting the tag list page">
71
- View All Tags
72
- </Translate>
73
- </Link>
74
- </header>
61
+ <Link href={allTagsPath}>
62
+ <Translate
63
+ id="theme.tags.tagsPageLink"
64
+ description="The label of the link targeting the tag list page">
65
+ View All Tags
66
+ </Translate>
67
+ </Link>
68
+ </header>
75
69
 
76
- {items.map(({content: BlogPostContent}) => (
77
- <BlogPostItem
78
- key={BlogPostContent.metadata.permalink}
79
- frontMatter={BlogPostContent.frontMatter}
80
- metadata={BlogPostContent.metadata}
81
- truncated>
82
- <BlogPostContent />
83
- </BlogPostItem>
84
- ))}
85
- </main>
86
- </div>
87
- </div>
88
- </Layout>
70
+ {items.map(({content: BlogPostContent}) => (
71
+ <BlogPostItem
72
+ key={BlogPostContent.metadata.permalink}
73
+ frontMatter={BlogPostContent.frontMatter}
74
+ assets={BlogPostContent.assets}
75
+ metadata={BlogPostContent.metadata}
76
+ truncated>
77
+ <BlogPostContent />
78
+ </BlogPostItem>
79
+ ))}
80
+ </BlogLayout>
89
81
  );
90
82
  }
91
-
92
- export default BlogTagsPostPage;