@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
@@ -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';
@@ -18,12 +17,14 @@ import NotFound from '@theme/NotFound';
18
17
  import type {DocumentRoute} from '@theme/DocItem';
19
18
  import type {Props} from '@theme/DocPage';
20
19
  import IconArrow from '@theme/IconArrow';
20
+ import BackToTopButton from '@theme/BackToTopButton';
21
21
  import {matchPath} from '@docusaurus/router';
22
22
  import {translate} from '@docusaurus/Translate';
23
23
 
24
24
  import clsx from 'clsx';
25
25
  import styles from './styles.module.css';
26
26
  import {ThemeClassNames, docVersionSearchTag} from '@docusaurus/theme-common';
27
+ import Head from '@docusaurus/Head';
27
28
 
28
29
  type DocPageContentProps = {
29
30
  readonly currentDocRoute: DocumentRoute;
@@ -31,36 +32,17 @@ type DocPageContentProps = {
31
32
  readonly children: ReactNode;
32
33
  };
33
34
 
34
- function getSidebar({versionMetadata, currentDocRoute}) {
35
- function addTrailingSlash(str: string): string {
36
- return str.endsWith('/') ? str : `${str}/`;
37
- }
38
- function removeTrailingSlash(str: string): string {
39
- return str.endsWith('/') ? str.slice(0, -1) : str;
40
- }
41
-
42
- const {permalinkToSidebar, docsSidebars} = versionMetadata;
43
-
44
- // With/without trailingSlash, we should always be able to get the appropriate sidebar
45
- // note: docs plugin permalinks currently never have trailing slashes
46
- // trailingSlash is handled globally at the framework level, not plugin level
47
- const sidebarName =
48
- permalinkToSidebar[currentDocRoute.path] ||
49
- permalinkToSidebar[addTrailingSlash(currentDocRoute.path)] ||
50
- permalinkToSidebar[removeTrailingSlash(currentDocRoute.path)];
51
-
52
- const sidebar = docsSidebars[sidebarName];
53
- return {sidebar, sidebarName};
54
- }
55
-
56
35
  function DocPageContent({
57
36
  currentDocRoute,
58
37
  versionMetadata,
59
38
  children,
60
39
  }: DocPageContentProps): JSX.Element {
61
- const {siteConfig, isClient} = useDocusaurusContext();
62
40
  const {pluginId, version} = versionMetadata;
63
- const {sidebarName, sidebar} = getSidebar({versionMetadata, currentDocRoute});
41
+
42
+ const sidebarName = currentDocRoute.sidebar;
43
+ const sidebar = sidebarName
44
+ ? versionMetadata.docsSidebars[sidebarName]
45
+ : undefined;
64
46
 
65
47
  const [hiddenSidebarContainer, setHiddenSidebarContainer] = useState(false);
66
48
  const [hiddenSidebar, setHiddenSidebar] = useState(false);
@@ -69,19 +51,20 @@ function DocPageContent({
69
51
  setHiddenSidebar(false);
70
52
  }
71
53
 
72
- setHiddenSidebarContainer(!hiddenSidebarContainer);
54
+ setHiddenSidebarContainer((value) => !value);
73
55
  }, [hiddenSidebar]);
74
56
 
75
57
  return (
76
58
  <Layout
77
- key={isClient}
78
- wrapperClassName={ThemeClassNames.wrapper.docPages}
79
- pageClassName={ThemeClassNames.page.docPage}
59
+ wrapperClassName={ThemeClassNames.wrapper.docsPages}
60
+ pageClassName={ThemeClassNames.page.docsDocPage}
80
61
  searchMetadatas={{
81
62
  version,
82
63
  tag: docVersionSearchTag(pluginId, version),
83
64
  }}>
84
65
  <div className={styles.docPage}>
66
+ <BackToTopButton />
67
+
85
68
  {sidebar && (
86
69
  <aside
87
70
  className={clsx(styles.docSidebarContainer, {
@@ -106,9 +89,6 @@ function DocPageContent({
106
89
  }
107
90
  sidebar={sidebar}
108
91
  path={currentDocRoute.path}
109
- sidebarCollapsible={
110
- siteConfig.themeConfig?.sidebarCollapsible ?? true
111
- }
112
92
  onCollapse={toggleSidebar}
113
93
  isHidden={hiddenSidebar}
114
94
  />
@@ -168,14 +148,20 @@ function DocPage(props: Props): JSX.Element {
168
148
  matchPath(location.pathname, docRoute),
169
149
  );
170
150
  if (!currentDocRoute) {
171
- return <NotFound {...props} />;
151
+ return <NotFound />;
172
152
  }
173
153
  return (
174
- <DocPageContent
175
- currentDocRoute={currentDocRoute}
176
- versionMetadata={versionMetadata}>
177
- {renderRoutes(docRoutes)}
178
- </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
+ </>
179
165
  );
180
166
  }
181
167
 
@@ -7,6 +7,7 @@
7
7
 
8
8
  :root {
9
9
  --doc-sidebar-width: 300px;
10
+ --doc-sidebar-hidden-width: 30px;
10
11
  }
11
12
 
12
13
  :global(.docs-wrapper) {
@@ -19,6 +20,10 @@
19
20
  width: 100%;
20
21
  }
21
22
 
23
+ .docSidebarContainer {
24
+ display: none;
25
+ }
26
+
22
27
  @media (min-width: 997px) {
23
28
  .docMainContainer {
24
29
  flex-grow: 1;
@@ -26,10 +31,11 @@
26
31
  }
27
32
 
28
33
  .docMainContainerEnhanced {
29
- max-width: none;
34
+ max-width: calc(100% - var(--doc-sidebar-hidden-width));
30
35
  }
31
36
 
32
37
  .docSidebarContainer {
38
+ display: block;
33
39
  width: var(--doc-sidebar-width);
34
40
  margin-top: calc(-1 * var(--ifm-navbar-height));
35
41
  border-right: 1px solid var(--ifm-toc-border-color);
@@ -39,7 +45,7 @@
39
45
  }
40
46
 
41
47
  .docSidebarContainerHidden {
42
- width: 30px;
48
+ width: var(--doc-sidebar-hidden-width);
43
49
  cursor: pointer;
44
50
  }
45
51
 
@@ -77,24 +83,3 @@
77
83
  ) !important;
78
84
  }
79
85
  }
80
-
81
- @media (max-width: 996px) {
82
- .docSidebarContainer {
83
- margin-top: 0;
84
- }
85
- }
86
-
87
- @media (min-width: 997px) and (max-width: 1320px) {
88
- .docItemWrapper {
89
- max-width: calc(
90
- var(--ifm-container-width) - var(--doc-sidebar-width) -
91
- var(--ifm-spacing-horizontal) * 2
92
- );
93
- }
94
-
95
- .docItemWrapperEnhanced {
96
- max-width: calc(
97
- var(--ifm-container-width) - var(--ifm-spacing-horizontal) * 2
98
- );
99
- }
100
- }
@@ -5,242 +5,41 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import React, {useState, useCallback, useEffect, useRef, memo} from 'react';
8
+ import React, {useState} from 'react';
9
9
  import clsx from 'clsx';
10
10
  import {
11
11
  useThemeConfig,
12
- isSamePath,
13
- usePrevious,
12
+ useAnnouncementBar,
13
+ MobileSecondaryMenuFiller,
14
+ MobileSecondaryMenuComponent,
15
+ ThemeClassNames,
16
+ useScrollPosition,
14
17
  } from '@docusaurus/theme-common';
15
- import useUserPreferencesContext from '@theme/hooks/useUserPreferencesContext';
16
- import useLockBodyScroll from '@theme/hooks/useLockBodyScroll';
17
- import useWindowSize, {windowSizes} from '@theme/hooks/useWindowSize';
18
- import useScrollPosition from '@theme/hooks/useScrollPosition';
19
- import Link from '@docusaurus/Link';
20
- import isInternalUrl from '@docusaurus/isInternalUrl';
21
- import type {Props} from '@theme/DocSidebar';
18
+ import useWindowSize from '@theme/hooks/useWindowSize';
22
19
  import Logo from '@theme/Logo';
23
20
  import IconArrow from '@theme/IconArrow';
24
- import IconMenu from '@theme/IconMenu';
25
- import IconExternalLink from '@theme/IconExternalLink';
26
21
  import {translate} from '@docusaurus/Translate';
22
+ import {DocSidebarItems} from '@theme/DocSidebarItem';
23
+ import type {Props} from '@theme/DocSidebar';
27
24
 
28
25
  import styles from './styles.module.css';
29
26
 
30
- const MOBILE_TOGGLE_SIZE = 24;
31
-
32
- const isActiveSidebarItem = (item, activePath) => {
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
- const DocSidebarItems = memo(function DocSidebarItems({
48
- items,
49
- ...props
50
- }: any): JSX.Element {
51
- return items.map((item, index) => (
52
- <DocSidebarItem
53
- key={index} // sidebar is static, the index does not change
54
- item={item}
55
- {...props}
56
- />
57
- ));
58
- });
59
-
60
- function DocSidebarItem(props): JSX.Element {
61
- switch (props.item.type) {
62
- case 'category':
63
- return <DocSidebarItemCategory {...props} />;
64
- case 'link':
65
- default:
66
- return <DocSidebarItemLink {...props} />;
67
- }
68
- }
69
-
70
- function DocSidebarItemCategory({
71
- item,
72
- onItemClick,
73
- collapsible,
74
- activePath,
75
- ...props
76
- }) {
77
- const {items, label} = item;
78
-
79
- const isActive = isActiveSidebarItem(item, activePath);
80
- const wasActive = usePrevious(isActive);
81
-
82
- // active categories are always initialized as expanded
83
- // the default (item.collapsed) is only used for non-active categories
84
- const [collapsed, setCollapsed] = useState(() => {
85
- if (!collapsible) {
86
- return false;
87
- }
88
- return isActive ? false : item.collapsed;
89
- });
90
-
91
- const menuListRef = useRef<HTMLUListElement>(null);
92
- const [menuListHeight, setMenuListHeight] = useState<string | undefined>(
93
- undefined,
94
- );
95
- const handleMenuListHeight = (calc = true) => {
96
- setMenuListHeight(
97
- calc ? `${menuListRef.current?.scrollHeight}px` : undefined,
98
- );
99
- };
100
-
101
- // If we navigate to a category, it should automatically expand itself
102
- useEffect(() => {
103
- const justBecameActive = isActive && !wasActive;
104
- if (justBecameActive && collapsed) {
105
- setCollapsed(false);
106
- }
107
- }, [isActive, wasActive, collapsed]);
108
-
109
- const handleItemClick = useCallback(
110
- (e) => {
111
- e.preventDefault();
27
+ function useShowAnnouncementBar() {
28
+ const {isActive} = useAnnouncementBar();
29
+ const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive);
112
30
 
113
- if (!menuListHeight) {
114
- handleMenuListHeight();
31
+ useScrollPosition(
32
+ ({scrollY}) => {
33
+ if (isActive) {
34
+ setShowAnnouncementBar(scrollY === 0);
115
35
  }
116
-
117
- setTimeout(() => setCollapsed((state) => !state), 100);
118
36
  },
119
- [menuListHeight],
120
- );
121
-
122
- if (items.length === 0) {
123
- return null;
124
- }
125
-
126
- return (
127
- <li
128
- className={clsx('menu__list-item', {
129
- 'menu__list-item--collapsed': collapsed,
130
- })}>
131
- <a
132
- className={clsx('menu__link', {
133
- 'menu__link--sublist': collapsible,
134
- 'menu__link--active': collapsible && isActive,
135
- [styles.menuLinkText]: !collapsible,
136
- })}
137
- onClick={collapsible ? handleItemClick : undefined}
138
- href={collapsible ? '#!' : undefined}
139
- {...props}>
140
- {label}
141
- </a>
142
- <ul
143
- className="menu__list"
144
- ref={menuListRef}
145
- style={{
146
- height: menuListHeight,
147
- }}
148
- onTransitionEnd={() => {
149
- if (!collapsed) {
150
- handleMenuListHeight(false);
151
- }
152
- }}>
153
- <DocSidebarItems
154
- items={items}
155
- tabIndex={collapsed ? '-1' : '0'}
156
- onItemClick={onItemClick}
157
- collapsible={collapsible}
158
- activePath={activePath}
159
- />
160
- </ul>
161
- </li>
37
+ [isActive],
162
38
  );
39
+ return isActive && showAnnouncementBar;
163
40
  }
164
41
 
165
- function DocSidebarItemLink({
166
- item,
167
- onItemClick,
168
- activePath,
169
- collapsible: _collapsible,
170
- ...props
171
- }) {
172
- const {href, label} = item;
173
- const isActive = isActiveSidebarItem(item, activePath);
174
- return (
175
- <li className="menu__list-item" key={label}>
176
- <Link
177
- className={clsx('menu__link', {
178
- 'menu__link--active': isActive,
179
- })}
180
- to={href}
181
- {...(isInternalUrl(href) && {
182
- isNavLink: true,
183
- exact: true,
184
- onClick: onItemClick,
185
- })}
186
- {...props}>
187
- {isInternalUrl(href) ? (
188
- label
189
- ) : (
190
- <span>
191
- {label}
192
- <IconExternalLink />
193
- </span>
194
- )}
195
- </Link>
196
- </li>
197
- );
198
- }
199
-
200
- function useShowAnnouncementBar() {
201
- const {isAnnouncementBarClosed} = useUserPreferencesContext();
202
- const [showAnnouncementBar, setShowAnnouncementBar] = useState(
203
- !isAnnouncementBarClosed,
204
- );
205
- useScrollPosition(({scrollY}) => {
206
- if (!isAnnouncementBarClosed) {
207
- setShowAnnouncementBar(scrollY === 0);
208
- }
209
- });
210
- return showAnnouncementBar;
211
- }
212
-
213
- function useResponsiveSidebar() {
214
- const [showResponsiveSidebar, setShowResponsiveSidebar] = useState(false);
215
- useLockBodyScroll(showResponsiveSidebar);
216
-
217
- const windowSize = useWindowSize();
218
- useEffect(() => {
219
- if (windowSize === windowSizes.desktop) {
220
- setShowResponsiveSidebar(false);
221
- }
222
- }, [windowSize]);
223
-
224
- const closeResponsiveSidebar = useCallback(
225
- (e) => {
226
- e.target.blur();
227
- setShowResponsiveSidebar(false);
228
- },
229
- [setShowResponsiveSidebar],
230
- );
231
-
232
- const toggleResponsiveSidebar = useCallback(() => {
233
- setShowResponsiveSidebar((value) => !value);
234
- }, [setShowResponsiveSidebar]);
235
-
236
- return {
237
- showResponsiveSidebar,
238
- closeResponsiveSidebar,
239
- toggleResponsiveSidebar,
240
- };
241
- }
242
-
243
- function HideableSidebarButton({onClick}) {
42
+ function HideableSidebarButton({onClick}: {onClick: React.MouseEventHandler}) {
244
43
  return (
245
44
  <button
246
45
  type="button"
@@ -264,63 +63,12 @@ function HideableSidebarButton({onClick}) {
264
63
  );
265
64
  }
266
65
 
267
- function ResponsiveSidebarButton({responsiveSidebarOpened, onClick}) {
268
- return (
269
- <button
270
- aria-label={
271
- responsiveSidebarOpened
272
- ? translate({
273
- id: 'theme.docs.sidebar.responsiveCloseButtonLabel',
274
- message: 'Close menu',
275
- description:
276
- 'The ARIA label for close button of mobile doc sidebar',
277
- })
278
- : translate({
279
- id: 'theme.docs.sidebar.responsiveOpenButtonLabel',
280
- message: 'Open menu',
281
- description:
282
- 'The ARIA label for open button of mobile doc sidebar',
283
- })
284
- }
285
- aria-haspopup="true"
286
- className="button button--secondary button--sm menu__button"
287
- type="button"
288
- onClick={onClick}>
289
- {responsiveSidebarOpened ? (
290
- <span
291
- className={clsx(styles.sidebarMenuIcon, styles.sidebarMenuCloseIcon)}>
292
- &times;
293
- </span>
294
- ) : (
295
- <IconMenu
296
- className={styles.sidebarMenuIcon}
297
- height={MOBILE_TOGGLE_SIZE}
298
- width={MOBILE_TOGGLE_SIZE}
299
- />
300
- )}
301
- </button>
302
- );
303
- }
304
-
305
- function DocSidebar({
306
- path,
307
- sidebar,
308
- sidebarCollapsible = true,
309
- onCollapse,
310
- isHidden,
311
- }: Props): JSX.Element | null {
66
+ function DocSidebarDesktop({path, sidebar, onCollapse, isHidden}: Props) {
312
67
  const showAnnouncementBar = useShowAnnouncementBar();
313
68
  const {
314
69
  navbar: {hideOnScroll},
315
70
  hideableSidebar,
316
71
  } = useThemeConfig();
317
- const {isAnnouncementBarClosed} = useUserPreferencesContext();
318
-
319
- const {
320
- showResponsiveSidebar,
321
- closeResponsiveSidebar,
322
- toggleResponsiveSidebar,
323
- } = useResponsiveSidebar();
324
72
 
325
73
  return (
326
74
  <div
@@ -330,34 +78,11 @@ function DocSidebar({
330
78
  })}>
331
79
  {hideOnScroll && <Logo tabIndex={-1} className={styles.sidebarLogo} />}
332
80
  <nav
333
- className={clsx(
334
- 'menu',
335
- 'menu--responsive',
336
- 'thin-scrollbar',
337
- styles.menu,
338
- {
339
- 'menu--show': showResponsiveSidebar,
340
- [styles.menuWithAnnouncementBar]:
341
- !isAnnouncementBarClosed && showAnnouncementBar,
342
- },
343
- )}
344
- aria-label={translate({
345
- id: 'theme.docs.sidebar.navAriaLabel',
346
- message: 'Sidebar navigation',
347
- description: 'The ARIA label for documentation menu',
81
+ className={clsx('menu thin-scrollbar', styles.menu, {
82
+ [styles.menuWithAnnouncementBar]: showAnnouncementBar,
348
83
  })}>
349
- <ResponsiveSidebarButton
350
- responsiveSidebarOpened={showResponsiveSidebar}
351
- onClick={toggleResponsiveSidebar}
352
- />
353
-
354
- <ul className="menu__list">
355
- <DocSidebarItems
356
- items={sidebar}
357
- onItemClick={closeResponsiveSidebar}
358
- collapsible={sidebarCollapsible}
359
- activePath={path}
360
- />
84
+ <ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
85
+ <DocSidebarItems items={sidebar} activePath={path} level={1} />
361
86
  </ul>
362
87
  </nav>
363
88
  {hideableSidebar && <HideableSidebarButton onClick={onCollapse} />}
@@ -365,4 +90,49 @@ function DocSidebar({
365
90
  );
366
91
  }
367
92
 
368
- export default DocSidebar;
93
+ const DocSidebarMobileSecondaryMenu: MobileSecondaryMenuComponent<Props> = ({
94
+ toggleSidebar,
95
+ sidebar,
96
+ path,
97
+ }) => {
98
+ return (
99
+ <ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
100
+ <DocSidebarItems
101
+ items={sidebar}
102
+ activePath={path}
103
+ onItemClick={() => toggleSidebar()}
104
+ level={1}
105
+ />
106
+ </ul>
107
+ );
108
+ };
109
+
110
+ function DocSidebarMobile(props: Props) {
111
+ return (
112
+ <MobileSecondaryMenuFiller
113
+ component={DocSidebarMobileSecondaryMenu}
114
+ props={props}
115
+ />
116
+ );
117
+ }
118
+
119
+ const DocSidebarDesktopMemo = React.memo(DocSidebarDesktop);
120
+ const DocSidebarMobileMemo = React.memo(DocSidebarMobile);
121
+
122
+ export default function DocSidebar(props: Props): JSX.Element {
123
+ const windowSize = useWindowSize();
124
+
125
+ // Desktop sidebar visible on hydration: need SSR rendering
126
+ const shouldRenderSidebarDesktop =
127
+ windowSize === 'desktop' || windowSize === 'ssr';
128
+
129
+ // Mobile sidebar not visible on hydration: can avoid SSR rendering
130
+ const shouldRenderSidebarMobile = windowSize === 'mobile';
131
+
132
+ return (
133
+ <>
134
+ {shouldRenderSidebarDesktop && <DocSidebarDesktopMemo {...props} />}
135
+ {shouldRenderSidebarMobile && <DocSidebarMobileMemo {...props} />}
136
+ </>
137
+ );
138
+ }
@@ -53,14 +53,6 @@
53
53
  padding: 0.5rem;
54
54
  }
55
55
 
56
- .menuLinkText {
57
- cursor: initial;
58
- }
59
-
60
- .menuLinkText:hover {
61
- background: none;
62
- }
63
-
64
56
  .menuWithAnnouncementBar {
65
57
  margin-bottom: var(--docusaurus-announcement-bar-height);
66
58
  }
@@ -112,13 +104,3 @@
112
104
  line-height: 0.9;
113
105
  width: 24px;
114
106
  }
115
-
116
- :global(.menu__list) :global(.menu__list) {
117
- overflow-y: hidden;
118
- will-change: height;
119
- transition: height var(--ifm-transition-fast) linear;
120
- }
121
-
122
- :global(.menu__list-item--collapsed) :global(.menu__list) {
123
- height: 0 !important;
124
- }