@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.
- package/README.md +1 -1
- package/codeTranslations/ar.json +12 -6
- package/codeTranslations/base.json +12 -0
- package/codeTranslations/bn.json +6 -0
- package/codeTranslations/cs.json +62 -0
- package/codeTranslations/da.json +6 -0
- package/codeTranslations/de.json +8 -2
- package/codeTranslations/es.json +10 -4
- package/codeTranslations/fa.json +9 -3
- package/codeTranslations/fil.json +6 -0
- package/codeTranslations/fr.json +6 -0
- package/codeTranslations/he.json +6 -0
- package/codeTranslations/hi.json +6 -0
- package/codeTranslations/ja.json +6 -0
- package/codeTranslations/ko.json +6 -0
- package/codeTranslations/pl.json +6 -0
- package/codeTranslations/pt-BR.json +8 -2
- package/codeTranslations/pt-PT.json +6 -0
- package/codeTranslations/ru.json +6 -0
- package/codeTranslations/sr.json +62 -0
- package/codeTranslations/tr.json +9 -3
- package/codeTranslations/vi.json +10 -4
- package/codeTranslations/zh-Hans.json +6 -0
- package/codeTranslations/zh-Hant.json +6 -0
- package/lib/__tests__/validateThemeConfig.test.js +154 -4
- package/lib/index.js +2 -3
- package/lib/prism-include-languages.js +9 -5
- package/lib/theme/AnnouncementBar/index.js +8 -12
- package/lib/theme/AnnouncementBar/styles.module.css +23 -32
- package/lib/theme/BackToTopButton/index.js +27 -13
- package/lib/theme/BackToTopButton/styles.module.css +17 -14
- package/lib/theme/BlogArchivePage/index.js +89 -0
- package/lib/theme/BlogLayout/index.js +2 -6
- package/lib/theme/BlogListPage/index.js +1 -1
- package/lib/theme/BlogPostAuthor/index.js +51 -0
- package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
- package/lib/theme/BlogPostAuthors/index.js +47 -0
- package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
- package/lib/theme/BlogPostItem/index.js +58 -67
- package/lib/theme/BlogPostPage/index.js +33 -4
- package/lib/theme/BlogSidebar/styles.module.css +2 -2
- package/lib/theme/BlogTagsListPage/index.js +3 -28
- package/lib/theme/BlogTagsPostsPage/index.js +5 -8
- package/lib/theme/CodeBlock/index.js +44 -37
- package/lib/theme/CodeBlock/styles.module.css +1 -2
- package/lib/theme/DocItem/index.js +15 -40
- package/lib/theme/DocItem/styles.module.css +2 -12
- package/lib/theme/DocItemFooter/index.js +79 -0
- package/lib/theme/DocItemFooter/styles.module.css +18 -0
- package/lib/theme/DocPage/index.js +18 -13
- package/lib/theme/DocSidebar/index.js +11 -16
- package/lib/theme/DocSidebarItem/index.js +12 -10
- package/lib/theme/DocTagDocListPage/index.js +89 -0
- package/lib/theme/DocTagsListPage/index.js +44 -0
- package/lib/theme/DocVersionBanner/index.js +6 -4
- package/lib/theme/EditThisPage/index.js +3 -1
- package/lib/theme/Footer/index.js +5 -3
- package/lib/theme/Heading/index.js +7 -9
- package/lib/theme/Heading/styles.css +4 -6
- package/lib/theme/Heading/styles.module.css +9 -5
- package/lib/theme/IconClose/index.js +31 -0
- package/lib/theme/LastUpdated/index.js +4 -2
- package/lib/theme/LayoutHead/index.js +13 -11
- package/lib/theme/LayoutProviders/index.js +7 -5
- package/lib/theme/Logo/index.js +14 -12
- package/lib/theme/MDXComponents/index.js +27 -1
- package/lib/theme/MDXComponents/styles.css +11 -0
- package/lib/theme/MDXPage/index.js +2 -1
- package/lib/theme/Navbar/index.js +20 -3
- package/lib/theme/Navbar/styles.module.css +5 -1
- package/lib/theme/NavbarItem/DefaultNavbarItem.js +12 -4
- package/lib/theme/NavbarItem/DocNavbarItem.js +5 -3
- package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +7 -1
- package/lib/theme/NavbarItem/DropdownNavbarItem.js +3 -3
- package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +3 -4
- package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib/theme/NavbarItem/index.js +5 -0
- package/lib/theme/Seo/index.js +10 -7
- package/lib/theme/TOC/index.js +9 -30
- package/lib/theme/TOC/styles.module.css +1 -1
- package/lib/theme/TOCCollapsible/index.js +5 -3
- package/lib/theme/TOCInline/index.js +7 -27
- package/lib/theme/TOCItems/index.js +78 -0
- package/lib/theme/Tabs/__tests__/index.test.js +123 -0
- package/lib/theme/Tabs/index.js +73 -50
- package/lib/theme/Tabs/styles.module.css +0 -13
- package/lib/theme/Tag/index.js +40 -0
- package/lib/theme/Tag/styles.module.css +70 -0
- package/lib/theme/TagsListByLetter/index.js +48 -0
- package/lib/theme/TagsListByLetter/styles.module.css +11 -0
- package/lib/theme/TagsListInline/index.js +44 -0
- package/lib/theme/TagsListInline/styles.module.css +15 -0
- package/lib/theme/ThemedImage/index.js +3 -5
- package/lib/theme/Toggle/index.js +23 -18
- package/lib/theme/Toggle/styles.module.css +91 -0
- package/lib/theme/hooks/useHideableNavbar.js +14 -31
- package/lib/theme/hooks/useTheme.js +2 -2
- package/lib/theme/hooks/useWindowSize.js +2 -7
- package/lib/theme/prism-include-languages.js +4 -3
- package/lib/translations.js +4 -4
- package/lib/types.d.ts +216 -105
- package/lib/validateThemeConfig.js +215 -254
- package/lib-next/__tests__/validateThemeConfig.test.js +154 -4
- package/lib-next/index.js +1 -2
- package/lib-next/prism-include-languages.js +0 -2
- package/lib-next/theme/AnnouncementBar/index.js +7 -12
- package/lib-next/theme/AnnouncementBar/styles.module.css +23 -32
- package/lib-next/theme/BackToTopButton/index.js +37 -17
- package/lib-next/theme/BackToTopButton/styles.module.css +17 -14
- package/lib-next/theme/BlogArchivePage/index.js +80 -0
- package/lib-next/theme/BlogLayout/index.js +4 -7
- package/lib-next/theme/BlogListPage/index.js +1 -0
- package/lib-next/theme/BlogPostAuthor/index.js +46 -0
- package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
- package/lib-next/theme/BlogPostAuthors/index.js +34 -0
- package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
- package/lib-next/theme/BlogPostItem/index.js +79 -86
- package/lib-next/theme/BlogPostPage/index.js +55 -8
- package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
- package/lib-next/theme/BlogTagsListPage/index.js +7 -39
- package/lib-next/theme/BlogTagsPostsPage/index.js +3 -4
- package/lib-next/theme/CodeBlock/index.js +53 -49
- package/lib-next/theme/CodeBlock/styles.module.css +1 -2
- package/lib-next/theme/DocItem/index.js +27 -45
- package/lib-next/theme/DocItem/styles.module.css +2 -12
- package/lib-next/theme/DocItemFooter/index.js +79 -0
- package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
- package/lib-next/theme/DocPage/index.js +18 -14
- package/lib-next/theme/DocSidebar/index.js +18 -15
- package/lib-next/theme/DocSidebarItem/index.js +31 -11
- package/lib-next/theme/DocTagDocListPage/index.js +89 -0
- package/lib-next/theme/DocTagsListPage/index.js +38 -0
- package/lib-next/theme/DocVersionBanner/index.js +16 -9
- package/lib-next/theme/EditThisPage/index.js +6 -1
- package/lib-next/theme/Footer/index.js +14 -3
- package/lib-next/theme/Heading/index.js +10 -13
- package/lib-next/theme/Heading/styles.css +4 -6
- package/lib-next/theme/Heading/styles.module.css +9 -5
- package/lib-next/theme/IconClose/index.js +23 -0
- package/lib-next/theme/LastUpdated/index.js +3 -2
- package/lib-next/theme/LayoutHead/index.js +9 -15
- package/lib-next/theme/LayoutProviders/index.js +8 -5
- package/lib-next/theme/Logo/index.js +23 -19
- package/lib-next/theme/MDXComponents/index.js +20 -1
- package/lib-next/theme/MDXComponents/styles.css +11 -0
- package/lib-next/theme/MDXPage/index.js +10 -2
- package/lib-next/theme/Navbar/index.js +27 -3
- package/lib-next/theme/Navbar/styles.module.css +5 -1
- package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +15 -4
- package/lib-next/theme/NavbarItem/DocNavbarItem.js +5 -3
- package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +12 -4
- package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +4 -6
- package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +2 -6
- package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib-next/theme/NavbarItem/index.js +2 -0
- package/lib-next/theme/Seo/index.js +11 -7
- package/lib-next/theme/TOC/index.js +12 -36
- package/lib-next/theme/TOC/styles.module.css +1 -1
- package/lib-next/theme/TOCCollapsible/index.js +12 -3
- package/lib-next/theme/TOCInline/index.js +10 -28
- package/lib-next/theme/TOCItems/index.js +85 -0
- package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
- package/lib-next/theme/Tabs/index.js +91 -43
- package/lib-next/theme/Tabs/styles.module.css +0 -13
- package/lib-next/theme/Tag/index.js +27 -0
- package/lib-next/theme/Tag/styles.module.css +70 -0
- package/lib-next/theme/TagsListByLetter/index.js +42 -0
- package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
- package/lib-next/theme/TagsListInline/index.js +31 -0
- package/lib-next/theme/TagsListInline/styles.module.css +15 -0
- package/lib-next/theme/ThemedImage/index.js +3 -3
- package/lib-next/theme/Toggle/index.js +20 -15
- package/lib-next/theme/Toggle/styles.module.css +91 -0
- package/lib-next/theme/hooks/useHideableNavbar.js +31 -47
- package/lib-next/theme/hooks/useTheme.js +2 -2
- package/lib-next/theme/hooks/useWindowSize.js +2 -6
- package/lib-next/theme/prism-include-languages.js +2 -1
- package/lib-next/translations.js +6 -10
- package/lib-next/types.d.ts +216 -105
- package/lib-next/validateThemeConfig.js +40 -36
- package/package.json +23 -19
- package/src/__tests__/validateThemeConfig.test.js +154 -4
- package/src/index.ts +11 -9
- package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
- package/src/theme/AnnouncementBar/index.tsx +8 -12
- package/src/theme/AnnouncementBar/styles.module.css +23 -32
- package/src/theme/BackToTopButton/index.tsx +39 -17
- package/src/theme/BackToTopButton/styles.module.css +17 -14
- package/src/theme/BlogArchivePage/index.tsx +91 -0
- package/src/theme/BlogLayout/index.tsx +4 -8
- package/src/theme/BlogListPage/index.tsx +1 -0
- package/src/theme/BlogPostAuthor/index.tsx +49 -0
- package/src/theme/BlogPostAuthor/styles.module.css +12 -0
- package/src/theme/BlogPostAuthors/index.tsx +36 -0
- package/src/theme/BlogPostAuthors/styles.module.css +11 -0
- package/src/theme/BlogPostItem/index.tsx +70 -80
- package/src/theme/BlogPostPage/index.tsx +57 -8
- package/src/theme/BlogSidebar/styles.module.css +2 -2
- package/src/theme/BlogTagsListPage/index.tsx +7 -41
- package/src/theme/BlogTagsPostsPage/index.tsx +3 -4
- package/src/theme/CodeBlock/index.tsx +63 -47
- package/src/theme/CodeBlock/styles.module.css +1 -2
- package/src/theme/DocItem/index.tsx +27 -46
- package/src/theme/DocItem/styles.module.css +2 -12
- package/src/theme/DocItemFooter/index.tsx +91 -0
- package/src/theme/DocItemFooter/styles.module.css +18 -0
- package/src/theme/DocPage/index.tsx +16 -12
- package/src/theme/DocSidebar/index.tsx +20 -16
- package/src/theme/DocSidebarItem/index.tsx +29 -10
- package/src/theme/DocTagDocListPage/index.tsx +89 -0
- package/src/theme/DocTagsListPage/index.tsx +41 -0
- package/src/theme/DocVersionBanner/index.tsx +26 -15
- package/src/theme/EditThisPage/index.tsx +6 -1
- package/src/theme/Footer/index.tsx +16 -3
- package/src/theme/Heading/index.tsx +10 -13
- package/src/theme/Heading/styles.css +4 -6
- package/src/theme/Heading/styles.module.css +9 -5
- package/src/theme/IconClose/index.tsx +26 -0
- package/src/theme/LastUpdated/index.tsx +3 -2
- package/src/theme/LayoutHead/index.tsx +9 -9
- package/src/theme/LayoutProviders/index.tsx +8 -5
- package/src/theme/Logo/index.tsx +19 -15
- package/src/theme/MDXComponents/index.tsx +20 -1
- package/src/theme/MDXComponents/styles.css +11 -0
- package/src/theme/MDXPage/index.tsx +10 -2
- package/src/theme/Navbar/index.tsx +26 -2
- package/src/theme/Navbar/styles.module.css +5 -1
- package/src/theme/NavbarItem/DefaultNavbarItem.tsx +15 -4
- package/src/theme/NavbarItem/DocNavbarItem.tsx +9 -5
- package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +15 -6
- package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
- package/src/theme/NavbarItem/DropdownNavbarItem.tsx +4 -6
- package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +6 -5
- package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/src/theme/NavbarItem/index.tsx +6 -1
- package/src/theme/Seo/index.tsx +7 -4
- package/src/theme/TOC/index.tsx +13 -38
- package/src/theme/TOC/styles.module.css +1 -1
- package/src/theme/TOCCollapsible/index.tsx +8 -2
- package/src/theme/TOCInline/index.tsx +13 -32
- package/src/theme/TOCItems/index.tsx +96 -0
- package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
- package/src/theme/Tabs/index.tsx +93 -49
- package/src/theme/Tabs/styles.module.css +0 -13
- package/src/theme/Tag/index.tsx +31 -0
- package/src/theme/Tag/styles.module.css +70 -0
- package/src/theme/TagsListByLetter/index.tsx +45 -0
- package/src/theme/TagsListByLetter/styles.module.css +11 -0
- package/src/theme/TagsListInline/index.tsx +35 -0
- package/src/theme/TagsListInline/styles.module.css +15 -0
- package/src/theme/ThemedImage/index.tsx +3 -3
- package/src/theme/Toggle/index.tsx +20 -15
- package/src/theme/Toggle/styles.module.css +91 -0
- package/src/theme/hooks/useContextualSearchFilters.ts +1 -1
- package/src/theme/hooks/useHideableNavbar.ts +32 -47
- package/src/theme/hooks/useTabGroupChoice.ts +2 -2
- package/src/theme/hooks/useTheme.ts +2 -2
- package/src/theme/hooks/useWindowSize.ts +2 -7
- package/src/theme/prism-include-languages.ts +3 -2
- package/src/translations.ts +6 -10
- package/src/types.d.ts +216 -105
- package/src/{validateThemeConfig.js → validateThemeConfig.ts} +46 -12
- package/tsconfig.json +0 -1
- package/update-code-translations.js +5 -4
- package/update-code-translations.test.js +1 -1
- package/update.js +151 -0
- package/lib/theme/Toggle/styles.css +0 -103
- package/lib/theme/hooks/useScrollPosition.js +0 -51
- package/lib/theme/hooks/useTOCHighlight.js +0 -87
- package/lib-next/theme/Toggle/styles.css +0 -103
- package/lib-next/theme/hooks/useScrollPosition.js +0 -42
- package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
- package/src/theme/Toggle/styles.css +0 -103
- package/src/theme/hooks/useScrollPosition.ts +0 -52
- 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
|
|
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 {
|
|
15
|
+
const {isActive, close} = useAnnouncementBar();
|
|
15
16
|
const {announcementBar} = useThemeConfig();
|
|
16
17
|
|
|
17
|
-
if (!
|
|
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={
|
|
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(
|
|
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
|
-
<
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
54
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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(--
|
|
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:
|
|
27
|
-
transition: all var(--ifm-transition-fast)
|
|
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:
|
|
33
|
-
|
|
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
|
+
}
|