@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
@@ -8,7 +8,6 @@
8
8
  import React, {ReactNode, useState, useCallback} from 'react';
9
9
  import {MDXProvider} from '@mdx-js/react';
10
10
 
11
- import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
12
11
  import renderRoutes from '@docusaurus/renderRoutes';
13
12
  import type {PropVersionMetadata} from '@docusaurus/plugin-content-docs-types';
14
13
  import Layout from '@theme/Layout';
@@ -25,6 +24,7 @@ import {translate} from '@docusaurus/Translate';
25
24
  import clsx from 'clsx';
26
25
  import styles from './styles.module.css';
27
26
  import {ThemeClassNames, docVersionSearchTag} from '@docusaurus/theme-common';
27
+ import Head from '@docusaurus/Head';
28
28
 
29
29
  type DocPageContentProps = {
30
30
  readonly currentDocRoute: DocumentRoute;
@@ -37,7 +37,6 @@ function DocPageContent({
37
37
  versionMetadata,
38
38
  children,
39
39
  }: DocPageContentProps): JSX.Element {
40
- const {isClient} = useDocusaurusContext();
41
40
  const {pluginId, version} = versionMetadata;
42
41
 
43
42
  const sidebarName = currentDocRoute.sidebar;
@@ -52,14 +51,13 @@ function DocPageContent({
52
51
  setHiddenSidebar(false);
53
52
  }
54
53
 
55
- setHiddenSidebarContainer(!hiddenSidebarContainer);
54
+ setHiddenSidebarContainer((value) => !value);
56
55
  }, [hiddenSidebar]);
57
56
 
58
57
  return (
59
58
  <Layout
60
- key={isClient}
61
- wrapperClassName={ThemeClassNames.wrapper.docPages}
62
- pageClassName={ThemeClassNames.page.docPage}
59
+ wrapperClassName={ThemeClassNames.wrapper.docsPages}
60
+ pageClassName={ThemeClassNames.page.docsDocPage}
63
61
  searchMetadatas={{
64
62
  version,
65
63
  tag: docVersionSearchTag(pluginId, version),
@@ -150,14 +148,20 @@ function DocPage(props: Props): JSX.Element {
150
148
  matchPath(location.pathname, docRoute),
151
149
  );
152
150
  if (!currentDocRoute) {
153
- return <NotFound {...props} />;
151
+ return <NotFound />;
154
152
  }
155
153
  return (
156
- <DocPageContent
157
- currentDocRoute={currentDocRoute}
158
- versionMetadata={versionMetadata}>
159
- {renderRoutes(docRoutes, {versionMetadata})}
160
- </DocPageContent>
154
+ <>
155
+ <Head>
156
+ {/* TODO we should add a core addRoute({htmlClassName}) generic plugin option */}
157
+ <html className={versionMetadata.className} />
158
+ </Head>
159
+ <DocPageContent
160
+ currentDocRoute={currentDocRoute}
161
+ versionMetadata={versionMetadata}>
162
+ {renderRoutes(docRoutes, {versionMetadata})}
163
+ </DocPageContent>
164
+ </>
161
165
  );
162
166
  }
163
167
 
@@ -12,9 +12,10 @@ import {
12
12
  useAnnouncementBar,
13
13
  MobileSecondaryMenuFiller,
14
14
  MobileSecondaryMenuComponent,
15
+ ThemeClassNames,
16
+ useScrollPosition,
15
17
  } from '@docusaurus/theme-common';
16
18
  import useWindowSize from '@theme/hooks/useWindowSize';
17
- import useScrollPosition from '@theme/hooks/useScrollPosition';
18
19
  import Logo from '@theme/Logo';
19
20
  import IconArrow from '@theme/IconArrow';
20
21
  import {translate} from '@docusaurus/Translate';
@@ -24,17 +25,21 @@ import type {Props} from '@theme/DocSidebar';
24
25
  import styles from './styles.module.css';
25
26
 
26
27
  function useShowAnnouncementBar() {
27
- const {isClosed} = useAnnouncementBar();
28
- const [showAnnouncementBar, setShowAnnouncementBar] = useState(!isClosed);
29
- useScrollPosition(({scrollY}) => {
30
- if (!isClosed) {
31
- setShowAnnouncementBar(scrollY === 0);
32
- }
33
- });
34
- return showAnnouncementBar;
28
+ const {isActive} = useAnnouncementBar();
29
+ const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive);
30
+
31
+ useScrollPosition(
32
+ ({scrollY}) => {
33
+ if (isActive) {
34
+ setShowAnnouncementBar(scrollY === 0);
35
+ }
36
+ },
37
+ [isActive],
38
+ );
39
+ return isActive && showAnnouncementBar;
35
40
  }
36
41
 
37
- function HideableSidebarButton({onClick}) {
42
+ function HideableSidebarButton({onClick}: {onClick: React.MouseEventHandler}) {
38
43
  return (
39
44
  <button
40
45
  type="button"
@@ -64,7 +69,6 @@ function DocSidebarDesktop({path, sidebar, onCollapse, isHidden}: Props) {
64
69
  navbar: {hideOnScroll},
65
70
  hideableSidebar,
66
71
  } = useThemeConfig();
67
- const {isClosed: isAnnouncementBarClosed} = useAnnouncementBar();
68
72
 
69
73
  return (
70
74
  <div
@@ -75,11 +79,10 @@ function DocSidebarDesktop({path, sidebar, onCollapse, isHidden}: Props) {
75
79
  {hideOnScroll && <Logo tabIndex={-1} className={styles.sidebarLogo} />}
76
80
  <nav
77
81
  className={clsx('menu thin-scrollbar', styles.menu, {
78
- [styles.menuWithAnnouncementBar]:
79
- !isAnnouncementBarClosed && showAnnouncementBar,
82
+ [styles.menuWithAnnouncementBar]: showAnnouncementBar,
80
83
  })}>
81
- <ul className="menu__list">
82
- <DocSidebarItems items={sidebar} activePath={path} />
84
+ <ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
85
+ <DocSidebarItems items={sidebar} activePath={path} level={1} />
83
86
  </ul>
84
87
  </nav>
85
88
  {hideableSidebar && <HideableSidebarButton onClick={onCollapse} />}
@@ -93,11 +96,12 @@ const DocSidebarMobileSecondaryMenu: MobileSecondaryMenuComponent<Props> = ({
93
96
  path,
94
97
  }) => {
95
98
  return (
96
- <ul className="menu__list">
99
+ <ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
97
100
  <DocSidebarItems
98
101
  items={sidebar}
99
102
  activePath={path}
100
103
  onItemClick={() => toggleSidebar()}
104
+ level={1}
101
105
  />
102
106
  </ul>
103
107
  );
@@ -12,6 +12,7 @@ import {
12
12
  usePrevious,
13
13
  Collapsible,
14
14
  useCollapsible,
15
+ ThemeClassNames,
15
16
  } from '@docusaurus/theme-common';
16
17
  import Link from '@docusaurus/Link';
17
18
  import isInternalUrl from '@docusaurus/isInternalUrl';
@@ -25,7 +26,10 @@ import type {
25
26
 
26
27
  import styles from './styles.module.css';
27
28
 
28
- const isActiveSidebarItem = (item: Props['item'], activePath: string) => {
29
+ const isActiveSidebarItem = (
30
+ item: Props['item'],
31
+ activePath: string,
32
+ ): boolean => {
29
33
  if (item.type === 'link') {
30
34
  return isSamePath(item.href, activePath);
31
35
  }
@@ -89,16 +93,17 @@ function useAutoExpandActiveCategory({
89
93
  if (justBecameActive && collapsed) {
90
94
  setCollapsed(false);
91
95
  }
92
- }, [isActive, wasActive, collapsed]);
96
+ }, [isActive, wasActive, collapsed, setCollapsed]);
93
97
  }
94
98
 
95
99
  function DocSidebarItemCategory({
96
100
  item,
97
101
  onItemClick,
98
102
  activePath,
103
+ level,
99
104
  ...props
100
105
  }: Props & {item: PropSidebarItemCategory}) {
101
- const {items, label, collapsible} = item;
106
+ const {items, label, collapsible, className} = item;
102
107
 
103
108
  const isActive = isActiveSidebarItem(item, activePath);
104
109
 
@@ -117,9 +122,15 @@ function DocSidebarItemCategory({
117
122
 
118
123
  return (
119
124
  <li
120
- className={clsx('menu__list-item', {
121
- 'menu__list-item--collapsed': collapsed,
122
- })}>
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
+ )}>
123
134
  {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
124
135
  <a
125
136
  className={clsx('menu__link', {
@@ -146,6 +157,7 @@ function DocSidebarItemCategory({
146
157
  tabIndex={collapsed ? -1 : 0}
147
158
  onItemClick={onItemClick}
148
159
  activePath={activePath}
160
+ level={level + 1}
149
161
  />
150
162
  </Collapsible>
151
163
  </li>
@@ -156,20 +168,27 @@ function DocSidebarItemLink({
156
168
  item,
157
169
  onItemClick,
158
170
  activePath,
171
+ level,
159
172
  ...props
160
173
  }: Props & {item: PropSidebarItemLink}) {
161
- const {href, label} = item;
174
+ const {href, label, className} = item;
162
175
  const isActive = isActiveSidebarItem(item, activePath);
163
176
  return (
164
- <li className="menu__list-item" key={label}>
177
+ <li
178
+ className={clsx(
179
+ ThemeClassNames.docs.docSidebarItemLink,
180
+ ThemeClassNames.docs.docSidebarItemLinkLevel(level),
181
+ 'menu__list-item',
182
+ className,
183
+ )}
184
+ key={label}>
165
185
  <Link
166
186
  className={clsx('menu__link', {
167
187
  'menu__link--active': isActive,
168
188
  })}
189
+ aria-current={isActive ? 'page' : undefined}
169
190
  to={href}
170
191
  {...(isInternalUrl(href) && {
171
- isNavLink: true,
172
- exact: true,
173
192
  onClick: onItemClick,
174
193
  })}
175
194
  {...props}>
@@ -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;
@@ -9,10 +9,19 @@ 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
- import {useActivePlugin, useDocVersionSuggestions} from '@theme/hooks/useDocs';
13
- import {useDocsPreferredVersion} from '@docusaurus/theme-common';
12
+ import {
13
+ useActivePlugin,
14
+ useDocVersionSuggestions,
15
+ GlobalVersion,
16
+ } from '@theme/hooks/useDocs';
17
+ import {
18
+ ThemeClassNames,
19
+ useDocsPreferredVersion,
20
+ } from '@docusaurus/theme-common';
14
21
 
15
22
  import type {Props} from '@theme/DocVersionBanner';
23
+ import clsx from 'clsx';
24
+ import type {VersionBanner} from '@docusaurus/plugin-content-docs-types';
16
25
 
17
26
  type BannerLabelComponentProps = {
18
27
  siteTitle: string;
@@ -58,7 +67,7 @@ function UnmaintainedVersionLabel({
58
67
  }
59
68
 
60
69
  const BannerLabelComponents: Record<
61
- Exclude<Props['versionMetadata']['banner'], 'none'>,
70
+ VersionBanner,
62
71
  ComponentType<BannerLabelComponentProps>
63
72
  > = {
64
73
  unreleased: UnreleasedVersionLabel,
@@ -67,7 +76,7 @@ const BannerLabelComponents: Record<
67
76
 
68
77
  function BannerLabel(props: BannerLabelComponentProps) {
69
78
  const BannerLabelComponent =
70
- BannerLabelComponents[props.versionMetadata.banner];
79
+ BannerLabelComponents[props.versionMetadata.banner!];
71
80
  return <BannerLabelComponent {...props} />;
72
81
  }
73
82
 
@@ -109,17 +118,15 @@ function DocVersionBannerEnabled({versionMetadata}: Props): JSX.Element {
109
118
  const {
110
119
  siteConfig: {title: siteTitle},
111
120
  } = useDocusaurusContext();
112
- const {pluginId} = useActivePlugin({failfast: true});
121
+ const {pluginId} = useActivePlugin({failfast: true})!;
113
122
 
114
- const getVersionMainDoc = (version) =>
115
- version.docs.find((doc) => doc.id === version.mainDocId);
123
+ const getVersionMainDoc = (version: GlobalVersion) =>
124
+ version.docs.find((doc) => doc.id === version.mainDocId)!;
116
125
 
117
126
  const {savePreferredVersionName} = useDocsPreferredVersion(pluginId);
118
127
 
119
- const {
120
- latestDocSuggestion,
121
- latestVersionSuggestion,
122
- } = useDocVersionSuggestions(pluginId);
128
+ const {latestDocSuggestion, latestVersionSuggestion} =
129
+ useDocVersionSuggestions(pluginId);
123
130
 
124
131
  // try to link to same doc in latest version (not always possible)
125
132
  // fallback to main doc of latest version
@@ -127,7 +134,12 @@ function DocVersionBannerEnabled({versionMetadata}: Props): JSX.Element {
127
134
  latestDocSuggestion ?? getVersionMainDoc(latestVersionSuggestion);
128
135
 
129
136
  return (
130
- <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">
131
143
  <div>
132
144
  <BannerLabel siteTitle={siteTitle} versionMetadata={versionMetadata} />
133
145
  </div>
@@ -143,11 +155,10 @@ function DocVersionBannerEnabled({versionMetadata}: Props): JSX.Element {
143
155
  }
144
156
 
145
157
  function DocVersionBanner({versionMetadata}: Props): JSX.Element {
146
- if (versionMetadata.banner === 'none') {
147
- return <></>;
148
- } else {
158
+ if (versionMetadata.banner) {
149
159
  return <DocVersionBannerEnabled versionMetadata={versionMetadata} />;
150
160
  }
161
+ return <></>;
151
162
  }
152
163
 
153
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"
@@ -52,8 +52,16 @@ function FooterLink({
52
52
  const FooterLogo = ({
53
53
  sources,
54
54
  alt,
55
- }: Pick<ThemedImageProps, 'sources' | 'alt'>) => (
56
- <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
+ />
57
65
  );
58
66
 
59
67
  function Footer(): JSX.Element | null {
@@ -115,7 +123,12 @@ function Footer(): JSX.Element | null {
115
123
  <div className="margin-bottom--sm">
116
124
  {logo.href ? (
117
125
  <Link href={logo.href} className={styles.footerLogoLink}>
118
- <FooterLogo alt={logo.alt} sources={sources} />
126
+ <FooterLogo
127
+ alt={logo.alt}
128
+ sources={sources}
129
+ width={logo.width}
130
+ height={logo.height}
131
+ />
119
132
  </Link>
120
133
  ) : (
121
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;
@@ -5,11 +5,15 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- .enhancedAnchor {
9
- top: calc(var(--ifm-navbar-height) * -1 - 0.5rem);
8
+ /*
9
+ When the navbar is sticky, ensure that on anchor click,
10
+ the browser does not scroll that anchor behind the navbar
11
+ See https://twitter.com/JoshWComeau/status/1332015868725891076
12
+ */
13
+ .anchorWithStickyNavbar {
14
+ scroll-margin-top: calc(var(--ifm-navbar-height) + 0.5rem);
10
15
  }
11
16
 
12
- .h1Heading {
13
- font-size: 3rem;
14
- margin-bottom: calc(var(--ifm-leading-desktop) * var(--ifm-leading));
17
+ .anchorWithHideOnScrollNavbar {
18
+ scroll-margin-top: 0.5rem;
15
19
  }
@@ -0,0 +1,26 @@
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 type {Props} from '@theme/IconClose';
10
+
11
+ export default function IconClose({
12
+ width = 21,
13
+ height = 21,
14
+ color = 'currentColor',
15
+ strokeWidth = 1.2,
16
+ className,
17
+ ...restProps
18
+ }: Props): JSX.Element {
19
+ return (
20
+ <svg viewBox="0 0 15 15" width={width} height={height} {...restProps}>
21
+ <g stroke={color} strokeWidth={strokeWidth}>
22
+ <path d="M.75.75l13.5 13.5M14.25.75L.75 14.25" />
23
+ </g>
24
+ </svg>
25
+ );
26
+ }
@@ -8,6 +8,7 @@
8
8
  import React from 'react';
9
9
  import Translate from '@docusaurus/Translate';
10
10
  import type {Props} from '@theme/LastUpdated';
11
+ import {ThemeClassNames} from '@docusaurus/theme-common';
11
12
 
12
13
  function LastUpdatedAtDate({
13
14
  lastUpdatedAt,
@@ -57,7 +58,7 @@ export default function LastUpdated({
57
58
  lastUpdatedBy,
58
59
  }: Props): JSX.Element {
59
60
  return (
60
- <>
61
+ <span className={ThemeClassNames.common.lastUpdated}>
61
62
  <Translate
62
63
  id="theme.lastUpdated.lastUpdatedAtBy"
63
64
  description="The sentence used to display when a page has been last updated, and by who"
@@ -84,6 +85,6 @@ export default function LastUpdated({
84
85
  <small> (Simulated during dev for better perf)</small>
85
86
  </div>
86
87
  )}
87
- </>
88
+ </span>
88
89
  );
89
90
  }