@docusaurus/theme-classic 2.0.0-beta.12faed89d → 2.0.0-beta.14

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 (349) hide show
  1. package/README.md +1 -1
  2. package/lib/admonitions.css +35 -0
  3. package/lib/deps.d.ts +13 -0
  4. package/lib/index.js +16 -15
  5. package/lib/prism-include-languages.js +9 -5
  6. package/{lib-next/types.d.ts → lib/theme-classic.d.ts} +338 -156
  7. package/lib/translations.js +16 -7
  8. package/lib/types.d.ts +0 -629
  9. package/lib/validateThemeConfig.js +232 -248
  10. package/lib-next/theme/Admonition/index.js +101 -0
  11. package/lib-next/theme/AnnouncementBar/index.js +7 -12
  12. package/lib-next/theme/AnnouncementBar/styles.module.css +23 -32
  13. package/lib-next/theme/BackToTopButton/index.js +131 -0
  14. package/lib-next/theme/BackToTopButton/styles.module.css +42 -0
  15. package/lib-next/theme/BlogArchivePage/index.js +80 -0
  16. package/lib-next/theme/BlogLayout/index.js +40 -0
  17. package/lib-next/theme/BlogListPage/index.js +17 -25
  18. package/lib-next/theme/BlogPostAuthor/index.js +46 -0
  19. package/{lib/theme/MDXPage → lib-next/theme/BlogPostAuthor}/styles.module.css +4 -2
  20. package/lib-next/theme/BlogPostAuthors/index.js +34 -0
  21. package/{lib/theme/IconExternalLink → lib-next/theme/BlogPostAuthors}/styles.module.css +3 -4
  22. package/lib-next/theme/BlogPostItem/index.js +79 -86
  23. package/lib-next/theme/BlogPostPage/index.js +70 -35
  24. package/lib-next/theme/BlogSidebar/index.js +11 -13
  25. package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
  26. package/lib-next/theme/BlogTagsListPage/index.js +14 -55
  27. package/lib-next/theme/BlogTagsPostsPage/index.js +29 -39
  28. package/lib-next/theme/CodeBlock/index.js +23 -149
  29. package/lib-next/theme/CodeBlock/styles.module.css +12 -9
  30. package/lib-next/theme/Details/index.js +20 -0
  31. package/lib-next/theme/Details/styles.module.css +13 -0
  32. package/lib-next/theme/DocCard/index.js +80 -0
  33. package/lib-next/theme/DocCard/styles.module.css +43 -0
  34. package/lib-next/theme/DocCardList/index.js +19 -0
  35. package/lib-next/theme/DocCategoryGeneratedIndexPage/index.js +49 -0
  36. package/lib-next/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  37. package/lib-next/theme/DocItem/index.js +30 -59
  38. package/lib-next/theme/DocItem/styles.module.css +2 -11
  39. package/lib-next/theme/DocItemFooter/index.js +79 -0
  40. package/{lib/theme/DocSidebarItem → lib-next/theme/DocItemFooter}/styles.module.css +8 -5
  41. package/lib-next/theme/DocPage/index.js +46 -23
  42. package/lib-next/theme/DocPaginator/index.js +5 -33
  43. package/lib-next/theme/DocPaginatorNavLink/index.js +36 -0
  44. package/lib-next/theme/DocSidebar/index.js +37 -43
  45. package/lib-next/theme/DocSidebarItem/index.js +115 -65
  46. package/lib-next/theme/DocSidebarItem/styles.module.css +4 -0
  47. package/lib-next/theme/DocTagDocListPage/index.js +89 -0
  48. package/lib-next/theme/DocTagsListPage/index.js +38 -0
  49. package/lib-next/theme/DocVersionBadge/index.js +27 -0
  50. package/lib-next/theme/DocVersionBanner/index.js +28 -14
  51. package/lib-next/theme/EditThisPage/index.js +6 -1
  52. package/lib-next/theme/ErrorPageContent.js +35 -0
  53. package/lib-next/theme/Footer/index.js +90 -39
  54. package/lib-next/theme/Heading/index.js +24 -29
  55. package/lib-next/theme/Heading/styles.css +5 -6
  56. package/lib-next/theme/Heading/styles.module.css +9 -5
  57. package/lib-next/theme/IconArrow/index.js +2 -2
  58. package/lib-next/theme/IconClose/index.js +23 -0
  59. package/lib-next/theme/IconEdit/index.js +2 -2
  60. package/lib-next/theme/IconExternalLink/index.js +2 -2
  61. package/lib-next/theme/IconLanguage/index.js +2 -2
  62. package/lib-next/theme/IconMenu/index.js +2 -2
  63. package/lib-next/theme/LastUpdated/index.js +3 -2
  64. package/lib-next/theme/Layout/index.js +3 -1
  65. package/lib-next/theme/LayoutHead/index.js +18 -23
  66. package/lib-next/theme/LayoutProviders/index.js +8 -5
  67. package/lib-next/theme/Logo/index.js +25 -21
  68. package/lib-next/theme/MDXComponents/index.js +34 -7
  69. package/{lib/theme/hooks → lib-next/theme/MDXComponents}/styles.css +3 -2
  70. package/lib-next/theme/MDXPage/index.js +10 -2
  71. package/lib-next/theme/Navbar/index.js +62 -34
  72. package/lib-next/theme/Navbar/styles.module.css +3 -39
  73. package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +45 -143
  74. package/lib-next/theme/NavbarItem/DocNavbarItem.js +7 -7
  75. package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +31 -19
  76. package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +158 -0
  77. package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +4 -12
  78. package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  79. package/lib-next/theme/NavbarItem/index.js +25 -12
  80. package/lib-next/theme/{SearchMetadatas → SearchMetadata}/index.js +1 -1
  81. package/lib-next/theme/Seo/index.js +11 -7
  82. package/lib-next/theme/TOC/index.js +12 -36
  83. package/lib-next/theme/TOC/styles.module.css +1 -1
  84. package/lib-next/theme/TOCCollapsible/index.js +13 -4
  85. package/lib-next/theme/TOCCollapsible/styles.module.css +1 -0
  86. package/lib-next/theme/TOCInline/index.js +10 -28
  87. package/lib-next/theme/TOCItems/index.js +85 -0
  88. package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
  89. package/lib-next/theme/Tabs/index.js +103 -48
  90. package/lib-next/theme/Tabs/styles.module.css +0 -13
  91. package/lib-next/theme/Tag/index.js +27 -0
  92. package/lib-next/theme/Tag/styles.module.css +70 -0
  93. package/lib-next/theme/TagsListByLetter/index.js +42 -0
  94. package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
  95. package/lib-next/theme/TagsListInline/index.js +31 -0
  96. package/lib-next/theme/TagsListInline/styles.module.css +15 -0
  97. package/lib-next/theme/ThemeProvider/index.js +10 -7
  98. package/lib-next/theme/ThemedImage/index.js +5 -5
  99. package/lib-next/theme/Toggle/index.js +34 -37
  100. package/lib-next/theme/Toggle/styles.module.css +91 -3
  101. package/lib-next/theme/UserPreferencesProvider/index.js +9 -6
  102. package/lib-next/theme/hooks/useHideableNavbar.js +31 -44
  103. package/lib-next/theme/hooks/useTheme.js +4 -5
  104. package/lib-next/theme/hooks/useWindowSize.js +2 -6
  105. package/lib-next/theme/prism-include-languages.js +2 -1
  106. package/package.json +26 -24
  107. package/src/admonitions.css +35 -0
  108. package/src/deps.d.ts +13 -0
  109. package/src/index.ts +23 -20
  110. package/{lib-next/prism-include-languages.js → src/prism-include-languages.ts} +0 -0
  111. package/src/theme/Admonition/index.tsx +106 -0
  112. package/src/theme/AnnouncementBar/index.tsx +8 -12
  113. package/src/theme/AnnouncementBar/styles.module.css +23 -32
  114. package/src/theme/BackToTopButton/index.tsx +142 -0
  115. package/src/theme/BackToTopButton/styles.module.css +42 -0
  116. package/src/theme/BlogArchivePage/index.tsx +91 -0
  117. package/src/theme/BlogLayout/index.tsx +44 -0
  118. package/src/theme/BlogListPage/index.tsx +18 -25
  119. package/src/theme/BlogPostAuthor/index.tsx +49 -0
  120. package/{lib/theme/IconEdit → src/theme/BlogPostAuthor}/styles.module.css +4 -3
  121. package/src/theme/BlogPostAuthors/index.tsx +39 -0
  122. package/src/theme/BlogPostAuthors/styles.module.css +11 -0
  123. package/src/theme/BlogPostItem/index.tsx +70 -80
  124. package/src/theme/BlogPostPage/index.tsx +72 -35
  125. package/src/theme/BlogSidebar/index.tsx +11 -13
  126. package/src/theme/BlogSidebar/styles.module.css +2 -2
  127. package/src/theme/BlogTagsListPage/index.tsx +14 -57
  128. package/src/theme/BlogTagsPostsPage/index.tsx +29 -39
  129. package/src/theme/CodeBlock/index.tsx +27 -151
  130. package/src/theme/CodeBlock/styles.module.css +12 -9
  131. package/src/theme/Details/index.tsx +24 -0
  132. package/src/theme/Details/styles.module.css +13 -0
  133. package/src/theme/DocCard/index.tsx +100 -0
  134. package/src/theme/DocCard/styles.module.css +43 -0
  135. package/src/theme/DocCardList/index.tsx +27 -0
  136. package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +53 -0
  137. package/src/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  138. package/src/theme/DocItem/index.tsx +30 -60
  139. package/src/theme/DocItem/styles.module.css +2 -11
  140. package/src/theme/DocItemFooter/index.tsx +91 -0
  141. package/{lib/theme/BlogPostItem → src/theme/DocItemFooter}/styles.module.css +8 -8
  142. package/src/theme/DocPage/index.tsx +44 -22
  143. package/src/theme/DocPaginator/index.tsx +5 -33
  144. package/src/theme/DocPaginatorNavLink/index.tsx +38 -0
  145. package/src/theme/DocSidebar/index.tsx +38 -39
  146. package/src/theme/DocSidebarItem/index.tsx +108 -49
  147. package/src/theme/DocSidebarItem/styles.module.css +4 -0
  148. package/src/theme/DocTagDocListPage/index.tsx +89 -0
  149. package/src/theme/DocTagsListPage/index.tsx +41 -0
  150. package/src/theme/DocVersionBadge/index.tsx +30 -0
  151. package/src/theme/DocVersionBanner/index.tsx +48 -21
  152. package/src/theme/EditThisPage/index.tsx +6 -1
  153. package/src/theme/ErrorPageContent.tsx +41 -0
  154. package/src/theme/Footer/index.tsx +103 -42
  155. package/src/theme/Heading/index.tsx +24 -31
  156. package/src/theme/Heading/styles.css +5 -6
  157. package/src/theme/Heading/styles.module.css +9 -5
  158. package/src/theme/IconArrow/index.tsx +2 -2
  159. package/src/theme/IconClose/index.tsx +26 -0
  160. package/src/theme/IconEdit/index.tsx +2 -2
  161. package/src/theme/IconExternalLink/index.tsx +2 -5
  162. package/src/theme/IconLanguage/index.tsx +2 -6
  163. package/src/theme/IconMenu/index.tsx +3 -3
  164. package/src/theme/LastUpdated/index.tsx +3 -2
  165. package/src/theme/Layout/index.tsx +3 -1
  166. package/src/theme/LayoutHead/index.tsx +18 -17
  167. package/src/theme/LayoutProviders/index.tsx +8 -5
  168. package/src/theme/Logo/index.tsx +21 -17
  169. package/src/theme/MDXComponents/index.tsx +39 -5
  170. package/src/theme/MDXComponents/styles.css +11 -0
  171. package/src/theme/MDXPage/index.tsx +10 -2
  172. package/src/theme/Navbar/index.tsx +62 -35
  173. package/src/theme/Navbar/styles.module.css +3 -39
  174. package/src/theme/NavbarItem/DefaultNavbarItem.tsx +42 -149
  175. package/src/theme/NavbarItem/DocNavbarItem.tsx +12 -16
  176. package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +33 -21
  177. package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
  178. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +180 -0
  179. package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +8 -9
  180. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  181. package/src/theme/NavbarItem/index.tsx +41 -16
  182. package/src/theme/{SearchMetadatas → SearchMetadata}/index.tsx +2 -2
  183. package/src/theme/Seo/index.tsx +7 -4
  184. package/src/theme/TOC/index.tsx +13 -35
  185. package/src/theme/TOC/styles.module.css +1 -1
  186. package/src/theme/TOCCollapsible/index.tsx +13 -4
  187. package/src/theme/TOCCollapsible/styles.module.css +1 -0
  188. package/src/theme/TOCInline/index.tsx +13 -32
  189. package/src/theme/TOCItems/index.tsx +96 -0
  190. package/src/theme/Tabs/index.tsx +110 -54
  191. package/src/theme/Tabs/styles.module.css +0 -13
  192. package/src/theme/Tag/index.tsx +31 -0
  193. package/src/theme/Tag/styles.module.css +70 -0
  194. package/src/theme/TagsListByLetter/index.tsx +45 -0
  195. package/src/theme/TagsListByLetter/styles.module.css +11 -0
  196. package/src/theme/TagsListInline/index.tsx +35 -0
  197. package/src/theme/TagsListInline/styles.module.css +15 -0
  198. package/src/theme/ThemeProvider/index.tsx +6 -2
  199. package/src/theme/ThemedImage/index.tsx +5 -5
  200. package/src/theme/Toggle/index.tsx +36 -43
  201. package/src/theme/Toggle/styles.module.css +91 -3
  202. package/src/theme/UserPreferencesProvider/index.tsx +9 -6
  203. package/src/theme/hooks/useHideableNavbar.ts +32 -45
  204. package/src/theme/hooks/useTabGroupChoice.ts +2 -2
  205. package/src/theme/hooks/useTheme.ts +4 -5
  206. package/src/theme/hooks/useWindowSize.ts +2 -7
  207. package/src/theme/prism-include-languages.ts +3 -2
  208. package/src/theme-classic.d.ts +822 -0
  209. package/src/translations.ts +41 -23
  210. package/src/types.d.ts +0 -629
  211. package/src/{validateThemeConfig.js → validateThemeConfig.ts} +160 -100
  212. package/babel.config.js +0 -35
  213. package/codeTranslations/README.md +0 -20
  214. package/codeTranslations/ar.json +0 -56
  215. package/codeTranslations/base.json +0 -110
  216. package/codeTranslations/bn.json +0 -56
  217. package/codeTranslations/da.json +0 -56
  218. package/codeTranslations/de.json +0 -56
  219. package/codeTranslations/es.json +0 -56
  220. package/codeTranslations/fa.json +0 -56
  221. package/codeTranslations/fil.json +0 -56
  222. package/codeTranslations/fr.json +0 -56
  223. package/codeTranslations/he.json +0 -56
  224. package/codeTranslations/hi.json +0 -56
  225. package/codeTranslations/ja.json +0 -56
  226. package/codeTranslations/ko.json +0 -56
  227. package/codeTranslations/pl.json +0 -56
  228. package/codeTranslations/pt-BR.json +0 -56
  229. package/codeTranslations/pt-PT.json +0 -56
  230. package/codeTranslations/ru.json +0 -56
  231. package/codeTranslations/tr.json +0 -56
  232. package/codeTranslations/vi.json +0 -56
  233. package/codeTranslations/zh-Hans.json +0 -56
  234. package/codeTranslations/zh-Hant.json +0 -56
  235. package/lib/__tests__/__snapshots__/translations.test.ts.snap +0 -116
  236. package/lib/__tests__/translations.test.js +0 -112
  237. package/lib/__tests__/validateThemeConfig.test.js +0 -333
  238. package/lib/theme/AnnouncementBar/index.js +0 -72
  239. package/lib/theme/AnnouncementBar/styles.module.css +0 -72
  240. package/lib/theme/BlogListPage/index.js +0 -71
  241. package/lib/theme/BlogListPaginator/index.js +0 -63
  242. package/lib/theme/BlogPostItem/index.js +0 -161
  243. package/lib/theme/BlogPostPage/index.js +0 -69
  244. package/lib/theme/BlogPostPaginator/index.js +0 -64
  245. package/lib/theme/BlogSidebar/index.js +0 -51
  246. package/lib/theme/BlogSidebar/styles.module.css +0 -44
  247. package/lib/theme/BlogTagsListPage/index.js +0 -76
  248. package/lib/theme/BlogTagsPostsPage/index.js +0 -100
  249. package/lib/theme/CodeBlock/index.js +0 -253
  250. package/lib/theme/CodeBlock/styles.module.css +0 -68
  251. package/lib/theme/DocItem/index.js +0 -138
  252. package/lib/theme/DocItem/styles.module.css +0 -31
  253. package/lib/theme/DocPage/index.js +0 -139
  254. package/lib/theme/DocPage/styles.module.css +0 -85
  255. package/lib/theme/DocPaginator/index.js +0 -63
  256. package/lib/theme/DocSidebar/index.js +0 -133
  257. package/lib/theme/DocSidebar/styles.module.css +0 -106
  258. package/lib/theme/DocSidebarItem/index.js +0 -175
  259. package/lib/theme/DocVersionBanner/index.js +0 -128
  260. package/lib/theme/EditThisPage/index.js +0 -31
  261. package/lib/theme/Footer/index.js +0 -115
  262. package/lib/theme/Footer/styles.module.css +0 -15
  263. package/lib/theme/Heading/index.js +0 -76
  264. package/lib/theme/Heading/styles.css +0 -23
  265. package/lib/theme/Heading/styles.module.css +0 -15
  266. package/lib/theme/IconArrow/index.js +0 -28
  267. package/lib/theme/IconEdit/index.js +0 -34
  268. package/lib/theme/IconExternalLink/index.js +0 -30
  269. package/lib/theme/IconLanguage/index.js +0 -29
  270. package/lib/theme/IconMenu/index.js +0 -30
  271. package/lib/theme/LastUpdated/index.js +0 -61
  272. package/lib/theme/Layout/index.js +0 -64
  273. package/lib/theme/Layout/styles.css +0 -27
  274. package/lib/theme/LayoutHead/index.js +0 -144
  275. package/lib/theme/LayoutProviders/index.js +0 -38
  276. package/lib/theme/Logo/index.js +0 -60
  277. package/lib/theme/MDXComponents/index.js +0 -65
  278. package/lib/theme/MDXPage/index.js +0 -66
  279. package/lib/theme/Navbar/index.js +0 -248
  280. package/lib/theme/Navbar/styles.module.css +0 -63
  281. package/lib/theme/NavbarItem/DefaultNavbarItem.js +0 -210
  282. package/lib/theme/NavbarItem/DocNavbarItem.js +0 -63
  283. package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +0 -76
  284. package/lib/theme/NavbarItem/DocsVersionNavbarItem.js +0 -43
  285. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem.js +0 -72
  286. package/lib/theme/NavbarItem/SearchNavbarItem.js +0 -28
  287. package/lib/theme/NavbarItem/index.js +0 -54
  288. package/lib/theme/NotFound.js +0 -57
  289. package/lib/theme/SearchBar.js +0 -15
  290. package/lib/theme/SearchMetadatas/index.js +0 -33
  291. package/lib/theme/Seo/index.js +0 -49
  292. package/lib/theme/SkipToContent/index.js +0 -71
  293. package/lib/theme/SkipToContent/styles.module.css +0 -14
  294. package/lib/theme/TOC/index.js +0 -60
  295. package/lib/theme/TOC/styles.module.css +0 -23
  296. package/lib/theme/TOCCollapsible/index.js +0 -51
  297. package/lib/theme/TOCCollapsible/styles.module.css +0 -49
  298. package/lib/theme/TOCInline/index.js +0 -53
  299. package/lib/theme/TOCInline/styles.module.css +0 -12
  300. package/lib/theme/TabItem/index.js +0 -32
  301. package/lib/theme/Tabs/index.js +0 -150
  302. package/lib/theme/Tabs/styles.module.css +0 -23
  303. package/lib/theme/ThemeContext.js +0 -21
  304. package/lib/theme/ThemeProvider/index.js +0 -38
  305. package/lib/theme/ThemedImage/index.js +0 -49
  306. package/lib/theme/ThemedImage/styles.module.css +0 -18
  307. package/lib/theme/Toggle/index.js +0 -94
  308. package/lib/theme/Toggle/styles.css +0 -103
  309. package/lib/theme/Toggle/styles.module.css +0 -17
  310. package/lib/theme/UserPreferencesContext.js +0 -18
  311. package/lib/theme/UserPreferencesProvider/index.js +0 -36
  312. package/lib/theme/hooks/useContextualSearchFilters.js +0 -47
  313. package/lib/theme/hooks/useDocs.js +0 -18
  314. package/lib/theme/hooks/useHideableNavbar.js +0 -92
  315. package/lib/theme/hooks/useKeyboardNavigation.js +0 -45
  316. package/lib/theme/hooks/useLocationHash.js +0 -28
  317. package/lib/theme/hooks/useLockBodyScroll.js +0 -26
  318. package/lib/theme/hooks/usePrismTheme.js +0 -36
  319. package/lib/theme/hooks/useScrollPosition.js +0 -49
  320. package/lib/theme/hooks/useTOCHighlight.js +0 -87
  321. package/lib/theme/hooks/useTabGroupChoice.js +0 -51
  322. package/lib/theme/hooks/useTheme.js +0 -99
  323. package/lib/theme/hooks/useThemeContext.js +0 -31
  324. package/lib/theme/hooks/useUserPreferencesContext.js +0 -31
  325. package/lib/theme/hooks/useWindowSize.js +0 -73
  326. package/lib/theme/prism-include-languages.js +0 -39
  327. package/lib-next/__tests__/__snapshots__/translations.test.ts.snap +0 -116
  328. package/lib-next/__tests__/translations.test.js +0 -128
  329. package/lib-next/__tests__/validateThemeConfig.test.js +0 -333
  330. package/lib-next/index.js +0 -221
  331. package/lib-next/theme/Toggle/styles.css +0 -103
  332. package/lib-next/theme/hooks/useContextualSearchFilters.js +0 -41
  333. package/lib-next/theme/hooks/useLocationHash.js +0 -20
  334. package/lib-next/theme/hooks/useScrollPosition.js +0 -38
  335. package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
  336. package/lib-next/translations.js +0 -145
  337. package/lib-next/validateThemeConfig.js +0 -319
  338. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -116
  339. package/src/__tests__/translations.test.ts +0 -116
  340. package/src/__tests__/validateThemeConfig.test.js +0 -333
  341. package/src/prism-include-languages.js +0 -11
  342. package/src/theme/Toggle/styles.css +0 -103
  343. package/src/theme/hooks/useContextualSearchFilters.ts +0 -52
  344. package/src/theme/hooks/useLocationHash.ts +0 -25
  345. package/src/theme/hooks/useScrollPosition.ts +0 -45
  346. package/src/theme/hooks/useTOCHighlight.ts +0 -98
  347. package/tsconfig.json +0 -12
  348. package/update-code-translations.js +0 -242
  349. package/update-code-translations.test.js +0 -33
@@ -0,0 +1,142 @@
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
+ import React from 'react';
8
+ import renderer from 'react-test-renderer';
9
+ import Tabs from '../index';
10
+ import TabItem from '../../TabItem';
11
+ import UserPreferencesProvider from '@theme/UserPreferencesProvider';
12
+ import {ScrollControllerProvider} from '@docusaurus/theme-common';
13
+ describe('Tabs', () => {
14
+ test('Should reject bad Tabs child', () => {
15
+ expect(() => {
16
+ renderer.create(
17
+ <Tabs>
18
+ <div>Naughty</div>
19
+ <TabItem value="good">Good</TabItem>
20
+ </Tabs>,
21
+ );
22
+ }).toThrowErrorMatchingInlineSnapshot(
23
+ `"Docusaurus error: Bad <Tabs> child <div>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique \\"value\\" prop."`,
24
+ );
25
+ });
26
+ test('Should reject bad Tabs defaultValue', () => {
27
+ expect(() => {
28
+ renderer.create(
29
+ <Tabs defaultValue="bad">
30
+ <TabItem value="v1">Tab 1</TabItem>
31
+ <TabItem value="v2">Tab 2</TabItem>
32
+ </Tabs>,
33
+ );
34
+ }).toThrowErrorMatchingInlineSnapshot(
35
+ `"Docusaurus error: The <Tabs> has a defaultValue \\"bad\\" but none of its children has the corresponding value. Available values are: v1, v2. If you intend to show no default tab, use defaultValue={null} instead."`,
36
+ );
37
+ });
38
+ test('Should reject duplicate values', () => {
39
+ expect(() => {
40
+ renderer.create(
41
+ <Tabs>
42
+ <TabItem value="v1">Tab 1</TabItem>
43
+ <TabItem value="v2">Tab 2</TabItem>
44
+ <TabItem value="v3">Tab 3</TabItem>
45
+ <TabItem value="v4">Tab 4</TabItem>
46
+ <TabItem value="v1">Tab 5</TabItem>
47
+ <TabItem value="v2">Tab 6</TabItem>
48
+ </Tabs>,
49
+ );
50
+ }).toThrowErrorMatchingInlineSnapshot(
51
+ `"Docusaurus error: Duplicate values \\"v1, v2\\" found in <Tabs>. Every value needs to be unique."`,
52
+ );
53
+ });
54
+ test('Should accept valid Tabs config', () => {
55
+ expect(() => {
56
+ renderer.create(
57
+ <ScrollControllerProvider>
58
+ <UserPreferencesProvider>
59
+ <Tabs>
60
+ <TabItem value="v1">Tab 1</TabItem>
61
+ <TabItem value="v2">Tab 2</TabItem>
62
+ </Tabs>
63
+ <Tabs>
64
+ <TabItem value="v1">Tab 1</TabItem>
65
+ <TabItem value="v2" default>
66
+ Tab 2
67
+ </TabItem>
68
+ </Tabs>
69
+ <Tabs defaultValue="v1">
70
+ <TabItem value="v1" label="V1">
71
+ Tab 1
72
+ </TabItem>
73
+ <TabItem value="v2" label="V2">
74
+ Tab 2
75
+ </TabItem>
76
+ </Tabs>
77
+ <Tabs
78
+ defaultValue="v1"
79
+ values={[
80
+ {
81
+ value: 'v1',
82
+ label: 'V1',
83
+ },
84
+ {
85
+ value: 'v2',
86
+ label: 'V2',
87
+ },
88
+ ]}>
89
+ <TabItem value="v1">Tab 1</TabItem>
90
+ <TabItem value="v2">Tab 2</TabItem>
91
+ </Tabs>
92
+ <Tabs
93
+ defaultValue={null}
94
+ values={[
95
+ {
96
+ value: 'v1',
97
+ label: 'V1',
98
+ },
99
+ {
100
+ value: 'v2',
101
+ label: 'V2',
102
+ },
103
+ ]}>
104
+ <TabItem value="v1">Tab 1</TabItem>
105
+ <TabItem value="v2">Tab 2</TabItem>
106
+ </Tabs>
107
+ <Tabs defaultValue={null}>
108
+ <TabItem value="v1" label="V1">
109
+ Tab 1
110
+ </TabItem>
111
+ <TabItem value="v2" label="V2">
112
+ Tab 2
113
+ </TabItem>
114
+ </Tabs>
115
+ </UserPreferencesProvider>
116
+ </ScrollControllerProvider>,
117
+ );
118
+ }).not.toThrow(); // TODO Better Jest infrastructure to mock the Layout
119
+ }); // https://github.com/facebook/docusaurus/issues/5729
120
+
121
+ test('Should accept dynamic Tabs with number values', () => {
122
+ expect(() => {
123
+ const tabs = ['Apple', 'Banana', 'Carrot'];
124
+ renderer.create(
125
+ <ScrollControllerProvider>
126
+ <UserPreferencesProvider>
127
+ <Tabs
128
+ values={tabs.map((t, idx) => ({
129
+ label: t,
130
+ value: idx,
131
+ }))}
132
+ defaultValue={0}>
133
+ {tabs.map((t, idx) => (
134
+ <TabItem value={idx}>{t}</TabItem>
135
+ ))}
136
+ </Tabs>
137
+ </UserPreferencesProvider>
138
+ </ScrollControllerProvider>,
139
+ );
140
+ }).not.toThrow();
141
+ });
142
+ });
@@ -4,28 +4,79 @@
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 React, {useState, cloneElement, Children} from 'react';
7
+ import React, {useState, cloneElement, Children, isValidElement} from 'react';
8
+ import useIsBrowser from '@docusaurus/useIsBrowser';
8
9
  import useUserPreferencesContext from '@theme/hooks/useUserPreferencesContext';
10
+ import {useScrollPositionBlocker, duplicates} from '@docusaurus/theme-common';
9
11
  import clsx from 'clsx';
10
- import styles from './styles.module.css';
12
+ import styles from './styles.module.css'; // A very rough duck type, but good enough to guard against mistakes while
13
+ // allowing customization
11
14
 
12
- function isInViewport(element) {
13
- const {top, left, bottom, right} = element.getBoundingClientRect();
14
- const {innerHeight, innerWidth} = window;
15
- return top >= 0 && right <= innerWidth && bottom <= innerHeight && left >= 0;
15
+ function isTabItem(comp) {
16
+ return typeof comp.props.value !== 'undefined';
16
17
  }
17
18
 
18
- const keys = {
19
- left: 37,
20
- right: 39,
21
- };
19
+ function TabsComponent(props) {
20
+ const {
21
+ lazy,
22
+ block,
23
+ defaultValue: defaultValueProp,
24
+ values: valuesProp,
25
+ groupId,
26
+ className,
27
+ } = props;
28
+ const children = Children.map(props.children, (child) => {
29
+ if (isValidElement(child) && isTabItem(child)) {
30
+ return child;
31
+ } // child.type.name will give non-sensical values in prod because of
32
+ // minification, but we assume it won't throw in prod.
33
+
34
+ throw new Error(
35
+ `Docusaurus error: Bad <Tabs> child <${
36
+ // @ts-expect-error: guarding against unexpected cases
37
+ typeof child.type === 'string' ? child.type : child.type.name
38
+ }>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`,
39
+ );
40
+ });
41
+ const values =
42
+ valuesProp ?? // We only pick keys that we recognize. MDX would inject some keys by default
43
+ children.map(({props: {value, label, attributes}}) => ({
44
+ value,
45
+ label,
46
+ attributes,
47
+ }));
48
+ const dup = duplicates(values, (a, b) => a.value === b.value);
49
+
50
+ if (dup.length > 0) {
51
+ throw new Error(
52
+ `Docusaurus error: Duplicate values "${dup
53
+ .map((a) => a.value)
54
+ .join(', ')}" found in <Tabs>. Every value needs to be unique.`,
55
+ );
56
+ } // When defaultValueProp is null, don't show a default tab
57
+
58
+ const defaultValue =
59
+ defaultValueProp === null
60
+ ? defaultValueProp
61
+ : defaultValueProp ??
62
+ children.find((child) => child.props.default)?.props.value ??
63
+ children[0]?.props.value;
64
+
65
+ if (defaultValue !== null && !values.some((a) => a.value === defaultValue)) {
66
+ throw new Error(
67
+ `Docusaurus error: The <Tabs> has a defaultValue "${defaultValue}" but none of its children has the corresponding value. Available values are: ${values
68
+ .map((a) => a.value)
69
+ .join(
70
+ ', ',
71
+ )}. If you intend to show no default tab, use defaultValue={null} instead.`,
72
+ );
73
+ }
22
74
 
23
- function Tabs(props) {
24
- const {lazy, block, defaultValue, values, groupId, className} = props;
25
75
  const {tabGroupChoices, setTabGroupChoices} = useUserPreferencesContext();
26
76
  const [selectedValue, setSelectedValue] = useState(defaultValue);
27
- const children = Children.toArray(props.children);
28
77
  const tabRefs = [];
78
+ const {blockElementScrollPositionUntilNextRender} =
79
+ useScrollPositionBlocker();
29
80
 
30
81
  if (groupId != null) {
31
82
  const relevantTabGroupChoice = tabGroupChoices[groupId];
@@ -40,43 +91,32 @@ function Tabs(props) {
40
91
  }
41
92
 
42
93
  const handleTabChange = (event) => {
43
- const selectedTab = event.currentTarget;
44
- const selectedTabIndex = tabRefs.indexOf(selectedTab);
45
- const selectedTabValue = values[selectedTabIndex].value;
46
- setSelectedValue(selectedTabValue);
47
-
48
- if (groupId != null) {
49
- setTabGroupChoices(groupId, selectedTabValue);
50
- setTimeout(() => {
51
- if (isInViewport(selectedTab)) {
52
- return;
53
- }
54
-
55
- selectedTab.scrollIntoView({
56
- block: 'center',
57
- behavior: 'smooth',
58
- });
59
- selectedTab.classList.add(styles.tabItemActive);
60
- setTimeout(
61
- () => selectedTab.classList.remove(styles.tabItemActive),
62
- 2000,
63
- );
64
- }, 150);
94
+ const newTab = event.currentTarget;
95
+ const newTabIndex = tabRefs.indexOf(newTab);
96
+ const newTabValue = values[newTabIndex].value;
97
+
98
+ if (newTabValue !== selectedValue) {
99
+ blockElementScrollPositionUntilNextRender(newTab);
100
+ setSelectedValue(newTabValue);
101
+
102
+ if (groupId != null) {
103
+ setTabGroupChoices(groupId, newTabValue);
104
+ }
65
105
  }
66
106
  };
67
107
 
68
108
  const handleKeydown = (event) => {
69
- let focusElement;
109
+ let focusElement = null;
70
110
 
71
- switch (event.keyCode) {
72
- case keys.right: {
73
- const nextTab = tabRefs.indexOf(event.target) + 1;
111
+ switch (event.key) {
112
+ case 'ArrowRight': {
113
+ const nextTab = tabRefs.indexOf(event.currentTarget) + 1;
74
114
  focusElement = tabRefs[nextTab] || tabRefs[0];
75
115
  break;
76
116
  }
77
117
 
78
- case keys.left: {
79
- const prevTab = tabRefs.indexOf(event.target) - 1;
118
+ case 'ArrowLeft': {
119
+ const prevTab = tabRefs.indexOf(event.currentTarget) - 1;
80
120
  focusElement = tabRefs[prevTab] || tabRefs[tabRefs.length - 1];
81
121
  break;
82
122
  }
@@ -100,20 +140,26 @@ function Tabs(props) {
100
140
  },
101
141
  className,
102
142
  )}>
103
- {values.map(({value, label}) => (
143
+ {values.map(({value, label, attributes}) => (
104
144
  <li
105
145
  role="tab"
106
146
  tabIndex={selectedValue === value ? 0 : -1}
107
147
  aria-selected={selectedValue === value}
108
- className={clsx('tabs__item', styles.tabItem, {
109
- 'tabs__item--active': selectedValue === value,
110
- })}
111
148
  key={value}
112
149
  ref={(tabControl) => tabRefs.push(tabControl)}
113
150
  onKeyDown={handleKeydown}
114
151
  onFocus={handleTabChange}
115
- onClick={handleTabChange}>
116
- {label}
152
+ onClick={handleTabChange}
153
+ {...attributes}
154
+ className={clsx(
155
+ 'tabs__item',
156
+ styles.tabItem,
157
+ attributes?.className,
158
+ {
159
+ 'tabs__item--active': selectedValue === value,
160
+ },
161
+ )}>
162
+ {label ?? value}
117
163
  </li>
118
164
  ))}
119
165
  </ul>
@@ -141,4 +187,13 @@ function Tabs(props) {
141
187
  );
142
188
  }
143
189
 
144
- export default Tabs;
190
+ export default function Tabs(props) {
191
+ const isBrowser = useIsBrowser();
192
+ return (
193
+ <TabsComponent // Remount tabs after hydration
194
+ // Temporary fix for https://github.com/facebook/docusaurus/issues/5653
195
+ key={String(isBrowser)}
196
+ {...props}
197
+ />
198
+ );
199
+ }
@@ -8,16 +8,3 @@
8
8
  .tabItem {
9
9
  margin-top: 0 !important;
10
10
  }
11
-
12
- .tabItemActive {
13
- animation: blink 0.5s ease-in-out 5;
14
- }
15
-
16
- @keyframes blink {
17
- 0% {
18
- background-color: var(--ifm-hover-overlay);
19
- }
20
- 100% {
21
- background-color: rgba(0, 0, 0, 0);
22
- }
23
- }
@@ -0,0 +1,27 @@
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
+ import React from 'react';
8
+ import clsx from 'clsx';
9
+ import Link from '@docusaurus/Link';
10
+ import styles from './styles.module.css';
11
+
12
+ function Tag(props) {
13
+ const {permalink, name, count} = props;
14
+ return (
15
+ <Link
16
+ href={permalink}
17
+ className={clsx(styles.tag, {
18
+ [styles.tagRegular]: !count,
19
+ [styles.tagWithCount]: count,
20
+ })}>
21
+ {name}
22
+ {count && <span>{count}</span>}
23
+ </Link>
24
+ );
25
+ }
26
+
27
+ export default Tag;
@@ -0,0 +1,70 @@
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
+ :root {
9
+ --docusaurus-tag-list-border: var(--ifm-color-emphasis-300);
10
+ }
11
+
12
+ .tag {
13
+ border: 1px solid var(--docusaurus-tag-list-border);
14
+ transition: border var(--ifm-transition-fast);
15
+ }
16
+
17
+ .tag:hover {
18
+ --docusaurus-tag-list-border: var(--ifm-link-color);
19
+ text-decoration: none;
20
+ }
21
+
22
+ .tagRegular {
23
+ border-radius: 0.5rem;
24
+ padding: 0.3rem 0.5rem;
25
+ font-size: 90%;
26
+ }
27
+
28
+ .tagWithCount {
29
+ display: flex;
30
+ align-items: center;
31
+ position: relative;
32
+ padding: 0 0.5rem 0 1rem;
33
+ border-left: 0;
34
+ }
35
+
36
+ .tagWithCount:before,
37
+ .tagWithCount:after {
38
+ content: '';
39
+ position: absolute;
40
+ top: 50%;
41
+ border: 1px solid var(--docusaurus-tag-list-border);
42
+ transition: inherit;
43
+ }
44
+
45
+ .tagWithCount:before {
46
+ right: 100%;
47
+ transform: translate(50%, -50%) rotate(-45deg);
48
+ width: 1.18rem;
49
+ height: 1.18rem;
50
+ border-right: 0;
51
+ border-bottom: 0;
52
+ }
53
+
54
+ .tagWithCount:after {
55
+ left: 0;
56
+ transform: translateY(-50%);
57
+ width: 0.5rem;
58
+ height: 0.5rem;
59
+ border-radius: 50%;
60
+ }
61
+
62
+ .tagWithCount span {
63
+ background: var(--ifm-color-secondary);
64
+ color: var(--ifm-color-black);
65
+ font-size: 0.7rem;
66
+ line-height: 1.2;
67
+ border-radius: var(--ifm-global-radius);
68
+ padding: 0.1rem 0.4rem;
69
+ margin-left: 0.3rem;
70
+ }
@@ -0,0 +1,42 @@
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
+ import React from 'react';
8
+ import Tag from '@theme/Tag';
9
+ import {listTagsByLetters} from '@docusaurus/theme-common';
10
+ import styles from './styles.module.css';
11
+
12
+ function TagLetterEntryItem({letterEntry}) {
13
+ return (
14
+ <article>
15
+ <h2>{letterEntry.letter}</h2>
16
+ <ul className="padding--none">
17
+ {letterEntry.tags.map((tag) => (
18
+ <li key={tag.permalink} className={styles.tag}>
19
+ <Tag {...tag} />
20
+ </li>
21
+ ))}
22
+ </ul>
23
+ <hr />
24
+ </article>
25
+ );
26
+ }
27
+
28
+ function TagsListByLetter({tags}) {
29
+ const letterList = listTagsByLetters(tags);
30
+ return (
31
+ <section className="margin-vert--lg">
32
+ {letterList.map((letterEntry) => (
33
+ <TagLetterEntryItem
34
+ key={letterEntry.letter}
35
+ letterEntry={letterEntry}
36
+ />
37
+ ))}
38
+ </section>
39
+ );
40
+ }
41
+
42
+ export default TagsListByLetter;
@@ -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
+ .tag {
9
+ display: inline-block;
10
+ margin: 0.5rem 0.5rem 0 1rem;
11
+ }
@@ -0,0 +1,31 @@
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
+ import React from 'react';
8
+ import clsx from 'clsx';
9
+ import Translate from '@docusaurus/Translate';
10
+ import Tag from '@theme/Tag';
11
+ import styles from './styles.module.css';
12
+ export default function TagsListInline({tags}) {
13
+ return (
14
+ <>
15
+ <b>
16
+ <Translate
17
+ id="theme.tags.tagsListLabel"
18
+ description="The label alongside a tag list">
19
+ Tags:
20
+ </Translate>
21
+ </b>
22
+ <ul className={clsx(styles.tags, 'padding--none', 'margin-left--sm')}>
23
+ {tags.map(({label, permalink: tagPermalink}) => (
24
+ <li key={tagPermalink} className={styles.tag}>
25
+ <Tag name={label} permalink={tagPermalink} />
26
+ </li>
27
+ ))}
28
+ </ul>
29
+ </>
30
+ );
31
+ }
@@ -0,0 +1,15 @@
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
+ .tags {
9
+ display: inline;
10
+ }
11
+
12
+ .tag {
13
+ margin: 0 0.4rem 0.5rem 0;
14
+ display: inline-block;
15
+ }
@@ -4,19 +4,22 @@
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 React from 'react';
7
+ import React, {useMemo} from 'react';
8
8
  import useTheme from '@theme/hooks/useTheme';
9
9
  import ThemeContext from '@theme/ThemeContext';
10
10
 
11
11
  function ThemeProvider(props) {
12
12
  const {isDarkTheme, setLightTheme, setDarkTheme} = useTheme();
13
+ const contextValue = useMemo(
14
+ () => ({
15
+ isDarkTheme,
16
+ setLightTheme,
17
+ setDarkTheme,
18
+ }),
19
+ [isDarkTheme, setLightTheme, setDarkTheme],
20
+ );
13
21
  return (
14
- <ThemeContext.Provider
15
- value={{
16
- isDarkTheme,
17
- setLightTheme,
18
- setDarkTheme,
19
- }}>
22
+ <ThemeContext.Provider value={contextValue}>
20
23
  {props.children}
21
24
  </ThemeContext.Provider>
22
25
  );
@@ -6,16 +6,16 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import clsx from 'clsx';
9
- import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
9
+ import useIsBrowser from '@docusaurus/useIsBrowser';
10
10
  import useThemeContext from '@theme/hooks/useThemeContext';
11
11
  import styles from './styles.module.css';
12
12
 
13
- const ThemedImage = (props) => {
14
- const {isClient} = useDocusaurusContext();
13
+ function ThemedImage(props) {
14
+ const isBrowser = useIsBrowser();
15
15
  const {isDarkTheme} = useThemeContext();
16
16
  const {sources, className, alt = '', ...propsRest} = props;
17
17
  const clientThemes = isDarkTheme ? ['dark'] : ['light'];
18
- const renderedSourceNames = isClient
18
+ const renderedSourceNames = isBrowser
19
19
  ? clientThemes // We need to render both images on the server to avoid flash
20
20
  : // See https://github.com/facebook/docusaurus/pull/3730
21
21
  ['light', 'dark'];
@@ -36,6 +36,6 @@ const ThemedImage = (props) => {
36
36
  ))}
37
37
  </>
38
38
  );
39
- };
39
+ }
40
40
 
41
41
  export default ThemedImage;