@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
@@ -91,6 +91,10 @@ describe('themeConfig', () => {
91
91
  },
92
92
  copyright: `Copyright © ${new Date().getFullYear()} Facebook, Inc. Built with Docusaurus.`,
93
93
  },
94
+ tableOfContents: {
95
+ minHeadingLevel: 2,
96
+ maxHeadingLevel: 5,
97
+ },
94
98
  };
95
99
  expect(testValidateThemeConfig(userConfig)).toEqual({
96
100
  ...DEFAULT_CONFIG,
@@ -108,7 +112,6 @@ describe('themeConfig', () => {
108
112
  position: 'left',
109
113
  docId: 'intro',
110
114
  label: 'Introduction',
111
- activeSidebarClassName: 'custom-class',
112
115
  },
113
116
  // Regular link
114
117
  {
@@ -134,6 +137,23 @@ describe('themeConfig', () => {
134
137
  },
135
138
  ],
136
139
  },
140
+ // Dropdown with name
141
+ {
142
+ type: 'dropdown',
143
+ label: 'Tools',
144
+ position: 'left',
145
+ items: [
146
+ {
147
+ type: 'doc',
148
+ docId: 'npm',
149
+ label: 'NPM',
150
+ },
151
+ {
152
+ to: '/yarn',
153
+ label: 'Yarn',
154
+ },
155
+ ],
156
+ },
137
157
  // Doc version dropdown
138
158
  {
139
159
  type: 'docsVersionDropdown',
@@ -141,8 +161,7 @@ describe('themeConfig', () => {
141
161
  dropdownActiveClassDisabled: true,
142
162
  dropdownItemsBefore: [
143
163
  {
144
- href:
145
- 'https://www.npmjs.com/package/docusaurus?activeTab=versions',
164
+ href: 'https://www.npmjs.com/package/docusaurus?activeTab=versions',
146
165
  label: 'Versions on npm',
147
166
  className: 'npm-styled',
148
167
  target: '_self',
@@ -181,6 +200,112 @@ describe('themeConfig', () => {
181
200
  });
182
201
  });
183
202
 
203
+ test('should reject unknown navbar item type', () => {
204
+ const config = {
205
+ navbar: {
206
+ items: [
207
+ {
208
+ type: 'joke',
209
+ position: 'left',
210
+ label: 'haha',
211
+ },
212
+ ],
213
+ },
214
+ };
215
+ expect(() =>
216
+ testValidateThemeConfig(config),
217
+ ).toThrowErrorMatchingInlineSnapshot(`"Bad navbar item type joke"`);
218
+ });
219
+
220
+ test('should reject nested dropdowns', () => {
221
+ const config = {
222
+ navbar: {
223
+ items: [
224
+ {
225
+ position: 'left',
226
+ label: 'Nested',
227
+ items: [
228
+ {
229
+ label: 'Still a dropdown',
230
+ items: [
231
+ {
232
+ label: 'Should reject this',
233
+ to: '/rejected',
234
+ },
235
+ ],
236
+ },
237
+ ],
238
+ },
239
+ ],
240
+ },
241
+ };
242
+ expect(() =>
243
+ testValidateThemeConfig(config),
244
+ ).toThrowErrorMatchingInlineSnapshot(`"Nested dropdowns are not allowed"`);
245
+ });
246
+
247
+ test('should reject nested dropdowns', () => {
248
+ const config = {
249
+ navbar: {
250
+ items: [
251
+ {
252
+ position: 'left',
253
+ label: 'Nested',
254
+ items: [{type: 'docsVersionDropdown'}],
255
+ },
256
+ ],
257
+ },
258
+ };
259
+ expect(() =>
260
+ testValidateThemeConfig(config),
261
+ ).toThrowErrorMatchingInlineSnapshot(`"Nested dropdowns are not allowed"`);
262
+ });
263
+
264
+ test('should reject position attribute within dropdown', () => {
265
+ const config = {
266
+ navbar: {
267
+ items: [
268
+ {
269
+ position: 'left',
270
+ label: 'Dropdown',
271
+ items: [
272
+ {
273
+ label: 'Hi',
274
+ position: 'left',
275
+ to: '/link',
276
+ },
277
+ ],
278
+ },
279
+ ],
280
+ },
281
+ };
282
+ expect(() =>
283
+ testValidateThemeConfig(config),
284
+ ).toThrowErrorMatchingInlineSnapshot(
285
+ `"\\"navbar.items[0].items[0].position\\" is not allowed"`,
286
+ );
287
+ });
288
+
289
+ test('should give friendly error when href and to coexist', () => {
290
+ const config = {
291
+ navbar: {
292
+ items: [
293
+ {
294
+ position: 'left',
295
+ label: 'Nested',
296
+ to: '/link',
297
+ href: 'http://example.com/link',
298
+ },
299
+ ],
300
+ },
301
+ };
302
+ expect(() =>
303
+ testValidateThemeConfig(config),
304
+ ).toThrowErrorMatchingInlineSnapshot(
305
+ `"One and only one between \\"to\\" and \\"href\\" should be provided"`,
306
+ );
307
+ });
308
+
184
309
  test('should allow empty alt tags for the logo image in the header', () => {
185
310
  const altTagConfig = {
186
311
  navbar: {
@@ -220,6 +345,27 @@ describe('themeConfig', () => {
220
345
  });
221
346
  });
222
347
 
348
+ test('should allow width and height specification for logo ', () => {
349
+ const altTagConfig = {
350
+ navbar: {
351
+ logo: {
352
+ alt: '',
353
+ src: '/arbitrary-logo.png',
354
+ srcDark: '/arbitrary-dark-logo.png',
355
+ width: '20px',
356
+ height: '20%',
357
+ },
358
+ },
359
+ };
360
+ expect(testValidateThemeConfig(altTagConfig)).toEqual({
361
+ ...DEFAULT_CONFIG,
362
+ navbar: {
363
+ ...DEFAULT_CONFIG.navbar,
364
+ ...altTagConfig.navbar,
365
+ },
366
+ });
367
+ });
368
+
223
369
  test('should accept valid prism config', () => {
224
370
  const prismConfig = {
225
371
  prism: {
@@ -331,3 +477,131 @@ describe('themeConfig', () => {
331
477
  });
332
478
  });
333
479
  });
480
+
481
+ describe('themeConfig tableOfContents', () => {
482
+ test('toc undefined', () => {
483
+ const tableOfContents = undefined;
484
+ expect(testValidateThemeConfig({tableOfContents})).toEqual({
485
+ ...DEFAULT_CONFIG,
486
+ tableOfContents: {
487
+ minHeadingLevel: DEFAULT_CONFIG.tableOfContents.minHeadingLevel,
488
+ maxHeadingLevel: DEFAULT_CONFIG.tableOfContents.maxHeadingLevel,
489
+ },
490
+ });
491
+ });
492
+
493
+ test('toc empty', () => {
494
+ const tableOfContents = {};
495
+ expect(testValidateThemeConfig({tableOfContents})).toEqual({
496
+ ...DEFAULT_CONFIG,
497
+ tableOfContents: {
498
+ minHeadingLevel: DEFAULT_CONFIG.tableOfContents.minHeadingLevel,
499
+ maxHeadingLevel: DEFAULT_CONFIG.tableOfContents.maxHeadingLevel,
500
+ },
501
+ });
502
+ });
503
+
504
+ test('toc with min', () => {
505
+ const tableOfContents = {
506
+ minHeadingLevel: 3,
507
+ };
508
+ expect(testValidateThemeConfig({tableOfContents})).toEqual({
509
+ ...DEFAULT_CONFIG,
510
+ tableOfContents: {
511
+ minHeadingLevel: 3,
512
+ maxHeadingLevel: DEFAULT_CONFIG.tableOfContents.maxHeadingLevel,
513
+ },
514
+ });
515
+ });
516
+
517
+ test('toc with max', () => {
518
+ const tableOfContents = {
519
+ maxHeadingLevel: 5,
520
+ };
521
+ expect(testValidateThemeConfig({tableOfContents})).toEqual({
522
+ ...DEFAULT_CONFIG,
523
+ tableOfContents: {
524
+ minHeadingLevel: DEFAULT_CONFIG.tableOfContents.minHeadingLevel,
525
+ maxHeadingLevel: 5,
526
+ },
527
+ });
528
+ });
529
+
530
+ test('toc with min 2.5', () => {
531
+ const tableOfContents = {
532
+ minHeadingLevel: 2.5,
533
+ };
534
+ expect(() =>
535
+ testValidateThemeConfig({tableOfContents}),
536
+ ).toThrowErrorMatchingInlineSnapshot(
537
+ `"\\"tableOfContents.minHeadingLevel\\" must be an integer"`,
538
+ );
539
+ });
540
+
541
+ test('toc with max 2.5', () => {
542
+ const tableOfContents = {
543
+ maxHeadingLevel: 2.5,
544
+ };
545
+ expect(() =>
546
+ testValidateThemeConfig({tableOfContents}),
547
+ ).toThrowErrorMatchingInlineSnapshot(
548
+ `"\\"tableOfContents.maxHeadingLevel\\" must be an integer"`,
549
+ );
550
+ });
551
+
552
+ test('toc with min 1', () => {
553
+ const tableOfContents = {
554
+ minHeadingLevel: 1,
555
+ };
556
+ expect(() =>
557
+ testValidateThemeConfig({tableOfContents}),
558
+ ).toThrowErrorMatchingInlineSnapshot(
559
+ `"\\"tableOfContents.minHeadingLevel\\" must be greater than or equal to 2"`,
560
+ );
561
+ });
562
+
563
+ test('toc with min 7', () => {
564
+ const tableOfContents = {
565
+ minHeadingLevel: 7,
566
+ };
567
+ expect(() =>
568
+ testValidateThemeConfig({tableOfContents}),
569
+ ).toThrowErrorMatchingInlineSnapshot(
570
+ `"\\"tableOfContents.minHeadingLevel\\" must be less than or equal to ref:maxHeadingLevel"`,
571
+ );
572
+ });
573
+
574
+ test('toc with max 1', () => {
575
+ const tableOfContents = {
576
+ maxHeadingLevel: 1,
577
+ };
578
+ expect(() =>
579
+ testValidateThemeConfig({tableOfContents}),
580
+ ).toThrowErrorMatchingInlineSnapshot(
581
+ `"\\"tableOfContents.maxHeadingLevel\\" must be greater than or equal to 2"`,
582
+ );
583
+ });
584
+
585
+ test('toc with max 7', () => {
586
+ const tableOfContents = {
587
+ maxHeadingLevel: 7,
588
+ };
589
+ expect(() =>
590
+ testValidateThemeConfig({tableOfContents}),
591
+ ).toThrowErrorMatchingInlineSnapshot(
592
+ `"\\"tableOfContents.maxHeadingLevel\\" must be less than or equal to 6"`,
593
+ );
594
+ });
595
+
596
+ test('toc with bad min 5 + max 3', () => {
597
+ const tableOfContents = {
598
+ minHeadingLevel: 5,
599
+ maxHeadingLevel: 3,
600
+ };
601
+ expect(() =>
602
+ testValidateThemeConfig({tableOfContents}),
603
+ ).toThrowErrorMatchingInlineSnapshot(
604
+ `"\\"tableOfContents.minHeadingLevel\\" must be less than or equal to ref:maxHeadingLevel"`,
605
+ );
606
+ });
607
+ });
@@ -0,0 +1,35 @@
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
+ .admonition h5 {
9
+ margin-top: 0;
10
+ margin-bottom: 8px;
11
+ text-transform: uppercase;
12
+ }
13
+
14
+ .admonition-icon {
15
+ display: inline-block;
16
+ vertical-align: middle;
17
+ margin-right: 0.4em;
18
+ }
19
+
20
+ .admonition-icon svg {
21
+ display: inline-block;
22
+ width: 22px;
23
+ height: 22px;
24
+ stroke-width: 0;
25
+ fill: var(--ifm-alert-foreground-color);
26
+ stroke: var(--ifm-alert-foreground-color);
27
+ }
28
+
29
+ .admonition-content > :last-child {
30
+ margin-bottom: 0;
31
+ }
32
+
33
+ .admonition {
34
+ margin-bottom: 1em;
35
+ }
package/lib/index.js CHANGED
@@ -11,12 +11,13 @@ Object.defineProperty(exports, "validateThemeConfig", {
11
11
  return _validateThemeConfig.validateThemeConfig;
12
12
  }
13
13
  });
14
+ exports.AnnouncementBarDismissStorageKey = void 0;
14
15
 
15
16
  var _translations = require("./translations");
16
17
 
17
18
  var _path = _interopRequireDefault(require("path"));
18
19
 
19
- var _module = _interopRequireDefault(require("module"));
20
+ var _module = require("module");
20
21
 
21
22
  var _rtlcss = _interopRequireDefault(require("rtlcss"));
22
23
 
@@ -32,12 +33,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
32
33
  * This source code is licensed under the MIT license found in the
33
34
  * LICENSE file in the root directory of this source tree.
34
35
  */
35
- const createRequire = _module.default.createRequire || _module.default.createRequireFromPath;
36
- const requireFromDocusaurusCore = createRequire(require.resolve('@docusaurus/core/package.json'));
36
+ const requireFromDocusaurusCore = (0, _module.createRequire)(require.resolve('@docusaurus/core/package.json'));
37
37
  const ContextReplacementPlugin = requireFromDocusaurusCore('webpack/lib/ContextReplacementPlugin'); // Need to be inlined to prevent dark mode FOUC
38
38
  // Make sure that the 'storageKey' is the same as the one in `/theme/hooks/useTheme.js`
39
39
 
40
- const storageKey = 'theme';
40
+ const ThemeStorageKey = 'theme';
41
41
 
42
42
  const noFlashColorMode = ({
43
43
  defaultMode,
@@ -54,7 +54,7 @@ const noFlashColorMode = ({
54
54
  function getStoredTheme() {
55
55
  var theme = null;
56
56
  try {
57
- theme = localStorage.getItem('${storageKey}');
57
+ theme = localStorage.getItem('${ThemeStorageKey}');
58
58
  } catch (err) {}
59
59
  return theme;
60
60
  }
@@ -78,7 +78,26 @@ const noFlashColorMode = ({
78
78
  }
79
79
  }
80
80
  })();`;
81
- };
81
+ }; // Duplicated constant. Unfortunately we can't import it from theme-common, as we need to support older nodejs versions without ESM support
82
+ // TODO: import from theme-common once we only support Node.js with ESM support
83
+ // + move all those announcementBar stuff there too
84
+
85
+
86
+ const AnnouncementBarDismissStorageKey = 'docusaurus.announcement.dismiss';
87
+ exports.AnnouncementBarDismissStorageKey = AnnouncementBarDismissStorageKey;
88
+ const AnnouncementBarDismissDataAttribute = 'data-announcement-bar-initially-dismissed'; // We always render the announcement bar html on the server, to prevent layout shifts on React hydration
89
+ // The theme can use CSS + the data attribute to hide the announcement bar asap (before React hydration)
90
+
91
+ const AnnouncementBarInlineJavaScript = `
92
+ (function() {
93
+ function isDismissed() {
94
+ try {
95
+ return localStorage.getItem('${AnnouncementBarDismissStorageKey}') === 'true';
96
+ } catch (err) {}
97
+ return false;
98
+ }
99
+ document.documentElement.setAttribute('${AnnouncementBarDismissDataAttribute}', isDismissed());
100
+ })();`;
82
101
 
83
102
  function getInfimaCSSFile(direction) {
84
103
  return `infima/dist/css/default/default${direction === 'rtl' ? '-rtl' : ''}.css`;
@@ -97,6 +116,7 @@ options) {
97
116
  } = context;
98
117
  const themeConfig = roughlyTypedThemeConfig || {};
99
118
  const {
119
+ announcementBar,
100
120
  colorMode,
101
121
  prism: {
102
122
  additionalLanguages = []
@@ -140,7 +160,7 @@ options) {
140
160
  },
141
161
 
142
162
  getClientModules() {
143
- const modules = [require.resolve(getInfimaCSSFile(direction)), _path.default.resolve(__dirname, './prism-include-languages')];
163
+ const modules = [require.resolve(getInfimaCSSFile(direction)), _path.default.resolve(__dirname, './prism-include-languages'), _path.default.resolve(__dirname, './admonitions.css')];
144
164
 
145
165
  if (customCss) {
146
166
  if (Array.isArray(customCss)) {
@@ -190,7 +210,10 @@ options) {
190
210
  return {
191
211
  preBodyTags: [{
192
212
  tagName: 'script',
193
- innerHTML: noFlashColorMode(colorMode)
213
+ innerHTML: `
214
+ ${noFlashColorMode(colorMode)}
215
+ ${announcementBar ? AnnouncementBarInlineJavaScript : ''}
216
+ `
194
217
  }]
195
218
  };
196
219
  }
@@ -1,11 +1,15 @@
1
+ "use strict";
2
+
3
+ var _prism = _interopRequireDefault(require("prism-react-renderer/prism"));
4
+
5
+ var _prismIncludeLanguages = _interopRequireDefault(require("@theme/prism-include-languages"));
6
+
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+
1
9
  /**
2
10
  * Copyright (c) Facebook, Inc. and its affiliates.
3
11
  *
4
12
  * This source code is licensed under the MIT license found in the
5
13
  * LICENSE file in the root directory of this source tree.
6
14
  */
7
-
8
- import Prism from 'prism-react-renderer/prism';
9
- import prismIncludeLanguages from '@theme/prism-include-languages';
10
-
11
- prismIncludeLanguages(Prism);
15
+ (0, _prismIncludeLanguages.default)(_prism.default);
@@ -11,10 +11,10 @@ var _clsx = _interopRequireDefault(require("clsx"));
11
11
 
12
12
  var _themeCommon = require("@docusaurus/theme-common");
13
13
 
14
- var _useUserPreferencesContext = _interopRequireDefault(require("@theme/hooks/useUserPreferencesContext"));
15
-
16
14
  var _Translate = require("@docusaurus/Translate");
17
15
 
16
+ var _IconClose = _interopRequireDefault(require("@theme/IconClose"));
17
+
18
18
  var _stylesModule = _interopRequireDefault(require("./styles.module.css"));
19
19
 
20
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -27,14 +27,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
27
27
  */
28
28
  function AnnouncementBar() {
29
29
  const {
30
- isAnnouncementBarClosed,
31
- closeAnnouncementBar
32
- } = (0, _useUserPreferencesContext.default)();
30
+ isActive,
31
+ close
32
+ } = (0, _themeCommon.useAnnouncementBar)();
33
33
  const {
34
34
  announcementBar
35
35
  } = (0, _themeCommon.useThemeConfig)();
36
36
 
37
- if (!announcementBar) {
37
+ if (!isActive) {
38
38
  return null;
39
39
  }
40
40
 
@@ -44,28 +44,22 @@ function AnnouncementBar() {
44
44
  textColor,
45
45
  isCloseable
46
46
  } = announcementBar;
47
-
48
- if (!content || isCloseable && isAnnouncementBarClosed) {
49
- return null;
50
- }
51
-
52
47
  return <div className={_stylesModule.default.announcementBar} style={{
53
48
  backgroundColor,
54
49
  color: textColor
55
50
  }} role="banner">
56
- <div className={(0, _clsx.default)(_stylesModule.default.announcementBarContent, {
57
- [_stylesModule.default.announcementBarCloseable]: isCloseable
58
- })} // Developer provided the HTML, so assume it's safe.
51
+ {isCloseable && <div className={_stylesModule.default.announcementBarPlaceholder} />}
52
+ <div className={_stylesModule.default.announcementBarContent} // Developer provided the HTML, so assume it's safe.
59
53
  // eslint-disable-next-line react/no-danger
60
54
  dangerouslySetInnerHTML={{
61
55
  __html: content
62
56
  }} />
63
- {isCloseable ? <button type="button" className={(0, _clsx.default)(_stylesModule.default.announcementBarClose, 'clean-btn')} onClick={closeAnnouncementBar} aria-label={(0, _Translate.translate)({
57
+ {isCloseable ? <button type="button" className={(0, _clsx.default)('clean-btn close', _stylesModule.default.announcementBarClose)} onClick={close} aria-label={(0, _Translate.translate)({
64
58
  id: 'theme.AnnouncementBar.closeButtonAriaLabel',
65
59
  message: 'Close',
66
60
  description: 'The ARIA label for close button of announcement bar'
67
61
  })}>
68
- <span aria-hidden="true">×</span>
62
+ <_IconClose.default width={14} height={14} strokeWidth={3.1} />
69
63
  </button> : null}
70
64
  </div>;
71
65
  }
@@ -10,55 +10,39 @@
10
10
  }
11
11
 
12
12
  .announcementBar {
13
- position: relative;
14
- width: 100%;
13
+ display: flex;
14
+ align-items: center;
15
15
  height: var(--docusaurus-announcement-bar-height);
16
16
  background-color: var(--ifm-color-white);
17
17
  color: var(--ifm-color-black);
18
18
  border-bottom: 1px solid var(--ifm-color-emphasis-100);
19
19
  }
20
20
 
21
- @media print {
22
- .announcementBar {
23
- display: none;
24
- }
21
+ html[data-announcement-bar-initially-dismissed='true'] .announcementBar {
22
+ display: none;
25
23
  }
26
24
 
27
- @media screen and (min-width: 1024px) {
28
- :root {
29
- --docusaurus-announcement-bar-height: 30px;
30
- }
25
+ .announcementBarPlaceholder {
26
+ flex: 0 0 10px;
31
27
  }
32
28
 
33
29
  .announcementBarClose {
34
- position: absolute;
35
- right: 0;
36
- top: 0;
37
- width: 55px;
38
- font-size: 1.25rem;
39
- height: 100%;
30
+ flex: 0 0 30px;
31
+ align-self: stretch;
32
+ padding: 0;
33
+ line-height: 0;
40
34
  }
41
35
 
42
36
  .announcementBarContent {
37
+ flex: 1 1 auto;
43
38
  font-size: 85%;
44
- width: 100%;
45
39
  text-align: center;
46
40
  padding: 5px 0;
47
41
  }
48
42
 
49
- .announcementBarCloseable {
50
- margin-right: 55px;
51
- }
52
-
53
- @media screen and (max-width: 576px) {
54
- .announcementBarClose {
55
- width: 35px;
56
- }
57
- .announcementBarContent {
58
- width: auto;
59
- }
60
- .announcementBarCloseable {
61
- margin-right: 35px;
43
+ @media print {
44
+ .announcementBar {
45
+ display: none;
62
46
  }
63
47
  }
64
48
 
@@ -66,3 +50,14 @@
66
50
  color: inherit;
67
51
  text-decoration: underline;
68
52
  }
53
+
54
+ @media (min-width: 997px) {
55
+ :root {
56
+ --docusaurus-announcement-bar-height: 30px;
57
+ }
58
+
59
+ .announcementBarPlaceholder,
60
+ .announcementBarClose {
61
+ flex-basis: 50px;
62
+ }
63
+ }