@docusaurus/theme-classic 2.0.0-beta.1 → 2.0.0-beta.10

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 (367) hide show
  1. package/README.md +1 -1
  2. package/lib/__tests__/validateThemeConfig.test.js +277 -3
  3. package/lib/admonitions.css +35 -0
  4. package/lib/deps.d.ts +13 -0
  5. package/lib/index.js +41 -16
  6. package/lib/prism-include-languages.js +9 -5
  7. package/lib/theme/AnnouncementBar/index.js +10 -16
  8. package/lib/theme/AnnouncementBar/styles.module.css +25 -30
  9. package/lib/theme/BackToTopButton/index.js +140 -0
  10. package/lib/theme/BackToTopButton/styles.module.css +42 -0
  11. package/lib/theme/BlogArchivePage/index.js +89 -0
  12. package/lib/theme/BlogLayout/index.js +51 -0
  13. package/lib/theme/BlogListPage/index.js +10 -21
  14. package/lib/theme/BlogPostAuthor/index.js +51 -0
  15. package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
  16. package/lib/theme/BlogPostAuthors/index.js +47 -0
  17. package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
  18. package/lib/theme/BlogPostItem/index.js +58 -67
  19. package/lib/theme/BlogPostPage/index.js +37 -24
  20. package/lib/theme/BlogSidebar/index.js +5 -7
  21. package/lib/theme/BlogSidebar/styles.module.css +2 -2
  22. package/lib/theme/BlogTagsListPage/index.js +8 -44
  23. package/lib/theme/BlogTagsPostsPage/index.js +24 -38
  24. package/lib/theme/CodeBlock/index.js +18 -138
  25. package/lib/theme/CodeBlock/styles.module.css +6 -9
  26. package/lib/theme/Details/index.js +30 -0
  27. package/lib/theme/Details/styles.module.css +13 -0
  28. package/lib/theme/DocCard/index.js +84 -0
  29. package/lib/theme/DocCard/styles.module.css +43 -0
  30. package/lib/theme/DocCardList/index.js +28 -0
  31. package/lib/theme/DocCategoryGeneratedIndexPage/index.js +57 -0
  32. package/lib/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  33. package/lib/theme/DocItem/index.js +29 -46
  34. package/lib/theme/DocItem/styles.module.css +5 -9
  35. package/lib/theme/DocItemFooter/index.js +79 -0
  36. package/lib/theme/DocItemFooter/styles.module.css +18 -0
  37. package/lib/theme/DocPage/index.js +35 -52
  38. package/lib/theme/DocPage/styles.module.css +8 -23
  39. package/lib/theme/DocPaginator/index.js +6 -7
  40. package/lib/theme/DocSidebar/index.js +53 -235
  41. package/lib/theme/DocSidebar/styles.module.css +0 -18
  42. package/lib/theme/DocSidebarItem/index.js +209 -0
  43. package/lib/theme/DocSidebarItem/styles.module.css +19 -0
  44. package/lib/theme/DocTagDocListPage/index.js +89 -0
  45. package/lib/theme/DocTagsListPage/index.js +44 -0
  46. package/lib/theme/DocVersionBadge/index.js +34 -0
  47. package/lib/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +39 -20
  48. package/lib/theme/EditThisPage/index.js +3 -1
  49. package/lib/theme/ErrorPageContent.js +43 -0
  50. package/lib/theme/Footer/index.js +16 -5
  51. package/lib/theme/Heading/index.js +17 -22
  52. package/lib/theme/Heading/styles.css +5 -6
  53. package/lib/theme/Heading/styles.module.css +9 -5
  54. package/lib/theme/IconArrow/index.js +2 -2
  55. package/lib/theme/IconClose/index.js +31 -0
  56. package/lib/theme/IconEdit/index.js +3 -3
  57. package/lib/theme/IconExternalLink/index.js +3 -3
  58. package/lib/theme/IconLanguage/index.js +3 -3
  59. package/lib/theme/IconMenu/index.js +3 -3
  60. package/lib/theme/LastUpdated/index.js +4 -2
  61. package/lib/theme/Layout/index.js +5 -1
  62. package/lib/theme/LayoutHead/index.js +22 -17
  63. package/lib/theme/LayoutProviders/index.js +11 -5
  64. package/lib/theme/Logo/index.js +16 -14
  65. package/lib/theme/MDXComponents/index.js +45 -4
  66. package/lib/theme/MDXComponents/styles.css +11 -0
  67. package/lib/theme/MDXPage/index.js +2 -1
  68. package/lib/theme/Navbar/index.js +162 -42
  69. package/lib/theme/Navbar/styles.module.css +10 -3
  70. package/lib/theme/NavbarItem/DefaultNavbarItem.js +27 -123
  71. package/lib/theme/NavbarItem/DocNavbarItem.js +7 -8
  72. package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +19 -12
  73. package/lib/theme/NavbarItem/DropdownNavbarItem.js +155 -0
  74. package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +6 -10
  75. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  76. package/lib/theme/NavbarItem/index.js +31 -11
  77. package/lib/theme/{SearchMetadatas → SearchMetadata}/index.js +2 -2
  78. package/lib/theme/Seo/index.js +10 -7
  79. package/lib/theme/SkipToContent/index.js +12 -4
  80. package/lib/theme/SkipToContent/styles.module.css +1 -0
  81. package/lib/theme/TOC/index.js +9 -29
  82. package/lib/theme/TOC/styles.module.css +1 -1
  83. package/lib/theme/TOCCollapsible/index.js +53 -0
  84. package/lib/theme/TOCCollapsible/styles.module.css +50 -0
  85. package/lib/theme/TOCInline/index.js +7 -27
  86. package/lib/theme/TOCItems/index.js +78 -0
  87. package/lib/theme/Tabs/__tests__/index.test.js +123 -0
  88. package/lib/theme/Tabs/index.js +73 -50
  89. package/lib/theme/Tabs/styles.module.css +0 -13
  90. package/lib/theme/Tag/index.js +40 -0
  91. package/lib/theme/Tag/styles.module.css +70 -0
  92. package/lib/theme/TagsListByLetter/index.js +48 -0
  93. package/lib/theme/TagsListByLetter/styles.module.css +11 -0
  94. package/lib/theme/TagsListInline/index.js +44 -0
  95. package/lib/theme/TagsListInline/styles.module.css +15 -0
  96. package/lib/theme/ThemeProvider/index.js +8 -3
  97. package/lib/theme/ThemedImage/index.js +6 -7
  98. package/lib/theme/Toggle/index.js +41 -44
  99. package/lib/theme/Toggle/styles.module.css +91 -3
  100. package/lib/theme/UserPreferencesProvider/index.js +9 -12
  101. package/lib/theme/hooks/useHideableNavbar.js +14 -32
  102. package/lib/theme/hooks/useTabGroupChoice.js +2 -4
  103. package/lib/theme/hooks/useTheme.js +3 -5
  104. package/lib/theme/hooks/useWindowSize.js +33 -20
  105. package/lib/theme/prism-include-languages.js +4 -3
  106. package/lib/theme-classic.d.ts +806 -0
  107. package/lib/translations.js +4 -4
  108. package/lib/types.d.ts +0 -599
  109. package/lib/validateThemeConfig.js +230 -246
  110. package/lib-next/__tests__/validateThemeConfig.test.js +277 -3
  111. package/lib-next/admonitions.css +35 -0
  112. package/lib-next/deps.d.ts +13 -0
  113. package/lib-next/index.js +45 -13
  114. package/lib-next/prism-include-languages.js +0 -2
  115. package/lib-next/theme/AnnouncementBar/index.js +9 -18
  116. package/lib-next/theme/AnnouncementBar/styles.module.css +25 -30
  117. package/lib-next/theme/BackToTopButton/index.js +131 -0
  118. package/lib-next/theme/BackToTopButton/styles.module.css +42 -0
  119. package/lib-next/theme/BlogArchivePage/index.js +80 -0
  120. package/lib-next/theme/BlogLayout/index.js +40 -0
  121. package/lib-next/theme/BlogListPage/index.js +17 -25
  122. package/lib-next/theme/BlogPostAuthor/index.js +46 -0
  123. package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
  124. package/lib-next/theme/BlogPostAuthors/index.js +34 -0
  125. package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
  126. package/lib-next/theme/BlogPostItem/index.js +79 -86
  127. package/lib-next/theme/BlogPostPage/index.js +70 -35
  128. package/lib-next/theme/BlogSidebar/index.js +11 -13
  129. package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
  130. package/lib-next/theme/BlogTagsListPage/index.js +14 -55
  131. package/lib-next/theme/BlogTagsPostsPage/index.js +29 -39
  132. package/lib-next/theme/CodeBlock/index.js +17 -149
  133. package/lib-next/theme/CodeBlock/styles.module.css +6 -9
  134. package/lib-next/theme/Details/index.js +20 -0
  135. package/lib-next/theme/Details/styles.module.css +13 -0
  136. package/lib-next/theme/DocCard/index.js +80 -0
  137. package/lib-next/theme/DocCard/styles.module.css +43 -0
  138. package/lib-next/theme/DocCardList/index.js +19 -0
  139. package/lib-next/theme/DocCategoryGeneratedIndexPage/index.js +49 -0
  140. package/lib-next/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  141. package/lib-next/theme/DocItem/index.js +40 -56
  142. package/lib-next/theme/DocItem/styles.module.css +5 -9
  143. package/lib-next/theme/DocItemFooter/index.js +79 -0
  144. package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
  145. package/lib-next/theme/DocPage/index.js +46 -47
  146. package/lib-next/theme/DocPage/styles.module.css +8 -23
  147. package/lib-next/theme/DocPaginator/index.js +7 -11
  148. package/lib-next/theme/DocSidebar/index.js +69 -295
  149. package/lib-next/theme/DocSidebar/styles.module.css +0 -18
  150. package/lib-next/theme/DocSidebarItem/index.js +217 -0
  151. package/lib-next/theme/DocSidebarItem/styles.module.css +19 -0
  152. package/lib-next/theme/DocTagDocListPage/index.js +89 -0
  153. package/lib-next/theme/DocTagsListPage/index.js +38 -0
  154. package/lib-next/theme/DocVersionBadge/index.js +27 -0
  155. package/lib-next/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +51 -36
  156. package/lib-next/theme/EditThisPage/index.js +6 -1
  157. package/lib-next/theme/ErrorPageContent.js +35 -0
  158. package/lib-next/theme/Footer/index.js +27 -5
  159. package/lib-next/theme/Heading/index.js +25 -29
  160. package/lib-next/theme/Heading/styles.css +5 -6
  161. package/lib-next/theme/Heading/styles.module.css +9 -5
  162. package/lib-next/theme/IconArrow/index.js +2 -2
  163. package/lib-next/theme/IconClose/index.js +23 -0
  164. package/lib-next/theme/IconEdit/index.js +2 -2
  165. package/lib-next/theme/IconExternalLink/index.js +2 -2
  166. package/lib-next/theme/IconLanguage/index.js +2 -2
  167. package/lib-next/theme/IconMenu/index.js +2 -2
  168. package/lib-next/theme/LastUpdated/index.js +3 -2
  169. package/lib-next/theme/Layout/index.js +3 -1
  170. package/lib-next/theme/LayoutHead/index.js +18 -23
  171. package/lib-next/theme/LayoutProviders/index.js +17 -6
  172. package/lib-next/theme/Logo/index.js +25 -21
  173. package/lib-next/theme/MDXComponents/index.js +34 -7
  174. package/lib-next/theme/MDXComponents/styles.css +11 -0
  175. package/lib-next/theme/MDXPage/index.js +10 -2
  176. package/lib-next/theme/Navbar/index.js +193 -56
  177. package/lib-next/theme/Navbar/styles.module.css +10 -3
  178. package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +45 -147
  179. package/lib-next/theme/NavbarItem/DocNavbarItem.js +7 -7
  180. package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +31 -19
  181. package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +159 -0
  182. package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +4 -12
  183. package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  184. package/lib-next/theme/NavbarItem/index.js +25 -12
  185. package/lib-next/theme/{SearchMetadatas → SearchMetadata}/index.js +1 -1
  186. package/lib-next/theme/Seo/index.js +11 -7
  187. package/lib-next/theme/SkipToContent/index.js +7 -8
  188. package/lib-next/theme/SkipToContent/styles.module.css +1 -0
  189. package/lib-next/theme/TOC/index.js +12 -36
  190. package/lib-next/theme/TOC/styles.module.css +1 -1
  191. package/lib-next/theme/TOCCollapsible/index.js +54 -0
  192. package/lib-next/theme/TOCCollapsible/styles.module.css +50 -0
  193. package/lib-next/theme/TOCInline/index.js +10 -28
  194. package/lib-next/theme/TOCItems/index.js +85 -0
  195. package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
  196. package/lib-next/theme/Tabs/index.js +91 -43
  197. package/lib-next/theme/Tabs/styles.module.css +0 -13
  198. package/lib-next/theme/Tag/index.js +27 -0
  199. package/lib-next/theme/Tag/styles.module.css +70 -0
  200. package/lib-next/theme/TagsListByLetter/index.js +42 -0
  201. package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
  202. package/lib-next/theme/TagsListInline/index.js +31 -0
  203. package/lib-next/theme/TagsListInline/styles.module.css +15 -0
  204. package/lib-next/theme/ThemeProvider/index.js +10 -7
  205. package/lib-next/theme/ThemedImage/index.js +7 -8
  206. package/lib-next/theme/Toggle/index.js +34 -37
  207. package/lib-next/theme/Toggle/styles.module.css +91 -3
  208. package/lib-next/theme/UserPreferencesProvider/index.js +9 -10
  209. package/lib-next/theme/hooks/useHideableNavbar.js +31 -44
  210. package/lib-next/theme/hooks/useTabGroupChoice.js +2 -4
  211. package/lib-next/theme/hooks/useTheme.js +4 -5
  212. package/lib-next/theme/hooks/useWindowSize.js +34 -20
  213. package/lib-next/theme/prism-include-languages.js +2 -1
  214. package/lib-next/theme-classic.d.ts +806 -0
  215. package/lib-next/translations.js +6 -10
  216. package/lib-next/types.d.ts +0 -599
  217. package/lib-next/validateThemeConfig.js +141 -114
  218. package/package.json +28 -25
  219. package/src/__tests__/validateThemeConfig.test.js +277 -3
  220. package/src/admonitions.css +35 -0
  221. package/src/deps.d.ts +13 -0
  222. package/src/index.ts +55 -22
  223. package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
  224. package/src/theme/AnnouncementBar/index.tsx +10 -17
  225. package/src/theme/AnnouncementBar/styles.module.css +25 -30
  226. package/src/theme/BackToTopButton/index.tsx +142 -0
  227. package/src/theme/BackToTopButton/styles.module.css +42 -0
  228. package/src/theme/BlogArchivePage/index.tsx +91 -0
  229. package/src/theme/BlogLayout/index.tsx +44 -0
  230. package/src/theme/BlogListPage/index.tsx +18 -25
  231. package/src/theme/BlogPostAuthor/index.tsx +49 -0
  232. package/src/theme/BlogPostAuthor/styles.module.css +12 -0
  233. package/src/theme/BlogPostAuthors/index.tsx +39 -0
  234. package/src/theme/BlogPostAuthors/styles.module.css +11 -0
  235. package/src/theme/BlogPostItem/index.tsx +70 -80
  236. package/src/theme/BlogPostPage/index.tsx +72 -35
  237. package/src/theme/BlogSidebar/index.tsx +11 -13
  238. package/src/theme/BlogSidebar/styles.module.css +2 -2
  239. package/src/theme/BlogTagsListPage/index.tsx +14 -57
  240. package/src/theme/BlogTagsPostsPage/index.tsx +29 -39
  241. package/src/theme/CodeBlock/index.tsx +21 -151
  242. package/src/theme/CodeBlock/styles.module.css +6 -9
  243. package/src/theme/Details/index.tsx +24 -0
  244. package/src/theme/Details/styles.module.css +13 -0
  245. package/src/theme/DocCard/index.tsx +100 -0
  246. package/src/theme/DocCard/styles.module.css +43 -0
  247. package/src/theme/DocCardList/index.tsx +27 -0
  248. package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +53 -0
  249. package/src/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
  250. package/src/theme/DocItem/index.tsx +43 -56
  251. package/src/theme/DocItem/styles.module.css +5 -9
  252. package/src/theme/DocItemFooter/index.tsx +91 -0
  253. package/src/theme/DocItemFooter/styles.module.css +18 -0
  254. package/src/theme/DocPage/index.tsx +44 -42
  255. package/src/theme/DocPage/styles.module.css +8 -23
  256. package/src/theme/DocPaginator/index.tsx +9 -13
  257. package/src/theme/DocSidebar/index.tsx +80 -307
  258. package/src/theme/DocSidebar/styles.module.css +0 -18
  259. package/src/theme/DocSidebarItem/index.tsx +242 -0
  260. package/src/theme/DocSidebarItem/styles.module.css +19 -0
  261. package/src/theme/DocTagDocListPage/index.tsx +89 -0
  262. package/src/theme/DocTagsListPage/index.tsx +41 -0
  263. package/src/theme/DocVersionBadge/index.tsx +30 -0
  264. package/src/theme/{DocVersionSuggestions → DocVersionBanner}/index.tsx +74 -44
  265. package/src/theme/EditThisPage/index.tsx +6 -1
  266. package/src/theme/ErrorPageContent.tsx +41 -0
  267. package/src/theme/Footer/index.tsx +30 -6
  268. package/src/theme/Heading/index.tsx +25 -31
  269. package/src/theme/Heading/styles.css +5 -6
  270. package/src/theme/Heading/styles.module.css +9 -5
  271. package/src/theme/IconArrow/index.tsx +2 -2
  272. package/src/theme/IconClose/index.tsx +26 -0
  273. package/src/theme/IconEdit/index.tsx +2 -2
  274. package/src/theme/IconExternalLink/index.tsx +2 -5
  275. package/src/theme/IconLanguage/index.tsx +2 -6
  276. package/src/theme/IconMenu/index.tsx +3 -3
  277. package/src/theme/LastUpdated/index.tsx +3 -2
  278. package/src/theme/Layout/index.tsx +3 -1
  279. package/src/theme/LayoutHead/index.tsx +18 -17
  280. package/src/theme/LayoutProviders/index.tsx +17 -6
  281. package/src/theme/Logo/index.tsx +21 -17
  282. package/src/theme/MDXComponents/index.tsx +39 -5
  283. package/src/theme/MDXComponents/styles.css +11 -0
  284. package/src/theme/MDXPage/index.tsx +10 -2
  285. package/src/theme/Navbar/index.tsx +203 -61
  286. package/src/theme/Navbar/styles.module.css +10 -3
  287. package/src/theme/NavbarItem/DefaultNavbarItem.tsx +42 -154
  288. package/src/theme/NavbarItem/DocNavbarItem.tsx +12 -16
  289. package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +33 -21
  290. package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
  291. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +181 -0
  292. package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +8 -9
  293. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  294. package/src/theme/NavbarItem/index.tsx +41 -16
  295. package/src/theme/{SearchMetadatas → SearchMetadata}/index.tsx +2 -2
  296. package/src/theme/Seo/index.tsx +7 -4
  297. package/src/theme/SkipToContent/index.tsx +7 -8
  298. package/src/theme/SkipToContent/styles.module.css +1 -0
  299. package/src/theme/TOC/index.tsx +12 -41
  300. package/src/theme/TOC/styles.module.css +1 -1
  301. package/src/theme/TOCCollapsible/index.tsx +58 -0
  302. package/src/theme/TOCCollapsible/styles.module.css +50 -0
  303. package/src/theme/TOCInline/index.tsx +13 -32
  304. package/src/theme/TOCItems/index.tsx +96 -0
  305. package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
  306. package/src/theme/Tabs/index.tsx +93 -49
  307. package/src/theme/Tabs/styles.module.css +0 -13
  308. package/src/theme/Tag/index.tsx +31 -0
  309. package/src/theme/Tag/styles.module.css +70 -0
  310. package/src/theme/TagsListByLetter/index.tsx +45 -0
  311. package/src/theme/TagsListByLetter/styles.module.css +11 -0
  312. package/src/theme/TagsListInline/index.tsx +35 -0
  313. package/src/theme/TagsListInline/styles.module.css +15 -0
  314. package/src/theme/ThemeProvider/index.tsx +6 -2
  315. package/src/theme/ThemedImage/index.tsx +8 -8
  316. package/src/theme/Toggle/index.tsx +36 -43
  317. package/src/theme/Toggle/styles.module.css +91 -3
  318. package/src/theme/UserPreferencesProvider/index.tsx +9 -11
  319. package/src/theme/hooks/useHideableNavbar.ts +32 -45
  320. package/src/theme/hooks/useTabGroupChoice.ts +4 -4
  321. package/src/theme/hooks/useTheme.ts +4 -5
  322. package/src/theme/hooks/useWindowSize.ts +38 -20
  323. package/src/theme/prism-include-languages.ts +3 -2
  324. package/src/theme-classic.d.ts +806 -0
  325. package/src/translations.ts +8 -10
  326. package/src/types.d.ts +0 -599
  327. package/src/{validateThemeConfig.js → validateThemeConfig.ts} +151 -94
  328. package/tsconfig.json +1 -2
  329. package/codeTranslations/README.md +0 -20
  330. package/codeTranslations/ar.json +0 -57
  331. package/codeTranslations/base.json +0 -112
  332. package/codeTranslations/bn.json +0 -56
  333. package/codeTranslations/da.json +0 -57
  334. package/codeTranslations/de.json +0 -57
  335. package/codeTranslations/es.json +0 -57
  336. package/codeTranslations/fa.json +0 -57
  337. package/codeTranslations/fil.json +0 -57
  338. package/codeTranslations/fr.json +0 -57
  339. package/codeTranslations/he.json +0 -57
  340. package/codeTranslations/hi.json +0 -57
  341. package/codeTranslations/ja.json +0 -57
  342. package/codeTranslations/ko.json +0 -57
  343. package/codeTranslations/pl.json +0 -57
  344. package/codeTranslations/pt-BR.json +0 -57
  345. package/codeTranslations/pt-PT.json +0 -57
  346. package/codeTranslations/ru.json +0 -57
  347. package/codeTranslations/tr.json +0 -57
  348. package/codeTranslations/vi.json +0 -57
  349. package/codeTranslations/zh-Hans.json +0 -57
  350. package/codeTranslations/zh-Hant.json +0 -57
  351. package/lib/theme/Toggle/styles.css +0 -103
  352. package/lib/theme/hooks/useAnnouncementBar.js +0 -63
  353. package/lib/theme/hooks/useContextualSearchFilters.js +0 -47
  354. package/lib/theme/hooks/useScrollPosition.js +0 -49
  355. package/lib/theme/hooks/useTOCHighlight.js +0 -87
  356. package/lib-next/theme/Toggle/styles.css +0 -103
  357. package/lib-next/theme/hooks/useAnnouncementBar.js +0 -49
  358. package/lib-next/theme/hooks/useContextualSearchFilters.js +0 -41
  359. package/lib-next/theme/hooks/useScrollPosition.js +0 -38
  360. package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
  361. package/src/theme/Toggle/styles.css +0 -103
  362. package/src/theme/hooks/useAnnouncementBar.ts +0 -58
  363. package/src/theme/hooks/useContextualSearchFilters.ts +0 -52
  364. package/src/theme/hooks/useScrollPosition.ts +0 -45
  365. package/src/theme/hooks/useTOCHighlight.ts +0 -98
  366. package/update-code-translations.js +0 -239
  367. package/update-code-translations.test.js +0 -33
@@ -5,246 +5,41 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import React, {useState, useCallback, useEffect, useRef, memo} from 'react';
8
+ import React, {useState} from 'react';
9
9
  import clsx from 'clsx';
10
- import {useThemeConfig, isSamePath} from '@docusaurus/theme-common';
11
- import useUserPreferencesContext from '@theme/hooks/useUserPreferencesContext';
12
- import useLockBodyScroll from '@theme/hooks/useLockBodyScroll';
13
- import useWindowSize, {windowSizes} from '@theme/hooks/useWindowSize';
14
- import useScrollPosition from '@theme/hooks/useScrollPosition';
15
- import Link from '@docusaurus/Link';
16
- import isInternalUrl from '@docusaurus/isInternalUrl';
17
- import type {Props} from '@theme/DocSidebar';
10
+ import {
11
+ useThemeConfig,
12
+ useAnnouncementBar,
13
+ MobileSecondaryMenuFiller,
14
+ MobileSecondaryMenuComponent,
15
+ ThemeClassNames,
16
+ useScrollPosition,
17
+ } from '@docusaurus/theme-common';
18
+ import useWindowSize from '@theme/hooks/useWindowSize';
18
19
  import Logo from '@theme/Logo';
19
20
  import IconArrow from '@theme/IconArrow';
20
- import IconMenu from '@theme/IconMenu';
21
- import IconExternalLink from '@theme/IconExternalLink';
22
21
  import {translate} from '@docusaurus/Translate';
22
+ import {DocSidebarItems} from '@theme/DocSidebarItem';
23
+ import type {Props} from '@theme/DocSidebar';
23
24
 
24
25
  import styles from './styles.module.css';
25
26
 
26
- const MOBILE_TOGGLE_SIZE = 24;
27
-
28
- function usePrevious(value) {
29
- const ref = useRef(value);
30
- useEffect(() => {
31
- ref.current = value;
32
- }, [value]);
33
- return ref.current;
34
- }
35
-
36
- const isActiveSidebarItem = (item, activePath) => {
37
- if (item.type === 'link') {
38
- return isSamePath(item.href, activePath);
39
- }
40
- if (item.type === 'category') {
41
- return item.items.some((subItem) =>
42
- isActiveSidebarItem(subItem, activePath),
43
- );
44
- }
45
- return false;
46
- };
47
-
48
- // Optimize sidebar at each "level"
49
- // TODO this item should probably not receive the "activePath" props
50
- // TODO this triggers whole sidebar re-renders on navigation
51
- const DocSidebarItems = memo(function DocSidebarItems({
52
- items,
53
- ...props
54
- }: any): JSX.Element {
55
- return items.map((item, index) => (
56
- <DocSidebarItem
57
- key={index} // sidebar is static, the index does not change
58
- item={item}
59
- {...props}
60
- />
61
- ));
62
- });
63
-
64
- function DocSidebarItem(props): JSX.Element {
65
- switch (props.item.type) {
66
- case 'category':
67
- return <DocSidebarItemCategory {...props} />;
68
- case 'link':
69
- default:
70
- return <DocSidebarItemLink {...props} />;
71
- }
72
- }
73
-
74
- function DocSidebarItemCategory({
75
- item,
76
- onItemClick,
77
- collapsible,
78
- activePath,
79
- ...props
80
- }) {
81
- const {items, label} = item;
82
-
83
- const isActive = isActiveSidebarItem(item, activePath);
84
- const wasActive = usePrevious(isActive);
85
-
86
- // active categories are always initialized as expanded
87
- // the default (item.collapsed) is only used for non-active categories
88
- const [collapsed, setCollapsed] = useState(() => {
89
- if (!collapsible) {
90
- return false;
91
- }
92
- return isActive ? false : item.collapsed;
93
- });
94
-
95
- const menuListRef = useRef<HTMLUListElement>(null);
96
- const [menuListHeight, setMenuListHeight] = useState<string | undefined>(
97
- undefined,
98
- );
99
- const handleMenuListHeight = (calc = true) => {
100
- setMenuListHeight(
101
- calc ? `${menuListRef.current?.scrollHeight}px` : undefined,
102
- );
103
- };
104
-
105
- // If we navigate to a category, it should automatically expand itself
106
- useEffect(() => {
107
- const justBecameActive = isActive && !wasActive;
108
- if (justBecameActive && collapsed) {
109
- setCollapsed(false);
110
- }
111
- }, [isActive, wasActive, collapsed]);
112
-
113
- const handleItemClick = useCallback(
114
- (e) => {
115
- e.preventDefault();
116
-
117
- if (!menuListHeight) {
118
- handleMenuListHeight();
119
- }
120
-
121
- setTimeout(() => setCollapsed((state) => !state), 100);
122
- },
123
- [menuListHeight],
124
- );
125
-
126
- if (items.length === 0) {
127
- return null;
128
- }
129
-
130
- return (
131
- <li
132
- className={clsx('menu__list-item', {
133
- 'menu__list-item--collapsed': collapsed,
134
- })}>
135
- <a
136
- className={clsx('menu__link', {
137
- 'menu__link--sublist': collapsible,
138
- 'menu__link--active': collapsible && isActive,
139
- [styles.menuLinkText]: !collapsible,
140
- })}
141
- onClick={collapsible ? handleItemClick : undefined}
142
- href={collapsible ? '#!' : undefined}
143
- {...props}>
144
- {label}
145
- </a>
146
- <ul
147
- className="menu__list"
148
- ref={menuListRef}
149
- style={{
150
- height: menuListHeight,
151
- }}
152
- onTransitionEnd={() => {
153
- if (!collapsed) {
154
- handleMenuListHeight(false);
155
- }
156
- }}>
157
- <DocSidebarItems
158
- items={items}
159
- tabIndex={collapsed ? '-1' : '0'}
160
- onItemClick={onItemClick}
161
- collapsible={collapsible}
162
- activePath={activePath}
163
- />
164
- </ul>
165
- </li>
166
- );
167
- }
168
-
169
- function DocSidebarItemLink({
170
- item,
171
- onItemClick,
172
- activePath,
173
- collapsible: _collapsible,
174
- ...props
175
- }) {
176
- const {href, label} = item;
177
- const isActive = isActiveSidebarItem(item, activePath);
178
- return (
179
- <li className="menu__list-item" key={label}>
180
- <Link
181
- className={clsx('menu__link', {
182
- 'menu__link--active': isActive,
183
- })}
184
- to={href}
185
- {...(isInternalUrl(href) && {
186
- isNavLink: true,
187
- exact: true,
188
- onClick: onItemClick,
189
- })}
190
- {...props}>
191
- {isInternalUrl(href) ? (
192
- label
193
- ) : (
194
- <span>
195
- {label}
196
- <IconExternalLink />
197
- </span>
198
- )}
199
- </Link>
200
- </li>
201
- );
202
- }
203
-
204
27
  function useShowAnnouncementBar() {
205
- const {isAnnouncementBarClosed} = useUserPreferencesContext();
206
- const [showAnnouncementBar, setShowAnnouncementBar] = useState(
207
- !isAnnouncementBarClosed,
208
- );
209
- useScrollPosition(({scrollY}) => {
210
- if (!isAnnouncementBarClosed) {
211
- setShowAnnouncementBar(scrollY === 0);
212
- }
213
- });
214
- return showAnnouncementBar;
215
- }
216
-
217
- function useResponsiveSidebar() {
218
- const [showResponsiveSidebar, setShowResponsiveSidebar] = useState(false);
219
- useLockBodyScroll(showResponsiveSidebar);
220
-
221
- const windowSize = useWindowSize();
222
- useEffect(() => {
223
- if (windowSize === windowSizes.desktop) {
224
- setShowResponsiveSidebar(false);
225
- }
226
- }, [windowSize]);
28
+ const {isActive} = useAnnouncementBar();
29
+ const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive);
227
30
 
228
- const closeResponsiveSidebar = useCallback(
229
- (e) => {
230
- e.target.blur();
231
- setShowResponsiveSidebar(false);
31
+ useScrollPosition(
32
+ ({scrollY}) => {
33
+ if (isActive) {
34
+ setShowAnnouncementBar(scrollY === 0);
35
+ }
232
36
  },
233
- [setShowResponsiveSidebar],
37
+ [isActive],
234
38
  );
235
-
236
- const toggleResponsiveSidebar = useCallback(() => {
237
- setShowResponsiveSidebar((value) => !value);
238
- }, [setShowResponsiveSidebar]);
239
-
240
- return {
241
- showResponsiveSidebar,
242
- closeResponsiveSidebar,
243
- toggleResponsiveSidebar,
244
- };
39
+ return isActive && showAnnouncementBar;
245
40
  }
246
41
 
247
- function HideableSidebarButton({onClick}) {
42
+ function HideableSidebarButton({onClick}: {onClick: React.MouseEventHandler}) {
248
43
  return (
249
44
  <button
250
45
  type="button"
@@ -268,63 +63,12 @@ function HideableSidebarButton({onClick}) {
268
63
  );
269
64
  }
270
65
 
271
- function ResponsiveSidebarButton({responsiveSidebarOpened, onClick}) {
272
- return (
273
- <button
274
- aria-label={
275
- responsiveSidebarOpened
276
- ? translate({
277
- id: 'theme.docs.sidebar.responsiveCloseButtonLabel',
278
- message: 'Close menu',
279
- description:
280
- 'The ARIA label for close button of mobile doc sidebar',
281
- })
282
- : translate({
283
- id: 'theme.docs.sidebar.responsiveOpenButtonLabel',
284
- message: 'Open menu',
285
- description:
286
- 'The ARIA label for open button of mobile doc sidebar',
287
- })
288
- }
289
- aria-haspopup="true"
290
- className="button button--secondary button--sm menu__button"
291
- type="button"
292
- onClick={onClick}>
293
- {responsiveSidebarOpened ? (
294
- <span
295
- className={clsx(styles.sidebarMenuIcon, styles.sidebarMenuCloseIcon)}>
296
- &times;
297
- </span>
298
- ) : (
299
- <IconMenu
300
- className={styles.sidebarMenuIcon}
301
- height={MOBILE_TOGGLE_SIZE}
302
- width={MOBILE_TOGGLE_SIZE}
303
- />
304
- )}
305
- </button>
306
- );
307
- }
308
-
309
- function DocSidebar({
310
- path,
311
- sidebar,
312
- sidebarCollapsible = true,
313
- onCollapse,
314
- isHidden,
315
- }: Props): JSX.Element | null {
66
+ function DocSidebarDesktop({path, sidebar, onCollapse, isHidden}: Props) {
316
67
  const showAnnouncementBar = useShowAnnouncementBar();
317
68
  const {
318
69
  navbar: {hideOnScroll},
319
70
  hideableSidebar,
320
71
  } = useThemeConfig();
321
- const {isAnnouncementBarClosed} = useUserPreferencesContext();
322
-
323
- const {
324
- showResponsiveSidebar,
325
- closeResponsiveSidebar,
326
- toggleResponsiveSidebar,
327
- } = useResponsiveSidebar();
328
72
 
329
73
  return (
330
74
  <div
@@ -334,34 +78,11 @@ function DocSidebar({
334
78
  })}>
335
79
  {hideOnScroll && <Logo tabIndex={-1} className={styles.sidebarLogo} />}
336
80
  <nav
337
- className={clsx(
338
- 'menu',
339
- 'menu--responsive',
340
- 'thin-scrollbar',
341
- styles.menu,
342
- {
343
- 'menu--show': showResponsiveSidebar,
344
- [styles.menuWithAnnouncementBar]:
345
- !isAnnouncementBarClosed && showAnnouncementBar,
346
- },
347
- )}
348
- aria-label={translate({
349
- id: 'theme.docs.sidebar.navAriaLabel',
350
- message: 'Sidebar navigation',
351
- description: 'The ARIA label for documentation menu',
81
+ className={clsx('menu thin-scrollbar', styles.menu, {
82
+ [styles.menuWithAnnouncementBar]: showAnnouncementBar,
352
83
  })}>
353
- <ResponsiveSidebarButton
354
- responsiveSidebarOpened={showResponsiveSidebar}
355
- onClick={toggleResponsiveSidebar}
356
- />
357
-
358
- <ul className="menu__list">
359
- <DocSidebarItems
360
- items={sidebar}
361
- onItemClick={closeResponsiveSidebar}
362
- collapsible={sidebarCollapsible}
363
- activePath={path}
364
- />
84
+ <ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
85
+ <DocSidebarItems items={sidebar} activePath={path} level={1} />
365
86
  </ul>
366
87
  </nav>
367
88
  {hideableSidebar && <HideableSidebarButton onClick={onCollapse} />}
@@ -369,4 +90,56 @@ function DocSidebar({
369
90
  );
370
91
  }
371
92
 
372
- export default DocSidebar;
93
+ // eslint-disable-next-line react/function-component-definition
94
+ const DocSidebarMobileSecondaryMenu: MobileSecondaryMenuComponent<Props> = ({
95
+ toggleSidebar,
96
+ sidebar,
97
+ path,
98
+ }) => (
99
+ <ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
100
+ <DocSidebarItems
101
+ items={sidebar}
102
+ activePath={path}
103
+ onItemClick={(item) => {
104
+ // Mobile sidebar should only be closed if the category has a link
105
+ if (item.type === 'category' && item.href) {
106
+ toggleSidebar();
107
+ }
108
+ if (item.type === 'link') {
109
+ toggleSidebar();
110
+ }
111
+ }}
112
+ level={1}
113
+ />
114
+ </ul>
115
+ );
116
+
117
+ function DocSidebarMobile(props: Props) {
118
+ return (
119
+ <MobileSecondaryMenuFiller
120
+ component={DocSidebarMobileSecondaryMenu}
121
+ props={props}
122
+ />
123
+ );
124
+ }
125
+
126
+ const DocSidebarDesktopMemo = React.memo(DocSidebarDesktop);
127
+ const DocSidebarMobileMemo = React.memo(DocSidebarMobile);
128
+
129
+ export default function DocSidebar(props: Props): JSX.Element {
130
+ const windowSize = useWindowSize();
131
+
132
+ // Desktop sidebar visible on hydration: need SSR rendering
133
+ const shouldRenderSidebarDesktop =
134
+ windowSize === 'desktop' || windowSize === 'ssr';
135
+
136
+ // Mobile sidebar not visible on hydration: can avoid SSR rendering
137
+ const shouldRenderSidebarMobile = windowSize === 'mobile';
138
+
139
+ return (
140
+ <>
141
+ {shouldRenderSidebarDesktop && <DocSidebarDesktopMemo {...props} />}
142
+ {shouldRenderSidebarMobile && <DocSidebarMobileMemo {...props} />}
143
+ </>
144
+ );
145
+ }
@@ -53,14 +53,6 @@
53
53
  padding: 0.5rem;
54
54
  }
55
55
 
56
- .menuLinkText {
57
- cursor: initial;
58
- }
59
-
60
- .menuLinkText:hover {
61
- background: none;
62
- }
63
-
64
56
  .menuWithAnnouncementBar {
65
57
  margin-bottom: var(--docusaurus-announcement-bar-height);
66
58
  }
@@ -112,13 +104,3 @@
112
104
  line-height: 0.9;
113
105
  width: 24px;
114
106
  }
115
-
116
- :global(.menu__list) :global(.menu__list) {
117
- overflow-y: hidden;
118
- will-change: height;
119
- transition: height var(--ifm-transition-fast) linear;
120
- }
121
-
122
- :global(.menu__list-item--collapsed) :global(.menu__list) {
123
- height: 0 !important;
124
- }
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import React, {useEffect, memo, useMemo} from 'react';
9
+ import clsx from 'clsx';
10
+ import {
11
+ isActiveSidebarItem,
12
+ usePrevious,
13
+ Collapsible,
14
+ useCollapsible,
15
+ findFirstCategoryLink,
16
+ ThemeClassNames,
17
+ } from '@docusaurus/theme-common';
18
+ import Link from '@docusaurus/Link';
19
+ import isInternalUrl from '@docusaurus/isInternalUrl';
20
+ import {translate} from '@docusaurus/Translate';
21
+ import IconExternalLink from '@theme/IconExternalLink';
22
+
23
+ import type {Props, DocSidebarItemsProps} from '@theme/DocSidebarItem';
24
+ import type {
25
+ PropSidebarItemCategory,
26
+ PropSidebarItemLink,
27
+ } from '@docusaurus/plugin-content-docs';
28
+
29
+ import styles from './styles.module.css';
30
+ import useIsBrowser from '@docusaurus/useIsBrowser';
31
+
32
+ // Optimize sidebar at each "level"
33
+ // TODO this item should probably not receive the "activePath" props
34
+ // TODO this triggers whole sidebar re-renders on navigation
35
+ export const DocSidebarItems = memo(
36
+ ({items, ...props}: DocSidebarItemsProps): JSX.Element => (
37
+ <>
38
+ {items.map((item, index) => (
39
+ <DocSidebarItem
40
+ key={index} // sidebar is static, the index does not change
41
+ item={item}
42
+ {...props}
43
+ />
44
+ ))}
45
+ </>
46
+ ),
47
+ );
48
+
49
+ export default function DocSidebarItem({
50
+ item,
51
+ ...props
52
+ }: Props): JSX.Element | null {
53
+ switch (item.type) {
54
+ case 'category':
55
+ if (item.items.length === 0) {
56
+ return null;
57
+ }
58
+ return <DocSidebarItemCategory item={item} {...props} />;
59
+ case 'link':
60
+ default:
61
+ return <DocSidebarItemLink item={item} {...props} />;
62
+ }
63
+ }
64
+
65
+ // If we navigate to a category and it becomes active, it should automatically expand itself
66
+ function useAutoExpandActiveCategory({
67
+ isActive,
68
+ collapsed,
69
+ setCollapsed,
70
+ }: {
71
+ isActive: boolean;
72
+ collapsed: boolean;
73
+ setCollapsed: (b: boolean) => void;
74
+ }) {
75
+ const wasActive = usePrevious(isActive);
76
+ useEffect(() => {
77
+ const justBecameActive = isActive && !wasActive;
78
+ if (justBecameActive && collapsed) {
79
+ setCollapsed(false);
80
+ }
81
+ }, [isActive, wasActive, collapsed, setCollapsed]);
82
+ }
83
+
84
+ // When a collapsible category has no link, we still link it to its first child during SSR as a temporary fallback
85
+ // This allows to be able to navigate inside the category even when JS fails to load, is delayed or simply disabled
86
+ // React hydration becomes an optional progressive enhancement
87
+ // see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188
88
+ // see https://github.com/facebook/docusaurus/issues/3030
89
+ function useCategoryHrefWithSSRFallback(
90
+ item: PropSidebarItemCategory,
91
+ ): string | undefined {
92
+ const isBrowser = useIsBrowser();
93
+ return useMemo(() => {
94
+ if (item.href) {
95
+ return item.href;
96
+ }
97
+ // In these cases, it's not necessary to render a fallback
98
+ // We skip the "findFirstCategoryLink" computation
99
+ if (isBrowser || !item.collapsible) {
100
+ return undefined;
101
+ }
102
+ return findFirstCategoryLink(item);
103
+ }, [item, isBrowser]);
104
+ }
105
+
106
+ function DocSidebarItemCategory({
107
+ item,
108
+ onItemClick,
109
+ activePath,
110
+ level,
111
+ ...props
112
+ }: Props & {item: PropSidebarItemCategory}) {
113
+ const {items, label, collapsible, className, href} = item;
114
+ const hrefWithSSRFallback = useCategoryHrefWithSSRFallback(item);
115
+
116
+ const isActive = isActiveSidebarItem(item, activePath);
117
+
118
+ const {collapsed, setCollapsed, toggleCollapsed} = useCollapsible({
119
+ // active categories are always initialized as expanded
120
+ // the default (item.collapsed) is only used for non-active categories
121
+ initialState: () => {
122
+ if (!collapsible) {
123
+ return false;
124
+ }
125
+ return isActive ? false : item.collapsed;
126
+ },
127
+ });
128
+
129
+ useAutoExpandActiveCategory({isActive, collapsed, setCollapsed});
130
+
131
+ return (
132
+ <li
133
+ className={clsx(
134
+ ThemeClassNames.docs.docSidebarItemCategory,
135
+ ThemeClassNames.docs.docSidebarItemCategoryLevel(level),
136
+ 'menu__list-item',
137
+ {
138
+ 'menu__list-item--collapsed': collapsed,
139
+ },
140
+ className,
141
+ )}>
142
+ <div className="menu__list-item-collapsible">
143
+ <Link
144
+ className={clsx('menu__link', {
145
+ 'menu__link--sublist': collapsible && !href,
146
+ 'menu__link--active': isActive,
147
+ [styles.menuLinkText]: !collapsible,
148
+ [styles.hasHref]: !!hrefWithSSRFallback,
149
+ })}
150
+ onClick={
151
+ collapsible
152
+ ? (e) => {
153
+ onItemClick?.(item);
154
+ if (href) {
155
+ setCollapsed(false);
156
+ } else {
157
+ e.preventDefault();
158
+ toggleCollapsed();
159
+ }
160
+ }
161
+ : () => {
162
+ onItemClick?.(item);
163
+ }
164
+ }
165
+ href={collapsible ? hrefWithSSRFallback ?? '#' : hrefWithSSRFallback}
166
+ {...props}>
167
+ {label}
168
+ </Link>
169
+ {href && collapsible && (
170
+ <button
171
+ aria-label={translate(
172
+ {
173
+ id: 'theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel',
174
+ message: "Toggle the collapsible sidebar category '{label}'",
175
+ description:
176
+ 'The ARIA label to toggle the collapsible sidebar category',
177
+ },
178
+ {label},
179
+ )}
180
+ type="button"
181
+ className="clean-btn menu__caret"
182
+ onClick={(e) => {
183
+ e.preventDefault();
184
+ toggleCollapsed();
185
+ }}
186
+ />
187
+ )}
188
+ </div>
189
+
190
+ <Collapsible lazy as="ul" className="menu__list" collapsed={collapsed}>
191
+ <DocSidebarItems
192
+ items={items}
193
+ tabIndex={collapsed ? -1 : 0}
194
+ onItemClick={onItemClick}
195
+ activePath={activePath}
196
+ level={level + 1}
197
+ />
198
+ </Collapsible>
199
+ </li>
200
+ );
201
+ }
202
+
203
+ function DocSidebarItemLink({
204
+ item,
205
+ onItemClick,
206
+ activePath,
207
+ level,
208
+ ...props
209
+ }: Props & {item: PropSidebarItemLink}) {
210
+ const {href, label, className} = item;
211
+ const isActive = isActiveSidebarItem(item, activePath);
212
+ return (
213
+ <li
214
+ className={clsx(
215
+ ThemeClassNames.docs.docSidebarItemLink,
216
+ ThemeClassNames.docs.docSidebarItemLinkLevel(level),
217
+ 'menu__list-item',
218
+ className,
219
+ )}
220
+ key={label}>
221
+ <Link
222
+ className={clsx('menu__link', {
223
+ 'menu__link--active': isActive,
224
+ })}
225
+ aria-current={isActive ? 'page' : undefined}
226
+ to={href}
227
+ {...(isInternalUrl(href) && {
228
+ onClick: onItemClick ? () => onItemClick(item) : undefined,
229
+ })}
230
+ {...props}>
231
+ {isInternalUrl(href) ? (
232
+ label
233
+ ) : (
234
+ <span>
235
+ {label}
236
+ <IconExternalLink />
237
+ </span>
238
+ )}
239
+ </Link>
240
+ </li>
241
+ );
242
+ }