@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
@@ -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/lib-next/index.js CHANGED
@@ -6,10 +6,9 @@
6
6
  */
7
7
  import {getTranslationFiles, translateThemeConfig} from './translations';
8
8
  import path from 'path';
9
- import Module from 'module';
9
+ import {createRequire} from 'module';
10
10
  import rtlcss from 'rtlcss';
11
11
  import {readDefaultCodeTranslationMessages} from '@docusaurus/utils';
12
- const createRequire = Module.createRequire || Module.createRequireFromPath;
13
12
  const requireFromDocusaurusCore = createRequire(
14
13
  require.resolve('@docusaurus/core/package.json'),
15
14
  );
@@ -4,8 +4,6 @@
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
7
  import Prism from 'prism-react-renderer/prism';
9
8
  import prismIncludeLanguages from '@theme/prism-include-languages';
10
-
11
9
  prismIncludeLanguages(Prism);
@@ -8,22 +8,18 @@ import React from 'react';
8
8
  import clsx from 'clsx';
9
9
  import {useThemeConfig, useAnnouncementBar} from '@docusaurus/theme-common';
10
10
  import {translate} from '@docusaurus/Translate';
11
+ import IconClose from '@theme/IconClose';
11
12
  import styles from './styles.module.css';
12
13
 
13
14
  function AnnouncementBar() {
14
- const {isClosed, close} = useAnnouncementBar();
15
+ const {isActive, close} = useAnnouncementBar();
15
16
  const {announcementBar} = useThemeConfig();
16
17
 
17
- if (!announcementBar) {
18
+ if (!isActive) {
18
19
  return null;
19
20
  }
20
21
 
21
22
  const {content, backgroundColor, textColor, isCloseable} = announcementBar;
22
-
23
- if (!content || (isCloseable && isClosed)) {
24
- return null;
25
- }
26
-
27
23
  return (
28
24
  <div
29
25
  className={styles.announcementBar}
@@ -32,10 +28,9 @@ function AnnouncementBar() {
32
28
  color: textColor,
33
29
  }}
34
30
  role="banner">
31
+ {isCloseable && <div className={styles.announcementBarPlaceholder} />}
35
32
  <div
36
- className={clsx(styles.announcementBarContent, {
37
- [styles.announcementBarCloseable]: isCloseable,
38
- })} // Developer provided the HTML, so assume it's safe.
33
+ className={styles.announcementBarContent} // Developer provided the HTML, so assume it's safe.
39
34
  // eslint-disable-next-line react/no-danger
40
35
  dangerouslySetInnerHTML={{
41
36
  __html: content,
@@ -44,14 +39,14 @@ function AnnouncementBar() {
44
39
  {isCloseable ? (
45
40
  <button
46
41
  type="button"
47
- className={clsx(styles.announcementBarClose, 'clean-btn')}
42
+ className={clsx('clean-btn close', styles.announcementBarClose)}
48
43
  onClick={close}
49
44
  aria-label={translate({
50
45
  id: 'theme.AnnouncementBar.closeButtonAriaLabel',
51
46
  message: 'Close',
52
47
  description: 'The ARIA label for close button of announcement bar',
53
48
  })}>
54
- <span aria-hidden="true">×</span>
49
+ <IconClose width={14} height={14} strokeWidth={3.1} />
55
50
  </button>
56
51
  ) : null}
57
52
  </div>
@@ -10,8 +10,8 @@
10
10
  }
11
11
 
12
12
  .announcementBar {
13
- position: relative;
14
- width: 100%;
13
+ display: flex;
14
+ align-items: center;
15
15
  height: var(--docusaurus-announcement-bar-height);
16
16
  background-color: var(--ifm-color-white);
17
17
  color: var(--ifm-color-black);
@@ -22,47 +22,27 @@ html[data-announcement-bar-initially-dismissed='true'] .announcementBar {
22
22
  display: none;
23
23
  }
24
24
 
25
- @media print {
26
- .announcementBar {
27
- display: none;
28
- }
29
- }
30
-
31
- @media screen and (min-width: 1024px) {
32
- :root {
33
- --docusaurus-announcement-bar-height: 30px;
34
- }
25
+ .announcementBarPlaceholder {
26
+ flex: 0 0 10px;
35
27
  }
36
28
 
37
29
  .announcementBarClose {
38
- position: absolute;
39
- right: 0;
40
- top: 0;
41
- width: 55px;
42
- font-size: 1.25rem;
43
- height: 100%;
30
+ flex: 0 0 30px;
31
+ align-self: stretch;
32
+ padding: 0;
33
+ line-height: 0;
44
34
  }
45
35
 
46
36
  .announcementBarContent {
37
+ flex: 1 1 auto;
47
38
  font-size: 85%;
48
- width: 100%;
49
39
  text-align: center;
50
40
  padding: 5px 0;
51
41
  }
52
42
 
53
- .announcementBarCloseable {
54
- margin-right: 55px;
55
- }
56
-
57
- @media screen and (max-width: 576px) {
58
- .announcementBarClose {
59
- width: 35px;
60
- }
61
- .announcementBarContent {
62
- width: auto;
63
- }
64
- .announcementBarCloseable {
65
- margin-right: 35px;
43
+ @media print {
44
+ .announcementBar {
45
+ display: none;
66
46
  }
67
47
  }
68
48
 
@@ -70,3 +50,14 @@ html[data-announcement-bar-initially-dismissed='true'] .announcementBar {
70
50
  color: inherit;
71
51
  text-decoration: underline;
72
52
  }
53
+
54
+ @media (min-width: 997px) {
55
+ :root {
56
+ --docusaurus-announcement-bar-height: 30px;
57
+ }
58
+
59
+ .announcementBarPlaceholder,
60
+ .announcementBarClose {
61
+ flex-basis: 50px;
62
+ }
63
+ }
@@ -6,8 +6,13 @@
6
6
  */
7
7
  import React, {useRef, useState} from 'react';
8
8
  import clsx from 'clsx';
9
- import useScrollPosition from '@theme/hooks/useScrollPosition';
9
+ import {translate} from '@docusaurus/Translate';
10
10
  import styles from './styles.module.css';
11
+ import {
12
+ ThemeClassNames,
13
+ useScrollPosition,
14
+ useLocationChange,
15
+ } from '@docusaurus/theme-common';
11
16
  const threshold = 300; // Not all have support for smooth scrolling (particularly Safari mobile iOS)
12
17
  // TODO proper detection is currently unreliable!
13
18
  // see https://github.com/wessberg/scroll-behavior-polyfill/issues/16
@@ -58,16 +63,22 @@ function useSmoothScrollToTop() {
58
63
  }
59
64
 
60
65
  function BackToTopButton() {
61
- const {smoothScrollTop, cancelScrollToTop} = useSmoothScrollToTop();
62
66
  const [show, setShow] = useState(false);
67
+ const isFocusedAnchor = useRef(false);
68
+ const {smoothScrollTop, cancelScrollToTop} = useSmoothScrollToTop();
63
69
  useScrollPosition(({scrollY: scrollTop}, lastPosition) => {
64
- // No lastPosition means component is just being mounted.
70
+ const lastScrollTop = lastPosition?.scrollY; // No lastScrollTop means component is just being mounted.
65
71
  // Not really a scroll event from the user, so we ignore it
66
- if (!lastPosition) {
72
+
73
+ if (!lastScrollTop) {
74
+ return;
75
+ }
76
+
77
+ if (isFocusedAnchor.current) {
78
+ isFocusedAnchor.current = false;
67
79
  return;
68
80
  }
69
81
 
70
- const lastScrollTop = lastPosition.scrollY;
71
82
  const isScrollingUp = scrollTop < lastScrollTop;
72
83
 
73
84
  if (!isScrollingUp) {
@@ -89,22 +100,31 @@ function BackToTopButton() {
89
100
  } else {
90
101
  setShow(false);
91
102
  }
92
- }, []);
103
+ });
104
+ useLocationChange((locationChangeEvent) => {
105
+ if (locationChangeEvent.location.hash) {
106
+ isFocusedAnchor.current = true;
107
+ setShow(false);
108
+ }
109
+ });
93
110
  return (
94
111
  <button
95
- className={clsx('clean-btn', styles.backToTopButton, {
96
- [styles.backToTopButtonShow]: show,
112
+ aria-label={translate({
113
+ id: 'theme.BackToTopButton.buttonAriaLabel',
114
+ message: 'Scroll back to top',
115
+ description: 'The ARIA label for the back to top button',
97
116
  })}
117
+ className={clsx(
118
+ 'clean-btn',
119
+ ThemeClassNames.common.backToTopButton,
120
+ styles.backToTopButton,
121
+ {
122
+ [styles.backToTopButtonShow]: show,
123
+ },
124
+ )}
98
125
  type="button"
99
- title="Scroll to top"
100
- onClick={() => smoothScrollTop()}>
101
- <svg viewBox="0 0 24 24" width="28">
102
- <path
103
- d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"
104
- fill="currentColor"
105
- />
106
- </svg>
107
- </button>
126
+ onClick={() => smoothScrollTop()}
127
+ />
108
128
  );
109
129
  }
110
130
 
@@ -5,32 +5,35 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- :root {
9
- --docusaurus-btt-background: var(--ifm-color-primary);
10
- --docusaurus-btt-color: #fff;
11
- }
12
-
13
8
  .backToTopButton {
14
- display: flex;
15
- align-items: center;
16
- justify-content: center;
17
9
  position: fixed;
18
10
  right: 1.3rem;
19
11
  bottom: 1.3rem;
20
12
  border-radius: 50%;
21
- background: var(--docusaurus-btt-background);
22
- color: var(--docusaurus-btt-color);
13
+ background-color: var(--ifm-color-emphasis-200);
23
14
  width: 3rem;
24
15
  height: 3rem;
25
16
  z-index: var(--ifm-z-index-fixed);
26
- box-shadow: 0 0.125rem 0.3125rem 0 rgba(0, 0, 0, 0.3);
27
- transition: all var(--ifm-transition-fast) ease-in-out;
17
+ box-shadow: var(--ifm-global-shadow-lw);
18
+ transition: all var(--ifm-transition-fast)
19
+ var(--ifm-transition-timing-default);
28
20
  opacity: 0;
29
21
  transform: scale(0);
30
22
  }
31
23
 
32
- .backToTopButton:hover {
33
- opacity: 0.8;
24
+ .backToTopButton:after {
25
+ content: ' ';
26
+ display: inline-block;
27
+ mask: var(--ifm-menu-link-sublist-icon) 50% / 2rem 2rem no-repeat;
28
+ background-color: var(--ifm-color-emphasis-1000);
29
+ width: 100%;
30
+ height: 100%;
31
+ }
32
+
33
+ @media (hover: hover) {
34
+ .backToTopButton:hover {
35
+ background-color: var(--ifm-color-emphasis-300);
36
+ }
34
37
  }
35
38
 
36
39
  .backToTopButtonShow {
@@ -0,0 +1,80 @@
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
+ import React from 'react';
8
+ import Layout from '@theme/Layout';
9
+ import Link from '@docusaurus/Link';
10
+ import {translate} from '@docusaurus/Translate';
11
+
12
+ function Year({year, posts}) {
13
+ return (
14
+ <>
15
+ <h3>{year}</h3>
16
+ <ul>
17
+ {posts.map((post) => (
18
+ <li key={post.metadata.date}>
19
+ <Link to={post.metadata.permalink}>
20
+ {post.metadata.formattedDate} - {post.metadata.title}
21
+ </Link>
22
+ </li>
23
+ ))}
24
+ </ul>
25
+ </>
26
+ );
27
+ }
28
+
29
+ function YearsSection({years}) {
30
+ return (
31
+ <section className="margin-vert--lg">
32
+ <div className="container">
33
+ <div className="row">
34
+ {years.map((_props, idx) => (
35
+ <div key={idx} className="col col--4 margin-vert--lg">
36
+ <Year {..._props} />
37
+ </div>
38
+ ))}
39
+ </div>
40
+ </div>
41
+ </section>
42
+ );
43
+ }
44
+
45
+ function listPostsByYears(blogPosts) {
46
+ const postsByYear = blogPosts.reduceRight((posts, post) => {
47
+ const year = post.metadata.date.split('-')[0];
48
+ const yearPosts = posts.get(year) || [];
49
+ return posts.set(year, [post, ...yearPosts]);
50
+ }, new Map());
51
+ return Array.from(postsByYear, ([year, posts]) => ({
52
+ year,
53
+ posts,
54
+ }));
55
+ }
56
+
57
+ export default function BlogArchive({archive}) {
58
+ const title = translate({
59
+ id: 'theme.blog.archive.title',
60
+ message: 'Archive',
61
+ description: 'The page & hero title of the blog archive page',
62
+ });
63
+ const description = translate({
64
+ id: 'theme.blog.archive.description',
65
+ message: 'Archive',
66
+ description: 'The page & hero description of the blog archive page',
67
+ });
68
+ const years = listPostsByYears(archive.blogPosts);
69
+ return (
70
+ <Layout title={title} description={description}>
71
+ <header className="hero hero--primary">
72
+ <div className="container">
73
+ <h1 className="hero__title">{title}</h1>
74
+ <p className="hero__subtitle">{description}</p>
75
+ </div>
76
+ </header>
77
+ <main>{years.length > 0 && <YearsSection years={years} />}</main>
78
+ </Layout>
79
+ );
80
+ }
@@ -8,7 +8,6 @@ import React from 'react';
8
8
  import clsx from 'clsx';
9
9
  import Layout from '@theme/Layout';
10
10
  import BlogSidebar from '@theme/BlogSidebar';
11
- import TOC from '@theme/TOC';
12
11
 
13
12
  function BlogLayout(props) {
14
13
  const {sidebar, toc, children, ...layoutProps} = props;
@@ -26,14 +25,12 @@ function BlogLayout(props) {
26
25
  className={clsx('col', {
27
26
  'col--7': hasSidebar,
28
27
  'col--9 col--offset-1': !hasSidebar,
29
- })}>
28
+ })}
29
+ itemScope
30
+ itemType="http://schema.org/Blog">
30
31
  {children}
31
32
  </main>
32
- {toc && (
33
- <div className="col col--2">
34
- <TOC toc={toc} />
35
- </div>
36
- )}
33
+ {toc && <div className="col col--2">{toc}</div>}
37
34
  </div>
38
35
  </div>
39
36
  </Layout>
@@ -34,6 +34,7 @@ function BlogListPage(props) {
34
34
  <BlogPostItem
35
35
  key={BlogPostContent.metadata.permalink}
36
36
  frontMatter={BlogPostContent.frontMatter}
37
+ assets={BlogPostContent.assets}
37
38
  metadata={BlogPostContent.metadata}
38
39
  truncated={BlogPostContent.metadata.truncated}>
39
40
  <BlogPostContent />
@@ -0,0 +1,46 @@
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
+ import React from 'react';
8
+ import Link from '@docusaurus/Link';
9
+ import styles from './styles.module.css';
10
+
11
+ function BlogPostAuthor({author}) {
12
+ const {name, title, url, imageURL} = author;
13
+ return (
14
+ <div className="avatar margin-bottom--sm">
15
+ {imageURL && (
16
+ <Link className="avatar__photo-link avatar__photo" href={url}>
17
+ <img className={styles.image} src={imageURL} alt={name} />
18
+ </Link>
19
+ )}
20
+
21
+ {
22
+ // Note: only legacy author frontmatter allow empty name (not frontMatter.authors)
23
+ name && (
24
+ <div
25
+ className="avatar__intro"
26
+ itemProp="author"
27
+ itemScope
28
+ itemType="https://schema.org/Person">
29
+ <div className="avatar__name">
30
+ <Link href={url} itemProp="url">
31
+ <span itemProp="name">{name}</span>
32
+ </Link>
33
+ </div>
34
+ {title && (
35
+ <small className="avatar__subtitle" itemProp="description">
36
+ {title}
37
+ </small>
38
+ )}
39
+ </div>
40
+ )
41
+ }
42
+ </div>
43
+ );
44
+ }
45
+
46
+ export default BlogPostAuthor;
@@ -0,0 +1,12 @@
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
+ .image {
9
+ width: 100%;
10
+ height: 100%;
11
+ object-fit: cover;
12
+ }