@docusaurus/theme-classic 2.0.0-beta.1 → 2.0.0-beta.10

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 (367) hide show
  1. package/README.md +1 -1
  2. package/lib/__tests__/validateThemeConfig.test.js +277 -3
  3. package/lib/admonitions.css +35 -0
  4. package/lib/deps.d.ts +13 -0
  5. package/lib/index.js +41 -16
  6. package/lib/prism-include-languages.js +9 -5
  7. package/lib/theme/AnnouncementBar/index.js +10 -16
  8. package/lib/theme/AnnouncementBar/styles.module.css +25 -30
  9. package/lib/theme/BackToTopButton/index.js +140 -0
  10. package/lib/theme/BackToTopButton/styles.module.css +42 -0
  11. package/lib/theme/BlogArchivePage/index.js +89 -0
  12. package/lib/theme/BlogLayout/index.js +51 -0
  13. package/lib/theme/BlogListPage/index.js +10 -21
  14. package/lib/theme/BlogPostAuthor/index.js +51 -0
  15. package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
  16. package/lib/theme/BlogPostAuthors/index.js +47 -0
  17. package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
  18. package/lib/theme/BlogPostItem/index.js +58 -67
  19. package/lib/theme/BlogPostPage/index.js +37 -24
  20. package/lib/theme/BlogSidebar/index.js +5 -7
  21. package/lib/theme/BlogSidebar/styles.module.css +2 -2
  22. package/lib/theme/BlogTagsListPage/index.js +8 -44
  23. package/lib/theme/BlogTagsPostsPage/index.js +24 -38
  24. package/lib/theme/CodeBlock/index.js +18 -138
  25. package/lib/theme/CodeBlock/styles.module.css +6 -9
  26. package/lib/theme/Details/index.js +30 -0
  27. package/lib/theme/Details/styles.module.css +13 -0
  28. package/lib/theme/DocCard/index.js +84 -0
  29. package/lib/theme/DocCard/styles.module.css +43 -0
  30. package/lib/theme/DocCardList/index.js +28 -0
  31. package/lib/theme/DocCategoryGeneratedIndexPage/index.js +57 -0
  32. package/lib/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  33. package/lib/theme/DocItem/index.js +29 -46
  34. package/lib/theme/DocItem/styles.module.css +5 -9
  35. package/lib/theme/DocItemFooter/index.js +79 -0
  36. package/lib/theme/DocItemFooter/styles.module.css +18 -0
  37. package/lib/theme/DocPage/index.js +35 -52
  38. package/lib/theme/DocPage/styles.module.css +8 -23
  39. package/lib/theme/DocPaginator/index.js +6 -7
  40. package/lib/theme/DocSidebar/index.js +53 -235
  41. package/lib/theme/DocSidebar/styles.module.css +0 -18
  42. package/lib/theme/DocSidebarItem/index.js +209 -0
  43. package/lib/theme/DocSidebarItem/styles.module.css +19 -0
  44. package/lib/theme/DocTagDocListPage/index.js +89 -0
  45. package/lib/theme/DocTagsListPage/index.js +44 -0
  46. package/lib/theme/DocVersionBadge/index.js +34 -0
  47. package/lib/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +39 -20
  48. package/lib/theme/EditThisPage/index.js +3 -1
  49. package/lib/theme/ErrorPageContent.js +43 -0
  50. package/lib/theme/Footer/index.js +16 -5
  51. package/lib/theme/Heading/index.js +17 -22
  52. package/lib/theme/Heading/styles.css +5 -6
  53. package/lib/theme/Heading/styles.module.css +9 -5
  54. package/lib/theme/IconArrow/index.js +2 -2
  55. package/lib/theme/IconClose/index.js +31 -0
  56. package/lib/theme/IconEdit/index.js +3 -3
  57. package/lib/theme/IconExternalLink/index.js +3 -3
  58. package/lib/theme/IconLanguage/index.js +3 -3
  59. package/lib/theme/IconMenu/index.js +3 -3
  60. package/lib/theme/LastUpdated/index.js +4 -2
  61. package/lib/theme/Layout/index.js +5 -1
  62. package/lib/theme/LayoutHead/index.js +22 -17
  63. package/lib/theme/LayoutProviders/index.js +11 -5
  64. package/lib/theme/Logo/index.js +16 -14
  65. package/lib/theme/MDXComponents/index.js +45 -4
  66. package/lib/theme/MDXComponents/styles.css +11 -0
  67. package/lib/theme/MDXPage/index.js +2 -1
  68. package/lib/theme/Navbar/index.js +162 -42
  69. package/lib/theme/Navbar/styles.module.css +10 -3
  70. package/lib/theme/NavbarItem/DefaultNavbarItem.js +27 -123
  71. package/lib/theme/NavbarItem/DocNavbarItem.js +7 -8
  72. package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +19 -12
  73. package/lib/theme/NavbarItem/DropdownNavbarItem.js +155 -0
  74. package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +6 -10
  75. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  76. package/lib/theme/NavbarItem/index.js +31 -11
  77. package/lib/theme/{SearchMetadatas → SearchMetadata}/index.js +2 -2
  78. package/lib/theme/Seo/index.js +10 -7
  79. package/lib/theme/SkipToContent/index.js +12 -4
  80. package/lib/theme/SkipToContent/styles.module.css +1 -0
  81. package/lib/theme/TOC/index.js +9 -29
  82. package/lib/theme/TOC/styles.module.css +1 -1
  83. package/lib/theme/TOCCollapsible/index.js +53 -0
  84. package/lib/theme/TOCCollapsible/styles.module.css +50 -0
  85. package/lib/theme/TOCInline/index.js +7 -27
  86. package/lib/theme/TOCItems/index.js +78 -0
  87. package/lib/theme/Tabs/__tests__/index.test.js +123 -0
  88. package/lib/theme/Tabs/index.js +73 -50
  89. package/lib/theme/Tabs/styles.module.css +0 -13
  90. package/lib/theme/Tag/index.js +40 -0
  91. package/lib/theme/Tag/styles.module.css +70 -0
  92. package/lib/theme/TagsListByLetter/index.js +48 -0
  93. package/lib/theme/TagsListByLetter/styles.module.css +11 -0
  94. package/lib/theme/TagsListInline/index.js +44 -0
  95. package/lib/theme/TagsListInline/styles.module.css +15 -0
  96. package/lib/theme/ThemeProvider/index.js +8 -3
  97. package/lib/theme/ThemedImage/index.js +6 -7
  98. package/lib/theme/Toggle/index.js +41 -44
  99. package/lib/theme/Toggle/styles.module.css +91 -3
  100. package/lib/theme/UserPreferencesProvider/index.js +9 -12
  101. package/lib/theme/hooks/useHideableNavbar.js +14 -32
  102. package/lib/theme/hooks/useTabGroupChoice.js +2 -4
  103. package/lib/theme/hooks/useTheme.js +3 -5
  104. package/lib/theme/hooks/useWindowSize.js +33 -20
  105. package/lib/theme/prism-include-languages.js +4 -3
  106. package/lib/theme-classic.d.ts +806 -0
  107. package/lib/translations.js +4 -4
  108. package/lib/types.d.ts +0 -599
  109. package/lib/validateThemeConfig.js +230 -246
  110. package/lib-next/__tests__/validateThemeConfig.test.js +277 -3
  111. package/lib-next/admonitions.css +35 -0
  112. package/lib-next/deps.d.ts +13 -0
  113. package/lib-next/index.js +45 -13
  114. package/lib-next/prism-include-languages.js +0 -2
  115. package/lib-next/theme/AnnouncementBar/index.js +9 -18
  116. package/lib-next/theme/AnnouncementBar/styles.module.css +25 -30
  117. package/lib-next/theme/BackToTopButton/index.js +131 -0
  118. package/lib-next/theme/BackToTopButton/styles.module.css +42 -0
  119. package/lib-next/theme/BlogArchivePage/index.js +80 -0
  120. package/lib-next/theme/BlogLayout/index.js +40 -0
  121. package/lib-next/theme/BlogListPage/index.js +17 -25
  122. package/lib-next/theme/BlogPostAuthor/index.js +46 -0
  123. package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
  124. package/lib-next/theme/BlogPostAuthors/index.js +34 -0
  125. package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
  126. package/lib-next/theme/BlogPostItem/index.js +79 -86
  127. package/lib-next/theme/BlogPostPage/index.js +70 -35
  128. package/lib-next/theme/BlogSidebar/index.js +11 -13
  129. package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
  130. package/lib-next/theme/BlogTagsListPage/index.js +14 -55
  131. package/lib-next/theme/BlogTagsPostsPage/index.js +29 -39
  132. package/lib-next/theme/CodeBlock/index.js +17 -149
  133. package/lib-next/theme/CodeBlock/styles.module.css +6 -9
  134. package/lib-next/theme/Details/index.js +20 -0
  135. package/lib-next/theme/Details/styles.module.css +13 -0
  136. package/lib-next/theme/DocCard/index.js +80 -0
  137. package/lib-next/theme/DocCard/styles.module.css +43 -0
  138. package/lib-next/theme/DocCardList/index.js +19 -0
  139. package/lib-next/theme/DocCategoryGeneratedIndexPage/index.js +49 -0
  140. package/lib-next/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  141. package/lib-next/theme/DocItem/index.js +40 -56
  142. package/lib-next/theme/DocItem/styles.module.css +5 -9
  143. package/lib-next/theme/DocItemFooter/index.js +79 -0
  144. package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
  145. package/lib-next/theme/DocPage/index.js +46 -47
  146. package/lib-next/theme/DocPage/styles.module.css +8 -23
  147. package/lib-next/theme/DocPaginator/index.js +7 -11
  148. package/lib-next/theme/DocSidebar/index.js +69 -295
  149. package/lib-next/theme/DocSidebar/styles.module.css +0 -18
  150. package/lib-next/theme/DocSidebarItem/index.js +217 -0
  151. package/lib-next/theme/DocSidebarItem/styles.module.css +19 -0
  152. package/lib-next/theme/DocTagDocListPage/index.js +89 -0
  153. package/lib-next/theme/DocTagsListPage/index.js +38 -0
  154. package/lib-next/theme/DocVersionBadge/index.js +27 -0
  155. package/lib-next/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +51 -36
  156. package/lib-next/theme/EditThisPage/index.js +6 -1
  157. package/lib-next/theme/ErrorPageContent.js +35 -0
  158. package/lib-next/theme/Footer/index.js +27 -5
  159. package/lib-next/theme/Heading/index.js +25 -29
  160. package/lib-next/theme/Heading/styles.css +5 -6
  161. package/lib-next/theme/Heading/styles.module.css +9 -5
  162. package/lib-next/theme/IconArrow/index.js +2 -2
  163. package/lib-next/theme/IconClose/index.js +23 -0
  164. package/lib-next/theme/IconEdit/index.js +2 -2
  165. package/lib-next/theme/IconExternalLink/index.js +2 -2
  166. package/lib-next/theme/IconLanguage/index.js +2 -2
  167. package/lib-next/theme/IconMenu/index.js +2 -2
  168. package/lib-next/theme/LastUpdated/index.js +3 -2
  169. package/lib-next/theme/Layout/index.js +3 -1
  170. package/lib-next/theme/LayoutHead/index.js +18 -23
  171. package/lib-next/theme/LayoutProviders/index.js +17 -6
  172. package/lib-next/theme/Logo/index.js +25 -21
  173. package/lib-next/theme/MDXComponents/index.js +34 -7
  174. package/lib-next/theme/MDXComponents/styles.css +11 -0
  175. package/lib-next/theme/MDXPage/index.js +10 -2
  176. package/lib-next/theme/Navbar/index.js +193 -56
  177. package/lib-next/theme/Navbar/styles.module.css +10 -3
  178. package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +45 -147
  179. package/lib-next/theme/NavbarItem/DocNavbarItem.js +7 -7
  180. package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +31 -19
  181. package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +159 -0
  182. package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +4 -12
  183. package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  184. package/lib-next/theme/NavbarItem/index.js +25 -12
  185. package/lib-next/theme/{SearchMetadatas → SearchMetadata}/index.js +1 -1
  186. package/lib-next/theme/Seo/index.js +11 -7
  187. package/lib-next/theme/SkipToContent/index.js +7 -8
  188. package/lib-next/theme/SkipToContent/styles.module.css +1 -0
  189. package/lib-next/theme/TOC/index.js +12 -36
  190. package/lib-next/theme/TOC/styles.module.css +1 -1
  191. package/lib-next/theme/TOCCollapsible/index.js +54 -0
  192. package/lib-next/theme/TOCCollapsible/styles.module.css +50 -0
  193. package/lib-next/theme/TOCInline/index.js +10 -28
  194. package/lib-next/theme/TOCItems/index.js +85 -0
  195. package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
  196. package/lib-next/theme/Tabs/index.js +91 -43
  197. package/lib-next/theme/Tabs/styles.module.css +0 -13
  198. package/lib-next/theme/Tag/index.js +27 -0
  199. package/lib-next/theme/Tag/styles.module.css +70 -0
  200. package/lib-next/theme/TagsListByLetter/index.js +42 -0
  201. package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
  202. package/lib-next/theme/TagsListInline/index.js +31 -0
  203. package/lib-next/theme/TagsListInline/styles.module.css +15 -0
  204. package/lib-next/theme/ThemeProvider/index.js +10 -7
  205. package/lib-next/theme/ThemedImage/index.js +7 -8
  206. package/lib-next/theme/Toggle/index.js +34 -37
  207. package/lib-next/theme/Toggle/styles.module.css +91 -3
  208. package/lib-next/theme/UserPreferencesProvider/index.js +9 -10
  209. package/lib-next/theme/hooks/useHideableNavbar.js +31 -44
  210. package/lib-next/theme/hooks/useTabGroupChoice.js +2 -4
  211. package/lib-next/theme/hooks/useTheme.js +4 -5
  212. package/lib-next/theme/hooks/useWindowSize.js +34 -20
  213. package/lib-next/theme/prism-include-languages.js +2 -1
  214. package/lib-next/theme-classic.d.ts +806 -0
  215. package/lib-next/translations.js +6 -10
  216. package/lib-next/types.d.ts +0 -599
  217. package/lib-next/validateThemeConfig.js +141 -114
  218. package/package.json +28 -25
  219. package/src/__tests__/validateThemeConfig.test.js +277 -3
  220. package/src/admonitions.css +35 -0
  221. package/src/deps.d.ts +13 -0
  222. package/src/index.ts +55 -22
  223. package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
  224. package/src/theme/AnnouncementBar/index.tsx +10 -17
  225. package/src/theme/AnnouncementBar/styles.module.css +25 -30
  226. package/src/theme/BackToTopButton/index.tsx +142 -0
  227. package/src/theme/BackToTopButton/styles.module.css +42 -0
  228. package/src/theme/BlogArchivePage/index.tsx +91 -0
  229. package/src/theme/BlogLayout/index.tsx +44 -0
  230. package/src/theme/BlogListPage/index.tsx +18 -25
  231. package/src/theme/BlogPostAuthor/index.tsx +49 -0
  232. package/src/theme/BlogPostAuthor/styles.module.css +12 -0
  233. package/src/theme/BlogPostAuthors/index.tsx +39 -0
  234. package/src/theme/BlogPostAuthors/styles.module.css +11 -0
  235. package/src/theme/BlogPostItem/index.tsx +70 -80
  236. package/src/theme/BlogPostPage/index.tsx +72 -35
  237. package/src/theme/BlogSidebar/index.tsx +11 -13
  238. package/src/theme/BlogSidebar/styles.module.css +2 -2
  239. package/src/theme/BlogTagsListPage/index.tsx +14 -57
  240. package/src/theme/BlogTagsPostsPage/index.tsx +29 -39
  241. package/src/theme/CodeBlock/index.tsx +21 -151
  242. package/src/theme/CodeBlock/styles.module.css +6 -9
  243. package/src/theme/Details/index.tsx +24 -0
  244. package/src/theme/Details/styles.module.css +13 -0
  245. package/src/theme/DocCard/index.tsx +100 -0
  246. package/src/theme/DocCard/styles.module.css +43 -0
  247. package/src/theme/DocCardList/index.tsx +27 -0
  248. package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +53 -0
  249. package/src/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  250. package/src/theme/DocItem/index.tsx +43 -56
  251. package/src/theme/DocItem/styles.module.css +5 -9
  252. package/src/theme/DocItemFooter/index.tsx +91 -0
  253. package/src/theme/DocItemFooter/styles.module.css +18 -0
  254. package/src/theme/DocPage/index.tsx +44 -42
  255. package/src/theme/DocPage/styles.module.css +8 -23
  256. package/src/theme/DocPaginator/index.tsx +9 -13
  257. package/src/theme/DocSidebar/index.tsx +80 -307
  258. package/src/theme/DocSidebar/styles.module.css +0 -18
  259. package/src/theme/DocSidebarItem/index.tsx +242 -0
  260. package/src/theme/DocSidebarItem/styles.module.css +19 -0
  261. package/src/theme/DocTagDocListPage/index.tsx +89 -0
  262. package/src/theme/DocTagsListPage/index.tsx +41 -0
  263. package/src/theme/DocVersionBadge/index.tsx +30 -0
  264. package/src/theme/{DocVersionSuggestions → DocVersionBanner}/index.tsx +74 -44
  265. package/src/theme/EditThisPage/index.tsx +6 -1
  266. package/src/theme/ErrorPageContent.tsx +41 -0
  267. package/src/theme/Footer/index.tsx +30 -6
  268. package/src/theme/Heading/index.tsx +25 -31
  269. package/src/theme/Heading/styles.css +5 -6
  270. package/src/theme/Heading/styles.module.css +9 -5
  271. package/src/theme/IconArrow/index.tsx +2 -2
  272. package/src/theme/IconClose/index.tsx +26 -0
  273. package/src/theme/IconEdit/index.tsx +2 -2
  274. package/src/theme/IconExternalLink/index.tsx +2 -5
  275. package/src/theme/IconLanguage/index.tsx +2 -6
  276. package/src/theme/IconMenu/index.tsx +3 -3
  277. package/src/theme/LastUpdated/index.tsx +3 -2
  278. package/src/theme/Layout/index.tsx +3 -1
  279. package/src/theme/LayoutHead/index.tsx +18 -17
  280. package/src/theme/LayoutProviders/index.tsx +17 -6
  281. package/src/theme/Logo/index.tsx +21 -17
  282. package/src/theme/MDXComponents/index.tsx +39 -5
  283. package/src/theme/MDXComponents/styles.css +11 -0
  284. package/src/theme/MDXPage/index.tsx +10 -2
  285. package/src/theme/Navbar/index.tsx +203 -61
  286. package/src/theme/Navbar/styles.module.css +10 -3
  287. package/src/theme/NavbarItem/DefaultNavbarItem.tsx +42 -154
  288. package/src/theme/NavbarItem/DocNavbarItem.tsx +12 -16
  289. package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +33 -21
  290. package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
  291. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +181 -0
  292. package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +8 -9
  293. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  294. package/src/theme/NavbarItem/index.tsx +41 -16
  295. package/src/theme/{SearchMetadatas → SearchMetadata}/index.tsx +2 -2
  296. package/src/theme/Seo/index.tsx +7 -4
  297. package/src/theme/SkipToContent/index.tsx +7 -8
  298. package/src/theme/SkipToContent/styles.module.css +1 -0
  299. package/src/theme/TOC/index.tsx +12 -41
  300. package/src/theme/TOC/styles.module.css +1 -1
  301. package/src/theme/TOCCollapsible/index.tsx +58 -0
  302. package/src/theme/TOCCollapsible/styles.module.css +50 -0
  303. package/src/theme/TOCInline/index.tsx +13 -32
  304. package/src/theme/TOCItems/index.tsx +96 -0
  305. package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
  306. package/src/theme/Tabs/index.tsx +93 -49
  307. package/src/theme/Tabs/styles.module.css +0 -13
  308. package/src/theme/Tag/index.tsx +31 -0
  309. package/src/theme/Tag/styles.module.css +70 -0
  310. package/src/theme/TagsListByLetter/index.tsx +45 -0
  311. package/src/theme/TagsListByLetter/styles.module.css +11 -0
  312. package/src/theme/TagsListInline/index.tsx +35 -0
  313. package/src/theme/TagsListInline/styles.module.css +15 -0
  314. package/src/theme/ThemeProvider/index.tsx +6 -2
  315. package/src/theme/ThemedImage/index.tsx +8 -8
  316. package/src/theme/Toggle/index.tsx +36 -43
  317. package/src/theme/Toggle/styles.module.css +91 -3
  318. package/src/theme/UserPreferencesProvider/index.tsx +9 -11
  319. package/src/theme/hooks/useHideableNavbar.ts +32 -45
  320. package/src/theme/hooks/useTabGroupChoice.ts +4 -4
  321. package/src/theme/hooks/useTheme.ts +4 -5
  322. package/src/theme/hooks/useWindowSize.ts +38 -20
  323. package/src/theme/prism-include-languages.ts +3 -2
  324. package/src/theme-classic.d.ts +806 -0
  325. package/src/translations.ts +8 -10
  326. package/src/types.d.ts +0 -599
  327. package/src/{validateThemeConfig.js → validateThemeConfig.ts} +151 -94
  328. package/tsconfig.json +1 -2
  329. package/codeTranslations/README.md +0 -20
  330. package/codeTranslations/ar.json +0 -57
  331. package/codeTranslations/base.json +0 -112
  332. package/codeTranslations/bn.json +0 -56
  333. package/codeTranslations/da.json +0 -57
  334. package/codeTranslations/de.json +0 -57
  335. package/codeTranslations/es.json +0 -57
  336. package/codeTranslations/fa.json +0 -57
  337. package/codeTranslations/fil.json +0 -57
  338. package/codeTranslations/fr.json +0 -57
  339. package/codeTranslations/he.json +0 -57
  340. package/codeTranslations/hi.json +0 -57
  341. package/codeTranslations/ja.json +0 -57
  342. package/codeTranslations/ko.json +0 -57
  343. package/codeTranslations/pl.json +0 -57
  344. package/codeTranslations/pt-BR.json +0 -57
  345. package/codeTranslations/pt-PT.json +0 -57
  346. package/codeTranslations/ru.json +0 -57
  347. package/codeTranslations/tr.json +0 -57
  348. package/codeTranslations/vi.json +0 -57
  349. package/codeTranslations/zh-Hans.json +0 -57
  350. package/codeTranslations/zh-Hant.json +0 -57
  351. package/lib/theme/Toggle/styles.css +0 -103
  352. package/lib/theme/hooks/useAnnouncementBar.js +0 -63
  353. package/lib/theme/hooks/useContextualSearchFilters.js +0 -47
  354. package/lib/theme/hooks/useScrollPosition.js +0 -49
  355. package/lib/theme/hooks/useTOCHighlight.js +0 -87
  356. package/lib-next/theme/Toggle/styles.css +0 -103
  357. package/lib-next/theme/hooks/useAnnouncementBar.js +0 -49
  358. package/lib-next/theme/hooks/useContextualSearchFilters.js +0 -41
  359. package/lib-next/theme/hooks/useScrollPosition.js +0 -38
  360. package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
  361. package/src/theme/Toggle/styles.css +0 -103
  362. package/src/theme/hooks/useAnnouncementBar.ts +0 -58
  363. package/src/theme/hooks/useContextualSearchFilters.ts +0 -52
  364. package/src/theme/hooks/useScrollPosition.ts +0 -45
  365. package/src/theme/hooks/useTOCHighlight.ts +0 -98
  366. package/update-code-translations.js +0 -239
  367. package/update-code-translations.test.js +0 -33
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import React, {useRef, useState} from 'react';
8
+ import clsx from 'clsx';
9
+ import {translate} from '@docusaurus/Translate';
10
+ import styles from './styles.module.css';
11
+ import {
12
+ ThemeClassNames,
13
+ useScrollPosition,
14
+ useLocationChange,
15
+ } from '@docusaurus/theme-common';
16
+ const threshold = 300; // Not all have support for smooth scrolling (particularly Safari mobile iOS)
17
+ // TODO proper detection is currently unreliable!
18
+ // see https://github.com/wessberg/scroll-behavior-polyfill/issues/16
19
+
20
+ const SupportsNativeSmoothScrolling = false; // const SupportsNativeSmoothScrolling = ExecutionEnvironment.canUseDOM && 'scrollBehavior' in document.documentElement.style;
21
+
22
+ function smoothScrollTopNative() {
23
+ window.scrollTo({
24
+ top: 0,
25
+ behavior: 'smooth',
26
+ });
27
+ return () => {
28
+ // Nothing to cancel, it's natively cancelled if user tries to scroll down
29
+ };
30
+ }
31
+
32
+ function smoothScrollTopPolyfill() {
33
+ let raf = null;
34
+
35
+ function rafRecursion() {
36
+ const currentScroll = document.documentElement.scrollTop;
37
+
38
+ if (currentScroll > 0) {
39
+ raf = requestAnimationFrame(rafRecursion);
40
+ window.scrollTo(0, Math.floor(currentScroll * 0.85));
41
+ }
42
+ }
43
+
44
+ rafRecursion(); // Break the recursion
45
+ // Prevents the user from "fighting" against that recursion producing a weird UX
46
+
47
+ return () => raf && cancelAnimationFrame(raf);
48
+ }
49
+
50
+ function useSmoothScrollToTop() {
51
+ const lastCancelRef = useRef(null);
52
+
53
+ function smoothScrollTop() {
54
+ lastCancelRef.current = SupportsNativeSmoothScrolling
55
+ ? smoothScrollTopNative()
56
+ : smoothScrollTopPolyfill();
57
+ }
58
+
59
+ return {
60
+ smoothScrollTop,
61
+ cancelScrollToTop: () => lastCancelRef.current?.(),
62
+ };
63
+ }
64
+
65
+ function BackToTopButton() {
66
+ const [show, setShow] = useState(false);
67
+ const isFocusedAnchor = useRef(false);
68
+ const {smoothScrollTop, cancelScrollToTop} = useSmoothScrollToTop();
69
+ useScrollPosition(({scrollY: scrollTop}, lastPosition) => {
70
+ const lastScrollTop = lastPosition?.scrollY; // No lastScrollTop means component is just being mounted.
71
+ // Not really a scroll event from the user, so we ignore it
72
+
73
+ if (!lastScrollTop) {
74
+ return;
75
+ }
76
+
77
+ if (isFocusedAnchor.current) {
78
+ isFocusedAnchor.current = false;
79
+ return;
80
+ }
81
+
82
+ const isScrollingUp = scrollTop < lastScrollTop;
83
+
84
+ if (!isScrollingUp) {
85
+ cancelScrollToTop();
86
+ }
87
+
88
+ if (scrollTop < threshold) {
89
+ setShow(false);
90
+ return;
91
+ }
92
+
93
+ if (isScrollingUp) {
94
+ const documentHeight = document.documentElement.scrollHeight;
95
+ const windowHeight = window.innerHeight;
96
+
97
+ if (scrollTop + windowHeight < documentHeight) {
98
+ setShow(true);
99
+ }
100
+ } else {
101
+ setShow(false);
102
+ }
103
+ });
104
+ useLocationChange((locationChangeEvent) => {
105
+ if (locationChangeEvent.location.hash) {
106
+ isFocusedAnchor.current = true;
107
+ setShow(false);
108
+ }
109
+ });
110
+ return (
111
+ <button
112
+ aria-label={translate({
113
+ id: 'theme.BackToTopButton.buttonAriaLabel',
114
+ message: 'Scroll back to top',
115
+ description: 'The ARIA label for the back to top button',
116
+ })}
117
+ className={clsx(
118
+ 'clean-btn',
119
+ ThemeClassNames.common.backToTopButton,
120
+ styles.backToTopButton,
121
+ {
122
+ [styles.backToTopButtonShow]: show,
123
+ },
124
+ )}
125
+ type="button"
126
+ onClick={() => smoothScrollTop()}
127
+ />
128
+ );
129
+ }
130
+
131
+ export default BackToTopButton;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ .backToTopButton {
9
+ position: fixed;
10
+ right: 1.3rem;
11
+ bottom: 1.3rem;
12
+ border-radius: 50%;
13
+ background-color: var(--ifm-color-emphasis-200);
14
+ width: 3rem;
15
+ height: 3rem;
16
+ z-index: var(--ifm-z-index-fixed);
17
+ box-shadow: var(--ifm-global-shadow-lw);
18
+ transition: all var(--ifm-transition-fast)
19
+ var(--ifm-transition-timing-default);
20
+ opacity: 0;
21
+ transform: scale(0);
22
+ }
23
+
24
+ .backToTopButton:after {
25
+ content: ' ';
26
+ display: inline-block;
27
+ mask: var(--ifm-menu-link-sublist-icon) 50% / 2rem 2rem no-repeat;
28
+ background-color: var(--ifm-color-emphasis-1000);
29
+ width: 100%;
30
+ height: 100%;
31
+ }
32
+
33
+ @media (hover: hover) {
34
+ .backToTopButton:hover {
35
+ background-color: var(--ifm-color-emphasis-300);
36
+ }
37
+ }
38
+
39
+ .backToTopButtonShow {
40
+ opacity: 1;
41
+ transform: scale(1);
42
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import React from 'react';
8
+ import Layout from '@theme/Layout';
9
+ import Link from '@docusaurus/Link';
10
+ import {translate} from '@docusaurus/Translate';
11
+
12
+ function Year({year, posts}) {
13
+ return (
14
+ <>
15
+ <h3>{year}</h3>
16
+ <ul>
17
+ {posts.map((post) => (
18
+ <li key={post.metadata.date}>
19
+ <Link to={post.metadata.permalink}>
20
+ {post.metadata.formattedDate} - {post.metadata.title}
21
+ </Link>
22
+ </li>
23
+ ))}
24
+ </ul>
25
+ </>
26
+ );
27
+ }
28
+
29
+ function YearsSection({years}) {
30
+ return (
31
+ <section className="margin-vert--lg">
32
+ <div className="container">
33
+ <div className="row">
34
+ {years.map((_props, idx) => (
35
+ <div key={idx} className="col col--4 margin-vert--lg">
36
+ <Year {..._props} />
37
+ </div>
38
+ ))}
39
+ </div>
40
+ </div>
41
+ </section>
42
+ );
43
+ }
44
+
45
+ function listPostsByYears(blogPosts) {
46
+ const postsByYear = blogPosts.reduceRight((posts, post) => {
47
+ const year = post.metadata.date.split('-')[0];
48
+ const yearPosts = posts.get(year) || [];
49
+ return posts.set(year, [post, ...yearPosts]);
50
+ }, new Map());
51
+ return Array.from(postsByYear, ([year, posts]) => ({
52
+ year,
53
+ posts,
54
+ }));
55
+ }
56
+
57
+ export default function BlogArchive({archive}) {
58
+ const title = translate({
59
+ id: 'theme.blog.archive.title',
60
+ message: 'Archive',
61
+ description: 'The page & hero title of the blog archive page',
62
+ });
63
+ const description = translate({
64
+ id: 'theme.blog.archive.description',
65
+ message: 'Archive',
66
+ description: 'The page & hero description of the blog archive page',
67
+ });
68
+ const years = listPostsByYears(archive.blogPosts);
69
+ return (
70
+ <Layout title={title} description={description}>
71
+ <header className="hero hero--primary">
72
+ <div className="container">
73
+ <h1 className="hero__title">{title}</h1>
74
+ <p className="hero__subtitle">{description}</p>
75
+ </div>
76
+ </header>
77
+ <main>{years.length > 0 && <YearsSection years={years} />}</main>
78
+ </Layout>
79
+ );
80
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import React from 'react';
8
+ import clsx from 'clsx';
9
+ import Layout from '@theme/Layout';
10
+ import BlogSidebar from '@theme/BlogSidebar';
11
+
12
+ function BlogLayout(props) {
13
+ const {sidebar, toc, children, ...layoutProps} = props;
14
+ const hasSidebar = sidebar && sidebar.items.length > 0;
15
+ return (
16
+ <Layout {...layoutProps}>
17
+ <div className="container margin-vert--lg">
18
+ <div className="row">
19
+ {hasSidebar && (
20
+ <aside className="col col--3">
21
+ <BlogSidebar sidebar={sidebar} />
22
+ </aside>
23
+ )}
24
+ <main
25
+ className={clsx('col', {
26
+ 'col--7': hasSidebar,
27
+ 'col--9 col--offset-1': !hasSidebar,
28
+ })}
29
+ itemScope
30
+ itemType="http://schema.org/Blog">
31
+ {children}
32
+ </main>
33
+ {toc && <div className="col col--2">{toc}</div>}
34
+ </div>
35
+ </div>
36
+ </Layout>
37
+ );
38
+ }
39
+
40
+ export default BlogLayout;
@@ -6,10 +6,9 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
9
- import Layout from '@theme/Layout';
9
+ import BlogLayout from '@theme/BlogLayout';
10
10
  import BlogPostItem from '@theme/BlogPostItem';
11
11
  import BlogListPaginator from '@theme/BlogListPaginator';
12
- import BlogSidebar from '@theme/BlogSidebar';
13
12
  import {ThemeClassNames} from '@docusaurus/theme-common';
14
13
 
15
14
  function BlogListPage(props) {
@@ -21,35 +20,28 @@ function BlogListPage(props) {
21
20
  const isBlogOnlyMode = permalink === '/';
22
21
  const title = isBlogOnlyMode ? siteTitle : blogTitle;
23
22
  return (
24
- <Layout
23
+ <BlogLayout
25
24
  title={title}
26
25
  description={blogDescription}
27
26
  wrapperClassName={ThemeClassNames.wrapper.blogPages}
28
27
  pageClassName={ThemeClassNames.page.blogListPage}
29
- searchMetadatas={{
28
+ searchMetadata={{
30
29
  // assign unique search tag to exclude this page from search results!
31
30
  tag: 'blog_posts_list',
32
- }}>
33
- <div className="container margin-vert--lg">
34
- <div className="row">
35
- <aside className="col col--3">
36
- <BlogSidebar sidebar={sidebar} />
37
- </aside>
38
- <main className="col col--7">
39
- {items.map(({content: BlogPostContent}) => (
40
- <BlogPostItem
41
- key={BlogPostContent.metadata.permalink}
42
- frontMatter={BlogPostContent.frontMatter}
43
- metadata={BlogPostContent.metadata}
44
- truncated={BlogPostContent.metadata.truncated}>
45
- <BlogPostContent />
46
- </BlogPostItem>
47
- ))}
48
- <BlogListPaginator metadata={metadata} />
49
- </main>
50
- </div>
51
- </div>
52
- </Layout>
31
+ }}
32
+ sidebar={sidebar}>
33
+ {items.map(({content: BlogPostContent}) => (
34
+ <BlogPostItem
35
+ key={BlogPostContent.metadata.permalink}
36
+ frontMatter={BlogPostContent.frontMatter}
37
+ assets={BlogPostContent.assets}
38
+ metadata={BlogPostContent.metadata}
39
+ truncated={BlogPostContent.metadata.truncated}>
40
+ <BlogPostContent />
41
+ </BlogPostItem>
42
+ ))}
43
+ <BlogListPaginator metadata={metadata} />
44
+ </BlogLayout>
53
45
  );
54
46
  }
55
47
 
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import React from 'react';
8
+ import Link from '@docusaurus/Link';
9
+ import styles from './styles.module.css';
10
+
11
+ function BlogPostAuthor({author}) {
12
+ const {name, title, url, imageURL} = author;
13
+ return (
14
+ <div className="avatar margin-bottom--sm">
15
+ {imageURL && (
16
+ <Link className="avatar__photo-link avatar__photo" href={url}>
17
+ <img className={styles.image} src={imageURL} alt={name} />
18
+ </Link>
19
+ )}
20
+
21
+ {
22
+ // Note: only legacy author frontmatter allow empty name (not frontMatter.authors)
23
+ name && (
24
+ <div
25
+ className="avatar__intro"
26
+ itemProp="author"
27
+ itemScope
28
+ itemType="https://schema.org/Person">
29
+ <div className="avatar__name">
30
+ <Link href={url} itemProp="url">
31
+ <span itemProp="name">{name}</span>
32
+ </Link>
33
+ </div>
34
+ {title && (
35
+ <small className="avatar__subtitle" itemProp="description">
36
+ {title}
37
+ </small>
38
+ )}
39
+ </div>
40
+ )
41
+ }
42
+ </div>
43
+ );
44
+ }
45
+
46
+ export default BlogPostAuthor;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ .image {
9
+ width: 100%;
10
+ height: 100%;
11
+ object-fit: cover;
12
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import React from 'react';
8
+ import clsx from 'clsx';
9
+ import BlogPostAuthor from '@theme/BlogPostAuthor';
10
+ import styles from './styles.module.css'; // Component responsible for the authors layout
11
+
12
+ export default function BlogPostAuthors({authors, assets}) {
13
+ const authorsCount = authors.length;
14
+
15
+ if (authorsCount === 0) {
16
+ return null;
17
+ }
18
+
19
+ return (
20
+ <div className="row margin-top--md margin-bottom--sm">
21
+ {authors.map((author, idx) => (
22
+ <div className={clsx('col col--6', styles.authorCol)} key={idx}>
23
+ <BlogPostAuthor
24
+ author={{
25
+ ...author,
26
+ // Handle author images using relative paths
27
+ imageURL: assets.authorsImageUrls[idx] ?? author.imageURL,
28
+ }}
29
+ />
30
+ </div>
31
+ ))}
32
+ </div>
33
+ );
34
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ .authorCol {
9
+ max-width: inherit !important;
10
+ flex-grow: 1 !important;
11
+ }
@@ -9,11 +9,13 @@ import clsx from 'clsx';
9
9
  import {MDXProvider} from '@mdx-js/react';
10
10
  import Translate, {translate} from '@docusaurus/Translate';
11
11
  import Link from '@docusaurus/Link';
12
+ import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
12
13
  import {usePluralForm} from '@docusaurus/theme-common';
13
14
  import MDXComponents from '@theme/MDXComponents';
14
- import Seo from '@theme/Seo';
15
15
  import EditThisPage from '@theme/EditThisPage';
16
- import styles from './styles.module.css'; // Very simple pluralization: probably good enough for now
16
+ import styles from './styles.module.css';
17
+ import TagsListInline from '@theme/TagsListInline';
18
+ import BlogPostAuthors from '@theme/BlogPostAuthors'; // Very simple pluralization: probably good enough for now
17
19
 
18
20
  function useReadingTimePlural() {
19
21
  const {selectMessage} = usePluralForm();
@@ -38,9 +40,11 @@ function useReadingTimePlural() {
38
40
 
39
41
  function BlogPostItem(props) {
40
42
  const readingTimePlural = useReadingTimePlural();
43
+ const {withBaseUrl} = useBaseUrlUtils();
41
44
  const {
42
45
  children,
43
46
  frontMatter,
47
+ assets,
44
48
  metadata,
45
49
  truncated,
46
50
  isBlogPostPage = false,
@@ -53,115 +57,104 @@ function BlogPostItem(props) {
53
57
  readingTime,
54
58
  title,
55
59
  editUrl,
60
+ authors,
56
61
  } = metadata;
57
- const {author, image, keywords} = frontMatter;
58
- const authorURL = frontMatter.author_url || frontMatter.authorURL;
59
- const authorTitle = frontMatter.author_title || frontMatter.authorTitle;
60
- const authorImageURL =
61
- frontMatter.author_image_url || frontMatter.authorImageURL;
62
+ const image = assets.image ?? frontMatter.image;
63
+ const truncatedPost = !isBlogPostPage && truncated;
64
+ const tagsExists = tags.length > 0;
62
65
 
63
66
  const renderPostHeader = () => {
64
67
  const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
65
68
  return (
66
69
  <header>
67
- <TitleHeading className={styles.blogPostTitle}>
68
- {isBlogPostPage ? title : <Link to={permalink}>{title}</Link>}
70
+ <TitleHeading className={styles.blogPostTitle} itemProp="headline">
71
+ {isBlogPostPage ? (
72
+ title
73
+ ) : (
74
+ <Link itemProp="url" to={permalink}>
75
+ {title}
76
+ </Link>
77
+ )}
69
78
  </TitleHeading>
70
79
  <div className={clsx(styles.blogPostData, 'margin-vert--md')}>
71
- <time dateTime={date}>{formattedDate}</time>
80
+ <time dateTime={date} itemProp="datePublished">
81
+ {formattedDate}
82
+ </time>
72
83
 
73
- {readingTime && (
84
+ {typeof readingTime !== 'undefined' && (
74
85
  <>
75
86
  {' · '}
76
87
  {readingTimePlural(readingTime)}
77
88
  </>
78
89
  )}
79
90
  </div>
80
- <div className="avatar margin-vert--md">
81
- {authorImageURL && (
82
- <Link className="avatar__photo-link avatar__photo" href={authorURL}>
83
- <img src={authorImageURL} alt={author} />
84
- </Link>
85
- )}
86
- <div className="avatar__intro">
87
- {author && (
88
- <>
89
- <div className="avatar__name">
90
- <Link href={authorURL}>{author}</Link>
91
- </div>
92
- <small className="avatar__subtitle">{authorTitle}</small>
93
- </>
94
- )}
95
- </div>
96
- </div>
91
+ <BlogPostAuthors authors={authors} assets={assets} />
97
92
  </header>
98
93
  );
99
94
  };
100
95
 
101
96
  return (
102
- <>
103
- <Seo
104
- {...{
105
- keywords,
106
- image,
107
- }}
108
- />
97
+ <article
98
+ className={!isBlogPostPage ? 'margin-bottom--xl' : undefined}
99
+ itemProp="blogPost"
100
+ itemScope
101
+ itemType="http://schema.org/BlogPosting">
102
+ {renderPostHeader()}
109
103
 
110
- <article className={!isBlogPostPage ? 'margin-bottom--xl' : undefined}>
111
- {renderPostHeader()}
112
- <div className="markdown">
113
- <MDXProvider components={MDXComponents}>{children}</MDXProvider>
114
- </div>
115
- {(tags.length > 0 || truncated) && (
116
- <footer
117
- className={clsx('row docusaurus-mt-lg', {
118
- [styles.blogPostDetailsFull]: isBlogPostPage,
119
- })}>
120
- {tags.length > 0 && (
121
- <div className="col">
104
+ {image && (
105
+ <meta
106
+ itemProp="image"
107
+ content={withBaseUrl(image, {
108
+ absolute: true,
109
+ })}
110
+ />
111
+ )}
112
+
113
+ <div className="markdown" itemProp="articleBody">
114
+ <MDXProvider components={MDXComponents}>{children}</MDXProvider>
115
+ </div>
116
+
117
+ {(tagsExists || truncated) && (
118
+ <footer
119
+ className={clsx('row docusaurus-mt-lg', {
120
+ [styles.blogPostDetailsFull]: isBlogPostPage,
121
+ })}>
122
+ {tagsExists && (
123
+ <div
124
+ className={clsx('col', {
125
+ 'col--9': truncatedPost,
126
+ })}>
127
+ <TagsListInline tags={tags} />
128
+ </div>
129
+ )}
130
+
131
+ {isBlogPostPage && editUrl && (
132
+ <div className="col margin-top--sm">
133
+ <EditThisPage editUrl={editUrl} />
134
+ </div>
135
+ )}
136
+
137
+ {truncatedPost && (
138
+ <div
139
+ className={clsx('col text--right', {
140
+ 'col--3': tagsExists,
141
+ })}>
142
+ <Link
143
+ to={metadata.permalink}
144
+ aria-label={`Read more about ${title}`}>
122
145
  <b>
123
146
  <Translate
124
- id="theme.tags.tagsListLabel"
125
- description="The label alongside a tag list">
126
- Tags:
147
+ id="theme.blog.post.readMore"
148
+ description="The label used in blog post item excerpts to link to full blog posts">
149
+ Read More
127
150
  </Translate>
128
151
  </b>
129
- {tags.map(({label, permalink: tagPermalink}) => (
130
- <Link
131
- key={tagPermalink}
132
- className="margin-horiz--sm"
133
- to={tagPermalink}>
134
- {label}
135
- </Link>
136
- ))}
137
- </div>
138
- )}
139
-
140
- {isBlogPostPage && editUrl && (
141
- <div className="col margin-top--sm">
142
- <EditThisPage editUrl={editUrl} />
143
- </div>
144
- )}
145
-
146
- {!isBlogPostPage && truncated && (
147
- <div className="col text--right">
148
- <Link
149
- to={metadata.permalink}
150
- aria-label={`Read more about ${title}`}>
151
- <b>
152
- <Translate
153
- id="theme.blog.post.readMore"
154
- description="The label used in blog post item excerpts to link to full blog posts">
155
- Read More
156
- </Translate>
157
- </b>
158
- </Link>
159
- </div>
160
- )}
161
- </footer>
162
- )}
163
- </article>
164
- </>
152
+ </Link>
153
+ </div>
154
+ )}
155
+ </footer>
156
+ )}
157
+ </article>
165
158
  );
166
159
  }
167
160