@docusaurus/theme-classic 2.0.0-beta.8e9b829d9 → 2.0.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/README.md +1 -1
  2. package/codeTranslations/ar.json +12 -6
  3. package/codeTranslations/base.json +12 -0
  4. package/codeTranslations/bn.json +6 -0
  5. package/codeTranslations/cs.json +62 -0
  6. package/codeTranslations/da.json +6 -0
  7. package/codeTranslations/de.json +8 -2
  8. package/codeTranslations/es.json +10 -4
  9. package/codeTranslations/fa.json +9 -3
  10. package/codeTranslations/fil.json +6 -0
  11. package/codeTranslations/fr.json +6 -0
  12. package/codeTranslations/he.json +6 -0
  13. package/codeTranslations/hi.json +6 -0
  14. package/codeTranslations/ja.json +6 -0
  15. package/codeTranslations/ko.json +6 -0
  16. package/codeTranslations/pl.json +6 -0
  17. package/codeTranslations/pt-BR.json +8 -2
  18. package/codeTranslations/pt-PT.json +6 -0
  19. package/codeTranslations/ru.json +6 -0
  20. package/codeTranslations/sr.json +62 -0
  21. package/codeTranslations/tr.json +9 -3
  22. package/codeTranslations/vi.json +10 -4
  23. package/codeTranslations/zh-Hans.json +6 -0
  24. package/codeTranslations/zh-Hant.json +6 -0
  25. package/lib/__tests__/validateThemeConfig.test.js +154 -4
  26. package/lib/index.js +2 -3
  27. package/lib/prism-include-languages.js +9 -5
  28. package/lib/theme/AnnouncementBar/index.js +8 -12
  29. package/lib/theme/AnnouncementBar/styles.module.css +23 -32
  30. package/lib/theme/BackToTopButton/index.js +27 -13
  31. package/lib/theme/BackToTopButton/styles.module.css +17 -14
  32. package/lib/theme/BlogArchivePage/index.js +89 -0
  33. package/lib/theme/BlogLayout/index.js +2 -6
  34. package/lib/theme/BlogListPage/index.js +1 -1
  35. package/lib/theme/BlogPostAuthor/index.js +51 -0
  36. package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
  37. package/lib/theme/BlogPostAuthors/index.js +47 -0
  38. package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
  39. package/lib/theme/BlogPostItem/index.js +58 -67
  40. package/lib/theme/BlogPostPage/index.js +33 -4
  41. package/lib/theme/BlogSidebar/styles.module.css +2 -2
  42. package/lib/theme/BlogTagsListPage/index.js +3 -28
  43. package/lib/theme/BlogTagsPostsPage/index.js +5 -8
  44. package/lib/theme/CodeBlock/index.js +44 -37
  45. package/lib/theme/CodeBlock/styles.module.css +1 -2
  46. package/lib/theme/DocItem/index.js +15 -40
  47. package/lib/theme/DocItem/styles.module.css +2 -12
  48. package/lib/theme/DocItemFooter/index.js +79 -0
  49. package/lib/theme/DocItemFooter/styles.module.css +18 -0
  50. package/lib/theme/DocPage/index.js +18 -13
  51. package/lib/theme/DocSidebar/index.js +11 -16
  52. package/lib/theme/DocSidebarItem/index.js +12 -10
  53. package/lib/theme/DocTagDocListPage/index.js +89 -0
  54. package/lib/theme/DocTagsListPage/index.js +44 -0
  55. package/lib/theme/DocVersionBanner/index.js +6 -4
  56. package/lib/theme/EditThisPage/index.js +3 -1
  57. package/lib/theme/Footer/index.js +5 -3
  58. package/lib/theme/Heading/index.js +7 -9
  59. package/lib/theme/Heading/styles.css +4 -6
  60. package/lib/theme/Heading/styles.module.css +9 -5
  61. package/lib/theme/IconClose/index.js +31 -0
  62. package/lib/theme/LastUpdated/index.js +4 -2
  63. package/lib/theme/LayoutHead/index.js +13 -11
  64. package/lib/theme/LayoutProviders/index.js +7 -5
  65. package/lib/theme/Logo/index.js +14 -12
  66. package/lib/theme/MDXComponents/index.js +27 -1
  67. package/lib/theme/MDXComponents/styles.css +11 -0
  68. package/lib/theme/MDXPage/index.js +2 -1
  69. package/lib/theme/Navbar/index.js +20 -3
  70. package/lib/theme/Navbar/styles.module.css +5 -1
  71. package/lib/theme/NavbarItem/DefaultNavbarItem.js +12 -4
  72. package/lib/theme/NavbarItem/DocNavbarItem.js +5 -3
  73. package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +7 -1
  74. package/lib/theme/NavbarItem/DropdownNavbarItem.js +3 -3
  75. package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +3 -4
  76. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  77. package/lib/theme/NavbarItem/index.js +5 -0
  78. package/lib/theme/Seo/index.js +10 -7
  79. package/lib/theme/TOC/index.js +9 -30
  80. package/lib/theme/TOC/styles.module.css +1 -1
  81. package/lib/theme/TOCCollapsible/index.js +5 -3
  82. package/lib/theme/TOCInline/index.js +7 -27
  83. package/lib/theme/TOCItems/index.js +78 -0
  84. package/lib/theme/Tabs/__tests__/index.test.js +123 -0
  85. package/lib/theme/Tabs/index.js +73 -50
  86. package/lib/theme/Tabs/styles.module.css +0 -13
  87. package/lib/theme/Tag/index.js +40 -0
  88. package/lib/theme/Tag/styles.module.css +70 -0
  89. package/lib/theme/TagsListByLetter/index.js +48 -0
  90. package/lib/theme/TagsListByLetter/styles.module.css +11 -0
  91. package/lib/theme/TagsListInline/index.js +44 -0
  92. package/lib/theme/TagsListInline/styles.module.css +15 -0
  93. package/lib/theme/ThemedImage/index.js +3 -5
  94. package/lib/theme/Toggle/index.js +23 -18
  95. package/lib/theme/Toggle/styles.module.css +91 -0
  96. package/lib/theme/hooks/useHideableNavbar.js +14 -31
  97. package/lib/theme/hooks/useTheme.js +2 -2
  98. package/lib/theme/hooks/useWindowSize.js +2 -7
  99. package/lib/theme/prism-include-languages.js +4 -3
  100. package/lib/translations.js +4 -4
  101. package/lib/types.d.ts +216 -105
  102. package/lib/validateThemeConfig.js +215 -254
  103. package/lib-next/__tests__/validateThemeConfig.test.js +154 -4
  104. package/lib-next/index.js +1 -2
  105. package/lib-next/prism-include-languages.js +0 -2
  106. package/lib-next/theme/AnnouncementBar/index.js +7 -12
  107. package/lib-next/theme/AnnouncementBar/styles.module.css +23 -32
  108. package/lib-next/theme/BackToTopButton/index.js +37 -17
  109. package/lib-next/theme/BackToTopButton/styles.module.css +17 -14
  110. package/lib-next/theme/BlogArchivePage/index.js +80 -0
  111. package/lib-next/theme/BlogLayout/index.js +4 -7
  112. package/lib-next/theme/BlogListPage/index.js +1 -0
  113. package/lib-next/theme/BlogPostAuthor/index.js +46 -0
  114. package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
  115. package/lib-next/theme/BlogPostAuthors/index.js +34 -0
  116. package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
  117. package/lib-next/theme/BlogPostItem/index.js +79 -86
  118. package/lib-next/theme/BlogPostPage/index.js +55 -8
  119. package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
  120. package/lib-next/theme/BlogTagsListPage/index.js +7 -39
  121. package/lib-next/theme/BlogTagsPostsPage/index.js +3 -4
  122. package/lib-next/theme/CodeBlock/index.js +53 -49
  123. package/lib-next/theme/CodeBlock/styles.module.css +1 -2
  124. package/lib-next/theme/DocItem/index.js +27 -45
  125. package/lib-next/theme/DocItem/styles.module.css +2 -12
  126. package/lib-next/theme/DocItemFooter/index.js +79 -0
  127. package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
  128. package/lib-next/theme/DocPage/index.js +18 -14
  129. package/lib-next/theme/DocSidebar/index.js +18 -15
  130. package/lib-next/theme/DocSidebarItem/index.js +31 -11
  131. package/lib-next/theme/DocTagDocListPage/index.js +89 -0
  132. package/lib-next/theme/DocTagsListPage/index.js +38 -0
  133. package/lib-next/theme/DocVersionBanner/index.js +16 -9
  134. package/lib-next/theme/EditThisPage/index.js +6 -1
  135. package/lib-next/theme/Footer/index.js +14 -3
  136. package/lib-next/theme/Heading/index.js +10 -13
  137. package/lib-next/theme/Heading/styles.css +4 -6
  138. package/lib-next/theme/Heading/styles.module.css +9 -5
  139. package/lib-next/theme/IconClose/index.js +23 -0
  140. package/lib-next/theme/LastUpdated/index.js +3 -2
  141. package/lib-next/theme/LayoutHead/index.js +9 -15
  142. package/lib-next/theme/LayoutProviders/index.js +8 -5
  143. package/lib-next/theme/Logo/index.js +23 -19
  144. package/lib-next/theme/MDXComponents/index.js +20 -1
  145. package/lib-next/theme/MDXComponents/styles.css +11 -0
  146. package/lib-next/theme/MDXPage/index.js +10 -2
  147. package/lib-next/theme/Navbar/index.js +27 -3
  148. package/lib-next/theme/Navbar/styles.module.css +5 -1
  149. package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +15 -4
  150. package/lib-next/theme/NavbarItem/DocNavbarItem.js +5 -3
  151. package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +12 -4
  152. package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +4 -6
  153. package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +2 -6
  154. package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  155. package/lib-next/theme/NavbarItem/index.js +2 -0
  156. package/lib-next/theme/Seo/index.js +11 -7
  157. package/lib-next/theme/TOC/index.js +12 -36
  158. package/lib-next/theme/TOC/styles.module.css +1 -1
  159. package/lib-next/theme/TOCCollapsible/index.js +12 -3
  160. package/lib-next/theme/TOCInline/index.js +10 -28
  161. package/lib-next/theme/TOCItems/index.js +85 -0
  162. package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
  163. package/lib-next/theme/Tabs/index.js +91 -43
  164. package/lib-next/theme/Tabs/styles.module.css +0 -13
  165. package/lib-next/theme/Tag/index.js +27 -0
  166. package/lib-next/theme/Tag/styles.module.css +70 -0
  167. package/lib-next/theme/TagsListByLetter/index.js +42 -0
  168. package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
  169. package/lib-next/theme/TagsListInline/index.js +31 -0
  170. package/lib-next/theme/TagsListInline/styles.module.css +15 -0
  171. package/lib-next/theme/ThemedImage/index.js +3 -3
  172. package/lib-next/theme/Toggle/index.js +20 -15
  173. package/lib-next/theme/Toggle/styles.module.css +91 -0
  174. package/lib-next/theme/hooks/useHideableNavbar.js +31 -47
  175. package/lib-next/theme/hooks/useTheme.js +2 -2
  176. package/lib-next/theme/hooks/useWindowSize.js +2 -6
  177. package/lib-next/theme/prism-include-languages.js +2 -1
  178. package/lib-next/translations.js +6 -10
  179. package/lib-next/types.d.ts +216 -105
  180. package/lib-next/validateThemeConfig.js +40 -36
  181. package/package.json +23 -19
  182. package/src/__tests__/validateThemeConfig.test.js +154 -4
  183. package/src/index.ts +11 -9
  184. package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
  185. package/src/theme/AnnouncementBar/index.tsx +8 -12
  186. package/src/theme/AnnouncementBar/styles.module.css +23 -32
  187. package/src/theme/BackToTopButton/index.tsx +39 -17
  188. package/src/theme/BackToTopButton/styles.module.css +17 -14
  189. package/src/theme/BlogArchivePage/index.tsx +91 -0
  190. package/src/theme/BlogLayout/index.tsx +4 -8
  191. package/src/theme/BlogListPage/index.tsx +1 -0
  192. package/src/theme/BlogPostAuthor/index.tsx +49 -0
  193. package/src/theme/BlogPostAuthor/styles.module.css +12 -0
  194. package/src/theme/BlogPostAuthors/index.tsx +36 -0
  195. package/src/theme/BlogPostAuthors/styles.module.css +11 -0
  196. package/src/theme/BlogPostItem/index.tsx +70 -80
  197. package/src/theme/BlogPostPage/index.tsx +57 -8
  198. package/src/theme/BlogSidebar/styles.module.css +2 -2
  199. package/src/theme/BlogTagsListPage/index.tsx +7 -41
  200. package/src/theme/BlogTagsPostsPage/index.tsx +3 -4
  201. package/src/theme/CodeBlock/index.tsx +63 -47
  202. package/src/theme/CodeBlock/styles.module.css +1 -2
  203. package/src/theme/DocItem/index.tsx +27 -46
  204. package/src/theme/DocItem/styles.module.css +2 -12
  205. package/src/theme/DocItemFooter/index.tsx +91 -0
  206. package/src/theme/DocItemFooter/styles.module.css +18 -0
  207. package/src/theme/DocPage/index.tsx +16 -12
  208. package/src/theme/DocSidebar/index.tsx +20 -16
  209. package/src/theme/DocSidebarItem/index.tsx +29 -10
  210. package/src/theme/DocTagDocListPage/index.tsx +89 -0
  211. package/src/theme/DocTagsListPage/index.tsx +41 -0
  212. package/src/theme/DocVersionBanner/index.tsx +26 -15
  213. package/src/theme/EditThisPage/index.tsx +6 -1
  214. package/src/theme/Footer/index.tsx +16 -3
  215. package/src/theme/Heading/index.tsx +10 -13
  216. package/src/theme/Heading/styles.css +4 -6
  217. package/src/theme/Heading/styles.module.css +9 -5
  218. package/src/theme/IconClose/index.tsx +26 -0
  219. package/src/theme/LastUpdated/index.tsx +3 -2
  220. package/src/theme/LayoutHead/index.tsx +9 -9
  221. package/src/theme/LayoutProviders/index.tsx +8 -5
  222. package/src/theme/Logo/index.tsx +19 -15
  223. package/src/theme/MDXComponents/index.tsx +20 -1
  224. package/src/theme/MDXComponents/styles.css +11 -0
  225. package/src/theme/MDXPage/index.tsx +10 -2
  226. package/src/theme/Navbar/index.tsx +26 -2
  227. package/src/theme/Navbar/styles.module.css +5 -1
  228. package/src/theme/NavbarItem/DefaultNavbarItem.tsx +15 -4
  229. package/src/theme/NavbarItem/DocNavbarItem.tsx +9 -5
  230. package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +15 -6
  231. package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
  232. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +4 -6
  233. package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +6 -5
  234. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
  235. package/src/theme/NavbarItem/index.tsx +6 -1
  236. package/src/theme/Seo/index.tsx +7 -4
  237. package/src/theme/TOC/index.tsx +13 -38
  238. package/src/theme/TOC/styles.module.css +1 -1
  239. package/src/theme/TOCCollapsible/index.tsx +8 -2
  240. package/src/theme/TOCInline/index.tsx +13 -32
  241. package/src/theme/TOCItems/index.tsx +96 -0
  242. package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
  243. package/src/theme/Tabs/index.tsx +93 -49
  244. package/src/theme/Tabs/styles.module.css +0 -13
  245. package/src/theme/Tag/index.tsx +31 -0
  246. package/src/theme/Tag/styles.module.css +70 -0
  247. package/src/theme/TagsListByLetter/index.tsx +45 -0
  248. package/src/theme/TagsListByLetter/styles.module.css +11 -0
  249. package/src/theme/TagsListInline/index.tsx +35 -0
  250. package/src/theme/TagsListInline/styles.module.css +15 -0
  251. package/src/theme/ThemedImage/index.tsx +3 -3
  252. package/src/theme/Toggle/index.tsx +20 -15
  253. package/src/theme/Toggle/styles.module.css +91 -0
  254. package/src/theme/hooks/useContextualSearchFilters.ts +1 -1
  255. package/src/theme/hooks/useHideableNavbar.ts +32 -47
  256. package/src/theme/hooks/useTabGroupChoice.ts +2 -2
  257. package/src/theme/hooks/useTheme.ts +2 -2
  258. package/src/theme/hooks/useWindowSize.ts +2 -7
  259. package/src/theme/prism-include-languages.ts +3 -2
  260. package/src/translations.ts +6 -10
  261. package/src/types.d.ts +216 -105
  262. package/src/{validateThemeConfig.js → validateThemeConfig.ts} +46 -12
  263. package/tsconfig.json +0 -1
  264. package/update-code-translations.js +5 -4
  265. package/update-code-translations.test.js +1 -1
  266. package/update.js +151 -0
  267. package/lib/theme/Toggle/styles.css +0 -103
  268. package/lib/theme/hooks/useScrollPosition.js +0 -51
  269. package/lib/theme/hooks/useTOCHighlight.js +0 -87
  270. package/lib-next/theme/Toggle/styles.css +0 -103
  271. package/lib-next/theme/hooks/useScrollPosition.js +0 -42
  272. package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
  273. package/src/theme/Toggle/styles.css +0 -103
  274. package/src/theme/hooks/useScrollPosition.ts +0 -52
  275. package/src/theme/hooks/useTOCHighlight.ts +0 -98
@@ -5,7 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- const {Joi, URISchema} = require('@docusaurus/utils-validation');
8
+ import {Joi, URISchema} from '@docusaurus/utils-validation';
9
+ import type {ThemeConfig, Validate, ValidationResult} from '@docusaurus/types';
9
10
 
10
11
  const DEFAULT_DOCS_CONFIG = {
11
12
  versionPersistence: 'localStorage',
@@ -40,6 +41,10 @@ const DEFAULT_CONFIG = {
40
41
  items: [],
41
42
  },
42
43
  hideableSidebar: false,
44
+ tableOfContents: {
45
+ minHeadingLevel: 2,
46
+ maxHeadingLevel: 3,
47
+ },
43
48
  };
44
49
  exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
45
50
 
@@ -79,10 +84,9 @@ const DocItemSchema = NavbarItemBaseSchema.append({
79
84
  type: Joi.string().equal('doc').required(),
80
85
  docId: Joi.string().required(),
81
86
  docsPluginId: Joi.string(),
82
- activeSidebarClassName: Joi.string().default('navbar__link--active'),
83
87
  });
84
88
 
85
- const itemWithType = (type) => {
89
+ const itemWithType = (type: string | undefined) => {
86
90
  // because equal(undefined) is not supported :/
87
91
  const typeSchema = type
88
92
  ? Joi.string().required().equal(type)
@@ -96,7 +100,7 @@ const itemWithType = (type) => {
96
100
 
97
101
  const DropdownSubitemSchema = Joi.object({
98
102
  position: Joi.forbidden(),
99
- }).when({
103
+ }).when('.', {
100
104
  switch: [
101
105
  {
102
106
  is: itemWithType('docsVersion'),
@@ -151,7 +155,7 @@ const SearchItemSchema = Joi.object({
151
155
 
152
156
  const NavbarItemSchema = Joi.object({
153
157
  position: NavbarItemPosition,
154
- }).when({
158
+ }).when('.', {
155
159
  switch: [
156
160
  {
157
161
  is: itemWithType('docsVersion'),
@@ -179,7 +183,7 @@ const NavbarItemSchema = Joi.object({
179
183
  },
180
184
  {
181
185
  is: itemWithType(undefined),
182
- then: Joi.object().when({
186
+ then: Joi.object().when('.', {
183
187
  // Dropdown item can be specified without type field
184
188
  is: Joi.object({
185
189
  items: Joi.array().required(),
@@ -247,12 +251,12 @@ const CustomCssSchema = Joi.alternatives()
247
251
 
248
252
  const ThemeConfigSchema = Joi.object({
249
253
  // TODO temporary (@alpha-58)
250
- disableDarkMode: Joi.any().forbidden(false).messages({
254
+ disableDarkMode: Joi.any().forbidden().messages({
251
255
  'any.unknown':
252
256
  'disableDarkMode theme config is deprecated. Please use the new colorMode attribute. You likely want: config.themeConfig.colorMode.disableSwitch = true',
253
257
  }),
254
258
  // TODO temporary (@alpha-58)
255
- defaultDarkMode: Joi.any().forbidden(false).messages({
259
+ defaultDarkMode: Joi.any().forbidden().messages({
256
260
  'any.unknown':
257
261
  'defaultDarkMode theme config is deprecated. Please use the new colorMode attribute. You likely want: config.themeConfig.colorMode.defaultMode = "dark"',
258
262
  }),
@@ -265,7 +269,7 @@ const ThemeConfigSchema = Joi.object({
265
269
  .default(DEFAULT_CONFIG.metadatas),
266
270
  announcementBar: Joi.object({
267
271
  id: Joi.string().default('announcement-bar'),
268
- content: Joi.string(),
272
+ content: Joi.string().required(),
269
273
  backgroundColor: Joi.string(),
270
274
  textColor: Joi.string(),
271
275
  isCloseable: Joi.bool().default(true),
@@ -286,6 +290,8 @@ const ThemeConfigSchema = Joi.object({
286
290
  alt: Joi.string().allow(''),
287
291
  src: Joi.string().required(),
288
292
  srcDark: Joi.string(),
293
+ width: Joi.alternatives().try(Joi.string(), Joi.number()),
294
+ height: Joi.alternatives().try(Joi.string(), Joi.number()),
289
295
  href: Joi.string(),
290
296
  target: Joi.string(),
291
297
  }),
@@ -296,6 +302,9 @@ const ThemeConfigSchema = Joi.object({
296
302
  alt: Joi.string().allow(''),
297
303
  src: Joi.string(),
298
304
  srcDark: Joi.string(),
305
+ // TODO infer this from reading the image
306
+ width: Joi.alternatives().try(Joi.string(), Joi.number()),
307
+ height: Joi.alternatives().try(Joi.string(), Joi.number()),
299
308
  href: Joi.string(),
300
309
  }),
301
310
  copyright: Joi.string(),
@@ -329,9 +338,34 @@ const ThemeConfigSchema = Joi.object({
329
338
  'any.unknown':
330
339
  'The themeConfig.sidebarCollapsible has been moved to docs plugin options. See: https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-docs',
331
340
  }),
341
+ tableOfContents: Joi.object({
342
+ minHeadingLevel: Joi.number()
343
+ .default(DEFAULT_CONFIG.tableOfContents.minHeadingLevel)
344
+ .when('maxHeadingLevel', {
345
+ is: Joi.exist(),
346
+ then: Joi.number()
347
+ .integer()
348
+ .min(2)
349
+ .max(6)
350
+ .max(Joi.ref('maxHeadingLevel')),
351
+ otherwise: Joi.number().integer().min(2).max(6),
352
+ }),
353
+ maxHeadingLevel: Joi.number()
354
+ .integer()
355
+ .min(2)
356
+ .max(6)
357
+ .default(DEFAULT_CONFIG.tableOfContents.maxHeadingLevel),
358
+ }).default(DEFAULT_CONFIG.tableOfContents),
332
359
  });
333
- exports.ThemeConfigSchema = ThemeConfigSchema;
334
360
 
335
- exports.validateThemeConfig = ({validate, themeConfig}) => {
361
+ export {ThemeConfigSchema};
362
+
363
+ export function validateThemeConfig({
364
+ validate,
365
+ themeConfig,
366
+ }: {
367
+ validate: Validate<ThemeConfig>;
368
+ themeConfig: ThemeConfig;
369
+ }): ValidationResult<ThemeConfig> {
336
370
  return validate(ThemeConfigSchema, themeConfig);
337
- };
371
+ }
package/tsconfig.json CHANGED
@@ -4,7 +4,6 @@
4
4
  "lib": ["DOM", "ES2019"],
5
5
  "module": "esnext",
6
6
  "noEmit": true,
7
- "noImplicitAny": false,
8
7
  "jsx": "react",
9
8
  "baseUrl": "src"
10
9
  },
@@ -14,6 +14,7 @@ const {mapValues, pickBy, difference, orderBy} = require('lodash');
14
14
  const CodeDirPaths = [
15
15
  path.join(__dirname, 'lib-next'),
16
16
  // TODO other themes should rather define their own translations in the future?
17
+ path.join(__dirname, '..', 'docusaurus-theme-common', 'lib'),
17
18
  path.join(__dirname, '..', 'docusaurus-theme-search-algolia', 'src', 'theme'),
18
19
  path.join(__dirname, '..', 'docusaurus-theme-live-codeblock', 'src', 'theme'),
19
20
  path.join(__dirname, '..', 'docusaurus-plugin-pwa', 'src', 'theme'),
@@ -45,7 +46,7 @@ function logSection(title) {
45
46
  }
46
47
 
47
48
  function logKeys(keys) {
48
- return `Keys:\n- ${keys.join('\n- ')}\``;
49
+ return `Keys:\n- ${keys.join('\n- ')}`;
49
50
  }
50
51
 
51
52
  async function extractThemeCodeMessages() {
@@ -56,9 +57,9 @@ async function extractThemeCodeMessages() {
56
57
  // eslint-disable-next-line global-require
57
58
  } = require('@docusaurus/core/lib/server/translations/translationsExtractor');
58
59
 
59
- const filePaths = (
60
- await globSourceCodeFilePaths(CodeDirPaths)
61
- ).filter((filePath) => ['.js', '.jsx'].includes(path.extname(filePath)));
60
+ const filePaths = (await globSourceCodeFilePaths(CodeDirPaths)).filter(
61
+ (filePath) => ['.js', '.jsx'].includes(path.extname(filePath)),
62
+ );
62
63
 
63
64
  const filesExtractedTranslations = await extractAllSourceCodeFileTranslations(
64
65
  filePaths,
@@ -14,7 +14,7 @@ const {mapValues, pickBy} = require('lodash');
14
14
  jest.setTimeout(15000);
15
15
 
16
16
  describe('update-code-translations', () => {
17
- test(`to have base.json contain all the translations extracted from the theme. Please run "yarn workspace @docusaurus/theme-classic update-code-translations" to keep base.json up-to-date.`, async () => {
17
+ test(`to have base.json contain EXACTLY all the translations extracted from the theme. Please run "yarn workspace @docusaurus/theme-classic update-code-translations" to keep base.json up-to-date.`, async () => {
18
18
  const baseMessages = pickBy(
19
19
  JSON.parse(
20
20
  await fs.readFile(
package/update.js ADDED
@@ -0,0 +1,151 @@
1
+ const chalk = require('chalk');
2
+ const path = require('path');
3
+ const fs = require('fs-extra');
4
+ const globby = require('globby');
5
+ const {mapValues, pickBy, difference, orderBy} = require('lodash');
6
+
7
+ async function extractThemeCodeMessages(dirPath) {
8
+ // Unsafe import, should we create a package for the translationsExtractor ?
9
+ const {
10
+ globSourceCodeFilePaths,
11
+ extractAllSourceCodeFileTranslations,
12
+ // eslint-disable-next-line global-require
13
+ } = require('@docusaurus/core/lib/server/translations/translationsExtractor');
14
+
15
+ const filePaths = (await globSourceCodeFilePaths([dirPath])).filter(
16
+ (filePath) => ['.js', '.jsx'].includes(path.extname(filePath)),
17
+ );
18
+
19
+ const filesExtractedTranslations = await extractAllSourceCodeFileTranslations(
20
+ filePaths,
21
+ {
22
+ presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
23
+ },
24
+ );
25
+
26
+ filesExtractedTranslations.forEach((fileExtractedTranslations) => {
27
+ fileExtractedTranslations.warnings.forEach((warning) => {
28
+ throw new Error(`
29
+ Please make sure all theme translations are static!
30
+ Some warnings were found!
31
+
32
+ ${warning}
33
+ `);
34
+ });
35
+ });
36
+
37
+ const translations = filesExtractedTranslations.reduce(
38
+ (acc, extractedTranslations) => {
39
+ return {...acc, ...extractedTranslations.translations};
40
+ },
41
+ {},
42
+ );
43
+
44
+ return translations;
45
+ }
46
+
47
+ function sortObjectKeys(obj) {
48
+ let keys = Object.keys(obj);
49
+ // keys = orderBy(keys, [(k) => removeDescriptionSuffix(k)]);
50
+ return keys.reduce((acc, key) => {
51
+ acc[key] = obj[key];
52
+ return acc;
53
+ }, {});
54
+ }
55
+
56
+ async function writeMessagesFile(filePath, messages) {
57
+ const sortedMessages = sortObjectKeys(messages);
58
+ const content = `${JSON.stringify(sortedMessages, null, 2)}\n`; // \n makes prettier happy
59
+ await fs.outputFile(filePath, content);
60
+ }
61
+
62
+ async function main() {
63
+ const codeTranslationsDir = path.join(__dirname, 'src', 'codeTranslations');
64
+ const baseFile = path.join(codeTranslationsDir, 'base.json');
65
+ const localesFiles = (await globby(codeTranslationsDir)).filter(
66
+ (filepath) => path.extname(filepath) === '.json',
67
+ // (filepath) => filepath.endsWith('base.json'),
68
+ );
69
+ let baseMessages = JSON.parse(await fs.readFile(baseFile));
70
+
71
+ const targetDirs = [
72
+ path.join(
73
+ __dirname,
74
+ '..',
75
+ 'docusaurus-theme-search-algolia',
76
+ 'src',
77
+ // 'theme',
78
+ ),
79
+ path.join(
80
+ __dirname,
81
+ '..',
82
+ 'docusaurus-theme-live-codeblock',
83
+ 'src',
84
+ // 'theme',
85
+ ),
86
+ path.join(__dirname, '..', 'docusaurus-plugin-pwa', 'src'),
87
+ ];
88
+
89
+ const convertToObject = (array) =>
90
+ array.reduce((acc, [key, value]) => {
91
+ return {...acc, ...{[key]: value}};
92
+ }, {});
93
+
94
+ const removePluginMessages = (content, keys) =>
95
+ Object.entries(content).filter(([key]) => !keys.includes(key));
96
+
97
+ for (const targetDir of targetDirs) {
98
+ console.log(targetDir);
99
+
100
+ const pluginExtractedTranslations = await extractThemeCodeMessages(
101
+ targetDir,
102
+ );
103
+
104
+ for (const localeFile of localesFiles) {
105
+ console.log(localeFile);
106
+
107
+ const targetFile = JSON.parse(await fs.readFile(localeFile));
108
+ const destFile = path.join(
109
+ targetDir,
110
+ 'codeTranslations',
111
+ path.basename(localeFile),
112
+ );
113
+
114
+ const pluginMessages = Object.entries(targetFile).filter(
115
+ ([key, value]) => {
116
+ return Object.keys(pluginExtractedTranslations).filter((message) =>
117
+ key.startsWith(message),
118
+ ).length;
119
+ },
120
+ );
121
+
122
+ const pluginMessagesKeys = pluginMessages.map(([key]) => key);
123
+
124
+ console.log(1, pluginMessagesKeys);
125
+
126
+ // await writeMessagesFile(destFile, convertToObject(pluginMessages));
127
+
128
+ const newTargetFile = removePluginMessages(
129
+ targetFile,
130
+ pluginMessagesKeys,
131
+ );
132
+
133
+ baseMessages = pickBy(
134
+ baseMessages,
135
+ (_, key) => !pluginMessagesKeys.includes(key),
136
+ );
137
+ // await writeMessagesFile(localeFile, convertToObject(newTargetFile));
138
+ }
139
+ }
140
+
141
+ // console.log(baseMessages);
142
+ // await writeMessagesFile(baseFile, baseMessages);
143
+ }
144
+
145
+ function run() {
146
+ main().then(() => {
147
+ console.log(1);
148
+ });
149
+ }
150
+
151
+ exports.run = run;
@@ -1,103 +0,0 @@
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
- /**
9
- * Styles for React Toggle
10
- * copied over because we want to allow user to swizzle it and modify the css
11
- * and also to make sure its compatible with our dark mode
12
- * https://github.com/aaronshaf/react-toggle/blob/master/style.css
13
- */
14
- .react-toggle {
15
- touch-action: pan-x;
16
- position: relative;
17
- cursor: pointer;
18
- user-select: none;
19
- -webkit-tap-highlight-color: transparent;
20
- }
21
-
22
- .react-toggle-screenreader-only {
23
- border: 0;
24
- clip: rect(0 0 0 0);
25
- height: 1px;
26
- margin: -1px;
27
- overflow: hidden;
28
- position: absolute;
29
- width: 1px;
30
- }
31
-
32
- .react-toggle--disabled {
33
- cursor: not-allowed;
34
- }
35
-
36
- .react-toggle-track {
37
- width: 50px;
38
- height: 24px;
39
- border-radius: 30px;
40
- background-color: #4d4d4d;
41
- transition: all 0.2s ease;
42
- }
43
-
44
- .react-toggle-track-check {
45
- position: absolute;
46
- width: 14px;
47
- height: 10px;
48
- top: 0px;
49
- bottom: 0px;
50
- margin: auto 0;
51
- left: 8px;
52
- opacity: 0;
53
- transition: opacity 0.25s ease;
54
- }
55
-
56
- [data-theme='dark'] .react-toggle .react-toggle-track-check,
57
- .react-toggle--checked .react-toggle-track-check {
58
- opacity: 1;
59
- transition: opacity 0.25s ease;
60
- }
61
-
62
- .react-toggle-track-x {
63
- position: absolute;
64
- width: 10px;
65
- height: 10px;
66
- top: 0px;
67
- bottom: 0px;
68
- margin: auto 0;
69
- right: 10px;
70
- opacity: 1;
71
- transition: opacity 0.25s ease;
72
- }
73
-
74
- [data-theme='dark'] .react-toggle .react-toggle-track-x,
75
- .react-toggle--checked .react-toggle-track-x {
76
- opacity: 0;
77
- }
78
-
79
- .react-toggle-thumb {
80
- position: absolute;
81
- top: 1px;
82
- left: 1px;
83
- width: 22px;
84
- height: 22px;
85
- border: 1px solid #4d4d4d;
86
- border-radius: 50%;
87
- background-color: #fafafa;
88
- transition: all 0.25s ease;
89
- }
90
-
91
- [data-theme='dark'] .react-toggle .react-toggle-thumb,
92
- .react-toggle--checked .react-toggle-thumb {
93
- left: 27px;
94
- }
95
-
96
- .react-toggle--focus .react-toggle-thumb,
97
- .react-toggle:hover .react-toggle-thumb {
98
- box-shadow: 0px 0px 2px 3px var(--ifm-color-primary);
99
- }
100
-
101
- .react-toggle:active:not(.react-toggle--disabled) .react-toggle-thumb {
102
- box-shadow: 0px 0px 5px 5px var(--ifm-color-primary);
103
- }
@@ -1,51 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = require("react");
9
-
10
- var _ExecutionEnvironment = _interopRequireDefault(require("@docusaurus/ExecutionEnvironment"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- /**
15
- * Copyright (c) Facebook, Inc. and its affiliates.
16
- *
17
- * This source code is licensed under the MIT license found in the
18
- * LICENSE file in the root directory of this source tree.
19
- */
20
- const getScrollPosition = () => {
21
- return _ExecutionEnvironment.default.canUseDOM ? {
22
- scrollX: window.pageXOffset,
23
- scrollY: window.pageYOffset
24
- } : null;
25
- };
26
-
27
- const useScrollPosition = (effect, deps = []) => {
28
- const lastPositionRef = (0, _react.useRef)(getScrollPosition());
29
-
30
- const handleScroll = () => {
31
- const currentPosition = getScrollPosition();
32
-
33
- if (effect) {
34
- effect(currentPosition, lastPositionRef.current);
35
- }
36
-
37
- lastPositionRef.current = currentPosition;
38
- };
39
-
40
- (0, _react.useEffect)(() => {
41
- const opts = {
42
- passive: true
43
- };
44
- handleScroll();
45
- window.addEventListener('scroll', handleScroll, opts);
46
- return () => window.removeEventListener('scroll', handleScroll, opts);
47
- }, deps);
48
- };
49
-
50
- var _default = useScrollPosition;
51
- exports.default = _default;
@@ -1,87 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = require("react");
9
-
10
- /**
11
- * Copyright (c) Facebook, Inc. and its affiliates.
12
- *
13
- * This source code is licensed under the MIT license found in the
14
- * LICENSE file in the root directory of this source tree.
15
- */
16
- function useTOCHighlight(linkClassName, linkActiveClassName, topOffset) {
17
- const [lastActiveLink, setLastActiveLink] = (0, _react.useState)(undefined);
18
- (0, _react.useEffect)(() => {
19
- function setActiveLink() {
20
- function getActiveHeaderAnchor() {
21
- const headersAnchors = Array.from(document.getElementsByClassName('anchor'));
22
- const firstAnchorUnderViewportTop = headersAnchors.find(anchor => {
23
- const {
24
- top
25
- } = anchor.getBoundingClientRect();
26
- return top >= topOffset;
27
- });
28
-
29
- if (firstAnchorUnderViewportTop) {
30
- // If first anchor in viewport is under a certain threshold, we consider it's not the active anchor.
31
- // In such case, the active anchor is the previous one (if it exists), that may be above the viewport
32
- if (firstAnchorUnderViewportTop.getBoundingClientRect().top >= topOffset) {
33
- const previousAnchor = headersAnchors[headersAnchors.indexOf(firstAnchorUnderViewportTop) - 1];
34
- return previousAnchor !== null && previousAnchor !== void 0 ? previousAnchor : firstAnchorUnderViewportTop;
35
- } // If the anchor is at the top of the viewport, we consider it's the first anchor
36
- else {
37
- return firstAnchorUnderViewportTop;
38
- }
39
- } // no anchor under viewport top? (ie we are at the bottom of the page)
40
- else {
41
- // highlight the last anchor found
42
- return headersAnchors[headersAnchors.length - 1];
43
- }
44
- }
45
-
46
- const activeHeaderAnchor = getActiveHeaderAnchor();
47
-
48
- if (activeHeaderAnchor) {
49
- let index = 0;
50
- let itemHighlighted = false; // @ts-expect-error: Must be <a> tags.
51
-
52
- const links = document.getElementsByClassName(linkClassName);
53
-
54
- while (index < links.length && !itemHighlighted) {
55
- const link = links[index];
56
- const {
57
- href
58
- } = link;
59
- const anchorValue = decodeURIComponent(href.substring(href.indexOf('#') + 1));
60
-
61
- if (activeHeaderAnchor.id === anchorValue) {
62
- if (lastActiveLink) {
63
- lastActiveLink.classList.remove(linkActiveClassName);
64
- }
65
-
66
- link.classList.add(linkActiveClassName);
67
- setLastActiveLink(link);
68
- itemHighlighted = true;
69
- }
70
-
71
- index += 1;
72
- }
73
- }
74
- }
75
-
76
- document.addEventListener('scroll', setActiveLink);
77
- document.addEventListener('resize', setActiveLink);
78
- setActiveLink();
79
- return () => {
80
- document.removeEventListener('scroll', setActiveLink);
81
- document.removeEventListener('resize', setActiveLink);
82
- };
83
- });
84
- }
85
-
86
- var _default = useTOCHighlight;
87
- exports.default = _default;
@@ -1,103 +0,0 @@
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
- /**
9
- * Styles for React Toggle
10
- * copied over because we want to allow user to swizzle it and modify the css
11
- * and also to make sure its compatible with our dark mode
12
- * https://github.com/aaronshaf/react-toggle/blob/master/style.css
13
- */
14
- .react-toggle {
15
- touch-action: pan-x;
16
- position: relative;
17
- cursor: pointer;
18
- user-select: none;
19
- -webkit-tap-highlight-color: transparent;
20
- }
21
-
22
- .react-toggle-screenreader-only {
23
- border: 0;
24
- clip: rect(0 0 0 0);
25
- height: 1px;
26
- margin: -1px;
27
- overflow: hidden;
28
- position: absolute;
29
- width: 1px;
30
- }
31
-
32
- .react-toggle--disabled {
33
- cursor: not-allowed;
34
- }
35
-
36
- .react-toggle-track {
37
- width: 50px;
38
- height: 24px;
39
- border-radius: 30px;
40
- background-color: #4d4d4d;
41
- transition: all 0.2s ease;
42
- }
43
-
44
- .react-toggle-track-check {
45
- position: absolute;
46
- width: 14px;
47
- height: 10px;
48
- top: 0px;
49
- bottom: 0px;
50
- margin: auto 0;
51
- left: 8px;
52
- opacity: 0;
53
- transition: opacity 0.25s ease;
54
- }
55
-
56
- [data-theme='dark'] .react-toggle .react-toggle-track-check,
57
- .react-toggle--checked .react-toggle-track-check {
58
- opacity: 1;
59
- transition: opacity 0.25s ease;
60
- }
61
-
62
- .react-toggle-track-x {
63
- position: absolute;
64
- width: 10px;
65
- height: 10px;
66
- top: 0px;
67
- bottom: 0px;
68
- margin: auto 0;
69
- right: 10px;
70
- opacity: 1;
71
- transition: opacity 0.25s ease;
72
- }
73
-
74
- [data-theme='dark'] .react-toggle .react-toggle-track-x,
75
- .react-toggle--checked .react-toggle-track-x {
76
- opacity: 0;
77
- }
78
-
79
- .react-toggle-thumb {
80
- position: absolute;
81
- top: 1px;
82
- left: 1px;
83
- width: 22px;
84
- height: 22px;
85
- border: 1px solid #4d4d4d;
86
- border-radius: 50%;
87
- background-color: #fafafa;
88
- transition: all 0.25s ease;
89
- }
90
-
91
- [data-theme='dark'] .react-toggle .react-toggle-thumb,
92
- .react-toggle--checked .react-toggle-thumb {
93
- left: 27px;
94
- }
95
-
96
- .react-toggle--focus .react-toggle-thumb,
97
- .react-toggle:hover .react-toggle-thumb {
98
- box-shadow: 0px 0px 2px 3px var(--ifm-color-primary);
99
- }
100
-
101
- .react-toggle:active:not(.react-toggle--disabled) .react-toggle-thumb {
102
- box-shadow: 0px 0px 5px 5px var(--ifm-color-primary);
103
- }