@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
@@ -4,9 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
-
8
- const {Joi, URISchema} = require('@docusaurus/utils-validation');
9
-
7
+ import {Joi, URISchema} from '@docusaurus/utils-validation';
10
8
  const DEFAULT_DOCS_CONFIG = {
11
9
  versionPersistence: 'localStorage',
12
10
  };
@@ -15,7 +13,6 @@ const DocsSchema = Joi.object({
15
13
  .equal('localStorage', 'none')
16
14
  .default(DEFAULT_DOCS_CONFIG.versionPersistence),
17
15
  }).default(DEFAULT_DOCS_CONFIG);
18
-
19
16
  const DEFAULT_COLOR_MODE_CONFIG = {
20
17
  defaultMode: 'light',
21
18
  disableSwitch: false,
@@ -27,7 +24,6 @@ const DEFAULT_COLOR_MODE_CONFIG = {
27
24
  lightIconStyle: {},
28
25
  },
29
26
  };
30
-
31
27
  const DEFAULT_CONFIG = {
32
28
  colorMode: DEFAULT_COLOR_MODE_CONFIG,
33
29
  docs: DEFAULT_DOCS_CONFIG,
@@ -40,19 +36,19 @@ const DEFAULT_CONFIG = {
40
36
  items: [],
41
37
  },
42
38
  hideableSidebar: false,
39
+ tableOfContents: {
40
+ minHeadingLevel: 2,
41
+ maxHeadingLevel: 3,
42
+ },
43
43
  };
44
44
  exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
45
-
46
45
  const NavbarItemPosition = Joi.string().equal('left', 'right').default('left');
47
-
48
46
  const NavbarItemBaseSchema = Joi.object({
49
47
  label: Joi.string(),
50
48
  className: Joi.string(),
51
- })
52
- // We allow any unknown attributes on the links
49
+ }) // We allow any unknown attributes on the links
53
50
  // (users may need additional attributes like target, aria-role, data-customAttribute...)
54
51
  .unknown();
55
-
56
52
  const DefaultNavbarItemSchema = NavbarItemBaseSchema.append({
57
53
  to: Joi.string(),
58
54
  href: URISchema,
@@ -68,18 +64,15 @@ const DefaultNavbarItemSchema = NavbarItemBaseSchema.append({
68
64
  .messages({
69
65
  'object.xor': 'One and only one between "to" and "href" should be provided',
70
66
  });
71
-
72
67
  const DocsVersionNavbarItemSchema = NavbarItemBaseSchema.append({
73
68
  type: Joi.string().equal('docsVersion').required(),
74
69
  to: Joi.string(),
75
70
  docsPluginId: Joi.string(),
76
71
  });
77
-
78
72
  const DocItemSchema = NavbarItemBaseSchema.append({
79
73
  type: Joi.string().equal('doc').required(),
80
74
  docId: Joi.string().required(),
81
75
  docsPluginId: Joi.string(),
82
- activeSidebarClassName: Joi.string().default('navbar__link--active'),
83
76
  });
84
77
 
85
78
  const itemWithType = (type) => {
@@ -96,7 +89,7 @@ const itemWithType = (type) => {
96
89
 
97
90
  const DropdownSubitemSchema = Joi.object({
98
91
  position: Joi.forbidden(),
99
- }).when({
92
+ }).when('.', {
100
93
  switch: [
101
94
  {
102
95
  is: itemWithType('docsVersion'),
@@ -126,11 +119,9 @@ const DropdownSubitemSchema = Joi.object({
126
119
  'any.unknown': 'Bad navbar item type {.type}',
127
120
  }),
128
121
  });
129
-
130
122
  const DropdownNavbarItemSchema = NavbarItemBaseSchema.append({
131
123
  items: Joi.array().items(DropdownSubitemSchema).required(),
132
124
  });
133
-
134
125
  const DocsVersionDropdownNavbarItemSchema = NavbarItemBaseSchema.append({
135
126
  type: Joi.string().equal('docsVersionDropdown').required(),
136
127
  docsPluginId: Joi.string(),
@@ -138,20 +129,17 @@ const DocsVersionDropdownNavbarItemSchema = NavbarItemBaseSchema.append({
138
129
  dropdownItemsBefore: Joi.array().items(DropdownSubitemSchema).default([]),
139
130
  dropdownItemsAfter: Joi.array().items(DropdownSubitemSchema).default([]),
140
131
  });
141
-
142
132
  const LocaleDropdownNavbarItemSchema = NavbarItemBaseSchema.append({
143
133
  type: Joi.string().equal('localeDropdown').required(),
144
134
  dropdownItemsBefore: Joi.array().items(DropdownSubitemSchema).default([]),
145
135
  dropdownItemsAfter: Joi.array().items(DropdownSubitemSchema).default([]),
146
136
  });
147
-
148
137
  const SearchItemSchema = Joi.object({
149
138
  type: Joi.string().equal('search').required(),
150
139
  });
151
-
152
140
  const NavbarItemSchema = Joi.object({
153
141
  position: NavbarItemPosition,
154
- }).when({
142
+ }).when('.', {
155
143
  switch: [
156
144
  {
157
145
  is: itemWithType('docsVersion'),
@@ -179,7 +167,7 @@ const NavbarItemSchema = Joi.object({
179
167
  },
180
168
  {
181
169
  is: itemWithType(undefined),
182
- then: Joi.object().when({
170
+ then: Joi.object().when('.', {
183
171
  // Dropdown item can be specified without type field
184
172
  is: Joi.object({
185
173
  items: Joi.array().required(),
@@ -193,7 +181,6 @@ const NavbarItemSchema = Joi.object({
193
181
  'any.unknown': 'Bad navbar item type {.type}',
194
182
  }),
195
183
  });
196
-
197
184
  const ColorModeSchema = Joi.object({
198
185
  defaultMode: Joi.string()
199
186
  .equal('dark', 'light')
@@ -216,9 +203,8 @@ const ColorModeSchema = Joi.object({
216
203
  DEFAULT_COLOR_MODE_CONFIG.switchConfig.lightIconStyle,
217
204
  ),
218
205
  }).default(DEFAULT_COLOR_MODE_CONFIG.switchConfig),
219
- }).default(DEFAULT_COLOR_MODE_CONFIG);
206
+ }).default(DEFAULT_COLOR_MODE_CONFIG); // schema can probably be improved
220
207
 
221
- // schema can probably be improved
222
208
  const HtmlMetadataSchema = Joi.object({
223
209
  id: Joi.string(),
224
210
  name: Joi.string(),
@@ -226,7 +212,6 @@ const HtmlMetadataSchema = Joi.object({
226
212
  content: Joi.string(),
227
213
  itemprop: Joi.string(),
228
214
  }).unknown();
229
-
230
215
  const FooterLinkItemSchema = Joi.object({
231
216
  to: Joi.string(),
232
217
  href: URISchema,
@@ -236,23 +221,20 @@ const FooterLinkItemSchema = Joi.object({
236
221
  .xor('to', 'href', 'html')
237
222
  .with('to', 'label')
238
223
  .with('href', 'label')
239
- .nand('html', 'label')
240
- // We allow any unknown attributes on the links
224
+ .nand('html', 'label') // We allow any unknown attributes on the links
241
225
  // (users may need additional attributes like target, aria-role, data-customAttribute...)
242
226
  .unknown();
243
-
244
227
  const CustomCssSchema = Joi.alternatives()
245
228
  .try(Joi.array().items(Joi.string().required()), Joi.string().required())
246
229
  .optional();
247
-
248
230
  const ThemeConfigSchema = Joi.object({
249
231
  // TODO temporary (@alpha-58)
250
- disableDarkMode: Joi.any().forbidden(false).messages({
232
+ disableDarkMode: Joi.any().forbidden().messages({
251
233
  'any.unknown':
252
234
  'disableDarkMode theme config is deprecated. Please use the new colorMode attribute. You likely want: config.themeConfig.colorMode.disableSwitch = true',
253
235
  }),
254
236
  // TODO temporary (@alpha-58)
255
- defaultDarkMode: Joi.any().forbidden(false).messages({
237
+ defaultDarkMode: Joi.any().forbidden().messages({
256
238
  'any.unknown':
257
239
  'defaultDarkMode theme config is deprecated. Please use the new colorMode attribute. You likely want: config.themeConfig.colorMode.defaultMode = "dark"',
258
240
  }),
@@ -265,7 +247,7 @@ const ThemeConfigSchema = Joi.object({
265
247
  .default(DEFAULT_CONFIG.metadatas),
266
248
  announcementBar: Joi.object({
267
249
  id: Joi.string().default('announcement-bar'),
268
- content: Joi.string(),
250
+ content: Joi.string().required(),
269
251
  backgroundColor: Joi.string(),
270
252
  textColor: Joi.string(),
271
253
  isCloseable: Joi.bool().default(true),
@@ -286,6 +268,8 @@ const ThemeConfigSchema = Joi.object({
286
268
  alt: Joi.string().allow(''),
287
269
  src: Joi.string().required(),
288
270
  srcDark: Joi.string(),
271
+ width: Joi.alternatives().try(Joi.string(), Joi.number()),
272
+ height: Joi.alternatives().try(Joi.string(), Joi.number()),
289
273
  href: Joi.string(),
290
274
  target: Joi.string(),
291
275
  }),
@@ -296,6 +280,9 @@ const ThemeConfigSchema = Joi.object({
296
280
  alt: Joi.string().allow(''),
297
281
  src: Joi.string(),
298
282
  srcDark: Joi.string(),
283
+ // TODO infer this from reading the image
284
+ width: Joi.alternatives().try(Joi.string(), Joi.number()),
285
+ height: Joi.alternatives().try(Joi.string(), Joi.number()),
299
286
  href: Joi.string(),
300
287
  }),
301
288
  copyright: Joi.string(),
@@ -329,9 +316,26 @@ const ThemeConfigSchema = Joi.object({
329
316
  'any.unknown':
330
317
  'The themeConfig.sidebarCollapsible has been moved to docs plugin options. See: https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-docs',
331
318
  }),
319
+ tableOfContents: Joi.object({
320
+ minHeadingLevel: Joi.number()
321
+ .default(DEFAULT_CONFIG.tableOfContents.minHeadingLevel)
322
+ .when('maxHeadingLevel', {
323
+ is: Joi.exist(),
324
+ then: Joi.number()
325
+ .integer()
326
+ .min(2)
327
+ .max(6)
328
+ .max(Joi.ref('maxHeadingLevel')),
329
+ otherwise: Joi.number().integer().min(2).max(6),
330
+ }),
331
+ maxHeadingLevel: Joi.number()
332
+ .integer()
333
+ .min(2)
334
+ .max(6)
335
+ .default(DEFAULT_CONFIG.tableOfContents.maxHeadingLevel),
336
+ }).default(DEFAULT_CONFIG.tableOfContents),
332
337
  });
333
- exports.ThemeConfigSchema = ThemeConfigSchema;
334
-
335
- exports.validateThemeConfig = ({validate, themeConfig}) => {
338
+ export {ThemeConfigSchema};
339
+ export function validateThemeConfig({validate, themeConfig}) {
336
340
  return validate(ThemeConfigSchema, themeConfig);
337
- };
341
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docusaurus/theme-classic",
3
- "version": "2.0.0-beta.8e9b829d9",
3
+ "version": "2.0.0-beta.9",
4
4
  "description": "Classic theme for Docusaurus",
5
5
  "main": "lib/index.js",
6
6
  "types": "src/types.d.ts",
@@ -23,42 +23,46 @@
23
23
  "update-code-translations": "node -e 'require(\"./update-code-translations.js\").run()'"
24
24
  },
25
25
  "dependencies": {
26
- "@docusaurus/core": "2.0.0-beta.8e9b829d9",
27
- "@docusaurus/plugin-content-blog": "2.0.0-beta.8e9b829d9",
28
- "@docusaurus/plugin-content-docs": "2.0.0-beta.8e9b829d9",
29
- "@docusaurus/plugin-content-pages": "2.0.0-beta.8e9b829d9",
30
- "@docusaurus/theme-common": "2.0.0-beta.8e9b829d9",
31
- "@docusaurus/types": "2.0.0-beta.8e9b829d9",
32
- "@docusaurus/utils": "2.0.0-beta.8e9b829d9",
33
- "@docusaurus/utils-common": "2.0.0-beta.8e9b829d9",
34
- "@docusaurus/utils-validation": "2.0.0-beta.8e9b829d9",
26
+ "@docusaurus/core": "2.0.0-beta.9",
27
+ "@docusaurus/plugin-content-blog": "2.0.0-beta.9",
28
+ "@docusaurus/plugin-content-docs": "2.0.0-beta.9",
29
+ "@docusaurus/plugin-content-pages": "2.0.0-beta.9",
30
+ "@docusaurus/theme-common": "2.0.0-beta.9",
31
+ "@docusaurus/types": "2.0.0-beta.9",
32
+ "@docusaurus/utils": "2.0.0-beta.9",
33
+ "@docusaurus/utils-common": "2.0.0-beta.9",
34
+ "@docusaurus/utils-validation": "2.0.0-beta.9",
35
35
  "@mdx-js/mdx": "^1.6.21",
36
36
  "@mdx-js/react": "^1.6.21",
37
- "chalk": "^4.1.1",
37
+ "chalk": "^4.1.2",
38
38
  "clsx": "^1.1.1",
39
39
  "copy-text-to-clipboard": "^3.0.1",
40
40
  "fs-extra": "^10.0.0",
41
41
  "globby": "^11.0.2",
42
- "infima": "0.2.0-alpha.29",
42
+ "infima": "0.2.0-alpha.34",
43
43
  "lodash": "^4.17.20",
44
- "parse-numeric-range": "^1.2.0",
45
- "postcss": "^8.2.15",
44
+ "parse-numeric-range": "^1.3.0",
45
+ "postcss": "^8.3.7",
46
46
  "prism-react-renderer": "^1.2.1",
47
47
  "prismjs": "^1.23.0",
48
48
  "prop-types": "^15.7.2",
49
49
  "react-router-dom": "^5.2.0",
50
- "rtlcss": "^3.1.2"
50
+ "rtlcss": "^3.3.0"
51
51
  },
52
52
  "devDependencies": {
53
- "@docusaurus/module-type-aliases": "2.0.0-beta.8e9b829d9",
54
- "@types/parse-numeric-range": "^0.0.1"
53
+ "@docusaurus/module-type-aliases": "2.0.0-beta.9",
54
+ "@types/mdx-js__react": "^1.5.4",
55
+ "@types/parse-numeric-range": "^0.0.1",
56
+ "@types/rtlcss": "^3.1.1",
57
+ "react-test-renderer": "^17.0.2",
58
+ "utility-types": "^3.10.0"
55
59
  },
56
60
  "peerDependencies": {
57
61
  "react": "^16.8.4 || ^17.0.0",
58
62
  "react-dom": "^16.8.4 || ^17.0.0"
59
63
  },
60
64
  "engines": {
61
- "node": ">=12.13.0"
65
+ "node": ">=14"
62
66
  },
63
- "gitHead": "cb79fda03ac12835068842a7e0a86f610974eae2"
67
+ "gitHead": "8a491fc29ad002f90e97f5b5fe4178ac8fa0c4d7"
64
68
  }
@@ -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
  {
@@ -142,7 +145,6 @@ describe('themeConfig', () => {
142
145
  items: [
143
146
  {
144
147
  type: 'doc',
145
- activeSidebarClassName: 'custom-class',
146
148
  docId: 'npm',
147
149
  label: 'NPM',
148
150
  },
@@ -159,8 +161,7 @@ describe('themeConfig', () => {
159
161
  dropdownActiveClassDisabled: true,
160
162
  dropdownItemsBefore: [
161
163
  {
162
- href:
163
- 'https://www.npmjs.com/package/docusaurus?activeTab=versions',
164
+ href: 'https://www.npmjs.com/package/docusaurus?activeTab=versions',
164
165
  label: 'Versions on npm',
165
166
  className: 'npm-styled',
166
167
  target: '_self',
@@ -344,6 +345,27 @@ describe('themeConfig', () => {
344
345
  });
345
346
  });
346
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
+
347
369
  test('should accept valid prism config', () => {
348
370
  const prismConfig = {
349
371
  prism: {
@@ -455,3 +477,131 @@ describe('themeConfig', () => {
455
477
  });
456
478
  });
457
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
+ });
package/src/index.ts CHANGED
@@ -9,12 +9,11 @@ import {DocusaurusContext, Plugin} from '@docusaurus/types';
9
9
  import type {ThemeConfig} from '@docusaurus/theme-common';
10
10
  import {getTranslationFiles, translateThemeConfig} from './translations';
11
11
  import path from 'path';
12
- import Module from 'module';
13
- import type {AcceptedPlugin, Result, Plugin as PostCssPlugin} from 'postcss';
12
+ import {createRequire} from 'module';
13
+ import type {AcceptedPlugin, Plugin as PostCssPlugin} from 'postcss';
14
14
  import rtlcss from 'rtlcss';
15
15
  import {readDefaultCodeTranslationMessages} from '@docusaurus/utils';
16
16
 
17
- const createRequire = Module.createRequire || Module.createRequireFromPath;
18
17
  const requireFromDocusaurusCore = createRequire(
19
18
  require.resolve('@docusaurus/core/package.json'),
20
19
  );
@@ -25,7 +24,10 @@ const ContextReplacementPlugin = requireFromDocusaurusCore(
25
24
  // Need to be inlined to prevent dark mode FOUC
26
25
  // Make sure that the 'storageKey' is the same as the one in `/theme/hooks/useTheme.js`
27
26
  const ThemeStorageKey = 'theme';
28
- const noFlashColorMode = ({defaultMode, respectPrefersColorScheme}) => {
27
+ const noFlashColorMode = ({
28
+ defaultMode,
29
+ respectPrefersColorScheme,
30
+ }: ThemeConfig['colorMode']) => {
29
31
  return `(function() {
30
32
  var defaultMode = '${defaultMode}';
31
33
  var respectPrefersColorScheme = ${respectPrefersColorScheme};
@@ -83,14 +85,14 @@ const AnnouncementBarInlineJavaScript = `
83
85
  document.documentElement.setAttribute('${AnnouncementBarDismissDataAttribute}', isDismissed());
84
86
  })();`;
85
87
 
86
- function getInfimaCSSFile(direction) {
88
+ function getInfimaCSSFile(direction: string) {
87
89
  return `infima/dist/css/default/default${
88
90
  direction === 'rtl' ? '-rtl' : ''
89
91
  }.css`;
90
92
  }
91
93
 
92
- type PluginOptions = {
93
- customCss?: string;
94
+ export type PluginOptions = {
95
+ customCss?: string | string[];
94
96
  };
95
97
 
96
98
  export default function docusaurusThemeClassic(
@@ -183,13 +185,13 @@ export default function docusaurusThemeClassic(
183
185
  const resolvedInfimaFile = require.resolve(getInfimaCSSFile(direction));
184
186
  const plugin: PostCssPlugin = {
185
187
  postcssPlugin: 'RtlCssPlugin',
186
- prepare: (result: Result) => {
188
+ prepare: (result) => {
187
189
  const file = result.root?.source?.input?.file;
188
190
  // Skip Infima as we are using the its RTL version.
189
191
  if (file === resolvedInfimaFile) {
190
192
  return {};
191
193
  }
192
- return rtlcss(result.root);
194
+ return rtlcss(result.root as unknown as rtlcss.ConfigOptions);
193
195
  },
194
196
  };
195
197
  postCssOptions.plugins.push(plugin);
@@ -9,32 +9,28 @@ import React from 'react';
9
9
  import clsx from 'clsx';
10
10
  import {useThemeConfig, useAnnouncementBar} from '@docusaurus/theme-common';
11
11
  import {translate} from '@docusaurus/Translate';
12
+ import IconClose from '@theme/IconClose';
12
13
 
13
14
  import styles from './styles.module.css';
14
15
 
15
16
  function AnnouncementBar(): JSX.Element | null {
16
- const {isClosed, close} = useAnnouncementBar();
17
+ const {isActive, close} = useAnnouncementBar();
17
18
  const {announcementBar} = useThemeConfig();
18
19
 
19
- if (!announcementBar) {
20
+ if (!isActive) {
20
21
  return null;
21
22
  }
22
23
 
23
- const {content, backgroundColor, textColor, isCloseable} = announcementBar;
24
-
25
- if (!content || (isCloseable && isClosed)) {
26
- return null;
27
- }
24
+ const {content, backgroundColor, textColor, isCloseable} = announcementBar!;
28
25
 
29
26
  return (
30
27
  <div
31
28
  className={styles.announcementBar}
32
29
  style={{backgroundColor, color: textColor}}
33
30
  role="banner">
31
+ {isCloseable && <div className={styles.announcementBarPlaceholder} />}
34
32
  <div
35
- className={clsx(styles.announcementBarContent, {
36
- [styles.announcementBarCloseable]: isCloseable,
37
- })}
33
+ className={styles.announcementBarContent}
38
34
  // Developer provided the HTML, so assume it's safe.
39
35
  // eslint-disable-next-line react/no-danger
40
36
  dangerouslySetInnerHTML={{__html: content}}
@@ -42,14 +38,14 @@ function AnnouncementBar(): JSX.Element | null {
42
38
  {isCloseable ? (
43
39
  <button
44
40
  type="button"
45
- className={clsx(styles.announcementBarClose, 'clean-btn')}
41
+ className={clsx('clean-btn close', styles.announcementBarClose)}
46
42
  onClick={close}
47
43
  aria-label={translate({
48
44
  id: 'theme.AnnouncementBar.closeButtonAriaLabel',
49
45
  message: 'Close',
50
46
  description: 'The ARIA label for close button of announcement bar',
51
47
  })}>
52
- <span aria-hidden="true">×</span>
48
+ <IconClose width={14} height={14} strokeWidth={3.1} />
53
49
  </button>
54
50
  ) : null}
55
51
  </div>