@docusaurus/theme-classic 2.0.0-beta.8e9b829d9 → 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 (275) hide show
  1. package/README.md +1 -1
  2. package/codeTranslations/ar.json +12 -6
  3. package/codeTranslations/base.json +12 -0
  4. package/codeTranslations/bn.json +6 -0
  5. package/codeTranslations/cs.json +62 -0
  6. package/codeTranslations/da.json +6 -0
  7. package/codeTranslations/de.json +8 -2
  8. package/codeTranslations/es.json +10 -4
  9. package/codeTranslations/fa.json +9 -3
  10. package/codeTranslations/fil.json +6 -0
  11. package/codeTranslations/fr.json +6 -0
  12. package/codeTranslations/he.json +6 -0
  13. package/codeTranslations/hi.json +6 -0
  14. package/codeTranslations/ja.json +6 -0
  15. package/codeTranslations/ko.json +6 -0
  16. package/codeTranslations/pl.json +6 -0
  17. package/codeTranslations/pt-BR.json +8 -2
  18. package/codeTranslations/pt-PT.json +6 -0
  19. package/codeTranslations/ru.json +6 -0
  20. package/codeTranslations/sr.json +62 -0
  21. package/codeTranslations/tr.json +9 -3
  22. package/codeTranslations/vi.json +10 -4
  23. package/codeTranslations/zh-Hans.json +6 -0
  24. package/codeTranslations/zh-Hant.json +6 -0
  25. package/lib/__tests__/validateThemeConfig.test.js +154 -4
  26. package/lib/index.js +2 -3
  27. package/lib/prism-include-languages.js +9 -5
  28. package/lib/theme/AnnouncementBar/index.js +8 -12
  29. package/lib/theme/AnnouncementBar/styles.module.css +23 -32
  30. package/lib/theme/BackToTopButton/index.js +27 -13
  31. package/lib/theme/BackToTopButton/styles.module.css +17 -14
  32. package/lib/theme/BlogArchivePage/index.js +89 -0
  33. package/lib/theme/BlogLayout/index.js +2 -6
  34. package/lib/theme/BlogListPage/index.js +1 -1
  35. package/lib/theme/BlogPostAuthor/index.js +51 -0
  36. package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
  37. package/lib/theme/BlogPostAuthors/index.js +47 -0
  38. package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
  39. package/lib/theme/BlogPostItem/index.js +58 -67
  40. package/lib/theme/BlogPostPage/index.js +33 -4
  41. package/lib/theme/BlogSidebar/styles.module.css +2 -2
  42. package/lib/theme/BlogTagsListPage/index.js +3 -28
  43. package/lib/theme/BlogTagsPostsPage/index.js +5 -8
  44. package/lib/theme/CodeBlock/index.js +44 -37
  45. package/lib/theme/CodeBlock/styles.module.css +1 -2
  46. package/lib/theme/DocItem/index.js +15 -40
  47. package/lib/theme/DocItem/styles.module.css +2 -12
  48. package/lib/theme/DocItemFooter/index.js +79 -0
  49. package/lib/theme/DocItemFooter/styles.module.css +18 -0
  50. package/lib/theme/DocPage/index.js +18 -13
  51. package/lib/theme/DocSidebar/index.js +11 -16
  52. package/lib/theme/DocSidebarItem/index.js +12 -10
  53. package/lib/theme/DocTagDocListPage/index.js +89 -0
  54. package/lib/theme/DocTagsListPage/index.js +44 -0
  55. package/lib/theme/DocVersionBanner/index.js +6 -4
  56. package/lib/theme/EditThisPage/index.js +3 -1
  57. package/lib/theme/Footer/index.js +5 -3
  58. package/lib/theme/Heading/index.js +7 -9
  59. package/lib/theme/Heading/styles.css +4 -6
  60. package/lib/theme/Heading/styles.module.css +9 -5
  61. package/lib/theme/IconClose/index.js +31 -0
  62. package/lib/theme/LastUpdated/index.js +4 -2
  63. package/lib/theme/LayoutHead/index.js +13 -11
  64. package/lib/theme/LayoutProviders/index.js +7 -5
  65. package/lib/theme/Logo/index.js +14 -12
  66. package/lib/theme/MDXComponents/index.js +27 -1
  67. package/lib/theme/MDXComponents/styles.css +11 -0
  68. package/lib/theme/MDXPage/index.js +2 -1
  69. package/lib/theme/Navbar/index.js +20 -3
  70. package/lib/theme/Navbar/styles.module.css +5 -1
  71. package/lib/theme/NavbarItem/DefaultNavbarItem.js +12 -4
  72. package/lib/theme/NavbarItem/DocNavbarItem.js +5 -3
  73. package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +7 -1
  74. package/lib/theme/NavbarItem/DropdownNavbarItem.js +3 -3
  75. package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +3 -4
  76. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  77. package/lib/theme/NavbarItem/index.js +5 -0
  78. package/lib/theme/Seo/index.js +10 -7
  79. package/lib/theme/TOC/index.js +9 -30
  80. package/lib/theme/TOC/styles.module.css +1 -1
  81. package/lib/theme/TOCCollapsible/index.js +5 -3
  82. package/lib/theme/TOCInline/index.js +7 -27
  83. package/lib/theme/TOCItems/index.js +78 -0
  84. package/lib/theme/Tabs/__tests__/index.test.js +123 -0
  85. package/lib/theme/Tabs/index.js +73 -50
  86. package/lib/theme/Tabs/styles.module.css +0 -13
  87. package/lib/theme/Tag/index.js +40 -0
  88. package/lib/theme/Tag/styles.module.css +70 -0
  89. package/lib/theme/TagsListByLetter/index.js +48 -0
  90. package/lib/theme/TagsListByLetter/styles.module.css +11 -0
  91. package/lib/theme/TagsListInline/index.js +44 -0
  92. package/lib/theme/TagsListInline/styles.module.css +15 -0
  93. package/lib/theme/ThemedImage/index.js +3 -5
  94. package/lib/theme/Toggle/index.js +23 -18
  95. package/lib/theme/Toggle/styles.module.css +91 -0
  96. package/lib/theme/hooks/useHideableNavbar.js +14 -31
  97. package/lib/theme/hooks/useTheme.js +2 -2
  98. package/lib/theme/hooks/useWindowSize.js +2 -7
  99. package/lib/theme/prism-include-languages.js +4 -3
  100. package/lib/translations.js +4 -4
  101. package/lib/types.d.ts +216 -105
  102. package/lib/validateThemeConfig.js +215 -254
  103. package/lib-next/__tests__/validateThemeConfig.test.js +154 -4
  104. package/lib-next/index.js +1 -2
  105. package/lib-next/prism-include-languages.js +0 -2
  106. package/lib-next/theme/AnnouncementBar/index.js +7 -12
  107. package/lib-next/theme/AnnouncementBar/styles.module.css +23 -32
  108. package/lib-next/theme/BackToTopButton/index.js +37 -17
  109. package/lib-next/theme/BackToTopButton/styles.module.css +17 -14
  110. package/lib-next/theme/BlogArchivePage/index.js +80 -0
  111. package/lib-next/theme/BlogLayout/index.js +4 -7
  112. package/lib-next/theme/BlogListPage/index.js +1 -0
  113. package/lib-next/theme/BlogPostAuthor/index.js +46 -0
  114. package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
  115. package/lib-next/theme/BlogPostAuthors/index.js +34 -0
  116. package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
  117. package/lib-next/theme/BlogPostItem/index.js +79 -86
  118. package/lib-next/theme/BlogPostPage/index.js +55 -8
  119. package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
  120. package/lib-next/theme/BlogTagsListPage/index.js +7 -39
  121. package/lib-next/theme/BlogTagsPostsPage/index.js +3 -4
  122. package/lib-next/theme/CodeBlock/index.js +53 -49
  123. package/lib-next/theme/CodeBlock/styles.module.css +1 -2
  124. package/lib-next/theme/DocItem/index.js +27 -45
  125. package/lib-next/theme/DocItem/styles.module.css +2 -12
  126. package/lib-next/theme/DocItemFooter/index.js +79 -0
  127. package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
  128. package/lib-next/theme/DocPage/index.js +18 -14
  129. package/lib-next/theme/DocSidebar/index.js +18 -15
  130. package/lib-next/theme/DocSidebarItem/index.js +31 -11
  131. package/lib-next/theme/DocTagDocListPage/index.js +89 -0
  132. package/lib-next/theme/DocTagsListPage/index.js +38 -0
  133. package/lib-next/theme/DocVersionBanner/index.js +16 -9
  134. package/lib-next/theme/EditThisPage/index.js +6 -1
  135. package/lib-next/theme/Footer/index.js +14 -3
  136. package/lib-next/theme/Heading/index.js +10 -13
  137. package/lib-next/theme/Heading/styles.css +4 -6
  138. package/lib-next/theme/Heading/styles.module.css +9 -5
  139. package/lib-next/theme/IconClose/index.js +23 -0
  140. package/lib-next/theme/LastUpdated/index.js +3 -2
  141. package/lib-next/theme/LayoutHead/index.js +9 -15
  142. package/lib-next/theme/LayoutProviders/index.js +8 -5
  143. package/lib-next/theme/Logo/index.js +23 -19
  144. package/lib-next/theme/MDXComponents/index.js +20 -1
  145. package/lib-next/theme/MDXComponents/styles.css +11 -0
  146. package/lib-next/theme/MDXPage/index.js +10 -2
  147. package/lib-next/theme/Navbar/index.js +27 -3
  148. package/lib-next/theme/Navbar/styles.module.css +5 -1
  149. package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +15 -4
  150. package/lib-next/theme/NavbarItem/DocNavbarItem.js +5 -3
  151. package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +12 -4
  152. package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +4 -6
  153. package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +2 -6
  154. package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  155. package/lib-next/theme/NavbarItem/index.js +2 -0
  156. package/lib-next/theme/Seo/index.js +11 -7
  157. package/lib-next/theme/TOC/index.js +12 -36
  158. package/lib-next/theme/TOC/styles.module.css +1 -1
  159. package/lib-next/theme/TOCCollapsible/index.js +12 -3
  160. package/lib-next/theme/TOCInline/index.js +10 -28
  161. package/lib-next/theme/TOCItems/index.js +85 -0
  162. package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
  163. package/lib-next/theme/Tabs/index.js +91 -43
  164. package/lib-next/theme/Tabs/styles.module.css +0 -13
  165. package/lib-next/theme/Tag/index.js +27 -0
  166. package/lib-next/theme/Tag/styles.module.css +70 -0
  167. package/lib-next/theme/TagsListByLetter/index.js +42 -0
  168. package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
  169. package/lib-next/theme/TagsListInline/index.js +31 -0
  170. package/lib-next/theme/TagsListInline/styles.module.css +15 -0
  171. package/lib-next/theme/ThemedImage/index.js +3 -3
  172. package/lib-next/theme/Toggle/index.js +20 -15
  173. package/lib-next/theme/Toggle/styles.module.css +91 -0
  174. package/lib-next/theme/hooks/useHideableNavbar.js +31 -47
  175. package/lib-next/theme/hooks/useTheme.js +2 -2
  176. package/lib-next/theme/hooks/useWindowSize.js +2 -6
  177. package/lib-next/theme/prism-include-languages.js +2 -1
  178. package/lib-next/translations.js +6 -10
  179. package/lib-next/types.d.ts +216 -105
  180. package/lib-next/validateThemeConfig.js +40 -36
  181. package/package.json +23 -19
  182. package/src/__tests__/validateThemeConfig.test.js +154 -4
  183. package/src/index.ts +11 -9
  184. package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
  185. package/src/theme/AnnouncementBar/index.tsx +8 -12
  186. package/src/theme/AnnouncementBar/styles.module.css +23 -32
  187. package/src/theme/BackToTopButton/index.tsx +39 -17
  188. package/src/theme/BackToTopButton/styles.module.css +17 -14
  189. package/src/theme/BlogArchivePage/index.tsx +91 -0
  190. package/src/theme/BlogLayout/index.tsx +4 -8
  191. package/src/theme/BlogListPage/index.tsx +1 -0
  192. package/src/theme/BlogPostAuthor/index.tsx +49 -0
  193. package/src/theme/BlogPostAuthor/styles.module.css +12 -0
  194. package/src/theme/BlogPostAuthors/index.tsx +36 -0
  195. package/src/theme/BlogPostAuthors/styles.module.css +11 -0
  196. package/src/theme/BlogPostItem/index.tsx +70 -80
  197. package/src/theme/BlogPostPage/index.tsx +57 -8
  198. package/src/theme/BlogSidebar/styles.module.css +2 -2
  199. package/src/theme/BlogTagsListPage/index.tsx +7 -41
  200. package/src/theme/BlogTagsPostsPage/index.tsx +3 -4
  201. package/src/theme/CodeBlock/index.tsx +63 -47
  202. package/src/theme/CodeBlock/styles.module.css +1 -2
  203. package/src/theme/DocItem/index.tsx +27 -46
  204. package/src/theme/DocItem/styles.module.css +2 -12
  205. package/src/theme/DocItemFooter/index.tsx +91 -0
  206. package/src/theme/DocItemFooter/styles.module.css +18 -0
  207. package/src/theme/DocPage/index.tsx +16 -12
  208. package/src/theme/DocSidebar/index.tsx +20 -16
  209. package/src/theme/DocSidebarItem/index.tsx +29 -10
  210. package/src/theme/DocTagDocListPage/index.tsx +89 -0
  211. package/src/theme/DocTagsListPage/index.tsx +41 -0
  212. package/src/theme/DocVersionBanner/index.tsx +26 -15
  213. package/src/theme/EditThisPage/index.tsx +6 -1
  214. package/src/theme/Footer/index.tsx +16 -3
  215. package/src/theme/Heading/index.tsx +10 -13
  216. package/src/theme/Heading/styles.css +4 -6
  217. package/src/theme/Heading/styles.module.css +9 -5
  218. package/src/theme/IconClose/index.tsx +26 -0
  219. package/src/theme/LastUpdated/index.tsx +3 -2
  220. package/src/theme/LayoutHead/index.tsx +9 -9
  221. package/src/theme/LayoutProviders/index.tsx +8 -5
  222. package/src/theme/Logo/index.tsx +19 -15
  223. package/src/theme/MDXComponents/index.tsx +20 -1
  224. package/src/theme/MDXComponents/styles.css +11 -0
  225. package/src/theme/MDXPage/index.tsx +10 -2
  226. package/src/theme/Navbar/index.tsx +26 -2
  227. package/src/theme/Navbar/styles.module.css +5 -1
  228. package/src/theme/NavbarItem/DefaultNavbarItem.tsx +15 -4
  229. package/src/theme/NavbarItem/DocNavbarItem.tsx +9 -5
  230. package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +15 -6
  231. package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
  232. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +4 -6
  233. package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +6 -5
  234. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  235. package/src/theme/NavbarItem/index.tsx +6 -1
  236. package/src/theme/Seo/index.tsx +7 -4
  237. package/src/theme/TOC/index.tsx +13 -38
  238. package/src/theme/TOC/styles.module.css +1 -1
  239. package/src/theme/TOCCollapsible/index.tsx +8 -2
  240. package/src/theme/TOCInline/index.tsx +13 -32
  241. package/src/theme/TOCItems/index.tsx +96 -0
  242. package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
  243. package/src/theme/Tabs/index.tsx +93 -49
  244. package/src/theme/Tabs/styles.module.css +0 -13
  245. package/src/theme/Tag/index.tsx +31 -0
  246. package/src/theme/Tag/styles.module.css +70 -0
  247. package/src/theme/TagsListByLetter/index.tsx +45 -0
  248. package/src/theme/TagsListByLetter/styles.module.css +11 -0
  249. package/src/theme/TagsListInline/index.tsx +35 -0
  250. package/src/theme/TagsListInline/styles.module.css +15 -0
  251. package/src/theme/ThemedImage/index.tsx +3 -3
  252. package/src/theme/Toggle/index.tsx +20 -15
  253. package/src/theme/Toggle/styles.module.css +91 -0
  254. package/src/theme/hooks/useContextualSearchFilters.ts +1 -1
  255. package/src/theme/hooks/useHideableNavbar.ts +32 -47
  256. package/src/theme/hooks/useTabGroupChoice.ts +2 -2
  257. package/src/theme/hooks/useTheme.ts +2 -2
  258. package/src/theme/hooks/useWindowSize.ts +2 -7
  259. package/src/theme/prism-include-languages.ts +3 -2
  260. package/src/translations.ts +6 -10
  261. package/src/types.d.ts +216 -105
  262. package/src/{validateThemeConfig.js → validateThemeConfig.ts} +46 -12
  263. package/tsconfig.json +0 -1
  264. package/update-code-translations.js +5 -4
  265. package/update-code-translations.test.js +1 -1
  266. package/update.js +151 -0
  267. package/lib/theme/Toggle/styles.css +0 -103
  268. package/lib/theme/hooks/useScrollPosition.js +0 -51
  269. package/lib/theme/hooks/useTOCHighlight.js +0 -87
  270. package/lib-next/theme/Toggle/styles.css +0 -103
  271. package/lib-next/theme/hooks/useScrollPosition.js +0 -42
  272. package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
  273. package/src/theme/Toggle/styles.css +0 -103
  274. package/src/theme/hooks/useScrollPosition.ts +0 -52
  275. package/src/theme/hooks/useTOCHighlight.ts +0 -98
@@ -10,8 +10,8 @@
10
10
  }
11
11
 
12
12
  .announcementBar {
13
- position: relative;
14
- width: 100%;
13
+ display: flex;
14
+ align-items: center;
15
15
  height: var(--docusaurus-announcement-bar-height);
16
16
  background-color: var(--ifm-color-white);
17
17
  color: var(--ifm-color-black);
@@ -22,47 +22,27 @@ html[data-announcement-bar-initially-dismissed='true'] .announcementBar {
22
22
  display: none;
23
23
  }
24
24
 
25
- @media print {
26
- .announcementBar {
27
- display: none;
28
- }
29
- }
30
-
31
- @media screen and (min-width: 1024px) {
32
- :root {
33
- --docusaurus-announcement-bar-height: 30px;
34
- }
25
+ .announcementBarPlaceholder {
26
+ flex: 0 0 10px;
35
27
  }
36
28
 
37
29
  .announcementBarClose {
38
- position: absolute;
39
- right: 0;
40
- top: 0;
41
- width: 55px;
42
- font-size: 1.25rem;
43
- height: 100%;
30
+ flex: 0 0 30px;
31
+ align-self: stretch;
32
+ padding: 0;
33
+ line-height: 0;
44
34
  }
45
35
 
46
36
  .announcementBarContent {
37
+ flex: 1 1 auto;
47
38
  font-size: 85%;
48
- width: 100%;
49
39
  text-align: center;
50
40
  padding: 5px 0;
51
41
  }
52
42
 
53
- .announcementBarCloseable {
54
- margin-right: 55px;
55
- }
56
-
57
- @media screen and (max-width: 576px) {
58
- .announcementBarClose {
59
- width: 35px;
60
- }
61
- .announcementBarContent {
62
- width: auto;
63
- }
64
- .announcementBarCloseable {
65
- margin-right: 35px;
43
+ @media print {
44
+ .announcementBar {
45
+ display: none;
66
46
  }
67
47
  }
68
48
 
@@ -70,3 +50,14 @@ html[data-announcement-bar-initially-dismissed='true'] .announcementBar {
70
50
  color: inherit;
71
51
  text-decoration: underline;
72
52
  }
53
+
54
+ @media (min-width: 997px) {
55
+ :root {
56
+ --docusaurus-announcement-bar-height: 30px;
57
+ }
58
+
59
+ .announcementBarPlaceholder,
60
+ .announcementBarClose {
61
+ flex-basis: 50px;
62
+ }
63
+ }
@@ -7,9 +7,14 @@
7
7
 
8
8
  import React, {useRef, useState} from 'react';
9
9
  import clsx from 'clsx';
10
- import useScrollPosition from '@theme/hooks/useScrollPosition';
10
+ import {translate} from '@docusaurus/Translate';
11
11
 
12
12
  import styles from './styles.module.css';
13
+ import {
14
+ ThemeClassNames,
15
+ useScrollPosition,
16
+ useLocationChange,
17
+ } from '@docusaurus/theme-common';
13
18
 
14
19
  const threshold = 300;
15
20
 
@@ -66,16 +71,23 @@ function useSmoothScrollToTop(): UseSmoothScrollTopReturn {
66
71
  }
67
72
 
68
73
  function BackToTopButton(): JSX.Element {
69
- const {smoothScrollTop, cancelScrollToTop} = useSmoothScrollToTop();
70
74
  const [show, setShow] = useState(false);
75
+ const isFocusedAnchor = useRef(false);
76
+ const {smoothScrollTop, cancelScrollToTop} = useSmoothScrollToTop();
71
77
 
72
78
  useScrollPosition(({scrollY: scrollTop}, lastPosition) => {
73
- // No lastPosition means component is just being mounted.
79
+ const lastScrollTop = lastPosition?.scrollY;
80
+
81
+ // No lastScrollTop means component is just being mounted.
74
82
  // Not really a scroll event from the user, so we ignore it
75
- if (!lastPosition) {
83
+ if (!lastScrollTop) {
84
+ return;
85
+ }
86
+
87
+ if (isFocusedAnchor.current) {
88
+ isFocusedAnchor.current = false;
76
89
  return;
77
90
  }
78
- const lastScrollTop = lastPosition.scrollY;
79
91
 
80
92
  const isScrollingUp = scrollTop < lastScrollTop;
81
93
 
@@ -97,23 +109,33 @@ function BackToTopButton(): JSX.Element {
97
109
  } else {
98
110
  setShow(false);
99
111
  }
100
- }, []);
112
+ });
113
+
114
+ useLocationChange((locationChangeEvent) => {
115
+ if (locationChangeEvent.location.hash) {
116
+ isFocusedAnchor.current = true;
117
+ setShow(false);
118
+ }
119
+ });
101
120
 
102
121
  return (
103
122
  <button
104
- className={clsx('clean-btn', styles.backToTopButton, {
105
- [styles.backToTopButtonShow]: show,
123
+ aria-label={translate({
124
+ id: 'theme.BackToTopButton.buttonAriaLabel',
125
+ message: 'Scroll back to top',
126
+ description: 'The ARIA label for the back to top button',
106
127
  })}
128
+ className={clsx(
129
+ 'clean-btn',
130
+ ThemeClassNames.common.backToTopButton,
131
+ styles.backToTopButton,
132
+ {
133
+ [styles.backToTopButtonShow]: show,
134
+ },
135
+ )}
107
136
  type="button"
108
- title="Scroll to top"
109
- onClick={() => smoothScrollTop()}>
110
- <svg viewBox="0 0 24 24" width="28">
111
- <path
112
- d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"
113
- fill="currentColor"
114
- />
115
- </svg>
116
- </button>
137
+ onClick={() => smoothScrollTop()}
138
+ />
117
139
  );
118
140
  }
119
141
 
@@ -5,32 +5,35 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- :root {
9
- --docusaurus-btt-background: var(--ifm-color-primary);
10
- --docusaurus-btt-color: #fff;
11
- }
12
-
13
8
  .backToTopButton {
14
- display: flex;
15
- align-items: center;
16
- justify-content: center;
17
9
  position: fixed;
18
10
  right: 1.3rem;
19
11
  bottom: 1.3rem;
20
12
  border-radius: 50%;
21
- background: var(--docusaurus-btt-background);
22
- color: var(--docusaurus-btt-color);
13
+ background-color: var(--ifm-color-emphasis-200);
23
14
  width: 3rem;
24
15
  height: 3rem;
25
16
  z-index: var(--ifm-z-index-fixed);
26
- box-shadow: 0 0.125rem 0.3125rem 0 rgba(0, 0, 0, 0.3);
27
- transition: all var(--ifm-transition-fast) ease-in-out;
17
+ box-shadow: var(--ifm-global-shadow-lw);
18
+ transition: all var(--ifm-transition-fast)
19
+ var(--ifm-transition-timing-default);
28
20
  opacity: 0;
29
21
  transform: scale(0);
30
22
  }
31
23
 
32
- .backToTopButton:hover {
33
- opacity: 0.8;
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
+ }
34
37
  }
35
38
 
36
39
  .backToTopButtonShow {
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import React from 'react';
9
+ import Layout from '@theme/Layout';
10
+ import Link from '@docusaurus/Link';
11
+ import type {ArchiveBlogPost, Props} from '@theme/BlogArchivePage';
12
+ import {translate} from '@docusaurus/Translate';
13
+
14
+ type YearProp = {
15
+ year: string;
16
+ posts: ArchiveBlogPost[];
17
+ };
18
+
19
+ function Year({year, posts}: YearProp) {
20
+ return (
21
+ <>
22
+ <h3>{year}</h3>
23
+ <ul>
24
+ {posts.map((post) => (
25
+ <li key={post.metadata.date}>
26
+ <Link to={post.metadata.permalink}>
27
+ {post.metadata.formattedDate} - {post.metadata.title}
28
+ </Link>
29
+ </li>
30
+ ))}
31
+ </ul>
32
+ </>
33
+ );
34
+ }
35
+
36
+ function YearsSection({years}: {years: YearProp[]}) {
37
+ return (
38
+ <section className="margin-vert--lg">
39
+ <div className="container">
40
+ <div className="row">
41
+ {years.map((_props, idx) => (
42
+ <div key={idx} className="col col--4 margin-vert--lg">
43
+ <Year {..._props} />
44
+ </div>
45
+ ))}
46
+ </div>
47
+ </div>
48
+ </section>
49
+ );
50
+ }
51
+
52
+ function listPostsByYears(blogPosts: readonly ArchiveBlogPost[]): YearProp[] {
53
+ const postsByYear: Map<string, ArchiveBlogPost[]> = blogPosts.reduceRight(
54
+ (posts, post) => {
55
+ const year = post.metadata.date.split('-')[0];
56
+ const yearPosts = posts.get(year) || [];
57
+ return posts.set(year, [post, ...yearPosts]);
58
+ },
59
+ new Map(),
60
+ );
61
+
62
+ return Array.from(postsByYear, ([year, posts]) => ({
63
+ year,
64
+ posts,
65
+ }));
66
+ }
67
+
68
+ export default function BlogArchive({archive}: Props): JSX.Element {
69
+ const title = translate({
70
+ id: 'theme.blog.archive.title',
71
+ message: 'Archive',
72
+ description: 'The page & hero title of the blog archive page',
73
+ });
74
+ const description = translate({
75
+ id: 'theme.blog.archive.description',
76
+ message: 'Archive',
77
+ description: 'The page & hero description of the blog archive page',
78
+ });
79
+ const years = listPostsByYears(archive.blogPosts);
80
+ return (
81
+ <Layout title={title} description={description}>
82
+ <header className="hero hero--primary">
83
+ <div className="container">
84
+ <h1 className="hero__title">{title}</h1>
85
+ <p className="hero__subtitle">{description}</p>
86
+ </div>
87
+ </header>
88
+ <main>{years.length > 0 && <YearsSection years={years} />}</main>
89
+ </Layout>
90
+ );
91
+ }
@@ -7,10 +7,8 @@
7
7
 
8
8
  import React from 'react';
9
9
  import clsx from 'clsx';
10
-
11
10
  import Layout from '@theme/Layout';
12
11
  import BlogSidebar from '@theme/BlogSidebar';
13
- import TOC from '@theme/TOC';
14
12
 
15
13
  import type {Props} from '@theme/BlogLayout';
16
14
 
@@ -31,14 +29,12 @@ function BlogLayout(props: Props): JSX.Element {
31
29
  className={clsx('col', {
32
30
  'col--7': hasSidebar,
33
31
  'col--9 col--offset-1': !hasSidebar,
34
- })}>
32
+ })}
33
+ itemScope
34
+ itemType="http://schema.org/Blog">
35
35
  {children}
36
36
  </main>
37
- {toc && (
38
- <div className="col col--2">
39
- <TOC toc={toc} />
40
- </div>
41
- )}
37
+ {toc && <div className="col col--2">{toc}</div>}
42
38
  </div>
43
39
  </div>
44
40
  </Layout>
@@ -38,6 +38,7 @@ function BlogListPage(props: Props): JSX.Element {
38
38
  <BlogPostItem
39
39
  key={BlogPostContent.metadata.permalink}
40
40
  frontMatter={BlogPostContent.frontMatter}
41
+ assets={BlogPostContent.assets}
41
42
  metadata={BlogPostContent.metadata}
42
43
  truncated={BlogPostContent.metadata.truncated}>
43
44
  <BlogPostContent />
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import React from 'react';
9
+ import Link from '@docusaurus/Link';
10
+ import type {Props} from '@theme/BlogPostAuthor';
11
+
12
+ import styles from './styles.module.css';
13
+
14
+ function BlogPostAuthor({author}: Props): JSX.Element {
15
+ const {name, title, url, imageURL} = author;
16
+ return (
17
+ <div className="avatar margin-bottom--sm">
18
+ {imageURL && (
19
+ <Link className="avatar__photo-link avatar__photo" href={url}>
20
+ <img className={styles.image} src={imageURL} alt={name} />
21
+ </Link>
22
+ )}
23
+
24
+ {
25
+ // Note: only legacy author frontmatter allow empty name (not frontMatter.authors)
26
+ name && (
27
+ <div
28
+ className="avatar__intro"
29
+ itemProp="author"
30
+ itemScope
31
+ itemType="https://schema.org/Person">
32
+ <div className="avatar__name">
33
+ <Link href={url} itemProp="url">
34
+ <span itemProp="name">{name}</span>
35
+ </Link>
36
+ </div>
37
+ {title && (
38
+ <small className="avatar__subtitle" itemProp="description">
39
+ {title}
40
+ </small>
41
+ )}
42
+ </div>
43
+ )
44
+ }
45
+ </div>
46
+ );
47
+ }
48
+
49
+ 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,36 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import React from 'react';
9
+ import clsx from 'clsx';
10
+ import type {Props} from '@theme/BlogPostAuthors';
11
+ import BlogPostAuthor from '@theme/BlogPostAuthor';
12
+
13
+ import styles from './styles.module.css';
14
+
15
+ // Component responsible for the authors layout
16
+ export default function BlogPostAuthors({authors, assets}: Props): JSX.Element {
17
+ const authorsCount = authors.length;
18
+ if (authorsCount === 0) {
19
+ return <></>;
20
+ }
21
+ return (
22
+ <div className="row margin-top--md margin-bottom--sm">
23
+ {authors.map((author, idx) => (
24
+ <div className={clsx('col col--6', styles.authorCol)} key={idx}>
25
+ <BlogPostAuthor
26
+ author={{
27
+ ...author,
28
+ // Handle author images using relative paths
29
+ imageURL: assets.authorsImageUrls[idx] ?? author.imageURL,
30
+ }}
31
+ />
32
+ </div>
33
+ ))}
34
+ </div>
35
+ );
36
+ }
@@ -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
+ }
@@ -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