@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
@@ -6,19 +6,18 @@
6
6
  */
7
7
  import React, {useState, useRef, memo} from 'react';
8
8
  import {useThemeConfig} from '@docusaurus/theme-common';
9
- import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
9
+ import useIsBrowser from '@docusaurus/useIsBrowser';
10
10
  import clsx from 'clsx';
11
- import './styles.css';
12
11
  import styles from './styles.module.css';
13
12
 
14
13
  const Dark = ({icon, style}) => (
15
- <span className={clsx(styles.toggle, styles.dark)} style={style}>
14
+ <span className={clsx(styles.toggleIcon, styles.dark)} style={style}>
16
15
  {icon}
17
16
  </span>
18
17
  );
19
18
 
20
19
  const Light = ({icon, style}) => (
21
- <span className={clsx(styles.toggle, styles.light)} style={style}>
20
+ <span className={clsx(styles.toggleIcon, styles.light)} style={style}>
22
21
  {icon}
23
22
  </span>
24
23
  ); // Based on react-toggle (https://github.com/aaronshaf/react-toggle/).
@@ -30,31 +29,37 @@ const Toggle = memo(
30
29
  const inputRef = useRef(null);
31
30
  return (
32
31
  <div
33
- className={clsx('react-toggle', className, {
34
- 'react-toggle--checked': checked,
35
- 'react-toggle--focus': focused,
36
- 'react-toggle--disabled': disabled,
32
+ className={clsx(styles.toggle, className, {
33
+ [styles.toggleChecked]: checked,
34
+ [styles.toggleFocused]: focused,
35
+ [styles.toggleDisabled]: disabled,
37
36
  })}>
37
+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
38
38
  <div
39
- className="react-toggle-track"
39
+ className={styles.toggleTrack}
40
40
  role="button"
41
41
  tabIndex={-1}
42
42
  onClick={() => inputRef.current?.click()}>
43
- <div className="react-toggle-track-check">{icons.checked}</div>
44
- <div className="react-toggle-track-x">{icons.unchecked}</div>
45
- <div className="react-toggle-thumb" />
43
+ <div className={styles.toggleTrackCheck}>{icons.checked}</div>
44
+ <div className={styles.toggleTrackX}>{icons.unchecked}</div>
45
+ <div className={styles.toggleTrackThumb} />
46
46
  </div>
47
47
 
48
48
  <input
49
49
  ref={inputRef}
50
50
  checked={checked}
51
51
  type="checkbox"
52
- className="react-toggle-screenreader-only"
52
+ className={styles.toggleScreenReader}
53
53
  aria-label="Switch between dark and light mode"
54
54
  onChange={onChange}
55
55
  onClick={() => setChecked(!checked)}
56
56
  onFocus={() => setFocused(true)}
57
57
  onBlur={() => setFocused(false)}
58
+ onKeyDown={(e) => {
59
+ if (e.key === 'Enter') {
60
+ inputRef.current?.click();
61
+ }
62
+ }}
58
63
  />
59
64
  </div>
60
65
  );
@@ -66,10 +71,10 @@ export default function (props) {
66
71
  switchConfig: {darkIcon, darkIconStyle, lightIcon, lightIconStyle},
67
72
  },
68
73
  } = useThemeConfig();
69
- const {isClient} = useDocusaurusContext();
74
+ const isBrowser = useIsBrowser();
70
75
  return (
71
76
  <Toggle
72
- disabled={!isClient}
77
+ disabled={!isBrowser}
73
78
  icons={{
74
79
  checked: <Dark icon={darkIcon} style={darkIconStyle} />,
75
80
  unchecked: <Light icon={lightIcon} style={lightIconStyle} />,
@@ -6,6 +6,97 @@
6
6
  */
7
7
 
8
8
  .toggle {
9
+ touch-action: pan-x;
10
+ position: relative;
11
+ cursor: pointer;
12
+ user-select: none;
13
+ -webkit-tap-highlight-color: transparent;
14
+ }
15
+
16
+ .toggleScreenReader {
17
+ border: 0;
18
+ clip: rect(0 0 0 0);
19
+ height: 1px;
20
+ margin: -1px;
21
+ overflow: hidden;
22
+ position: absolute;
23
+ width: 1px;
24
+ }
25
+
26
+ .toggleDisabled {
27
+ cursor: not-allowed;
28
+ }
29
+
30
+ .toggleTrack {
31
+ width: 50px;
32
+ height: 24px;
33
+ border-radius: 30px;
34
+ background-color: #4d4d4d;
35
+ transition: all 0.2s ease;
36
+ }
37
+
38
+ .toggleTrackCheck {
39
+ position: absolute;
40
+ width: 14px;
41
+ height: 10px;
42
+ top: 0px;
43
+ bottom: 0px;
44
+ margin: auto 0;
45
+ left: 8px;
46
+ opacity: 0;
47
+ transition: opacity 0.25s ease;
48
+ }
49
+
50
+ [data-theme='dark'] .toggle .toggleTrackCheck,
51
+ .toggleChecked .toggleTrackCheck {
52
+ opacity: 1;
53
+ transition: opacity 0.25s ease;
54
+ }
55
+
56
+ .toggleTrackX {
57
+ position: absolute;
58
+ width: 10px;
59
+ height: 10px;
60
+ top: 0px;
61
+ bottom: 0px;
62
+ margin: auto 0;
63
+ right: 10px;
64
+ opacity: 1;
65
+ transition: opacity 0.25s ease;
66
+ }
67
+
68
+ [data-theme='dark'] .toggle .toggleTrackX,
69
+ .toggleChecked .toggleTrackX {
70
+ opacity: 0;
71
+ }
72
+
73
+ .toggleTrackThumb {
74
+ position: absolute;
75
+ top: 1px;
76
+ left: 1px;
77
+ width: 22px;
78
+ height: 22px;
79
+ border: 1px solid #4d4d4d;
80
+ border-radius: 50%;
81
+ background-color: #fafafa;
82
+ transition: all 0.25s ease;
83
+ }
84
+
85
+ [data-theme='dark'] .toggle .toggleTrackThumb,
86
+ .toggleChecked .toggleTrackThumb {
87
+ left: 27px;
88
+ }
89
+
90
+ .toggleFocused .toggleTrackThumb,
91
+ .toggle:hover .toggleTrackThumb {
92
+ box-shadow: 0px 0px 2px 3px var(--ifm-color-primary);
93
+ }
94
+
95
+ .toggle:active:not(.toggleDisabled) .toggleTrackThumb {
96
+ box-shadow: 0px 0px 5px 5px var(--ifm-color-primary);
97
+ }
98
+
99
+ .toggleIcon {
9
100
  align-items: center;
10
101
  display: flex;
11
102
  height: 10px;
@@ -6,19 +6,15 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import useTabGroupChoice from '@theme/hooks/useTabGroupChoice';
9
- import useAnnouncementBar from '@theme/hooks/useAnnouncementBar';
10
9
  import UserPreferencesContext from '@theme/UserPreferencesContext';
11
10
 
12
11
  function UserPreferencesProvider(props) {
13
12
  const {tabGroupChoices, setTabGroupChoices} = useTabGroupChoice();
14
- const {isAnnouncementBarClosed, closeAnnouncementBar} = useAnnouncementBar();
15
13
  return (
16
14
  <UserPreferencesContext.Provider
17
15
  value={{
18
16
  tabGroupChoices,
19
17
  setTabGroupChoices,
20
- isAnnouncementBarClosed,
21
- closeAnnouncementBar,
22
18
  }}>
23
19
  {props.children}
24
20
  </UserPreferencesContext.Provider>
@@ -4,72 +4,59 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import {useState, useCallback, useEffect, useRef} from 'react';
8
- import {useLocation} from '@docusaurus/router';
9
- import useScrollPosition from '@theme/hooks/useScrollPosition';
10
- import {useLocationChange} from '@docusaurus/theme-common';
7
+ import {useState, useCallback, useRef} from 'react';
8
+ import {useLocationChange, useScrollPosition} from '@docusaurus/theme-common';
11
9
 
12
10
  const useHideableNavbar = (hideOnScroll) => {
13
- const location = useLocation();
14
11
  const [isNavbarVisible, setIsNavbarVisible] = useState(hideOnScroll);
15
12
  const isFocusedAnchor = useRef(false);
16
- const [navbarHeight, setNavbarHeight] = useState(0);
13
+ const navbarHeight = useRef(0);
17
14
  const navbarRef = useCallback((node) => {
18
15
  if (node !== null) {
19
- setNavbarHeight(node.getBoundingClientRect().height);
16
+ navbarHeight.current = node.getBoundingClientRect().height;
20
17
  }
21
18
  }, []);
22
- useScrollPosition(
23
- ({scrollY: scrollTop}, {scrollY: lastScrollTop}) => {
24
- if (!hideOnScroll) {
25
- return;
26
- }
27
-
28
- if (scrollTop < navbarHeight) {
29
- setIsNavbarVisible(true);
30
- return;
31
- }
32
-
33
- if (isFocusedAnchor.current) {
34
- isFocusedAnchor.current = false;
35
- setIsNavbarVisible(false);
36
- return;
37
- }
19
+ useScrollPosition((currentPosition, lastPosition) => {
20
+ if (!hideOnScroll) {
21
+ return;
22
+ }
38
23
 
39
- if (lastScrollTop && scrollTop === 0) {
40
- setIsNavbarVisible(true);
41
- }
24
+ const scrollTop = currentPosition.scrollY; // It needed for mostly to handle rubber band scrolling
42
25
 
43
- const documentHeight =
44
- document.documentElement.scrollHeight - navbarHeight;
45
- const windowHeight = window.innerHeight;
26
+ if (scrollTop < navbarHeight.current) {
27
+ setIsNavbarVisible(true);
28
+ return;
29
+ }
46
30
 
47
- if (lastScrollTop && scrollTop >= lastScrollTop) {
48
- setIsNavbarVisible(false);
49
- } else if (scrollTop + windowHeight < documentHeight) {
50
- setIsNavbarVisible(true);
51
- }
52
- },
53
- [navbarHeight, isFocusedAnchor],
54
- );
55
- useLocationChange((locationChangeEvent) => {
56
- if (!hideOnScroll || locationChangeEvent.location.hash) {
31
+ if (isFocusedAnchor.current) {
32
+ isFocusedAnchor.current = false;
57
33
  return;
58
34
  }
59
35
 
60
- setIsNavbarVisible(true);
36
+ const lastScrollTop = lastPosition?.scrollY;
37
+ const documentHeight =
38
+ document.documentElement.scrollHeight - navbarHeight.current;
39
+ const windowHeight = window.innerHeight;
40
+
41
+ if (lastScrollTop && scrollTop >= lastScrollTop) {
42
+ setIsNavbarVisible(false);
43
+ } else if (scrollTop + windowHeight < documentHeight) {
44
+ setIsNavbarVisible(true);
45
+ }
61
46
  });
62
- useEffect(() => {
47
+ useLocationChange((locationChangeEvent) => {
63
48
  if (!hideOnScroll) {
64
49
  return;
65
50
  }
66
51
 
67
- if (!location.hash) {
52
+ if (locationChangeEvent.location.hash) {
53
+ isFocusedAnchor.current = true;
54
+ setIsNavbarVisible(false);
68
55
  return;
69
56
  }
70
57
 
71
- isFocusedAnchor.current = true;
72
- }, [location.hash]);
58
+ setIsNavbarVisible(true);
59
+ });
73
60
  return {
74
61
  navbarRef,
75
62
  isNavbarVisible,
@@ -16,14 +16,12 @@ const useTabGroupChoice = () => {
16
16
  useEffect(() => {
17
17
  try {
18
18
  const localStorageChoices = {};
19
-
20
- for (const storageKey of listStorageKeys()) {
19
+ listStorageKeys().forEach((storageKey) => {
21
20
  if (storageKey.startsWith(TAB_CHOICE_PREFIX)) {
22
21
  const groupId = storageKey.substring(TAB_CHOICE_PREFIX.length);
23
22
  localStorageChoices[groupId] = createStorageSlot(storageKey).get();
24
23
  }
25
- }
26
-
24
+ });
27
25
  setChoices(localStorageChoices);
28
26
  } catch (err) {
29
27
  console.error(err);
@@ -60,7 +60,7 @@ const useTheme = () => {
60
60
  } catch (err) {
61
61
  console.error(err);
62
62
  }
63
- }, [setTheme]);
63
+ }, [disableSwitch, setTheme]);
64
64
  useEffect(() => {
65
65
  if (disableSwitch && !respectPrefersColorScheme) {
66
66
  return;
@@ -71,7 +71,7 @@ const useTheme = () => {
71
71
  .addListener(({matches}) => {
72
72
  setTheme(matches ? themes.dark : themes.light);
73
73
  });
74
- }, []);
74
+ }, [disableSwitch, respectPrefersColorScheme]);
75
75
  return {
76
76
  isDarkTheme: theme === themes.dark,
77
77
  setLightTheme,
@@ -6,40 +6,54 @@
6
6
  */
7
7
  import {useEffect, useState} from 'react';
8
8
  import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
9
- const desktopThresholdWidth = 996;
10
9
  const windowSizes = {
11
10
  desktop: 'desktop',
12
11
  mobile: 'mobile',
12
+ // This "ssr" value is very important to handle hydration FOUC / layout shifts
13
+ // You have to handle server-rendering explicitly on the call-site
14
+ // On the server, you may need to render BOTH the mobile/desktop elements (and hide one of them with mediaquery)
15
+ // We don't return "undefined" on purpose, to make it more explicit
16
+ ssr: 'ssr',
13
17
  };
18
+ const DesktopThresholdWidth = 996;
14
19
 
15
- function useWindowSize() {
16
- const isClient = ExecutionEnvironment.canUseDOM;
20
+ function getWindowSize() {
21
+ if (!ExecutionEnvironment.canUseDOM) {
22
+ return windowSizes.ssr;
23
+ }
17
24
 
18
- function getSize() {
19
- if (!isClient) {
20
- return undefined;
21
- }
25
+ return window.innerWidth > DesktopThresholdWidth
26
+ ? windowSizes.desktop
27
+ : windowSizes.mobile;
28
+ } // Simulate the SSR window size in dev, so that potential hydration FOUC/layout shift problems can be seen in dev too!
22
29
 
23
- return window.innerWidth > desktopThresholdWidth
24
- ? windowSizes.desktop
25
- : windowSizes.mobile;
26
- }
30
+ const DevSimulateSSR = process.env.NODE_ENV === 'development' && true; // This hook returns an enum value on purpose!
31
+ // We don't want it to return the actual width value, for resize perf reasons
32
+ // We only want to re-render once a breakpoint is crossed
27
33
 
28
- const [windowSize, setWindowSize] = useState(getSize);
29
- useEffect(() => {
30
- if (!isClient) {
31
- return undefined;
34
+ function useWindowSize() {
35
+ const [windowSize, setWindowSize] = useState(() => {
36
+ if (DevSimulateSSR) {
37
+ return 'ssr';
32
38
  }
33
39
 
34
- function handleResize() {
35
- setWindowSize(getSize());
40
+ return getWindowSize();
41
+ });
42
+ useEffect(() => {
43
+ function updateWindowSize() {
44
+ setWindowSize(getWindowSize());
36
45
  }
37
46
 
38
- window.addEventListener('resize', handleResize);
39
- return () => window.removeEventListener('resize', handleResize);
47
+ const timeout = DevSimulateSSR
48
+ ? window.setTimeout(updateWindowSize, 1000)
49
+ : undefined;
50
+ window.addEventListener('resize', updateWindowSize);
51
+ return () => {
52
+ window.removeEventListener('resize', updateWindowSize);
53
+ clearTimeout(timeout);
54
+ };
40
55
  }, []);
41
56
  return windowSize;
42
57
  }
43
58
 
44
- export {windowSizes};
45
59
  export default useWindowSize;
@@ -10,8 +10,9 @@ import siteConfig from '@generated/docusaurus.config';
10
10
  const prismIncludeLanguages = (PrismObject) => {
11
11
  if (ExecutionEnvironment.canUseDOM) {
12
12
  const {
13
- themeConfig: {prism: {additionalLanguages = []} = {}},
13
+ themeConfig: {prism = {}},
14
14
  } = siteConfig;
15
+ const {additionalLanguages = []} = prism;
15
16
  window.Prism = PrismObject;
16
17
  additionalLanguages.forEach((lang) => {
17
18
  require(`prismjs/components/prism-${lang}`); // eslint-disable-line
@@ -4,18 +4,16 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import {keyBy, chain, flatten} from 'lodash';
7
+ import {keyBy, chain} from 'lodash';
8
8
  import {mergeTranslations} from '@docusaurus/utils';
9
9
 
10
10
  function getNavbarTranslationFile(navbar) {
11
11
  // TODO handle properly all the navbar item types here!
12
12
  function flattenNavbarItems(items) {
13
- const subItems = flatten(
14
- items.map((item) => {
15
- const allSubItems = flatten([item.items ?? []]);
16
- return flattenNavbarItems(allSubItems);
17
- }),
18
- );
13
+ const subItems = items.flatMap((item) => {
14
+ const allSubItems = [item.items ?? []].flat();
15
+ return flattenNavbarItems(allSubItems);
16
+ });
19
17
  return [...items, ...subItems];
20
18
  }
21
19
 
@@ -76,9 +74,7 @@ function getFooterTranslationFile(footer) {
76
74
  }))
77
75
  .value();
78
76
  const footerLinkLabels = chain(
79
- flatten(footer.links.map((link) => link.items)).filter(
80
- (link) => !!link.label,
81
- ),
77
+ footer.links.flatMap((link) => link.items).filter((link) => !!link.label),
82
78
  )
83
79
  .keyBy((linkItem) => `link.item.label.${linkItem.label}`)
84
80
  .mapValues((linkItem) => ({