diff --git a/packages/docusaurus-theme-classic/src/theme/Layout/index.tsx b/packages/docusaurus-theme-classic/src/theme/Layout/index.tsx
index ccfe381b0eb5..48b3086ec44a 100644
--- a/packages/docusaurus-theme-classic/src/theme/Layout/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/Layout/index.tsx
@@ -28,11 +28,11 @@ function Providers({children}) {
}
function Layout(props: Props): JSX.Element {
- const {siteConfig = {}} = useDocusaurusContext();
+ const {siteConfig} = useDocusaurusContext();
const {
favicon,
title: siteTitle,
- themeConfig: {image: defaultImage},
+ themeConfig: {image: defaultImage, metadatas},
url: siteUrl,
} = siteConfig;
const {
@@ -48,13 +48,11 @@ function Layout(props: Props): JSX.Element {
const metaImage = image || defaultImage;
const metaImageUrl = useBaseUrl(metaImage, {absolute: true});
const faviconUrl = useBaseUrl(favicon);
-
return (
{/* TODO: Do not assume that it is in english language */}
-
{metaTitle &&
{metaTitle}}
{metaTitle && }
{favicon && }
@@ -74,6 +72,19 @@ function Layout(props: Props): JSX.Element {
{permalink && }
+
+ element here,
+ // as it allows react-helmet to override values set in previous
+ // ie we can override default metadatas such as "twitter:card"
+ // In same Head, the same meta would appear twice instead of overriding
+ // See react-helmet doc
+ >
+ {metadatas.map((metadata, i) => (
+
+ ))}
+
+
{children}
diff --git a/packages/docusaurus-theme-classic/src/validateThemeConfig.js b/packages/docusaurus-theme-classic/src/validateThemeConfig.js
index 968e6e37bda7..ca6c51888125 100644
--- a/packages/docusaurus-theme-classic/src/validateThemeConfig.js
+++ b/packages/docusaurus-theme-classic/src/validateThemeConfig.js
@@ -137,6 +137,15 @@ const ColorModeSchema = Joi.object({
}).default(DEFAULT_COLOR_MODE_CONFIG.switchConfig),
}).default(DEFAULT_COLOR_MODE_CONFIG);
+// schema can probably be improved
+const HtmlMetadataSchema = Joi.object({
+ id: Joi.string(),
+ name: Joi.string(),
+ property: Joi.string(),
+ content: Joi.string(),
+ itemprop: Joi.string(),
+}).unknown();
+
const FooterLinkItemSchema = Joi.object({
to: Joi.string(),
href: URISchema,
@@ -164,6 +173,7 @@ const ThemeConfigSchema = Joi.object({
}),
colorMode: ColorModeSchema,
image: Joi.string(),
+ metadatas: Joi.array().items(HtmlMetadataSchema).default([]),
announcementBar: Joi.object({
id: Joi.string().default('announcement-bar'),
content: Joi.string(),
diff --git a/website/docs/theme-classic.md b/website/docs/theme-classic.md
index 769411b915ea..6fed3f709204 100644
--- a/website/docs/theme-classic.md
+++ b/website/docs/theme-classic.md
@@ -85,6 +85,20 @@ module.exports = {
};
```
+### Metadatas
+
+You can configure additional html metadatas (and override existing ones).
+
+```js {4-6} title="docusaurus.config.js"
+module.exports = {
+ // ...
+ themeConfig: {
+ metadatas: [{name: 'twitter:card', content: 'summary'}],
+ // ...
+ },
+};
+```
+
### Announcement bar
Sometimes you want to announce something in your website. Just for such a case, you can add an announcement bar. This is a non-fixed and optionally dismissable panel above the navbar.
diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index a2ce5bdd5045..ee5891776d65 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -228,6 +228,7 @@ module.exports = {
darkTheme: require('prism-react-renderer/themes/dracula'),
},
image: 'img/docusaurus-soc.png',
+ // metadatas: [{name: 'twitter:card', content: 'summary'}],
gtag: {
trackingID: 'UA-141789564-1',
},