@docusaurus/theme-classic 0.0.0-4736 → 0.0.0-4739

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 (35) hide show
  1. package/lib/theme-classic.d.ts +5 -33
  2. package/lib-next/theme/BlogArchivePage/index.js +13 -9
  3. package/lib-next/theme/BlogListPage/index.js +34 -13
  4. package/lib-next/theme/BlogPostPage/index.js +56 -45
  5. package/lib-next/theme/BlogTagsListPage/index.js +16 -12
  6. package/lib-next/theme/BlogTagsPostsPage/index.js +40 -33
  7. package/lib-next/theme/DocCategoryGeneratedIndexPage/index.js +27 -6
  8. package/lib-next/theme/DocItem/index.js +78 -63
  9. package/lib-next/theme/DocPage/index.js +85 -77
  10. package/lib-next/theme/DocPage/styles.module.css +0 -4
  11. package/lib-next/theme/DocTagDocListPage/index.js +38 -31
  12. package/lib-next/theme/DocTagsListPage/index.js +21 -16
  13. package/lib-next/theme/Layout/index.js +15 -10
  14. package/lib-next/theme/MDXPage/index.js +32 -26
  15. package/lib-next/theme/NotFound.js +38 -33
  16. package/lib-next/theme/{LayoutHead → SiteMetadata}/index.js +11 -26
  17. package/package.json +13 -13
  18. package/src/theme/BlogArchivePage/index.tsx +13 -9
  19. package/src/theme/BlogListPage/index.tsx +32 -13
  20. package/src/theme/BlogPostPage/index.tsx +55 -48
  21. package/src/theme/BlogTagsListPage/index.tsx +16 -12
  22. package/src/theme/BlogTagsPostsPage/index.tsx +39 -32
  23. package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +31 -4
  24. package/src/theme/DocItem/index.tsx +65 -52
  25. package/src/theme/DocPage/index.tsx +85 -77
  26. package/src/theme/DocPage/styles.module.css +0 -4
  27. package/src/theme/DocTagDocListPage/index.tsx +38 -30
  28. package/src/theme/DocTagsListPage/index.tsx +21 -16
  29. package/src/theme/Layout/index.tsx +15 -10
  30. package/src/theme/MDXPage/index.tsx +32 -26
  31. package/src/theme/NotFound.tsx +38 -33
  32. package/src/theme/{LayoutHead → SiteMetadata}/index.tsx +11 -25
  33. package/src/theme-classic.d.ts +5 -33
  34. package/lib-next/theme/Seo/index.js +0 -40
  35. package/src/theme/Seo/index.tsx +0 -49
@@ -23,6 +23,7 @@ import {
23
23
  useDocsSidebar,
24
24
  DocsVersionProvider,
25
25
  } from '@docusaurus/theme-common';
26
+ import SearchMetadata from '@theme/SearchMetadata';
26
27
 
27
28
  function DocPageContent({
28
29
  currentDocRoute,
@@ -42,87 +43,89 @@ function DocPageContent({
42
43
  setHiddenSidebarContainer((value) => !value);
43
44
  }, [hiddenSidebar]);
44
45
  return (
45
- <Layout
46
- wrapperClassName={ThemeClassNames.wrapper.docsPages}
47
- pageClassName={ThemeClassNames.page.docsDocPage}
48
- searchMetadata={{
49
- version,
50
- tag: docVersionSearchTag(pluginId, version),
51
- }}>
52
- <div className={styles.docPage}>
53
- <BackToTopButton />
46
+ <>
47
+ <SearchMetadata
48
+ version={version}
49
+ tag={docVersionSearchTag(pluginId, version)}
50
+ />
51
+ <Layout>
52
+ <div className={styles.docPage}>
53
+ <BackToTopButton />
54
54
 
55
- {sidebar && (
56
- <aside
57
- className={clsx(
58
- ThemeClassNames.docs.docSidebarContainer,
59
- styles.docSidebarContainer,
60
- hiddenSidebarContainer && styles.docSidebarContainerHidden,
61
- )}
62
- onTransitionEnd={(e) => {
63
- if (
64
- !e.currentTarget.classList.contains(styles.docSidebarContainer)
65
- ) {
66
- return;
67
- }
55
+ {sidebar && (
56
+ <aside
57
+ className={clsx(
58
+ ThemeClassNames.docs.docSidebarContainer,
59
+ styles.docSidebarContainer,
60
+ hiddenSidebarContainer && styles.docSidebarContainerHidden,
61
+ )}
62
+ onTransitionEnd={(e) => {
63
+ if (
64
+ !e.currentTarget.classList.contains(
65
+ styles.docSidebarContainer,
66
+ )
67
+ ) {
68
+ return;
69
+ }
68
70
 
69
- if (hiddenSidebarContainer) {
70
- setHiddenSidebar(true);
71
- }
72
- }}>
73
- <DocSidebar
74
- key={
75
- // Reset sidebar state on sidebar changes
76
- // See https://github.com/facebook/docusaurus/issues/3414
77
- sidebarName
78
- }
79
- sidebar={sidebar}
80
- path={currentDocRoute.path}
81
- onCollapse={toggleSidebar}
82
- isHidden={hiddenSidebar}
83
- />
71
+ if (hiddenSidebarContainer) {
72
+ setHiddenSidebar(true);
73
+ }
74
+ }}>
75
+ <DocSidebar
76
+ key={
77
+ // Reset sidebar state on sidebar changes
78
+ // See https://github.com/facebook/docusaurus/issues/3414
79
+ sidebarName
80
+ }
81
+ sidebar={sidebar}
82
+ path={currentDocRoute.path}
83
+ onCollapse={toggleSidebar}
84
+ isHidden={hiddenSidebar}
85
+ />
84
86
 
85
- {hiddenSidebar && (
86
- <div
87
- className={styles.collapsedDocSidebar}
88
- title={translate({
89
- id: 'theme.docs.sidebar.expandButtonTitle',
90
- message: 'Expand sidebar',
91
- description:
92
- 'The ARIA label and title attribute for expand button of doc sidebar',
93
- })}
94
- aria-label={translate({
95
- id: 'theme.docs.sidebar.expandButtonAriaLabel',
96
- message: 'Expand sidebar',
97
- description:
98
- 'The ARIA label and title attribute for expand button of doc sidebar',
99
- })}
100
- tabIndex={0}
101
- role="button"
102
- onKeyDown={toggleSidebar}
103
- onClick={toggleSidebar}>
104
- <IconArrow className={styles.expandSidebarButtonIcon} />
105
- </div>
106
- )}
107
- </aside>
108
- )}
109
- <main
110
- className={clsx(
111
- styles.docMainContainer,
112
- (hiddenSidebarContainer || !sidebar) &&
113
- styles.docMainContainerEnhanced,
114
- )}>
115
- <div
87
+ {hiddenSidebar && (
88
+ <div
89
+ className={styles.collapsedDocSidebar}
90
+ title={translate({
91
+ id: 'theme.docs.sidebar.expandButtonTitle',
92
+ message: 'Expand sidebar',
93
+ description:
94
+ 'The ARIA label and title attribute for expand button of doc sidebar',
95
+ })}
96
+ aria-label={translate({
97
+ id: 'theme.docs.sidebar.expandButtonAriaLabel',
98
+ message: 'Expand sidebar',
99
+ description:
100
+ 'The ARIA label and title attribute for expand button of doc sidebar',
101
+ })}
102
+ tabIndex={0}
103
+ role="button"
104
+ onKeyDown={toggleSidebar}
105
+ onClick={toggleSidebar}>
106
+ <IconArrow className={styles.expandSidebarButtonIcon} />
107
+ </div>
108
+ )}
109
+ </aside>
110
+ )}
111
+ <main
116
112
  className={clsx(
117
- 'container padding-top--md padding-bottom--lg',
118
- styles.docItemWrapper,
119
- hiddenSidebarContainer && styles.docItemWrapperEnhanced,
113
+ styles.docMainContainer,
114
+ (hiddenSidebarContainer || !sidebar) &&
115
+ styles.docMainContainerEnhanced,
120
116
  )}>
121
- {children}
122
- </div>
123
- </main>
124
- </div>
125
- </Layout>
117
+ <div
118
+ className={clsx(
119
+ 'container padding-top--md padding-bottom--lg',
120
+ styles.docItemWrapper,
121
+ hiddenSidebarContainer && styles.docItemWrapperEnhanced,
122
+ )}>
123
+ {children}
124
+ </div>
125
+ </main>
126
+ </div>
127
+ </Layout>
128
+ </>
126
129
  );
127
130
  }
128
131
 
@@ -145,7 +148,12 @@ export default function DocPage(props) {
145
148
  ? versionMetadata.docsSidebars[sidebarName]
146
149
  : null;
147
150
  return (
148
- <HtmlClassNameProvider className={versionMetadata.className}>
151
+ <HtmlClassNameProvider
152
+ className={clsx(
153
+ ThemeClassNames.wrapper.docsPages,
154
+ ThemeClassNames.page.docsDocPage,
155
+ versionMetadata.className,
156
+ )}>
149
157
  <DocsVersionProvider version={versionMetadata}>
150
158
  <DocsSidebarProvider sidebar={sidebar ?? null}>
151
159
  <DocPageContent
@@ -10,10 +10,6 @@
10
10
  --doc-sidebar-hidden-width: 30px;
11
11
  }
12
12
 
13
- :global(.docs-wrapper) {
14
- display: flex;
15
- }
16
-
17
13
  .docPage,
18
14
  .docMainContainer {
19
15
  display: flex;
@@ -7,10 +7,16 @@
7
7
  import React from 'react';
8
8
  import Layout from '@theme/Layout';
9
9
  import Link from '@docusaurus/Link';
10
- import {ThemeClassNames, usePluralForm} from '@docusaurus/theme-common';
10
+ import {
11
+ PageMetadata,
12
+ HtmlClassNameProvider,
13
+ ThemeClassNames,
14
+ usePluralForm,
15
+ } from '@docusaurus/theme-common';
11
16
  import Translate, {translate} from '@docusaurus/Translate';
17
+ import SearchMetadata from '@theme/SearchMetadata';
18
+ import clsx from 'clsx'; // Very simple pluralization: probably good enough for now
12
19
 
13
- // Very simple pluralization: probably good enough for now
14
20
  function useNDocsTaggedPlural() {
15
21
  const {selectMessage} = usePluralForm();
16
22
  return (count) =>
@@ -55,35 +61,36 @@ export default function DocTagDocListPage({tag}) {
55
61
  },
56
62
  );
57
63
  return (
58
- <Layout
59
- title={title}
60
- wrapperClassName={ThemeClassNames.wrapper.docsPages}
61
- pageClassName={ThemeClassNames.page.docsTagDocListPage}
62
- searchMetadata={{
63
- // assign unique search tag to exclude this page from search results!
64
- tag: 'doc_tag_doc_list',
65
- }}>
66
- <div className="container margin-vert--lg">
67
- <div className="row">
68
- <main className="col col--8 col--offset-2">
69
- <header className="margin-bottom--xl">
70
- <h1>{title}</h1>
71
- <Link href={tag.allTagsPath}>
72
- <Translate
73
- id="theme.tags.tagsPageLink"
74
- description="The label of the link targeting the tag list page">
75
- View All Tags
76
- </Translate>
77
- </Link>
78
- </header>
79
- <section className="margin-vert--lg">
80
- {tag.docs.map((doc) => (
81
- <DocItem key={doc.id} doc={doc} />
82
- ))}
83
- </section>
84
- </main>
64
+ <HtmlClassNameProvider
65
+ className={clsx(
66
+ ThemeClassNames.wrapper.docsPages,
67
+ ThemeClassNames.page.docsTagDocListPage,
68
+ )}>
69
+ <PageMetadata title={title} />
70
+ <SearchMetadata tag="doc_tag_doc_list" />
71
+ <Layout>
72
+ <div className="container margin-vert--lg">
73
+ <div className="row">
74
+ <main className="col col--8 col--offset-2">
75
+ <header className="margin-bottom--xl">
76
+ <h1>{title}</h1>
77
+ <Link href={tag.allTagsPath}>
78
+ <Translate
79
+ id="theme.tags.tagsPageLink"
80
+ description="The label of the link targeting the tag list page">
81
+ View All Tags
82
+ </Translate>
83
+ </Link>
84
+ </header>
85
+ <section className="margin-vert--lg">
86
+ {tag.docs.map((doc) => (
87
+ <DocItem key={doc.id} doc={doc} />
88
+ ))}
89
+ </section>
90
+ </main>
91
+ </div>
85
92
  </div>
86
- </div>
87
- </Layout>
93
+ </Layout>
94
+ </HtmlClassNameProvider>
88
95
  );
89
96
  }
@@ -7,29 +7,34 @@
7
7
  import React from 'react';
8
8
  import Layout from '@theme/Layout';
9
9
  import {
10
+ PageMetadata,
11
+ HtmlClassNameProvider,
10
12
  ThemeClassNames,
11
13
  translateTagsPageTitle,
12
14
  } from '@docusaurus/theme-common';
13
15
  import TagsListByLetter from '@theme/TagsListByLetter';
16
+ import SearchMetadata from '@theme/SearchMetadata';
17
+ import clsx from 'clsx';
14
18
  export default function DocTagsListPage({tags}) {
15
19
  const title = translateTagsPageTitle();
16
20
  return (
17
- <Layout
18
- title={title}
19
- wrapperClassName={ThemeClassNames.wrapper.docsPages}
20
- pageClassName={ThemeClassNames.page.docsTagsListPage}
21
- searchMetadata={{
22
- // assign unique search tag to exclude this page from search results!
23
- tag: 'doc_tags_list',
24
- }}>
25
- <div className="container margin-vert--lg">
26
- <div className="row">
27
- <main className="col col--8 col--offset-2">
28
- <h1>{title}</h1>
29
- <TagsListByLetter tags={tags} />
30
- </main>
21
+ <HtmlClassNameProvider
22
+ className={clsx(
23
+ ThemeClassNames.wrapper.docsPages,
24
+ ThemeClassNames.page.docsTagsListPage,
25
+ )}>
26
+ <PageMetadata title={title} />
27
+ <SearchMetadata tag="doc_tags_list" />
28
+ <Layout>
29
+ <div className="container margin-vert--lg">
30
+ <div className="row">
31
+ <main className="col col--8 col--offset-2">
32
+ <h1>{title}</h1>
33
+ <TagsListByLetter tags={tags} />
34
+ </main>
35
+ </div>
31
36
  </div>
32
- </div>
33
- </Layout>
37
+ </Layout>
38
+ </HtmlClassNameProvider>
34
39
  );
35
40
  }
@@ -12,16 +12,26 @@ import AnnouncementBar from '@theme/AnnouncementBar';
12
12
  import Navbar from '@theme/Navbar';
13
13
  import Footer from '@theme/Footer';
14
14
  import LayoutProviders from '@theme/LayoutProviders';
15
- import LayoutHead from '@theme/LayoutHead';
16
- import {ThemeClassNames, useKeyboardNavigation} from '@docusaurus/theme-common';
15
+ import {
16
+ PageMetadata,
17
+ ThemeClassNames,
18
+ useKeyboardNavigation,
19
+ } from '@docusaurus/theme-common';
17
20
  import ErrorPageContent from '@theme/ErrorPageContent';
18
21
  import './styles.css';
19
22
  export default function Layout(props) {
20
- const {children, noFooter, wrapperClassName, pageClassName} = props;
23
+ const {
24
+ children,
25
+ noFooter,
26
+ wrapperClassName,
27
+ // not really layout-related, but kept for convenience/retro-compatibility
28
+ title,
29
+ description,
30
+ } = props;
21
31
  useKeyboardNavigation();
22
32
  return (
23
33
  <LayoutProviders>
24
- <LayoutHead {...props} />
34
+ <PageMetadata title={title} description={description} />
25
35
 
26
36
  <SkipToContent />
27
37
 
@@ -29,12 +39,7 @@ export default function Layout(props) {
29
39
 
30
40
  <Navbar />
31
41
 
32
- <div
33
- className={clsx(
34
- ThemeClassNames.wrapper.main,
35
- wrapperClassName,
36
- pageClassName,
37
- )}>
42
+ <div className={clsx(ThemeClassNames.wrapper.main, wrapperClassName)}>
38
43
  <ErrorBoundary fallback={ErrorPageContent}>{children}</ErrorBoundary>
39
44
  </div>
40
45
 
@@ -9,40 +9,46 @@ import clsx from 'clsx';
9
9
  import Layout from '@theme/Layout';
10
10
  import MDXContent from '@theme/MDXContent';
11
11
  import TOC from '@theme/TOC';
12
- import {ThemeClassNames} from '@docusaurus/theme-common';
12
+ import {
13
+ PageMetadata,
14
+ HtmlClassNameProvider,
15
+ ThemeClassNames,
16
+ } from '@docusaurus/theme-common';
13
17
  import styles from './styles.module.css';
14
18
  export default function MDXPage(props) {
15
19
  const {content: MDXPageContent} = props;
16
20
  const {
17
- metadata: {title, description, permalink, frontMatter},
21
+ metadata: {title, description, frontMatter},
18
22
  } = MDXPageContent;
19
23
  const {wrapperClassName, hide_table_of_contents: hideTableOfContents} =
20
24
  frontMatter;
21
25
  return (
22
- <Layout
23
- title={title}
24
- description={description}
25
- permalink={permalink}
26
- wrapperClassName={wrapperClassName ?? ThemeClassNames.wrapper.mdxPages}
27
- pageClassName={ThemeClassNames.page.mdxPage}>
28
- <main className="container container--fluid margin-vert--lg">
29
- <div className={clsx('row', styles.mdxPageWrapper)}>
30
- <div className={clsx('col', !hideTableOfContents && 'col--8')}>
31
- <MDXContent>
32
- <MDXPageContent />
33
- </MDXContent>
34
- </div>
35
- {!hideTableOfContents && MDXPageContent.toc && (
36
- <div className="col col--2">
37
- <TOC
38
- toc={MDXPageContent.toc}
39
- minHeadingLevel={frontMatter.toc_min_heading_level}
40
- maxHeadingLevel={frontMatter.toc_max_heading_level}
41
- />
26
+ <HtmlClassNameProvider
27
+ className={clsx(
28
+ wrapperClassName ?? ThemeClassNames.wrapper.mdxPages,
29
+ ThemeClassNames.page.mdxPage,
30
+ )}>
31
+ <PageMetadata title={title} description={description} />
32
+ <Layout>
33
+ <main className="container container--fluid margin-vert--lg">
34
+ <div className={clsx('row', styles.mdxPageWrapper)}>
35
+ <div className={clsx('col', !hideTableOfContents && 'col--8')}>
36
+ <MDXContent>
37
+ <MDXPageContent />
38
+ </MDXContent>
42
39
  </div>
43
- )}
44
- </div>
45
- </main>
46
- </Layout>
40
+ {!hideTableOfContents && MDXPageContent.toc && (
41
+ <div className="col col--2">
42
+ <TOC
43
+ toc={MDXPageContent.toc}
44
+ minHeadingLevel={frontMatter.toc_min_heading_level}
45
+ maxHeadingLevel={frontMatter.toc_max_heading_level}
46
+ />
47
+ </div>
48
+ )}
49
+ </div>
50
+ </main>
51
+ </Layout>
52
+ </HtmlClassNameProvider>
47
53
  );
48
54
  }
@@ -7,41 +7,46 @@
7
7
  import React from 'react';
8
8
  import Layout from '@theme/Layout';
9
9
  import Translate, {translate} from '@docusaurus/Translate';
10
+ import {PageMetadata} from '@docusaurus/theme-common';
10
11
  export default function NotFound() {
11
12
  return (
12
- <Layout
13
- title={translate({
14
- id: 'theme.NotFound.title',
15
- message: 'Page Not Found',
16
- })}>
17
- <main className="container margin-vert--xl">
18
- <div className="row">
19
- <div className="col col--6 col--offset-3">
20
- <h1 className="hero__title">
21
- <Translate
22
- id="theme.NotFound.title"
23
- description="The title of the 404 page">
24
- Page Not Found
25
- </Translate>
26
- </h1>
27
- <p>
28
- <Translate
29
- id="theme.NotFound.p1"
30
- description="The first paragraph of the 404 page">
31
- We could not find what you were looking for.
32
- </Translate>
33
- </p>
34
- <p>
35
- <Translate
36
- id="theme.NotFound.p2"
37
- description="The 2nd paragraph of the 404 page">
38
- Please contact the owner of the site that linked you to the
39
- original URL and let them know their link is broken.
40
- </Translate>
41
- </p>
13
+ <>
14
+ <PageMetadata
15
+ title={translate({
16
+ id: 'theme.NotFound.title',
17
+ message: 'Page Not Found',
18
+ })}
19
+ />
20
+ <Layout>
21
+ <main className="container margin-vert--xl">
22
+ <div className="row">
23
+ <div className="col col--6 col--offset-3">
24
+ <h1 className="hero__title">
25
+ <Translate
26
+ id="theme.NotFound.title"
27
+ description="The title of the 404 page">
28
+ Page Not Found
29
+ </Translate>
30
+ </h1>
31
+ <p>
32
+ <Translate
33
+ id="theme.NotFound.p1"
34
+ description="The first paragraph of the 404 page">
35
+ We could not find what you were looking for.
36
+ </Translate>
37
+ </p>
38
+ <p>
39
+ <Translate
40
+ id="theme.NotFound.p2"
41
+ description="The 2nd paragraph of the 404 page">
42
+ Please contact the owner of the site that linked you to the
43
+ original URL and let them know their link is broken.
44
+ </Translate>
45
+ </p>
46
+ </div>
42
47
  </div>
43
- </div>
44
- </main>
45
- </Layout>
48
+ </main>
49
+ </Layout>
50
+ </>
46
51
  );
47
52
  }
@@ -9,15 +9,15 @@ import Head from '@docusaurus/Head';
9
9
  import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
10
10
  import useBaseUrl from '@docusaurus/useBaseUrl';
11
11
  import SearchMetadata from '@theme/SearchMetadata';
12
- import Seo from '@theme/Seo';
13
12
  import {
13
+ PageMetadata,
14
14
  DEFAULT_SEARCH_TAG,
15
- useTitleFormatter,
16
15
  useAlternatePageUtils,
17
16
  useThemeConfig,
18
17
  keyboardFocusedClassName,
19
18
  } from '@docusaurus/theme-common';
20
- import {useLocation} from '@docusaurus/router'; // Useful for SEO
19
+ import {useLocation} from '@docusaurus/router'; // TODO move to SiteMetadataDefaults or theme-common ?
20
+ // Useful for i18n/SEO
21
21
  // See https://developers.google.com/search/docs/advanced/crawling/localized-versions
22
22
  // See https://github.com/facebook/docusaurus/issues/3317
23
23
 
@@ -59,7 +59,7 @@ function useDefaultCanonicalUrl() {
59
59
  } = useDocusaurusContext();
60
60
  const {pathname} = useLocation();
61
61
  return siteUrl + useBaseUrl(pathname);
62
- }
62
+ } // TODO move to SiteMetadataDefaults or theme-common ?
63
63
 
64
64
  function CanonicalUrlHeaders({permalink}) {
65
65
  const {
@@ -77,44 +77,29 @@ function CanonicalUrlHeaders({permalink}) {
77
77
  );
78
78
  }
79
79
 
80
- export default function LayoutHead(props) {
80
+ export default function SiteMetadata() {
81
81
  const {
82
- siteConfig: {favicon},
83
- i18n: {currentLocale, localeConfigs},
84
- } = useDocusaurusContext();
82
+ i18n: {currentLocale},
83
+ } = useDocusaurusContext(); // TODO maybe move these 2 themeConfig to siteConfig?
84
+ // These seems useful for other themes as well
85
+
85
86
  const {metadata, image: defaultImage} = useThemeConfig();
86
- const {title, description, image, keywords, searchMetadata} = props;
87
- const faviconUrl = useBaseUrl(favicon);
88
- const pageTitle = useTitleFormatter(title);
89
- const {htmlLang, direction: htmlDir} = localeConfigs[currentLocale];
90
87
  return (
91
88
  <>
92
89
  <Head>
93
- <html lang={htmlLang} dir={htmlDir} />
94
- {favicon && <link rel="icon" href={faviconUrl} />}
95
- <title>{pageTitle}</title>
96
- <meta property="og:title" content={pageTitle} />
97
90
  <meta name="twitter:card" content="summary_large_image" />
98
91
  {/* The keyboard focus class name need to be applied when SSR so links
99
92
  are outlined when JS is disabled */}
100
93
  <body className={keyboardFocusedClassName} />
101
94
  </Head>
102
95
 
103
- {/* image can override the default image */}
104
- {defaultImage && <Seo image={defaultImage} />}
105
- {image && <Seo image={image} />}
106
-
107
- <Seo description={description} keywords={keywords} />
96
+ {defaultImage && <PageMetadata image={defaultImage} />}
108
97
 
109
98
  <CanonicalUrlHeaders />
110
99
 
111
100
  <AlternateLangHeaders />
112
101
 
113
- <SearchMetadata
114
- tag={DEFAULT_SEARCH_TAG}
115
- locale={currentLocale}
116
- {...searchMetadata}
117
- />
102
+ <SearchMetadata tag={DEFAULT_SEARCH_TAG} locale={currentLocale} />
118
103
 
119
104
  <Head // it's important to have an additional <Head> element here,
120
105
  // as it allows react-helmet to override values set in previous <Head>