@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
@@ -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,84 +41,56 @@ 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
 
46
51
  const NavbarItemPosition = Joi.string().equal('left', 'right').default('left');
47
52
 
48
- const BaseNavbarItemSchema = Joi.object({
49
- to: Joi.string(),
50
- href: URISchema,
53
+ const NavbarItemBaseSchema = Joi.object({
51
54
  label: Joi.string(),
52
55
  className: Joi.string(),
53
- prependBaseUrlToHref: Joi.bool(),
54
56
  })
55
57
  // We allow any unknown attributes on the links
56
58
  // (users may need additional attributes like target, aria-role, data-customAttribute...)
57
59
  .unknown();
58
60
 
59
- // TODO we should probably create a custom navbar item type "dropdown"
60
- // having this recursive structure is bad because we only support 2 levels
61
- // + parent/child don't have exactly the same props
62
- const DefaultNavbarItemSchema = BaseNavbarItemSchema.append({
63
- items: Joi.array().optional().items(BaseNavbarItemSchema),
64
- position: NavbarItemPosition,
61
+ const DefaultNavbarItemSchema = NavbarItemBaseSchema.append({
62
+ to: Joi.string(),
63
+ href: URISchema,
65
64
  activeBasePath: Joi.string(),
66
65
  activeBaseRegex: Joi.string(),
67
- });
68
- // TODO the dropdown parent item can have no href/to
69
- // should check should not apply to dropdown parent item
70
- // .xor('href', 'to');
66
+ prependBaseUrlToHref: Joi.bool(),
67
+ // This is only triggered in case of a nested dropdown
68
+ items: Joi.forbidden().messages({
69
+ 'any.unknown': 'Nested dropdowns are not allowed',
70
+ }),
71
+ })
72
+ .xor('href', 'to')
73
+ .messages({
74
+ 'object.xor': 'One and only one between "to" and "href" should be provided',
75
+ });
71
76
 
72
- const DocsVersionNavbarItemSchema = Joi.object({
77
+ const DocsVersionNavbarItemSchema = NavbarItemBaseSchema.append({
73
78
  type: Joi.string().equal('docsVersion').required(),
74
- position: NavbarItemPosition,
75
- label: Joi.string(),
76
79
  to: Joi.string(),
77
80
  docsPluginId: Joi.string(),
78
- className: Joi.string(),
79
81
  });
80
82
 
81
- const DocsVersionDropdownNavbarItemSchema = Joi.object({
82
- type: Joi.string().equal('docsVersionDropdown').required(),
83
- position: NavbarItemPosition,
84
- docsPluginId: Joi.string(),
85
- dropdownActiveClassDisabled: Joi.boolean(),
86
- dropdownItemsBefore: Joi.array().items(BaseNavbarItemSchema).default([]),
87
- dropdownItemsAfter: Joi.array().items(BaseNavbarItemSchema).default([]),
88
- className: Joi.string(),
89
- });
90
-
91
- const DocItemSchema = Joi.object({
83
+ const DocItemSchema = NavbarItemBaseSchema.append({
92
84
  type: Joi.string().equal('doc').required(),
93
- position: NavbarItemPosition,
94
85
  docId: Joi.string().required(),
95
- label: Joi.string(),
96
86
  docsPluginId: Joi.string(),
97
- activeSidebarClassName: Joi.string().default('navbar__link--active'),
98
- className: Joi.string(),
99
87
  });
100
88
 
101
- const LocaleDropdownNavbarItemSchema = Joi.object({
102
- type: Joi.string().equal('localeDropdown').required(),
103
- position: NavbarItemPosition,
104
- dropdownItemsBefore: Joi.array().items(BaseNavbarItemSchema).default([]),
105
- dropdownItemsAfter: Joi.array().items(BaseNavbarItemSchema).default([]),
106
- className: Joi.string(),
107
- });
108
-
109
- const SearchItemSchema = Joi.object({
110
- type: Joi.string().equal('search').required(),
111
- position: NavbarItemPosition,
112
- });
113
-
114
- // Can this be made easier? :/
115
- const isOfType = (type) => {
116
- let typeSchema = Joi.string().required();
89
+ const itemWithType = (type: string | undefined) => {
117
90
  // because equal(undefined) is not supported :/
118
- if (type) {
119
- typeSchema = typeSchema.equal(type);
120
- }
91
+ const typeSchema = type
92
+ ? Joi.string().required().equal(type)
93
+ : Joi.string().forbidden();
121
94
  return Joi.object({
122
95
  type: typeSchema,
123
96
  })
@@ -125,58 +98,105 @@ const isOfType = (type) => {
125
98
  .required();
126
99
  };
127
100
 
128
- const NavbarItemSchema = Joi.object().when({
101
+ const DropdownSubitemSchema = Joi.object({
102
+ position: Joi.forbidden(),
103
+ }).when('.', {
104
+ switch: [
105
+ {
106
+ is: itemWithType('docsVersion'),
107
+ then: DocsVersionNavbarItemSchema,
108
+ },
109
+ {
110
+ is: itemWithType('doc'),
111
+ then: DocItemSchema,
112
+ },
113
+ {
114
+ is: itemWithType(undefined),
115
+ then: DefaultNavbarItemSchema,
116
+ },
117
+ {
118
+ is: Joi.alternatives().try(
119
+ itemWithType('dropdown'),
120
+ itemWithType('docsVersionDropdown'),
121
+ itemWithType('localeDropdown'),
122
+ itemWithType('search'),
123
+ ),
124
+ then: Joi.forbidden().messages({
125
+ 'any.unknown': 'Nested dropdowns are not allowed',
126
+ }),
127
+ },
128
+ ],
129
+ otherwise: Joi.forbidden().messages({
130
+ 'any.unknown': 'Bad navbar item type {.type}',
131
+ }),
132
+ });
133
+
134
+ const DropdownNavbarItemSchema = NavbarItemBaseSchema.append({
135
+ items: Joi.array().items(DropdownSubitemSchema).required(),
136
+ });
137
+
138
+ const DocsVersionDropdownNavbarItemSchema = NavbarItemBaseSchema.append({
139
+ type: Joi.string().equal('docsVersionDropdown').required(),
140
+ docsPluginId: Joi.string(),
141
+ dropdownActiveClassDisabled: Joi.boolean(),
142
+ dropdownItemsBefore: Joi.array().items(DropdownSubitemSchema).default([]),
143
+ dropdownItemsAfter: Joi.array().items(DropdownSubitemSchema).default([]),
144
+ });
145
+
146
+ const LocaleDropdownNavbarItemSchema = NavbarItemBaseSchema.append({
147
+ type: Joi.string().equal('localeDropdown').required(),
148
+ dropdownItemsBefore: Joi.array().items(DropdownSubitemSchema).default([]),
149
+ dropdownItemsAfter: Joi.array().items(DropdownSubitemSchema).default([]),
150
+ });
151
+
152
+ const SearchItemSchema = Joi.object({
153
+ type: Joi.string().equal('search').required(),
154
+ });
155
+
156
+ const NavbarItemSchema = Joi.object({
157
+ position: NavbarItemPosition,
158
+ }).when('.', {
129
159
  switch: [
130
160
  {
131
- is: isOfType('docsVersion'),
161
+ is: itemWithType('docsVersion'),
132
162
  then: DocsVersionNavbarItemSchema,
133
163
  },
134
164
  {
135
- is: isOfType('docsVersionDropdown'),
165
+ is: itemWithType('dropdown'),
166
+ then: DropdownNavbarItemSchema,
167
+ },
168
+ {
169
+ is: itemWithType('docsVersionDropdown'),
136
170
  then: DocsVersionDropdownNavbarItemSchema,
137
171
  },
138
172
  {
139
- is: isOfType('doc'),
173
+ is: itemWithType('doc'),
140
174
  then: DocItemSchema,
141
175
  },
142
176
  {
143
- is: isOfType('localeDropdown'),
177
+ is: itemWithType('localeDropdown'),
144
178
  then: LocaleDropdownNavbarItemSchema,
145
179
  },
146
180
  {
147
- is: isOfType('search'),
181
+ is: itemWithType('search'),
148
182
  then: SearchItemSchema,
149
183
  },
150
184
  {
151
- is: isOfType(undefined),
152
- then: Joi.forbidden().messages({
153
- 'any.unknown': 'Bad navbar item type {.type}',
185
+ is: itemWithType(undefined),
186
+ then: Joi.object().when('.', {
187
+ // Dropdown item can be specified without type field
188
+ is: Joi.object({
189
+ items: Joi.array().required(),
190
+ }).unknown(),
191
+ then: DropdownNavbarItemSchema,
192
+ otherwise: DefaultNavbarItemSchema,
154
193
  }),
155
194
  },
156
195
  ],
157
- otherwise: DefaultNavbarItemSchema,
158
- });
159
-
160
- /*
161
- const NavbarItemSchema = Joi.object({
162
- type: Joi.string().only(['docsVersion'])
163
- })
164
- .when(Joi.object({ type: 'docsVersion' }).unknown(), {
165
- then: Joi.object({ pepperoni: Joi.boolean() })
166
- })
167
- .when(Joi.object().unknown(), {
168
- then: Joi.object({ croutons: Joi.boolean() })
169
- })
170
-
171
- */
172
-
173
- /*
174
- const NavbarItemSchema = Joi.object().when('type', {
175
- is: Joi.valid('docsVersion'),
176
- then: DocsVersionNavbarItemSchema,
177
- otherwise: DefaultNavbarItemSchema,
196
+ otherwise: Joi.forbidden().messages({
197
+ 'any.unknown': 'Bad navbar item type {.type}',
198
+ }),
178
199
  });
179
- */
180
200
 
181
201
  const ColorModeSchema = Joi.object({
182
202
  defaultMode: Joi.string()
@@ -231,12 +251,12 @@ const CustomCssSchema = Joi.alternatives()
231
251
 
232
252
  const ThemeConfigSchema = Joi.object({
233
253
  // TODO temporary (@alpha-58)
234
- disableDarkMode: Joi.any().forbidden(false).messages({
254
+ disableDarkMode: Joi.any().forbidden().messages({
235
255
  'any.unknown':
236
256
  'disableDarkMode theme config is deprecated. Please use the new colorMode attribute. You likely want: config.themeConfig.colorMode.disableSwitch = true',
237
257
  }),
238
258
  // TODO temporary (@alpha-58)
239
- defaultDarkMode: Joi.any().forbidden(false).messages({
259
+ defaultDarkMode: Joi.any().forbidden().messages({
240
260
  'any.unknown':
241
261
  'defaultDarkMode theme config is deprecated. Please use the new colorMode attribute. You likely want: config.themeConfig.colorMode.defaultMode = "dark"',
242
262
  }),
@@ -249,7 +269,7 @@ const ThemeConfigSchema = Joi.object({
249
269
  .default(DEFAULT_CONFIG.metadatas),
250
270
  announcementBar: Joi.object({
251
271
  id: Joi.string().default('announcement-bar'),
252
- content: Joi.string(),
272
+ content: Joi.string().required(),
253
273
  backgroundColor: Joi.string(),
254
274
  textColor: Joi.string(),
255
275
  isCloseable: Joi.bool().default(true),
@@ -270,6 +290,8 @@ const ThemeConfigSchema = Joi.object({
270
290
  alt: Joi.string().allow(''),
271
291
  src: Joi.string().required(),
272
292
  srcDark: Joi.string(),
293
+ width: Joi.alternatives().try(Joi.string(), Joi.number()),
294
+ height: Joi.alternatives().try(Joi.string(), Joi.number()),
273
295
  href: Joi.string(),
274
296
  target: Joi.string(),
275
297
  }),
@@ -280,6 +302,9 @@ const ThemeConfigSchema = Joi.object({
280
302
  alt: Joi.string().allow(''),
281
303
  src: Joi.string(),
282
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()),
283
308
  href: Joi.string(),
284
309
  }),
285
310
  copyright: Joi.string(),
@@ -309,9 +334,38 @@ const ThemeConfigSchema = Joi.object({
309
334
  .default(DEFAULT_CONFIG.prism)
310
335
  .unknown(),
311
336
  hideableSidebar: Joi.bool().default(DEFAULT_CONFIG.hideableSidebar),
337
+ sidebarCollapsible: Joi.forbidden().messages({
338
+ 'any.unknown':
339
+ 'The themeConfig.sidebarCollapsible has been moved to docs plugin options. See: https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-docs',
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),
312
359
  });
313
- exports.ThemeConfigSchema = ThemeConfigSchema;
314
360
 
315
- 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> {
316
370
  return validate(ThemeConfigSchema, themeConfig);
317
- };
371
+ }
package/tsconfig.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "extends": "../../tsconfig.json",
3
3
  "compilerOptions": {
4
- "lib": ["DOM"],
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() {
@@ -53,11 +54,12 @@ async function extractThemeCodeMessages() {
53
54
  const {
54
55
  globSourceCodeFilePaths,
55
56
  extractAllSourceCodeFileTranslations,
57
+ // eslint-disable-next-line global-require
56
58
  } = require('@docusaurus/core/lib/server/translations/translationsExtractor');
57
59
 
58
- const filePaths = (
59
- await globSourceCodeFilePaths(CodeDirPaths)
60
- ).filter((filePath) => ['.js', '.jsx'].includes(path.extname(filePath)));
60
+ const filePaths = (await globSourceCodeFilePaths(CodeDirPaths)).filter(
61
+ (filePath) => ['.js', '.jsx'].includes(path.extname(filePath)),
62
+ );
61
63
 
62
64
  const filesExtractedTranslations = await extractAllSourceCodeFileTranslations(
63
65
  filePaths,
@@ -148,10 +150,12 @@ ${logKeys(unknownMessages)}`),
148
150
 
149
151
  const newBaseMessagesDescriptions = Object.entries(newBaseMessages).reduce(
150
152
  (acc, [key]) => {
153
+ const codeTranslation = codeExtractedTranslations[key];
151
154
  return {
152
155
  ...acc,
153
- [`${key}${DescriptionSuffix}`]: codeExtractedTranslations[key]
154
- .description,
156
+ [`${key}${DescriptionSuffix}`]: codeTranslation
157
+ ? codeTranslation.description
158
+ : undefined,
155
159
  };
156
160
  },
157
161
  {},
@@ -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
- }