@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
@@ -0,0 +1,206 @@
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, {useEffect, memo} from 'react';
9
+ import clsx from 'clsx';
10
+ import {
11
+ isSamePath,
12
+ usePrevious,
13
+ Collapsible,
14
+ useCollapsible,
15
+ ThemeClassNames,
16
+ } from '@docusaurus/theme-common';
17
+ import Link from '@docusaurus/Link';
18
+ import isInternalUrl from '@docusaurus/isInternalUrl';
19
+ import IconExternalLink from '@theme/IconExternalLink';
20
+
21
+ import type {Props, DocSidebarItemsProps} from '@theme/DocSidebarItem';
22
+ import type {
23
+ PropSidebarItemCategory,
24
+ PropSidebarItemLink,
25
+ } from '@docusaurus/plugin-content-docs-types';
26
+
27
+ import styles from './styles.module.css';
28
+
29
+ const isActiveSidebarItem = (
30
+ item: Props['item'],
31
+ activePath: string,
32
+ ): boolean => {
33
+ if (item.type === 'link') {
34
+ return isSamePath(item.href, activePath);
35
+ }
36
+ if (item.type === 'category') {
37
+ return item.items.some((subItem) =>
38
+ isActiveSidebarItem(subItem, activePath),
39
+ );
40
+ }
41
+ return false;
42
+ };
43
+
44
+ // Optimize sidebar at each "level"
45
+ // TODO this item should probably not receive the "activePath" props
46
+ // TODO this triggers whole sidebar re-renders on navigation
47
+ export const DocSidebarItems = memo(function DocSidebarItems({
48
+ items,
49
+ ...props
50
+ }: DocSidebarItemsProps): JSX.Element {
51
+ return (
52
+ <>
53
+ {items.map((item, index) => (
54
+ <DocSidebarItem
55
+ key={index} // sidebar is static, the index does not change
56
+ item={item}
57
+ {...props}
58
+ />
59
+ ))}
60
+ </>
61
+ );
62
+ });
63
+
64
+ export default function DocSidebarItem({
65
+ item,
66
+ ...props
67
+ }: Props): JSX.Element | null {
68
+ switch (item.type) {
69
+ case 'category':
70
+ if (item.items.length === 0) {
71
+ return null;
72
+ }
73
+ return <DocSidebarItemCategory item={item} {...props} />;
74
+ case 'link':
75
+ default:
76
+ return <DocSidebarItemLink item={item} {...props} />;
77
+ }
78
+ }
79
+
80
+ // If we navigate to a category and it becomes active, it should automatically expand itself
81
+ function useAutoExpandActiveCategory({
82
+ isActive,
83
+ collapsed,
84
+ setCollapsed,
85
+ }: {
86
+ isActive: boolean;
87
+ collapsed: boolean;
88
+ setCollapsed: (b: boolean) => void;
89
+ }) {
90
+ const wasActive = usePrevious(isActive);
91
+ useEffect(() => {
92
+ const justBecameActive = isActive && !wasActive;
93
+ if (justBecameActive && collapsed) {
94
+ setCollapsed(false);
95
+ }
96
+ }, [isActive, wasActive, collapsed, setCollapsed]);
97
+ }
98
+
99
+ function DocSidebarItemCategory({
100
+ item,
101
+ onItemClick,
102
+ activePath,
103
+ level,
104
+ ...props
105
+ }: Props & {item: PropSidebarItemCategory}) {
106
+ const {items, label, collapsible, className} = item;
107
+
108
+ const isActive = isActiveSidebarItem(item, activePath);
109
+
110
+ const {collapsed, setCollapsed, toggleCollapsed} = useCollapsible({
111
+ // active categories are always initialized as expanded
112
+ // the default (item.collapsed) is only used for non-active categories
113
+ initialState: () => {
114
+ if (!collapsible) {
115
+ return false;
116
+ }
117
+ return isActive ? false : item.collapsed;
118
+ },
119
+ });
120
+
121
+ useAutoExpandActiveCategory({isActive, collapsed, setCollapsed});
122
+
123
+ return (
124
+ <li
125
+ className={clsx(
126
+ ThemeClassNames.docs.docSidebarItemCategory,
127
+ ThemeClassNames.docs.docSidebarItemCategoryLevel(level),
128
+ 'menu__list-item',
129
+ {
130
+ 'menu__list-item--collapsed': collapsed,
131
+ },
132
+ className,
133
+ )}>
134
+ {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
135
+ <a
136
+ className={clsx('menu__link', {
137
+ 'menu__link--sublist': collapsible,
138
+ 'menu__link--active': collapsible && isActive,
139
+ [styles.menuLinkText]: !collapsible,
140
+ })}
141
+ onClick={
142
+ collapsible
143
+ ? (e) => {
144
+ e.preventDefault();
145
+ toggleCollapsed();
146
+ }
147
+ : undefined
148
+ }
149
+ href={collapsible ? '#' : undefined}
150
+ {...props}>
151
+ {label}
152
+ </a>
153
+
154
+ <Collapsible lazy as="ul" className="menu__list" collapsed={collapsed}>
155
+ <DocSidebarItems
156
+ items={items}
157
+ tabIndex={collapsed ? -1 : 0}
158
+ onItemClick={onItemClick}
159
+ activePath={activePath}
160
+ level={level + 1}
161
+ />
162
+ </Collapsible>
163
+ </li>
164
+ );
165
+ }
166
+
167
+ function DocSidebarItemLink({
168
+ item,
169
+ onItemClick,
170
+ activePath,
171
+ level,
172
+ ...props
173
+ }: Props & {item: PropSidebarItemLink}) {
174
+ const {href, label, className} = item;
175
+ const isActive = isActiveSidebarItem(item, activePath);
176
+ return (
177
+ <li
178
+ className={clsx(
179
+ ThemeClassNames.docs.docSidebarItemLink,
180
+ ThemeClassNames.docs.docSidebarItemLinkLevel(level),
181
+ 'menu__list-item',
182
+ className,
183
+ )}
184
+ key={label}>
185
+ <Link
186
+ className={clsx('menu__link', {
187
+ 'menu__link--active': isActive,
188
+ })}
189
+ aria-current={isActive ? 'page' : undefined}
190
+ to={href}
191
+ {...(isInternalUrl(href) && {
192
+ onClick: onItemClick,
193
+ })}
194
+ {...props}>
195
+ {isInternalUrl(href) ? (
196
+ label
197
+ ) : (
198
+ <span>
199
+ {label}
200
+ <IconExternalLink />
201
+ </span>
202
+ )}
203
+ </Link>
204
+ </li>
205
+ );
206
+ }
@@ -0,0 +1,15 @@
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
+ @media (min-width: 997px) {
9
+ .menuLinkText {
10
+ cursor: initial;
11
+ }
12
+ .menuLinkText:hover {
13
+ background: none;
14
+ }
15
+ }
@@ -0,0 +1,89 @@
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
+
10
+ import Layout from '@theme/Layout';
11
+ import Link from '@docusaurus/Link';
12
+ import {ThemeClassNames, usePluralForm} from '@docusaurus/theme-common';
13
+ import type {PropTagDocListDoc} from '@docusaurus/plugin-content-docs-types';
14
+ import Translate, {translate} from '@docusaurus/Translate';
15
+ import type {Props} from '@theme/DocTagDocListPage';
16
+
17
+ // Very simple pluralization: probably good enough for now
18
+ function useNDocsTaggedPlural() {
19
+ const {selectMessage} = usePluralForm();
20
+ return (count: number) =>
21
+ selectMessage(
22
+ count,
23
+ translate(
24
+ {
25
+ id: 'theme.docs.tagDocListPageTitle.nDocsTagged',
26
+ description:
27
+ 'Pluralized label for "{count} docs tagged". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',
28
+ message: 'One doc tagged|{count} docs tagged',
29
+ },
30
+ {count},
31
+ ),
32
+ );
33
+ }
34
+
35
+ function DocItem({doc}: {doc: PropTagDocListDoc}): JSX.Element {
36
+ return (
37
+ <article className="margin-vert--lg">
38
+ <Link to={doc.permalink}>
39
+ <h2>{doc.title}</h2>
40
+ </Link>
41
+ {doc.description && <p>{doc.description}</p>}
42
+ </article>
43
+ );
44
+ }
45
+
46
+ export default function DocTagDocListPage({tag}: Props): JSX.Element {
47
+ const nDocsTaggedPlural = useNDocsTaggedPlural();
48
+ const title = translate(
49
+ {
50
+ id: 'theme.docs.tagDocListPageTitle',
51
+ description: 'The title of the page for a docs tag',
52
+ message: '{nDocsTagged} with "{tagName}"',
53
+ },
54
+ {nDocsTagged: nDocsTaggedPlural(tag.docs.length), tagName: tag.name},
55
+ );
56
+
57
+ return (
58
+ <Layout
59
+ title={title}
60
+ wrapperClassName={ThemeClassNames.wrapper.docsPages}
61
+ pageClassName={ThemeClassNames.page.docsTagDocListPage}
62
+ searchMetadatas={{
63
+ // assign unique search tag to exclude this page from search results!
64
+ tag: 'doc_tag_doc_list',
65
+ }}>
66
+ <div className="container margin-vert--lg">
67
+ <div className="row">
68
+ <main className="col col--8 col--offset-2">
69
+ <header className="margin-bottom--xl">
70
+ <h1>{title}</h1>
71
+ <Link href={tag.allTagsPath}>
72
+ <Translate
73
+ id="theme.tags.tagsPageLink"
74
+ description="The label of the link targeting the tag list page">
75
+ View All Tags
76
+ </Translate>
77
+ </Link>
78
+ </header>
79
+ <section className="margin-vert--lg">
80
+ {tag.docs.map((doc) => (
81
+ <DocItem key={doc.id} doc={doc} />
82
+ ))}
83
+ </section>
84
+ </main>
85
+ </div>
86
+ </div>
87
+ </Layout>
88
+ );
89
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import React from 'react';
9
+
10
+ import Layout from '@theme/Layout';
11
+ import {
12
+ ThemeClassNames,
13
+ translateTagsPageTitle,
14
+ } from '@docusaurus/theme-common';
15
+ import TagsListByLetter from '@theme/TagsListByLetter';
16
+ import type {Props} from '@theme/DocTagsListPage';
17
+
18
+ function DocTagsListPage({tags}: Props): JSX.Element {
19
+ const title = translateTagsPageTitle();
20
+ return (
21
+ <Layout
22
+ title={title}
23
+ wrapperClassName={ThemeClassNames.wrapper.docsPages}
24
+ pageClassName={ThemeClassNames.page.docsTagsListPage}
25
+ searchMetadatas={{
26
+ // assign unique search tag to exclude this page from search results!
27
+ tag: 'doc_tags_list',
28
+ }}>
29
+ <div className="container margin-vert--lg">
30
+ <div className="row">
31
+ <main className="col col--8 col--offset-2">
32
+ <h1>{title}</h1>
33
+ <TagsListByLetter tags={tags} />
34
+ </main>
35
+ </div>
36
+ </div>
37
+ </Layout>
38
+ );
39
+ }
40
+
41
+ export default DocTagsListPage;
@@ -5,31 +5,40 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import React from 'react';
8
+ import React, {ComponentType} from 'react';
9
9
  import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
10
10
  import Link from '@docusaurus/Link';
11
11
  import Translate from '@docusaurus/Translate';
12
12
  import {
13
13
  useActivePlugin,
14
- useActiveVersion,
15
14
  useDocVersionSuggestions,
15
+ GlobalVersion,
16
16
  } from '@theme/hooks/useDocs';
17
- import {useDocsPreferredVersion} from '@docusaurus/theme-common';
17
+ import {
18
+ ThemeClassNames,
19
+ useDocsPreferredVersion,
20
+ } from '@docusaurus/theme-common';
21
+
22
+ import type {Props} from '@theme/DocVersionBanner';
23
+ import clsx from 'clsx';
24
+ import type {VersionBanner} from '@docusaurus/plugin-content-docs-types';
25
+
26
+ type BannerLabelComponentProps = {
27
+ siteTitle: string;
28
+ versionMetadata: Props['versionMetadata'];
29
+ };
18
30
 
19
31
  function UnreleasedVersionLabel({
20
32
  siteTitle,
21
- versionLabel,
22
- }: {
23
- siteTitle: string;
24
- versionLabel: string;
25
- }) {
33
+ versionMetadata,
34
+ }: BannerLabelComponentProps) {
26
35
  return (
27
36
  <Translate
28
37
  id="theme.docs.versions.unreleasedVersionLabel"
29
38
  description="The label used to tell the user that he's browsing an unreleased doc version"
30
39
  values={{
31
40
  siteTitle,
32
- versionLabel: <b>{versionLabel}</b>,
41
+ versionLabel: <b>{versionMetadata.label}</b>,
33
42
  }}>
34
43
  {
35
44
  'This is unreleased documentation for {siteTitle} {versionLabel} version.'
@@ -40,18 +49,15 @@ function UnreleasedVersionLabel({
40
49
 
41
50
  function UnmaintainedVersionLabel({
42
51
  siteTitle,
43
- versionLabel,
44
- }: {
45
- siteTitle: string;
46
- versionLabel: string;
47
- }) {
52
+ versionMetadata,
53
+ }: BannerLabelComponentProps) {
48
54
  return (
49
55
  <Translate
50
56
  id="theme.docs.versions.unmaintainedVersionLabel"
51
57
  description="The label used to tell the user that he's browsing an unmaintained doc version"
52
58
  values={{
53
59
  siteTitle,
54
- versionLabel: <b>{versionLabel}</b>,
60
+ versionLabel: <b>{versionMetadata.label}</b>,
55
61
  }}>
56
62
  {
57
63
  'This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.'
@@ -60,6 +66,20 @@ function UnmaintainedVersionLabel({
60
66
  );
61
67
  }
62
68
 
69
+ const BannerLabelComponents: Record<
70
+ VersionBanner,
71
+ ComponentType<BannerLabelComponentProps>
72
+ > = {
73
+ unreleased: UnreleasedVersionLabel,
74
+ unmaintained: UnmaintainedVersionLabel,
75
+ };
76
+
77
+ function BannerLabel(props: BannerLabelComponentProps) {
78
+ const BannerLabelComponent =
79
+ BannerLabelComponents[props.versionMetadata.banner!];
80
+ return <BannerLabelComponent {...props} />;
81
+ }
82
+
63
83
  function LatestVersionSuggestionLabel({
64
84
  versionLabel,
65
85
  to,
@@ -72,7 +92,7 @@ function LatestVersionSuggestionLabel({
72
92
  return (
73
93
  <Translate
74
94
  id="theme.docs.versions.latestVersionSuggestionLabel"
75
- description="The label userd to tell the user that he's browsing an unmaintained doc version"
95
+ description="The label used to tell the user to check the latest version"
76
96
  values={{
77
97
  versionLabel,
78
98
  latestVersionLink: (
@@ -94,27 +114,19 @@ function LatestVersionSuggestionLabel({
94
114
  );
95
115
  }
96
116
 
97
- const getVersionMainDoc = (version) =>
98
- version.docs.find((doc) => doc.id === version.mainDocId);
99
-
100
- function DocVersionSuggestions(): JSX.Element {
117
+ function DocVersionBannerEnabled({versionMetadata}: Props): JSX.Element {
101
118
  const {
102
119
  siteConfig: {title: siteTitle},
103
120
  } = useDocusaurusContext();
104
- const {pluginId} = useActivePlugin({failfast: true});
121
+ const {pluginId} = useActivePlugin({failfast: true})!;
105
122
 
106
- const {savePreferredVersionName} = useDocsPreferredVersion(pluginId);
123
+ const getVersionMainDoc = (version: GlobalVersion) =>
124
+ version.docs.find((doc) => doc.id === version.mainDocId)!;
107
125
 
108
- const activeVersion = useActiveVersion(pluginId);
109
- const {
110
- latestDocSuggestion,
111
- latestVersionSuggestion,
112
- } = useDocVersionSuggestions(pluginId);
126
+ const {savePreferredVersionName} = useDocsPreferredVersion(pluginId);
113
127
 
114
- // No suggestion to be made
115
- if (!latestVersionSuggestion) {
116
- return <></>;
117
- }
128
+ const {latestDocSuggestion, latestVersionSuggestion} =
129
+ useDocVersionSuggestions(pluginId);
118
130
 
119
131
  // try to link to same doc in latest version (not always possible)
120
132
  // fallback to main doc of latest version
@@ -122,19 +134,14 @@ function DocVersionSuggestions(): JSX.Element {
122
134
  latestDocSuggestion ?? getVersionMainDoc(latestVersionSuggestion);
123
135
 
124
136
  return (
125
- <div className="alert alert--warning margin-bottom--md" role="alert">
137
+ <div
138
+ className={clsx(
139
+ ThemeClassNames.docs.docVersionBanner,
140
+ 'alert alert--warning margin-bottom--md',
141
+ )}
142
+ role="alert">
126
143
  <div>
127
- {activeVersion.name === 'current' ? (
128
- <UnreleasedVersionLabel
129
- siteTitle={siteTitle}
130
- versionLabel={activeVersion.label}
131
- />
132
- ) : (
133
- <UnmaintainedVersionLabel
134
- siteTitle={siteTitle}
135
- versionLabel={activeVersion.label}
136
- />
137
- )}
144
+ <BannerLabel siteTitle={siteTitle} versionMetadata={versionMetadata} />
138
145
  </div>
139
146
  <div className="margin-top--md">
140
147
  <LatestVersionSuggestionLabel
@@ -147,4 +154,11 @@ function DocVersionSuggestions(): JSX.Element {
147
154
  );
148
155
  }
149
156
 
150
- export default DocVersionSuggestions;
157
+ function DocVersionBanner({versionMetadata}: Props): JSX.Element {
158
+ if (versionMetadata.banner) {
159
+ return <DocVersionBannerEnabled versionMetadata={versionMetadata} />;
160
+ }
161
+ return <></>;
162
+ }
163
+
164
+ export default DocVersionBanner;
@@ -10,10 +10,15 @@ import Translate from '@docusaurus/Translate';
10
10
 
11
11
  import type {Props} from '@theme/EditThisPage';
12
12
  import IconEdit from '@theme/IconEdit';
13
+ import {ThemeClassNames} from '@docusaurus/theme-common';
13
14
 
14
15
  export default function EditThisPage({editUrl}: Props): JSX.Element {
15
16
  return (
16
- <a href={editUrl} target="_blank" rel="noreferrer noopener">
17
+ <a
18
+ href={editUrl}
19
+ target="_blank"
20
+ rel="noreferrer noopener"
21
+ className={ThemeClassNames.common.editThisPage}>
17
22
  <IconEdit />
18
23
  <Translate
19
24
  id="theme.common.editThisPage"
@@ -11,8 +11,10 @@ import clsx from 'clsx';
11
11
  import Link from '@docusaurus/Link';
12
12
  import {FooterLinkItem, useThemeConfig} from '@docusaurus/theme-common';
13
13
  import useBaseUrl from '@docusaurus/useBaseUrl';
14
+ import isInternalUrl from '@docusaurus/isInternalUrl';
14
15
  import styles from './styles.module.css';
15
16
  import ThemedImage, {Props as ThemedImageProps} from '@theme/ThemedImage';
17
+ import IconExternalLink from '@theme/IconExternalLink';
16
18
 
17
19
  function FooterLink({
18
20
  to,
@@ -35,7 +37,14 @@ function FooterLink({
35
37
  to: toUrl,
36
38
  })}
37
39
  {...props}>
38
- {label}
40
+ {href && !isInternalUrl(href) ? (
41
+ <span>
42
+ {label}
43
+ <IconExternalLink />
44
+ </span>
45
+ ) : (
46
+ label
47
+ )}
39
48
  </Link>
40
49
  );
41
50
  }
@@ -43,8 +52,16 @@ function FooterLink({
43
52
  const FooterLogo = ({
44
53
  sources,
45
54
  alt,
46
- }: Pick<ThemedImageProps, 'sources' | 'alt'>) => (
47
- <ThemedImage className="footer__logo" alt={alt} sources={sources} />
55
+ width,
56
+ height,
57
+ }: Pick<ThemedImageProps, 'sources' | 'alt' | 'width' | 'height'>) => (
58
+ <ThemedImage
59
+ className="footer__logo"
60
+ alt={alt}
61
+ sources={sources}
62
+ width={width}
63
+ height={height}
64
+ />
48
65
  );
49
66
 
50
67
  function Footer(): JSX.Element | null {
@@ -106,7 +123,12 @@ function Footer(): JSX.Element | null {
106
123
  <div className="margin-bottom--sm">
107
124
  {logo.href ? (
108
125
  <Link href={logo.href} className={styles.footerLogoLink}>
109
- <FooterLogo alt={logo.alt} sources={sources} />
126
+ <FooterLogo
127
+ alt={logo.alt}
128
+ sources={sources}
129
+ width={logo.width}
130
+ height={logo.height}
131
+ />
110
132
  </Link>
111
133
  ) : (
112
134
  <FooterLogo alt={logo.alt} sources={sources} />
@@ -5,8 +5,6 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- /* eslint-disable jsx-a11y/anchor-has-content, jsx-a11y/anchor-is-valid */
9
-
10
8
  import React from 'react';
11
9
  import clsx from 'clsx';
12
10
  import type {HeadingType, Props} from '@theme/Heading';
@@ -24,7 +22,7 @@ export const MainHeading: HeadingComponent = function MainHeading({...props}) {
24
22
  <h1
25
23
  {...props}
26
24
  id={undefined} // h1 headings do not need an id because they don't appear in the TOC
27
- className={styles.h1Heading}>
25
+ >
28
26
  {props.children}
29
27
  </h1>
30
28
  </header>
@@ -44,17 +42,16 @@ const createAnchorHeading = (
44
42
  }
45
43
 
46
44
  return (
47
- <Tag {...props}>
48
- <a
49
- aria-hidden="true"
50
- tabIndex={-1}
51
- className={clsx('anchor', {
52
- [styles.enhancedAnchor]: !hideOnScroll,
53
- })}
54
- id={id}
55
- />
45
+ <Tag
46
+ {...props}
47
+ className={clsx('anchor', {
48
+ [styles.anchorWithHideOnScrollNavbar]: hideOnScroll,
49
+ [styles.anchorWithStickyNavbar]: !hideOnScroll,
50
+ })}
51
+ id={id}>
56
52
  {props.children}
57
53
  <a
54
+ aria-hidden="true"
58
55
  className="hash-link"
59
56
  href={`#${id}`}
60
57
  title={translate({
@@ -62,7 +59,7 @@ const createAnchorHeading = (
62
59
  message: 'Direct link to heading',
63
60
  description: 'Title for link to heading',
64
61
  })}>
65
- #
62
+ &#8203;
66
63
  </a>
67
64
  </Tag>
68
65
  );
@@ -5,18 +5,16 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- .anchor {
9
- display: block;
10
- position: relative;
11
- top: -0.5rem;
12
- }
13
-
14
8
  .hash-link {
15
9
  opacity: 0;
16
10
  padding-left: 0.5rem;
17
11
  transition: opacity var(--ifm-transition-fast);
18
12
  }
19
13
 
14
+ .hash-link:before {
15
+ content: '#';
16
+ }
17
+
20
18
  .hash-link:focus,
21
19
  *:hover > .hash-link {
22
20
  opacity: 1;