@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
@@ -5,12 +5,10 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import React, {useState, useRef, useEffect} from 'react';
8
+ import React from 'react';
9
9
  import clsx from 'clsx';
10
10
  import Link from '@docusaurus/Link';
11
11
  import useBaseUrl from '@docusaurus/useBaseUrl';
12
- import {useLocation} from '@docusaurus/router';
13
- import {isSamePath} from '@docusaurus/theme-common';
14
12
  import type {
15
13
  NavLinkProps,
16
14
  DesktopOrMobileNavBarItemProps,
@@ -18,19 +16,21 @@ import type {
18
16
  } from '@theme/NavbarItem/DefaultNavbarItem';
19
17
  import IconExternalLink from '@theme/IconExternalLink';
20
18
  import isInternalUrl from '@docusaurus/isInternalUrl';
19
+ import {isRegexpStringMatch} from '@docusaurus/theme-common';
20
+ import {getInfimaActiveClassName} from './index';
21
21
 
22
22
  const dropdownLinkActiveClass = 'dropdown__link--active';
23
23
 
24
- function NavLink({
24
+ export function NavLink({
25
25
  activeBasePath,
26
26
  activeBaseRegex,
27
27
  to,
28
28
  href,
29
29
  label,
30
- activeClassName = 'navbar__link--active',
30
+ activeClassName = '',
31
31
  prependBaseUrlToHref,
32
32
  ...props
33
- }: NavLinkProps) {
33
+ }: NavLinkProps): JSX.Element {
34
34
  // TODO all this seems hacky
35
35
  // {to: 'version'} should probably be forbidden, in favor of {to: '/version'}
36
36
  const toUrl = useBaseUrl(to);
@@ -47,13 +47,15 @@ function NavLink({
47
47
  }
48
48
  : {
49
49
  isNavLink: true,
50
- activeClassName,
50
+ activeClassName: !props.className?.includes(activeClassName)
51
+ ? activeClassName
52
+ : '',
51
53
  to: toUrl,
52
54
  ...(activeBasePath || activeBaseRegex
53
55
  ? {
54
56
  isActive: (_match, location) =>
55
57
  activeBaseRegex
56
- ? new RegExp(activeBaseRegex).test(location.pathname)
58
+ ? isRegexpStringMatch(activeBaseRegex, location.pathname)
57
59
  : location.pathname.startsWith(activeBaseUrl),
58
60
  }
59
61
  : null),
@@ -71,168 +73,54 @@ function NavLink({
71
73
  );
72
74
  }
73
75
 
74
- function NavItemDesktop({
75
- items,
76
- position,
76
+ function DefaultNavbarItemDesktop({
77
77
  className,
78
+ isDropdownItem = false,
78
79
  ...props
79
80
  }: DesktopOrMobileNavBarItemProps) {
80
- const dropdownRef = useRef<HTMLDivElement>(null);
81
- const dropdownMenuRef = useRef<HTMLUListElement>(null);
82
- const [showDropdown, setShowDropdown] = useState(false);
83
-
84
- useEffect(() => {
85
- const handleClickOutside = (event) => {
86
- if (!dropdownRef.current || dropdownRef.current.contains(event.target)) {
87
- return;
88
- }
89
-
90
- setShowDropdown(false);
91
- };
92
-
93
- document.addEventListener('mousedown', handleClickOutside);
94
- document.addEventListener('touchstart', handleClickOutside);
95
-
96
- return () => {
97
- document.removeEventListener('mousedown', handleClickOutside);
98
- document.removeEventListener('touchstart', handleClickOutside);
99
- };
100
- }, [dropdownRef]);
101
-
102
- const navLinkClassNames = (extraClassName?: string, isDropdownItem = false) =>
103
- clsx(
104
- {
105
- 'navbar__item navbar__link': !isDropdownItem,
106
- dropdown__link: isDropdownItem,
107
- },
108
- extraClassName,
109
- );
81
+ const element = (
82
+ <NavLink
83
+ className={clsx(
84
+ isDropdownItem ? 'dropdown__link' : 'navbar__item navbar__link',
85
+ className,
86
+ )}
87
+ {...props}
88
+ />
89
+ );
110
90
 
111
- if (!items) {
112
- return <NavLink className={navLinkClassNames(className)} {...props} />;
91
+ if (isDropdownItem) {
92
+ return <li>{element}</li>;
113
93
  }
114
94
 
115
- return (
116
- <div
117
- ref={dropdownRef}
118
- className={clsx('navbar__item', 'dropdown', 'dropdown--hoverable', {
119
- 'dropdown--left': position === 'left',
120
- 'dropdown--right': position === 'right',
121
- 'dropdown--show': showDropdown,
122
- })}>
123
- <NavLink
124
- className={navLinkClassNames(className)}
125
- {...props}
126
- onClick={props.to ? undefined : (e) => e.preventDefault()}
127
- onKeyDown={(e) => {
128
- if (e.key === 'Enter') {
129
- e.preventDefault();
130
- setShowDropdown(!showDropdown);
131
- }
132
- }}>
133
- {props.children ?? props.label}
134
- </NavLink>
135
- <ul ref={dropdownMenuRef} className="dropdown__menu">
136
- {items.map(({className: childItemClassName, ...childItemProps}, i) => (
137
- <li key={i}>
138
- <NavLink
139
- onKeyDown={(e) => {
140
- if (i === items.length - 1 && e.key === 'Tab') {
141
- e.preventDefault();
142
-
143
- setShowDropdown(false);
144
-
145
- const nextNavbarItem = (dropdownRef.current as HTMLElement)
146
- .nextElementSibling;
147
-
148
- if (nextNavbarItem) {
149
- (nextNavbarItem as HTMLElement).focus();
150
- }
151
- }
152
- }}
153
- activeClassName={dropdownLinkActiveClass}
154
- className={navLinkClassNames(childItemClassName, true)}
155
- {...childItemProps}
156
- />
157
- </li>
158
- ))}
159
- </ul>
160
- </div>
161
- );
95
+ return element;
162
96
  }
163
97
 
164
- function NavItemMobile({
165
- items,
98
+ function DefaultNavbarItemMobile({
166
99
  className,
167
- position: _position, // Need to destructure position from props so that it doesn't get passed on.
100
+ isDropdownItem: _isDropdownItem,
168
101
  ...props
169
102
  }: DesktopOrMobileNavBarItemProps) {
170
- const menuListRef = useRef<HTMLUListElement>(null);
171
- const {pathname} = useLocation();
172
- const [collapsed, setCollapsed] = useState(
173
- () => !items?.some((item) => isSamePath(item.to, pathname)) ?? true,
174
- );
175
-
176
- const navLinkClassNames = (extraClassName?: string, isSubList = false) =>
177
- clsx(
178
- 'menu__link',
179
- {
180
- 'menu__link--sublist': isSubList,
181
- },
182
- extraClassName,
183
- );
184
-
185
- if (!items) {
186
- return (
187
- <li className="menu__list-item">
188
- <NavLink className={navLinkClassNames(className)} {...props} />
189
- </li>
190
- );
191
- }
192
-
193
- const menuListHeight = menuListRef.current?.scrollHeight
194
- ? `${menuListRef.current?.scrollHeight}px`
195
- : undefined;
196
-
197
103
  return (
198
- <li
199
- className={clsx('menu__list-item', {
200
- 'menu__list-item--collapsed': collapsed,
201
- })}>
202
- <NavLink
203
- role="button"
204
- className={navLinkClassNames(className, true)}
205
- {...props}
206
- onClick={(e) => {
207
- e.preventDefault();
208
- setCollapsed((state) => !state);
209
- }}>
210
- {props.children ?? props.label}
211
- </NavLink>
212
- <ul
213
- className="menu__list"
214
- ref={menuListRef}
215
- style={{
216
- height: !collapsed ? menuListHeight : undefined,
217
- }}>
218
- {items.map(({className: childItemClassName, ...childItemProps}, i) => (
219
- <li className="menu__list-item" key={i}>
220
- <NavLink
221
- activeClassName="menu__link--active"
222
- className={navLinkClassNames(childItemClassName)}
223
- {...childItemProps}
224
- onClick={props.onClick}
225
- />
226
- </li>
227
- ))}
228
- </ul>
104
+ <li className="menu__list-item">
105
+ <NavLink className={clsx('menu__link', className)} {...props} />
229
106
  </li>
230
107
  );
231
108
  }
232
109
 
233
- function DefaultNavbarItem({mobile = false, ...props}: Props): JSX.Element {
234
- const Comp = mobile ? NavItemMobile : NavItemDesktop;
235
- return <Comp {...props} />;
110
+ function DefaultNavbarItem({
111
+ mobile = false,
112
+ position: _position, // Need to destructure position from props so that it doesn't get passed on.
113
+ ...props
114
+ }: Props): JSX.Element {
115
+ const Comp = mobile ? DefaultNavbarItemMobile : DefaultNavbarItemDesktop;
116
+ return (
117
+ <Comp
118
+ {...props}
119
+ activeClassName={
120
+ props.activeClassName ?? getInfimaActiveClassName(mobile)
121
+ }
122
+ />
123
+ );
236
124
  }
237
125
 
238
126
  export default DefaultNavbarItem;
@@ -9,20 +9,14 @@ import React from 'react';
9
9
  import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
10
10
  import {useLatestVersion, useActiveDocContext} from '@theme/hooks/useDocs';
11
11
  import clsx from 'clsx';
12
+ import {getInfimaActiveClassName} from './index';
12
13
  import type {Props} from '@theme/NavbarItem/DocNavbarItem';
13
14
  import {useDocsPreferredVersion} from '@docusaurus/theme-common';
14
15
  import {uniq} from '@docusaurus/utils-common';
15
- import type {
16
- GlobalDataVersion,
17
- GlobalDataDoc,
18
- } from '@docusaurus/plugin-content-docs-types';
16
+ import type {GlobalDataVersion} from '@docusaurus/plugin-content-docs-types';
19
17
 
20
18
  function getDocInVersions(versions: GlobalDataVersion[], docId: string) {
21
- // vanilla-js flatten, TODO replace soon by ES flat() / flatMap()
22
- const allDocs: GlobalDataDoc[] = [].concat(
23
- ...versions.map((version) => version.docs),
24
- );
25
-
19
+ const allDocs = versions.flatMap((version) => version.docs);
26
20
  const doc = allDocs.find((versionDoc) => versionDoc.id === docId);
27
21
  if (!doc) {
28
22
  const docIds = allDocs.map((versionDoc) => versionDoc.id).join('\n- ');
@@ -38,7 +32,6 @@ Available doc ids are:\n- ${docIds}`,
38
32
 
39
33
  export default function DocNavbarItem({
40
34
  docId,
41
- activeSidebarClassName,
42
35
  label: staticLabel,
43
36
  docsPluginId,
44
37
  ...props
@@ -48,19 +41,23 @@ export default function DocNavbarItem({
48
41
  const latestVersion = useLatestVersion(docsPluginId);
49
42
 
50
43
  // Versions used to look for the doc to link to, ordered + no duplicate
51
- const versions: GlobalDataVersion[] = uniq(
52
- [activeVersion, preferredVersion, latestVersion].filter(Boolean),
44
+ const versions = uniq(
45
+ [activeVersion, preferredVersion, latestVersion].filter(
46
+ Boolean,
47
+ ) as GlobalDataVersion[],
53
48
  );
54
49
  const doc = getDocInVersions(versions, docId);
50
+ const activeDocInfimaClassName = getInfimaActiveClassName(props.mobile);
55
51
 
56
52
  return (
57
53
  <DefaultNavbarItem
58
54
  exact
59
55
  {...props}
60
56
  className={clsx(props.className, {
61
- [activeSidebarClassName]:
62
- activeDoc && activeDoc.sidebar === doc.sidebar,
57
+ [activeDocInfimaClassName]:
58
+ activeDoc?.sidebar && activeDoc.sidebar === doc.sidebar,
63
59
  })}
60
+ activeClassName={activeDocInfimaClassName}
64
61
  label={staticLabel ?? doc.id}
65
62
  to={doc.path}
66
63
  />
@@ -7,6 +7,7 @@
7
7
 
8
8
  import React from 'react';
9
9
  import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
10
+ import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
10
11
  import {
11
12
  useVersions,
12
13
  useLatestVersion,
@@ -14,9 +15,11 @@ import {
14
15
  } from '@theme/hooks/useDocs';
15
16
  import type {Props} from '@theme/NavbarItem/DocsVersionDropdownNavbarItem';
16
17
  import {useDocsPreferredVersion} from '@docusaurus/theme-common';
18
+ import {translate} from '@docusaurus/Translate';
19
+ import type {GlobalDataVersion} from '@docusaurus/plugin-content-docs-types';
17
20
 
18
- const getVersionMainDoc = (version) =>
19
- version.docs.find((doc) => doc.id === version.mainDocId);
21
+ const getVersionMainDoc = (version: GlobalDataVersion) =>
22
+ version.docs.find((doc) => doc.id === version.mainDocId)!;
20
23
 
21
24
  export default function DocsVersionDropdownNavbarItem({
22
25
  mobile,
@@ -30,9 +33,8 @@ export default function DocsVersionDropdownNavbarItem({
30
33
  const versions = useVersions(docsPluginId);
31
34
  const latestVersion = useLatestVersion(docsPluginId);
32
35
 
33
- const {preferredVersion, savePreferredVersionName} = useDocsPreferredVersion(
34
- docsPluginId,
35
- );
36
+ const {preferredVersion, savePreferredVersionName} =
37
+ useDocsPreferredVersion(docsPluginId);
36
38
 
37
39
  function getItems() {
38
40
  const versionLinks = versions.map((version) => {
@@ -52,20 +54,7 @@ export default function DocsVersionDropdownNavbarItem({
52
54
  };
53
55
  });
54
56
 
55
- const items = [
56
- ...dropdownItemsBefore,
57
- ...versionLinks,
58
- ...dropdownItemsAfter,
59
- ];
60
-
61
- // We don't want to render a version dropdown with 0 or 1 item
62
- // If we build the site with a single docs version (onlyIncludeVersions: ['1.0.0'])
63
- // We'd rather render a button instead of a dropdown
64
- if (items.length <= 1) {
65
- return undefined;
66
- }
67
-
68
- return items;
57
+ return [...dropdownItemsBefore, ...versionLinks, ...dropdownItemsAfter];
69
58
  }
70
59
 
71
60
  const items = getItems();
@@ -74,12 +63,35 @@ export default function DocsVersionDropdownNavbarItem({
74
63
  activeDocContext.activeVersion ?? preferredVersion ?? latestVersion;
75
64
 
76
65
  // Mobile dropdown is handled a bit differently
77
- const dropdownLabel = mobile && items ? 'Versions' : dropdownVersion.label;
66
+ const dropdownLabel =
67
+ mobile && items
68
+ ? translate({
69
+ id: 'theme.navbar.mobileVersionsDropdown.label',
70
+ message: 'Versions',
71
+ description:
72
+ 'The label for the navbar versions dropdown on mobile view',
73
+ })
74
+ : dropdownVersion.label;
78
75
  const dropdownTo =
79
76
  mobile && items ? undefined : getVersionMainDoc(dropdownVersion).path;
80
77
 
78
+ // We don't want to render a version dropdown with 0 or 1 item
79
+ // If we build the site with a single docs version (onlyIncludeVersions: ['1.0.0'])
80
+ // We'd rather render a button instead of a dropdown
81
+ if (items.length <= 1) {
82
+ return (
83
+ <DefaultNavbarItem
84
+ {...props}
85
+ mobile={mobile}
86
+ label={dropdownLabel}
87
+ to={dropdownTo}
88
+ isActive={dropdownActiveClassDisabled ? () => false : undefined}
89
+ />
90
+ );
91
+ }
92
+
81
93
  return (
82
- <DefaultNavbarItem
94
+ <DropdownNavbarItem
83
95
  {...props}
84
96
  mobile={mobile}
85
97
  label={dropdownLabel}
@@ -7,12 +7,16 @@
7
7
 
8
8
  import React from 'react';
9
9
  import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
10
- import {useActiveVersion, useLatestVersion} from '@theme/hooks/useDocs';
10
+ import {
11
+ useActiveVersion,
12
+ useLatestVersion,
13
+ GlobalVersion,
14
+ } from '@theme/hooks/useDocs';
11
15
  import type {Props} from '@theme/NavbarItem/DocsVersionNavbarItem';
12
16
  import {useDocsPreferredVersion} from '@docusaurus/theme-common';
13
17
 
14
- const getVersionMainDoc = (version) =>
15
- version.docs.find((doc) => doc.id === version.mainDocId);
18
+ const getVersionMainDoc = (version: GlobalVersion) =>
19
+ version.docs.find((doc) => doc.id === version.mainDocId)!;
16
20
 
17
21
  export default function DocsVersionNavbarItem({
18
22
  label: staticLabel,
@@ -0,0 +1,180 @@
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, {useState, useRef, useEffect} from 'react';
9
+ import clsx from 'clsx';
10
+ import {
11
+ isSamePath,
12
+ useCollapsible,
13
+ Collapsible,
14
+ isRegexpStringMatch,
15
+ useLocalPathname,
16
+ } from '@docusaurus/theme-common';
17
+ import type {
18
+ DesktopOrMobileNavBarItemProps,
19
+ Props,
20
+ } from '@theme/NavbarItem/DropdownNavbarItem';
21
+ import type {LinkLikeNavbarItemProps} from '@theme/NavbarItem';
22
+
23
+ import {NavLink} from '@theme/NavbarItem/DefaultNavbarItem';
24
+ import NavbarItem from '@theme/NavbarItem';
25
+
26
+ const dropdownLinkActiveClass = 'dropdown__link--active';
27
+
28
+ function isItemActive(
29
+ item: LinkLikeNavbarItemProps,
30
+ localPathname: string,
31
+ ): boolean {
32
+ if (isSamePath(item.to, localPathname)) {
33
+ return true;
34
+ }
35
+ if (isRegexpStringMatch(item.activeBaseRegex, localPathname)) {
36
+ return true;
37
+ }
38
+ if (item.activeBasePath && localPathname.startsWith(item.activeBasePath)) {
39
+ return true;
40
+ }
41
+ return false;
42
+ }
43
+
44
+ function containsActiveItems(
45
+ items: readonly LinkLikeNavbarItemProps[],
46
+ localPathname: string,
47
+ ): boolean {
48
+ return items.some((item) => isItemActive(item, localPathname));
49
+ }
50
+
51
+ function DropdownNavbarItemDesktop({
52
+ items,
53
+ position,
54
+ className,
55
+ ...props
56
+ }: DesktopOrMobileNavBarItemProps) {
57
+ const dropdownRef = useRef<HTMLDivElement>(null);
58
+ const dropdownMenuRef = useRef<HTMLUListElement>(null);
59
+ const [showDropdown, setShowDropdown] = useState(false);
60
+
61
+ useEffect(() => {
62
+ const handleClickOutside = (event: MouseEvent | TouchEvent) => {
63
+ if (
64
+ !dropdownRef.current ||
65
+ dropdownRef.current.contains(event.target as Node)
66
+ ) {
67
+ return;
68
+ }
69
+ setShowDropdown(false);
70
+ };
71
+
72
+ document.addEventListener('mousedown', handleClickOutside);
73
+ document.addEventListener('touchstart', handleClickOutside);
74
+
75
+ return () => {
76
+ document.removeEventListener('mousedown', handleClickOutside);
77
+ document.removeEventListener('touchstart', handleClickOutside);
78
+ };
79
+ }, [dropdownRef]);
80
+
81
+ return (
82
+ <div
83
+ ref={dropdownRef}
84
+ className={clsx('navbar__item', 'dropdown', 'dropdown--hoverable', {
85
+ 'dropdown--right': position === 'right',
86
+ 'dropdown--show': showDropdown,
87
+ })}>
88
+ <NavLink
89
+ className={clsx('navbar__link', className)}
90
+ {...props}
91
+ onClick={props.to ? undefined : (e) => e.preventDefault()}
92
+ onKeyDown={(e) => {
93
+ if (e.key === 'Enter') {
94
+ e.preventDefault();
95
+ setShowDropdown(!showDropdown);
96
+ }
97
+ }}>
98
+ {props.children ?? props.label}
99
+ </NavLink>
100
+ <ul ref={dropdownMenuRef} className="dropdown__menu">
101
+ {items.map((childItemProps, i) => (
102
+ <NavbarItem
103
+ isDropdownItem
104
+ onKeyDown={(e) => {
105
+ if (i === items.length - 1 && e.key === 'Tab') {
106
+ e.preventDefault();
107
+ setShowDropdown(false);
108
+ const nextNavbarItem = dropdownRef.current!.nextElementSibling;
109
+ if (nextNavbarItem) {
110
+ (nextNavbarItem as HTMLElement).focus();
111
+ }
112
+ }
113
+ }}
114
+ activeClassName={dropdownLinkActiveClass}
115
+ {...childItemProps}
116
+ key={i}
117
+ />
118
+ ))}
119
+ </ul>
120
+ </div>
121
+ );
122
+ }
123
+
124
+ function DropdownNavbarItemMobile({
125
+ items,
126
+ className,
127
+ position: _position, // Need to destructure position from props so that it doesn't get passed on.
128
+ ...props
129
+ }: DesktopOrMobileNavBarItemProps) {
130
+ const localPathname = useLocalPathname();
131
+ const containsActive = containsActiveItems(items, localPathname);
132
+
133
+ const {collapsed, toggleCollapsed, setCollapsed} = useCollapsible({
134
+ initialState: () => !containsActive,
135
+ });
136
+
137
+ // Expand/collapse if any item active after a navigation
138
+ useEffect(() => {
139
+ if (containsActive) {
140
+ setCollapsed(!containsActive);
141
+ }
142
+ }, [localPathname, containsActive, setCollapsed]);
143
+
144
+ return (
145
+ <li
146
+ className={clsx('menu__list-item', {
147
+ 'menu__list-item--collapsed': collapsed,
148
+ })}>
149
+ <NavLink
150
+ role="button"
151
+ className={clsx('menu__link menu__link--sublist', className)}
152
+ {...props}
153
+ onClick={(e) => {
154
+ e.preventDefault();
155
+ toggleCollapsed();
156
+ }}>
157
+ {props.children ?? props.label}
158
+ </NavLink>
159
+ <Collapsible lazy as="ul" className="menu__list" collapsed={collapsed}>
160
+ {items.map((childItemProps, i) => (
161
+ <NavbarItem
162
+ mobile
163
+ isDropdownItem
164
+ onClick={props.onClick}
165
+ activeClassName="menu__link--active"
166
+ {...childItemProps}
167
+ key={i}
168
+ />
169
+ ))}
170
+ </Collapsible>
171
+ </li>
172
+ );
173
+ }
174
+
175
+ function DropdownNavbarItem({mobile = false, ...props}: Props): JSX.Element {
176
+ const Comp = mobile ? DropdownNavbarItemMobile : DropdownNavbarItemDesktop;
177
+ return <Comp {...props} />;
178
+ }
179
+
180
+ export default DropdownNavbarItem;
@@ -6,11 +6,14 @@
6
6
  */
7
7
 
8
8
  import React from 'react';
9
- import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
9
+ import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
10
10
  import IconLanguage from '@theme/IconLanguage';
11
11
  import type {Props} from '@theme/NavbarItem/LocaleDropdownNavbarItem';
12
12
  import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
13
13
  import {useAlternatePageUtils} from '@docusaurus/theme-common';
14
+ import type {LinkLikeNavbarItemProps} from '@theme/NavbarItem';
15
+
16
+ import styles from './styles.module.css';
14
17
 
15
18
  export default function LocaleDropdownNavbarItem({
16
19
  mobile,
@@ -23,11 +26,11 @@ export default function LocaleDropdownNavbarItem({
23
26
  } = useDocusaurusContext();
24
27
  const alternatePageUtils = useAlternatePageUtils();
25
28
 
26
- function getLocaleLabel(locale) {
29
+ function getLocaleLabel(locale: string) {
27
30
  return localeConfigs[locale].label;
28
31
  }
29
32
 
30
- const localeItems = locales.map((locale) => {
33
+ const localeItems = locales.map((locale): LinkLikeNavbarItemProps => {
31
34
  const to = `pathname://${alternatePageUtils.createUrl({
32
35
  locale,
33
36
  fullyQualified: false,
@@ -49,15 +52,13 @@ export default function LocaleDropdownNavbarItem({
49
52
  const dropdownLabel = mobile ? 'Languages' : getLocaleLabel(currentLocale);
50
53
 
51
54
  return (
52
- <DefaultNavbarItem
55
+ <DropdownNavbarItem
53
56
  {...props}
54
57
  href="#"
55
58
  mobile={mobile}
56
59
  label={
57
60
  <span>
58
- <IconLanguage
59
- style={{verticalAlign: 'text-bottom', marginRight: 5}}
60
- />
61
+ <IconLanguage className={styles.iconLanguage} />
61
62
  <span>{dropdownLabel}</span>
62
63
  </span>
63
64
  }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ .iconLanguage {
9
+ vertical-align: text-bottom;
10
+ margin-right: 5px;
11
+ }