@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
@@ -16,6 +16,7 @@ import {
16
16
  DEFAULT_SEARCH_TAG,
17
17
  useTitleFormatter,
18
18
  useAlternatePageUtils,
19
+ useThemeConfig,
19
20
  } from '@docusaurus/theme-common';
20
21
  import {useLocation} from '@docusaurus/router';
21
22
 
@@ -83,12 +84,10 @@ function CanonicalUrlHeaders({permalink}: {permalink?: string}) {
83
84
 
84
85
  export default function LayoutHead(props: Props): JSX.Element {
85
86
  const {
86
- siteConfig: {
87
- favicon,
88
- themeConfig: {metadatas, image: defaultImage},
89
- },
87
+ siteConfig: {favicon},
90
88
  i18n: {currentLocale, localeConfigs},
91
89
  } = useDocusaurusContext();
90
+ const {metadatas, image: defaultImage} = useThemeConfig();
92
91
  const {title, description, image, keywords, searchMetadatas} = props;
93
92
  const faviconUrl = useBaseUrl(favicon);
94
93
  const pageTitle = useTitleFormatter(title);
@@ -105,13 +104,14 @@ export default function LayoutHead(props: Props): JSX.Element {
105
104
  {favicon && <link rel="shortcut icon" href={faviconUrl} />}
106
105
  <title>{pageTitle}</title>
107
106
  <meta property="og:title" content={pageTitle} />
108
- {image ||
109
- (defaultImage && (
110
- <meta name="twitter:card" content="summary_large_image" />
111
- ))}
107
+ <meta name="twitter:card" content="summary_large_image" />
112
108
  </Head>
113
109
 
114
- <Seo {...{description, keywords, image}} />
110
+ {/* image can override the default image */}
111
+ {defaultImage && <Seo image={defaultImage} />}
112
+ {image && <Seo image={image} />}
113
+
114
+ <Seo description={description} keywords={keywords} />
115
115
 
116
116
  <CanonicalUrlHeaders />
117
117
 
@@ -12,6 +12,7 @@ import {
12
12
  AnnouncementBarProvider,
13
13
  DocsPreferredVersionContextProvider,
14
14
  MobileSecondaryMenuProvider,
15
+ ScrollControllerProvider,
15
16
  } from '@docusaurus/theme-common';
16
17
  import type {Props} from '@theme/LayoutProviders';
17
18
 
@@ -20,11 +21,13 @@ export default function LayoutProviders({children}: Props): JSX.Element {
20
21
  <ThemeProvider>
21
22
  <AnnouncementBarProvider>
22
23
  <UserPreferencesProvider>
23
- <DocsPreferredVersionContextProvider>
24
- <MobileSecondaryMenuProvider>
25
- {children}
26
- </MobileSecondaryMenuProvider>
27
- </DocsPreferredVersionContextProvider>
24
+ <ScrollControllerProvider>
25
+ <DocsPreferredVersionContextProvider>
26
+ <MobileSecondaryMenuProvider>
27
+ {children}
28
+ </MobileSecondaryMenuProvider>
29
+ </DocsPreferredVersionContextProvider>
30
+ </ScrollControllerProvider>
28
31
  </UserPreferencesProvider>
29
32
  </AnnouncementBarProvider>
30
33
  </ThemeProvider>
@@ -12,17 +12,15 @@ import Link from '@docusaurus/Link';
12
12
  import ThemedImage from '@theme/ThemedImage';
13
13
  import useBaseUrl from '@docusaurus/useBaseUrl';
14
14
  import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
15
+ import {useThemeConfig} from '@docusaurus/theme-common';
15
16
 
16
17
  const Logo = (props: Props): JSX.Element => {
17
18
  const {
18
- siteConfig: {
19
- title,
20
- themeConfig: {
21
- navbar: {title: navbarTitle, logo = {src: ''}},
22
- },
23
- },
24
- isClient,
19
+ siteConfig: {title},
25
20
  } = useDocusaurusContext();
21
+ const {
22
+ navbar: {title: navbarTitle, logo = {src: ''}},
23
+ } = useThemeConfig();
26
24
 
27
25
  const {imageClassName, titleClassName, ...propsRest} = props;
28
26
  const logoLink = useBaseUrl(logo.href || '/');
@@ -30,20 +28,26 @@ const Logo = (props: Props): JSX.Element => {
30
28
  light: useBaseUrl(logo.src),
31
29
  dark: useBaseUrl(logo.srcDark || logo.src),
32
30
  };
31
+ const themedImage = (
32
+ <ThemedImage
33
+ sources={sources}
34
+ height={logo.height}
35
+ width={logo.width}
36
+ alt={logo.alt || navbarTitle || title}
37
+ />
38
+ );
33
39
 
34
40
  return (
35
41
  <Link
36
42
  to={logoLink}
37
43
  {...propsRest}
38
44
  {...(logo.target && {target: logo.target})}>
39
- {logo.src && (
40
- <ThemedImage
41
- key={isClient}
42
- className={imageClassName}
43
- sources={sources}
44
- alt={logo.alt || navbarTitle || title}
45
- />
46
- )}
45
+ {logo.src &&
46
+ (imageClassName ? (
47
+ <div className={imageClassName}>{themedImage}</div>
48
+ ) : (
49
+ <>{themedImage}</>
50
+ ))}
47
51
  {navbarTitle != null && <b className={titleClassName}>{navbarTitle}</b>}
48
52
  </Link>
49
53
  );
@@ -6,13 +6,32 @@
6
6
  */
7
7
 
8
8
  import React, {ComponentProps, isValidElement, ReactElement} from 'react';
9
+ import Head from '@docusaurus/Head';
9
10
  import Link from '@docusaurus/Link';
10
11
  import CodeBlock, {Props} from '@theme/CodeBlock';
11
12
  import Heading from '@theme/Heading';
12
13
  import Details from '@theme/Details';
13
14
  import type {MDXComponentsObject} from '@theme/MDXComponents';
14
15
 
16
+ import './styles.css';
17
+
18
+ // MDX elements are wrapped through the MDX pragma
19
+ // In some cases (notably usage with Head/Helmet) we need to unwrap those elements.
20
+ function unwrapMDXElement(element: ReactElement) {
21
+ if (element?.props?.mdxType && element?.props?.originalType) {
22
+ const {mdxType, originalType, ...newProps} = element.props;
23
+ return React.createElement(element.props.originalType, newProps);
24
+ }
25
+ return element;
26
+ }
27
+
15
28
  const MDXComponents: MDXComponentsObject = {
29
+ head: (props) => {
30
+ const unwrappedChildren = React.Children.map(props.children, (child) =>
31
+ unwrapMDXElement(child as ReactElement),
32
+ );
33
+ return <Head {...props}>{unwrappedChildren}</Head>;
34
+ },
16
35
  code: (props) => {
17
36
  const {children} = props;
18
37
 
@@ -34,7 +53,7 @@ const MDXComponents: MDXComponentsObject = {
34
53
 
35
54
  // See comment for `code` above
36
55
  if (isValidElement(children) && isValidElement(children?.props?.children)) {
37
- return children?.props.children;
56
+ return children.props.children;
38
57
  }
39
58
 
40
59
  return (
@@ -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
+ ul.contains-task-list {
9
+ padding-left: 0;
10
+ list-style: none;
11
+ }
@@ -18,7 +18,11 @@ import styles from './styles.module.css';
18
18
 
19
19
  function MDXPage(props: Props): JSX.Element {
20
20
  const {content: MDXPageContent} = props;
21
- const {frontMatter, metadata} = MDXPageContent;
21
+ const {
22
+ // TODO this frontmatter is not validated/normalized, it's the raw user-provided one. We should expose normalized one too!
23
+ frontMatter,
24
+ metadata,
25
+ } = MDXPageContent;
22
26
 
23
27
  const {
24
28
  title,
@@ -44,7 +48,11 @@ function MDXPage(props: Props): JSX.Element {
44
48
  </div>
45
49
  {!hideTableOfContents && MDXPageContent.toc && (
46
50
  <div className="col col--2">
47
- <TOC toc={MDXPageContent.toc} />
51
+ <TOC
52
+ toc={MDXPageContent.toc}
53
+ minHeadingLevel={frontMatter.toc_min_heading_level}
54
+ maxHeadingLevel={frontMatter.toc_max_heading_level}
55
+ />
48
56
  </div>
49
57
  )}
50
58
  </div>
@@ -15,6 +15,7 @@ import {
15
15
  useThemeConfig,
16
16
  useMobileSecondaryMenuRenderer,
17
17
  usePrevious,
18
+ useHistoryPopHandler,
18
19
  } from '@docusaurus/theme-common';
19
20
  import useHideableNavbar from '@theme/hooks/useHideableNavbar';
20
21
  import useLockBodyScroll from '@theme/hooks/useLockBodyScroll';
@@ -23,6 +24,7 @@ import {useActivePlugin} from '@theme/hooks/useDocs';
23
24
  import NavbarItem, {Props as NavbarItemConfig} from '@theme/NavbarItem';
24
25
  import Logo from '@theme/Logo';
25
26
  import IconMenu from '@theme/IconMenu';
27
+ import IconClose from '@theme/IconClose';
26
28
 
27
29
  import styles from './styles.module.css';
28
30
 
@@ -57,6 +59,18 @@ function useMobileSidebar() {
57
59
 
58
60
  const [shown, setShown] = useState(false);
59
61
 
62
+ // Close mobile sidebar on navigation pop
63
+ // Most likely firing when using the Android back button (but not only)
64
+ useHistoryPopHandler(() => {
65
+ if (shown) {
66
+ setShown(false);
67
+ // Should we prevent the navigation here?
68
+ // See https://github.com/facebook/docusaurus/pull/5462#issuecomment-911699846
69
+ return false; // prevent pop navigation
70
+ }
71
+ return undefined;
72
+ });
73
+
60
74
  const toggle = useCallback(() => {
61
75
  setShown((s) => !s);
62
76
  }, []);
@@ -155,12 +169,22 @@ function NavbarMobileSidebar({
155
169
  imageClassName="navbar__logo"
156
170
  titleClassName="navbar__title"
157
171
  />
158
- {!colorModeToggle.disabled && sidebarShown && (
172
+ {!colorModeToggle.disabled && (
159
173
  <Toggle
174
+ className={styles.navbarSidebarToggle}
160
175
  checked={colorModeToggle.isDarkTheme}
161
176
  onChange={colorModeToggle.toggle}
162
177
  />
163
178
  )}
179
+ <button
180
+ type="button"
181
+ className="clean-btn navbar-sidebar__close"
182
+ onClick={toggleSidebar}>
183
+ <IconClose
184
+ color="var(--ifm-color-emphasis-600)"
185
+ className={styles.navbarSidebarCloseSvg}
186
+ />
187
+ </button>
164
188
  </div>
165
189
 
166
190
  <div
@@ -175,7 +199,7 @@ function NavbarMobileSidebar({
175
199
  </ul>
176
200
  </div>
177
201
 
178
- <div className="navbar-sidebar__item navbar-sidebar__item--secondary menu">
202
+ <div className="navbar-sidebar__item menu">
179
203
  {items.length > 0 && (
180
204
  <button
181
205
  type="button"
@@ -8,7 +8,7 @@
8
8
  /*
9
9
  Hide toggle in small viewports
10
10
  */
11
- @media screen and (max-width: 997px) {
11
+ @media (max-width: 996px) {
12
12
  .toggle {
13
13
  display: none;
14
14
  }
@@ -21,3 +21,7 @@ Hide toggle in small viewports
21
21
  .navbarHidden {
22
22
  transform: translate3d(0, calc(-100% - 2px), 0);
23
23
  }
24
+
25
+ .navbarSidebarToggle {
26
+ margin-right: 1rem;
27
+ }
@@ -16,6 +16,8 @@ import type {
16
16
  } from '@theme/NavbarItem/DefaultNavbarItem';
17
17
  import IconExternalLink from '@theme/IconExternalLink';
18
18
  import isInternalUrl from '@docusaurus/isInternalUrl';
19
+ import {isRegexpStringMatch} from '@docusaurus/theme-common';
20
+ import {getInfimaActiveClassName} from './index';
19
21
 
20
22
  const dropdownLinkActiveClass = 'dropdown__link--active';
21
23
 
@@ -25,7 +27,7 @@ export function NavLink({
25
27
  to,
26
28
  href,
27
29
  label,
28
- activeClassName = 'navbar__link--active',
30
+ activeClassName = '',
29
31
  prependBaseUrlToHref,
30
32
  ...props
31
33
  }: NavLinkProps): JSX.Element {
@@ -45,13 +47,15 @@ export function NavLink({
45
47
  }
46
48
  : {
47
49
  isNavLink: true,
48
- activeClassName,
50
+ activeClassName: !props.className?.includes(activeClassName)
51
+ ? activeClassName
52
+ : '',
49
53
  to: toUrl,
50
54
  ...(activeBasePath || activeBaseRegex
51
55
  ? {
52
56
  isActive: (_match, location) =>
53
57
  activeBaseRegex
54
- ? new RegExp(activeBaseRegex).test(location.pathname)
58
+ ? isRegexpStringMatch(activeBaseRegex, location.pathname)
55
59
  : location.pathname.startsWith(activeBaseUrl),
56
60
  }
57
61
  : null),
@@ -109,7 +113,14 @@ function DefaultNavbarItem({
109
113
  ...props
110
114
  }: Props): JSX.Element {
111
115
  const Comp = mobile ? DefaultNavbarItemMobile : DefaultNavbarItemDesktop;
112
- return <Comp {...props} />;
116
+ return (
117
+ <Comp
118
+ {...props}
119
+ activeClassName={
120
+ props.activeClassName ?? getInfimaActiveClassName(mobile)
121
+ }
122
+ />
123
+ );
113
124
  }
114
125
 
115
126
  export default DefaultNavbarItem;
@@ -9,6 +9,7 @@ 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';
@@ -31,7 +32,6 @@ Available doc ids are:\n- ${docIds}`,
31
32
 
32
33
  export default function DocNavbarItem({
33
34
  docId,
34
- activeSidebarClassName,
35
35
  label: staticLabel,
36
36
  docsPluginId,
37
37
  ...props
@@ -41,19 +41,23 @@ export default function DocNavbarItem({
41
41
  const latestVersion = useLatestVersion(docsPluginId);
42
42
 
43
43
  // Versions used to look for the doc to link to, ordered + no duplicate
44
- const versions: GlobalDataVersion[] = uniq(
45
- [activeVersion, preferredVersion, latestVersion].filter(Boolean),
44
+ const versions = uniq(
45
+ [activeVersion, preferredVersion, latestVersion].filter(
46
+ Boolean,
47
+ ) as GlobalDataVersion[],
46
48
  );
47
49
  const doc = getDocInVersions(versions, docId);
50
+ const activeDocInfimaClassName = getInfimaActiveClassName(props.mobile);
48
51
 
49
52
  return (
50
53
  <DefaultNavbarItem
51
54
  exact
52
55
  {...props}
53
56
  className={clsx(props.className, {
54
- [activeSidebarClassName]:
55
- activeDoc && activeDoc.sidebar === doc.sidebar,
57
+ [activeDocInfimaClassName]:
58
+ activeDoc?.sidebar && activeDoc.sidebar === doc.sidebar,
56
59
  })}
60
+ activeClassName={activeDocInfimaClassName}
57
61
  label={staticLabel ?? doc.id}
58
62
  to={doc.path}
59
63
  />
@@ -15,9 +15,11 @@ import {
15
15
  } from '@theme/hooks/useDocs';
16
16
  import type {Props} from '@theme/NavbarItem/DocsVersionDropdownNavbarItem';
17
17
  import {useDocsPreferredVersion} from '@docusaurus/theme-common';
18
+ import {translate} from '@docusaurus/Translate';
19
+ import type {GlobalDataVersion} from '@docusaurus/plugin-content-docs-types';
18
20
 
19
- const getVersionMainDoc = (version) =>
20
- version.docs.find((doc) => doc.id === version.mainDocId);
21
+ const getVersionMainDoc = (version: GlobalDataVersion) =>
22
+ version.docs.find((doc) => doc.id === version.mainDocId)!;
21
23
 
22
24
  export default function DocsVersionDropdownNavbarItem({
23
25
  mobile,
@@ -31,9 +33,8 @@ export default function DocsVersionDropdownNavbarItem({
31
33
  const versions = useVersions(docsPluginId);
32
34
  const latestVersion = useLatestVersion(docsPluginId);
33
35
 
34
- const {preferredVersion, savePreferredVersionName} = useDocsPreferredVersion(
35
- docsPluginId,
36
- );
36
+ const {preferredVersion, savePreferredVersionName} =
37
+ useDocsPreferredVersion(docsPluginId);
37
38
 
38
39
  function getItems() {
39
40
  const versionLinks = versions.map((version) => {
@@ -62,7 +63,15 @@ export default function DocsVersionDropdownNavbarItem({
62
63
  activeDocContext.activeVersion ?? preferredVersion ?? latestVersion;
63
64
 
64
65
  // Mobile dropdown is handled a bit differently
65
- 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;
66
75
  const dropdownTo =
67
76
  mobile && items ? undefined : getVersionMainDoc(dropdownVersion).path;
68
77
 
@@ -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,
@@ -11,6 +11,7 @@ import {
11
11
  isSamePath,
12
12
  useCollapsible,
13
13
  Collapsible,
14
+ isRegexpStringMatch,
14
15
  useLocalPathname,
15
16
  } from '@docusaurus/theme-common';
16
17
  import type {
@@ -31,10 +32,7 @@ function isItemActive(
31
32
  if (isSamePath(item.to, localPathname)) {
32
33
  return true;
33
34
  }
34
- if (
35
- item.activeBaseRegex &&
36
- new RegExp(item.activeBaseRegex).test(localPathname)
37
- ) {
35
+ if (isRegexpStringMatch(item.activeBaseRegex, localPathname)) {
38
36
  return true;
39
37
  }
40
38
  if (item.activeBasePath && localPathname.startsWith(item.activeBasePath)) {
@@ -88,7 +86,7 @@ function DropdownNavbarItemDesktop({
88
86
  'dropdown--show': showDropdown,
89
87
  })}>
90
88
  <NavLink
91
- className={clsx('navbar__item navbar__link', className)}
89
+ className={clsx('navbar__link', className)}
92
90
  {...props}
93
91
  onClick={props.to ? undefined : (e) => e.preventDefault()}
94
92
  onKeyDown={(e) => {
@@ -141,7 +139,7 @@ function DropdownNavbarItemMobile({
141
139
  if (containsActive) {
142
140
  setCollapsed(!containsActive);
143
141
  }
144
- }, [localPathname, containsActive]);
142
+ }, [localPathname, containsActive, setCollapsed]);
145
143
 
146
144
  return (
147
145
  <li
@@ -11,6 +11,9 @@ 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,
@@ -55,9 +58,7 @@ export default function LocaleDropdownNavbarItem({
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
+ }
@@ -16,7 +16,9 @@ import type {Types, Props} from '@theme/NavbarItem';
16
16
 
17
17
  const NavbarItemComponents: Record<
18
18
  Exclude<Types, undefined>,
19
- () => (props) => JSX.Element
19
+ // TODO: properly type this
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ () => (props: any) => JSX.Element
20
22
  > = {
21
23
  default: () => DefaultNavbarItem,
22
24
  localeDropdown: () => LocaleDropdownNavbarItem,
@@ -55,6 +57,9 @@ function getComponentType(
55
57
  return type as NavbarItemComponentType;
56
58
  }
57
59
 
60
+ export const getInfimaActiveClassName = (mobile?: boolean): string =>
61
+ mobile ? 'menu__link--active' : 'navbar__link--active';
62
+
58
63
  export default function NavbarItem({type, ...props}: Props): JSX.Element {
59
64
  const componentType = getComponentType(
60
65
  type,
@@ -7,8 +7,8 @@
7
7
 
8
8
  import React from 'react';
9
9
  import Head from '@docusaurus/Head';
10
- import {useThemeConfig, useTitleFormatter} from '@docusaurus/theme-common';
11
- import useBaseUrl from '@docusaurus/useBaseUrl';
10
+ import {useTitleFormatter} from '@docusaurus/theme-common';
11
+ import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
12
12
 
13
13
  import type {Props} from '@theme/Seo';
14
14
 
@@ -17,10 +17,11 @@ export default function Seo({
17
17
  description,
18
18
  keywords,
19
19
  image,
20
+ children,
20
21
  }: Props): JSX.Element {
21
- const {image: defaultImage} = useThemeConfig();
22
22
  const pageTitle = useTitleFormatter(title);
23
- const pageImage = useBaseUrl(image || defaultImage, {absolute: true});
23
+ const {withBaseUrl} = useBaseUrlUtils();
24
+ const pageImage = image ? withBaseUrl(image, {absolute: true}) : undefined;
24
25
 
25
26
  return (
26
27
  <Head>
@@ -41,6 +42,8 @@ export default function Seo({
41
42
 
42
43
  {pageImage && <meta property="og:image" content={pageImage} />}
43
44
  {pageImage && <meta name="twitter:image" content={pageImage} />}
45
+
46
+ {children}
44
47
  </Head>
45
48
  );
46
49
  }
@@ -7,48 +7,23 @@
7
7
 
8
8
  import React from 'react';
9
9
  import clsx from 'clsx';
10
- import useTOCHighlight from '@theme/hooks/useTOCHighlight';
11
- import type {TOCProps, TOCHeadingsProps} from '@theme/TOC';
10
+ import type {TOCProps} from '@theme/TOC';
11
+ import TOCItems from '@theme/TOCItems';
12
12
  import styles from './styles.module.css';
13
13
 
14
- const LINK_CLASS_NAME = 'table-of-contents__link';
15
- const ACTIVE_LINK_CLASS_NAME = 'table-of-contents__link--active';
16
- const TOP_OFFSET = 100;
14
+ // Using a custom className
15
+ // This prevents TOC highlighting to highlight TOCInline/TOCCollapsible by mistake
16
+ const LINK_CLASS_NAME = 'table-of-contents__link toc-highlight';
17
+ const LINK_ACTIVE_CLASS_NAME = 'table-of-contents__link--active';
17
18
 
18
- /* eslint-disable jsx-a11y/control-has-associated-label */
19
- export function TOCHeadings({
20
- toc,
21
- isChild,
22
- }: TOCHeadingsProps): JSX.Element | null {
23
- if (!toc.length) {
24
- return null;
25
- }
19
+ function TOC({className, ...props}: TOCProps): JSX.Element {
26
20
  return (
27
- <ul
28
- className={
29
- isChild ? '' : 'table-of-contents table-of-contents__left-border'
30
- }>
31
- {toc.map((heading) => (
32
- <li key={heading.id}>
33
- <a
34
- href={`#${heading.id}`}
35
- className={LINK_CLASS_NAME}
36
- // Developer provided the HTML, so assume it's safe.
37
- // eslint-disable-next-line react/no-danger
38
- dangerouslySetInnerHTML={{__html: heading.value}}
39
- />
40
- <TOCHeadings isChild toc={heading.children} />
41
- </li>
42
- ))}
43
- </ul>
44
- );
45
- }
46
-
47
- function TOC({toc}: TOCProps): JSX.Element {
48
- useTOCHighlight(LINK_CLASS_NAME, ACTIVE_LINK_CLASS_NAME, TOP_OFFSET);
49
- return (
50
- <div className={clsx(styles.tableOfContents, 'thin-scrollbar')}>
51
- <TOCHeadings toc={toc} />
21
+ <div className={clsx(styles.tableOfContents, 'thin-scrollbar', className)}>
22
+ <TOCItems
23
+ {...props}
24
+ linkClassName={LINK_CLASS_NAME}
25
+ linkActiveClassName={LINK_ACTIVE_CLASS_NAME}
26
+ />
52
27
  </div>
53
28
  );
54
29
  }
@@ -12,7 +12,7 @@
12
12
  top: calc(var(--ifm-navbar-height) + 1rem);
13
13
  }
14
14
 
15
- @media only screen and (max-width: 996px) {
15
+ @media (max-width: 996px) {
16
16
  .tableOfContents {
17
17
  display: none;
18
18
  }