diff --git a/packages/docusaurus-plugin-content-blog/index.d.ts b/packages/docusaurus-plugin-content-blog/index.d.ts index e8d2d88889..5fa42268b5 100644 --- a/packages/docusaurus-plugin-content-blog/index.d.ts +++ b/packages/docusaurus-plugin-content-blog/index.d.ts @@ -21,7 +21,7 @@ declare module '@theme/BlogSidebar' { } declare module '@theme/BlogPostPage' { - import type {TOCItem} from '@docusaurus/types'; + import type {FrontMatterTag} from '@docusaurus/utils'; import type {BlogSidebar} from '@theme/BlogSidebar'; export type FrontMatter = { @@ -29,7 +29,7 @@ declare module '@theme/BlogPostPage' { readonly title: string; readonly author?: string; readonly image?: string; - readonly tags?: readonly string[]; + readonly tags?: readonly FrontMatterTag[]; readonly keywords?: readonly string[]; readonly author_url?: string; readonly authorURL?: string; diff --git a/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts b/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts index 1cf3ca72b5..9d21d08fce 100644 --- a/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts +++ b/packages/docusaurus-plugin-content-docs/src/plugin-content-docs.d.ts @@ -171,6 +171,7 @@ declare module '@theme/Seo' { readonly description?: string; readonly keywords?: readonly string[] | string; readonly image?: string; + readonly children?: ReactNode; }; const Seo: (props: Props) => JSX.Element; diff --git a/packages/docusaurus-theme-bootstrap/src/theme/DebugLayout/index.tsx b/packages/docusaurus-theme-bootstrap/src/theme/DebugLayout/index.tsx index 7505ee2c27..3a15c7203e 100644 --- a/packages/docusaurus-theme-bootstrap/src/theme/DebugLayout/index.tsx +++ b/packages/docusaurus-theme-bootstrap/src/theme/DebugLayout/index.tsx @@ -34,7 +34,7 @@ function Layout(props: Props): JSX.Element { const metaImage = image || defaultImage; let metaImageUrl = siteUrl + useBaseUrl(metaImage); if (!isInternalUrl(metaImage)) { - metaImageUrl = metaImage; + metaImageUrl = metaImage as string; } const faviconUrl = useBaseUrl(favicon); diff --git a/packages/docusaurus-theme-bootstrap/src/theme/Layout/index.tsx b/packages/docusaurus-theme-bootstrap/src/theme/Layout/index.tsx index 5182d16c04..2bf345fbdf 100644 --- a/packages/docusaurus-theme-bootstrap/src/theme/Layout/index.tsx +++ b/packages/docusaurus-theme-bootstrap/src/theme/Layout/index.tsx @@ -35,7 +35,7 @@ function Layout(props: Props): JSX.Element { const metaImage = image || defaultImage; let metaImageUrl = siteUrl + useBaseUrl(metaImage); if (!isInternalUrl(metaImage)) { - metaImageUrl = metaImage; + metaImageUrl = metaImage as string; } const faviconUrl = useBaseUrl(favicon); diff --git a/packages/docusaurus-theme-classic/src/theme/BlogPostItem/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogPostItem/index.tsx index fcba24a960..b8062a37c7 100644 --- a/packages/docusaurus-theme-classic/src/theme/BlogPostItem/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/BlogPostItem/index.tsx @@ -13,7 +13,6 @@ import Link from '@docusaurus/Link'; import {useBaseUrlUtils} from '@docusaurus/useBaseUrl'; import {usePluralForm} from '@docusaurus/theme-common'; import MDXComponents from '@theme/MDXComponents'; -import Seo from '@theme/Seo'; import EditThisPage from '@theme/EditThisPage'; import type {Props} from '@theme/BlogPostItem'; @@ -60,7 +59,7 @@ function BlogPostItem(props: Props): JSX.Element { title, editUrl, } = metadata; - const {author, keywords} = frontMatter; + const {author} = frontMatter; const image = frontMatterAssets.image ?? frontMatter.image; @@ -129,63 +128,56 @@ function BlogPostItem(props: Props): JSX.Element { }; return ( - <> - +
+ {renderPostHeader()} -
- {renderPostHeader()} + {image && ( + + )} - {image && ( - - )} +
+ {children} +
-
- {children} -
+ {(tags.length > 0 || truncated) && ( +
+ {tags.length > 0 && ( +
+ +
+ )} - {(tags.length > 0 || truncated) && ( -
- {tags.length > 0 && ( -
- -
- )} + {isBlogPostPage && editUrl && ( +
+ +
+ )} - {isBlogPostPage && editUrl && ( -
- -
- )} - - {!isBlogPostPage && truncated && ( -
- - - - Read More - - - -
- )} -
- )} -
- + {!isBlogPostPage && truncated && ( +
+ + + + Read More + + + +
+ )} + + )} +
); } diff --git a/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx index 455cfa7f48..d6cf19c4c7 100644 --- a/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx @@ -6,6 +6,7 @@ */ import React from 'react'; +import Seo from '@theme/Seo'; import BlogLayout from '@theme/BlogLayout'; import BlogPostItem from '@theme/BlogPostItem'; import BlogPostPaginator from '@theme/BlogPostPaginator'; @@ -15,13 +16,14 @@ import {ThemeClassNames} from '@docusaurus/theme-common'; function BlogPostPage(props: Props): JSX.Element { const {content: BlogPostContents, sidebar} = props; const {frontMatter, frontMatterAssets, metadata} = BlogPostContents; - const {title, description, nextItem, prevItem} = metadata; - const {hide_table_of_contents: hideTableOfContents} = frontMatter; + const {title, description, nextItem, prevItem, date, tags} = metadata; + const {hide_table_of_contents: hideTableOfContents, keywords} = frontMatter; + + const image = frontMatterAssets.image ?? frontMatter.image; + const authorURL = frontMatter.author_url || frontMatter.authorURL; return ( + + + + {authorURL && } + {tags.length > 0 && ( + tag.label).join(',')} + /> + )} + + + {(nextItem || prevItem) && ( )} diff --git a/packages/docusaurus-theme-classic/src/theme/LayoutHead/index.tsx b/packages/docusaurus-theme-classic/src/theme/LayoutHead/index.tsx index 6c3aeff479..59206c00d1 100644 --- a/packages/docusaurus-theme-classic/src/theme/LayoutHead/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/LayoutHead/index.tsx @@ -104,13 +104,14 @@ export default function LayoutHead(props: Props): JSX.Element { {favicon && } {pageTitle} - {image || - (defaultImage && ( - - ))} + - + {/* image can override the default image */} + {defaultImage && } + {image && } + + diff --git a/packages/docusaurus-theme-classic/src/theme/Seo/index.tsx b/packages/docusaurus-theme-classic/src/theme/Seo/index.tsx index 88fa6beb3f..6acdbe0864 100644 --- a/packages/docusaurus-theme-classic/src/theme/Seo/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Seo/index.tsx @@ -7,8 +7,8 @@ import React from 'react'; import Head from '@docusaurus/Head'; -import {useThemeConfig, useTitleFormatter} from '@docusaurus/theme-common'; -import useBaseUrl from '@docusaurus/useBaseUrl'; +import {useTitleFormatter} from '@docusaurus/theme-common'; +import {useBaseUrlUtils} from '@docusaurus/useBaseUrl'; import type {Props} from '@theme/Seo'; @@ -17,10 +17,11 @@ export default function Seo({ description, keywords, image, + children, }: Props): JSX.Element { - const {image: defaultImage} = useThemeConfig(); const pageTitle = useTitleFormatter(title); - const pageImage = useBaseUrl(image || defaultImage, {absolute: true}); + const {withBaseUrl} = useBaseUrlUtils(); + const pageImage = image ? withBaseUrl(image, {absolute: true}) : undefined; return ( @@ -41,6 +42,8 @@ export default function Seo({ {pageImage && } {pageImage && } + + {children} ); } diff --git a/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts b/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts index b33fa2872d..fe192e31b3 100644 --- a/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts +++ b/packages/docusaurus-theme-common/src/utils/useThemeConfig.ts @@ -101,7 +101,7 @@ export type ThemeConfig = { prism: PrismConfig; footer?: Footer; hideableSidebar: boolean; - image: string; + image?: string; metadatas: Array>; sidebarCollapsible: boolean; };