diff --git a/packages/docusaurus-theme-classic/src/theme/BlogLayout/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogLayout/index.tsx
new file mode 100644
index 0000000000..f99aa4c5f2
--- /dev/null
+++ b/packages/docusaurus-theme-classic/src/theme/BlogLayout/index.tsx
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import React from 'react';
+import clsx from 'clsx';
+
+import Layout from '@theme/Layout';
+import BlogSidebar from '@theme/BlogSidebar';
+import TOC from '@theme/TOC';
+
+import type {Props} from '@theme/BlogLayout';
+
+function BlogLayout(props: Props): JSX.Element {
+ const {sidebar, toc, children, ...layoutProps} = props;
+ const hasSidebar = sidebar && sidebar.items.length > 0;
+
+ return (
+
+
+
+ {hasSidebar && (
+
+ )}
+
+ {children}
+
+ {toc && (
+
+
+
+ )}
+
+
+
+ );
+}
+
+export default BlogLayout;
diff --git a/packages/docusaurus-theme-classic/src/theme/BlogListPage/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogListPage/index.tsx
index 5c6ac3b09c..282c5d4733 100644
--- a/packages/docusaurus-theme-classic/src/theme/BlogListPage/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/BlogListPage/index.tsx
@@ -8,11 +8,10 @@
import React from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
-import Layout from '@theme/Layout';
+import BlogLayout from '@theme/BlogLayout';
import BlogPostItem from '@theme/BlogPostItem';
import BlogListPaginator from '@theme/BlogListPaginator';
import type {Props} from '@theme/BlogListPage';
-import BlogSidebar from '@theme/BlogSidebar';
import {ThemeClassNames} from '@docusaurus/theme-common';
function BlogListPage(props: Props): JSX.Element {
@@ -23,8 +22,9 @@ function BlogListPage(props: Props): JSX.Element {
const {blogDescription, blogTitle, permalink} = metadata;
const isBlogOnlyMode = permalink === '/';
const title = isBlogOnlyMode ? siteTitle : blogTitle;
+
return (
-
-
-
-
-
- {items.map(({content: BlogPostContent}) => (
-
-
-
- ))}
-
-
-
-
-
+ }}
+ sidebar={sidebar}>
+ {items.map(({content: BlogPostContent}) => (
+
+
+
+ ))}
+
+
);
}
diff --git a/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx
index c9558125ef..c2c311c611 100644
--- a/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/BlogPostPage/index.tsx
@@ -6,12 +6,10 @@
*/
import React from 'react';
-import Layout from '@theme/Layout';
+import BlogLayout from '@theme/BlogLayout';
import BlogPostItem from '@theme/BlogPostItem';
import BlogPostPaginator from '@theme/BlogPostPaginator';
import type {Props} from '@theme/BlogPostPage';
-import BlogSidebar from '@theme/BlogSidebar';
-import TOC from '@theme/TOC';
import {ThemeClassNames} from '@docusaurus/theme-common';
function BlogPostPage(props: Props): JSX.Element {
@@ -21,37 +19,27 @@ function BlogPostPage(props: Props): JSX.Element {
const {hide_table_of_contents: hideTableOfContents} = frontMatter;
return (
-
- {BlogPostContents && (
-
-
-
-
-
-
-
- {(nextItem || prevItem) && (
-
- )}
-
- {!hideTableOfContents && BlogPostContents.toc && (
-
-
-
- )}
-
-
+ pageClassName={ThemeClassNames.page.blogPostPage}
+ sidebar={sidebar}
+ toc={
+ !hideTableOfContents && BlogPostContents.toc
+ ? BlogPostContents.toc
+ : undefined
+ }>
+
+
+
+ {(nextItem || prevItem) && (
+
)}
-
+
);
}
diff --git a/packages/docusaurus-theme-classic/src/theme/BlogTagsListPage/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogTagsListPage/index.tsx
index 455d5f1f93..1df05c8feb 100644
--- a/packages/docusaurus-theme-classic/src/theme/BlogTagsListPage/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/BlogTagsListPage/index.tsx
@@ -7,10 +7,9 @@
import React from 'react';
-import Layout from '@theme/Layout';
import Link from '@docusaurus/Link';
+import BlogLayout from '@theme/BlogLayout';
import type {Props} from '@theme/BlogTagsListPage';
-import BlogSidebar from '@theme/BlogSidebar';
import {translate} from '@docusaurus/Translate';
import {ThemeClassNames} from '@docusaurus/theme-common';
@@ -54,26 +53,18 @@ function BlogTagsListPage(props: Props): JSX.Element {
.filter((item) => item != null);
return (
-
-
-
+ }}
+ sidebar={sidebar}>
+
{title}
+
+
);
}
diff --git a/packages/docusaurus-theme-classic/src/theme/BlogTagsPostsPage/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogTagsPostsPage/index.tsx
index 1eff02c0fb..4b2c9d66be 100644
--- a/packages/docusaurus-theme-classic/src/theme/BlogTagsPostsPage/index.tsx
+++ b/packages/docusaurus-theme-classic/src/theme/BlogTagsPostsPage/index.tsx
@@ -7,11 +7,10 @@
import React from 'react';
-import Layout from '@theme/Layout';
-import BlogPostItem from '@theme/BlogPostItem';
import Link from '@docusaurus/Link';
+import BlogLayout from '@theme/BlogLayout';
+import BlogPostItem from '@theme/BlogPostItem';
import type {Props} from '@theme/BlogTagsPostsPage';
-import BlogSidebar from '@theme/BlogSidebar';
import Translate, {translate} from '@docusaurus/Translate';
import {ThemeClassNames, usePluralForm} from '@docusaurus/theme-common';
@@ -47,45 +46,37 @@ function BlogTagsPostPage(props: Props): JSX.Element {
);
return (
-
-
-
-
-
-
- {title}
+ }}
+ sidebar={sidebar}>
+
+ {title}
-
-
- View All Tags
-
-
-
+
+
+ View All Tags
+
+
+
- {items.map(({content: BlogPostContent}) => (
-
-
-
- ))}
-
-
-
-
+ {items.map(({content: BlogPostContent}) => (
+
+
+
+ ))}
+
);
}
diff --git a/packages/docusaurus-theme-classic/src/types.d.ts b/packages/docusaurus-theme-classic/src/types.d.ts
index 158d7b9d39..d568c22f9b 100644
--- a/packages/docusaurus-theme-classic/src/types.d.ts
+++ b/packages/docusaurus-theme-classic/src/types.d.ts
@@ -50,6 +50,20 @@ declare module '@theme/BlogPostPaginator' {
export default BlogPostPaginator;
}
+declare module '@theme/BlogLayout' {
+ import type {Props as LayoutProps} from '@theme/Layout';
+ import type {BlogSidebar} from '@theme/BlogSidebar';
+ import type {TOCItem} from '@docusaurus/types';
+
+ export type Props = LayoutProps & {
+ readonly sidebar?: BlogSidebar;
+ readonly toc?: readonly TOCItem[];
+ };
+
+ const BlogLayout: (props: Props) => JSX.Element;
+ export default BlogLayout;
+}
+
declare module '@theme/CodeBlock' {
export type Props = {
readonly children: string;