@seqera/docusaurus-theme-seqera 1.0.0
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 +26 -0
- package/package.json +66 -0
- package/src/getSwizzleConfig.ts +433 -0
- package/src/index.ts +154 -0
- package/src/inlineScripts.ts +95 -0
- package/src/inlineSvgSprites.ts +7 -0
- package/src/main-styles.css +322 -0
- package/src/nprogress.css +36 -0
- package/src/nprogress.ts +27 -0
- package/src/options.ts +503 -0
- package/src/prism-include-languages.ts +6 -0
- package/src/styles/api.css +42 -0
- package/src/styles/typography.css +342 -0
- package/src/theme/Admonition/Icon/Danger.tsx +15 -0
- package/src/theme/Admonition/Icon/Info.tsx +15 -0
- package/src/theme/Admonition/Icon/Note.tsx +15 -0
- package/src/theme/Admonition/Icon/Tip.tsx +15 -0
- package/src/theme/Admonition/Icon/Warning.tsx +15 -0
- package/src/theme/Admonition/Layout/index.tsx +53 -0
- package/src/theme/Admonition/Layout/styles.module.css +39 -0
- package/src/theme/Admonition/Type/Caution.tsx +34 -0
- package/src/theme/Admonition/Type/Danger.tsx +32 -0
- package/src/theme/Admonition/Type/Info.tsx +32 -0
- package/src/theme/Admonition/Type/Note.tsx +32 -0
- package/src/theme/Admonition/Type/Tip.tsx +32 -0
- package/src/theme/Admonition/Type/Warning.tsx +32 -0
- package/src/theme/Admonition/Types.tsx +33 -0
- package/src/theme/Admonition/index.tsx +23 -0
- package/src/theme/AdmonitionVersioned/AddedInVersion.tsx +14 -0
- package/src/theme/AdmonitionVersioned/AdmonitionVersioned.tsx +66 -0
- package/src/theme/AdmonitionVersioned/ChangedInVersion.tsx +14 -0
- package/src/theme/AdmonitionVersioned/DeprecatedInVersion.tsx +15 -0
- package/src/theme/AdmonitionVersioned/getStableVersion.ts +30 -0
- package/src/theme/AdmonitionVersioned/index.ts +1 -0
- package/src/theme/AdmonitionVersioned/stableVersions.ts +119 -0
- package/src/theme/AnnouncementBar/CloseButton/index.tsx +24 -0
- package/src/theme/AnnouncementBar/CloseButton/styles.module.css +6 -0
- package/src/theme/AnnouncementBar/Content/index.tsx +21 -0
- package/src/theme/AnnouncementBar/Content/styles.module.css +12 -0
- package/src/theme/AnnouncementBar/index.tsx +37 -0
- package/src/theme/AnnouncementBar/styles.module.css +57 -0
- package/src/theme/BackToTopButton/index.tsx +30 -0
- package/src/theme/BackToTopButton/styles.module.css +39 -0
- package/src/theme/Blog/Components/Author/Socials/index.tsx +75 -0
- package/src/theme/Blog/Components/Author/Socials/styles.module.css +34 -0
- package/src/theme/Blog/Components/Author/index.tsx +98 -0
- package/src/theme/Blog/Components/Author/styles.module.css +69 -0
- package/src/theme/Blog/Pages/BlogAuthorsListPage/index.tsx +57 -0
- package/src/theme/Blog/Pages/BlogAuthorsListPage/styles.module.css +6 -0
- package/src/theme/Blog/Pages/BlogAuthorsPostsPage/index.tsx +77 -0
- package/src/theme/BlogArchivePage/index.tsx +102 -0
- package/src/theme/BlogLayout/index.tsx +31 -0
- package/src/theme/BlogListPage/StructuredData/index.tsx +17 -0
- package/src/theme/BlogListPage/index.tsx +57 -0
- package/src/theme/BlogListPaginator/index.tsx +47 -0
- package/src/theme/BlogPostItem/Container/index.tsx +11 -0
- package/src/theme/BlogPostItem/Content/index.tsx +23 -0
- package/src/theme/BlogPostItem/Footer/ReadMoreLink/index.tsx +39 -0
- package/src/theme/BlogPostItem/Footer/index.tsx +85 -0
- package/src/theme/BlogPostItem/Header/Authors/index.tsx +49 -0
- package/src/theme/BlogPostItem/Header/Authors/styles.module.css +15 -0
- package/src/theme/BlogPostItem/Header/Info/index.tsx +77 -0
- package/src/theme/BlogPostItem/Header/Info/styles.module.css +5 -0
- package/src/theme/BlogPostItem/Header/Title/index.tsx +20 -0
- package/src/theme/BlogPostItem/Header/Title/styles.module.css +14 -0
- package/src/theme/BlogPostItem/Header/index.tsx +16 -0
- package/src/theme/BlogPostItem/index.tsx +27 -0
- package/src/theme/BlogPostItems/index.tsx +25 -0
- package/src/theme/BlogPostPage/Metadata/index.tsx +39 -0
- package/src/theme/BlogPostPage/StructuredData/index.tsx +16 -0
- package/src/theme/BlogPostPage/index.tsx +74 -0
- package/src/theme/BlogPostPaginator/index.tsx +46 -0
- package/src/theme/BlogSidebar/Content/index.tsx +52 -0
- package/src/theme/BlogSidebar/Desktop/index.tsx +52 -0
- package/src/theme/BlogSidebar/Desktop/styles.module.css +46 -0
- package/src/theme/BlogSidebar/Mobile/index.tsx +47 -0
- package/src/theme/BlogSidebar/Mobile/styles.module.css +5 -0
- package/src/theme/BlogSidebar/index.tsx +19 -0
- package/src/theme/BlogTagsListPage/index.tsx +33 -0
- package/src/theme/BlogTagsPostsPage/index.tsx +68 -0
- package/src/theme/CodeBlock/Buttons/Button/index.tsx +14 -0
- package/src/theme/CodeBlock/Buttons/CopyButton/index.tsx +82 -0
- package/src/theme/CodeBlock/Buttons/CopyButton/styles.module.css +42 -0
- package/src/theme/CodeBlock/Buttons/WordWrapButton/index.tsx +40 -0
- package/src/theme/CodeBlock/Buttons/WordWrapButton/styles.module.css +10 -0
- package/src/theme/CodeBlock/Buttons/index.tsx +27 -0
- package/src/theme/CodeBlock/Buttons/styles.module.css +32 -0
- package/src/theme/CodeBlock/Container/index.tsx +27 -0
- package/src/theme/CodeBlock/Container/styles.module.css +9 -0
- package/src/theme/CodeBlock/Content/Element.tsx +24 -0
- package/src/theme/CodeBlock/Content/String.tsx +37 -0
- package/src/theme/CodeBlock/Content/index.tsx +79 -0
- package/src/theme/CodeBlock/Content/styles.module.css +30 -0
- package/src/theme/CodeBlock/Layout/index.tsx +29 -0
- package/src/theme/CodeBlock/Layout/styles.module.css +22 -0
- package/src/theme/CodeBlock/Line/Token/index.tsx +13 -0
- package/src/theme/CodeBlock/Line/index.tsx +61 -0
- package/src/theme/CodeBlock/Line/styles.module.css +47 -0
- package/src/theme/CodeBlock/Title/index.tsx +10 -0
- package/src/theme/CodeBlock/index.tsx +40 -0
- package/src/theme/CodeInline/index.tsx +11 -0
- package/src/theme/ColorModeToggle/index.tsx +140 -0
- package/src/theme/ColorModeToggle/styles.module.css +35 -0
- package/src/theme/ContentVisibility/Draft/index.tsx +22 -0
- package/src/theme/ContentVisibility/Unlisted/index.tsx +37 -0
- package/src/theme/ContentVisibility/index.tsx +20 -0
- package/src/theme/Details/index.tsx +21 -0
- package/src/theme/Details/styles.module.css +8 -0
- package/src/theme/DocBreadcrumbs/Items/Home/index.tsx +29 -0
- package/src/theme/DocBreadcrumbs/Items/Home/styles.module.css +9 -0
- package/src/theme/DocBreadcrumbs/StructuredData/index.tsx +19 -0
- package/src/theme/DocBreadcrumbs/index.tsx +98 -0
- package/src/theme/DocBreadcrumbs/styles.module.css +14 -0
- package/src/theme/DocCard/index.tsx +133 -0
- package/src/theme/DocCard/styles.module.css +29 -0
- package/src/theme/DocCardList/index.tsx +43 -0
- package/src/theme/DocCardList/styles.module.css +9 -0
- package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +68 -0
- package/src/theme/DocCategoryGeneratedIndexPage/styles.module.css +13 -0
- package/src/theme/DocItem/Content/index.tsx +43 -0
- package/src/theme/DocItem/Footer/index.tsx +51 -0
- package/src/theme/DocItem/Layout/index.tsx +66 -0
- package/src/theme/DocItem/Layout/styles.module.css +12 -0
- package/src/theme/DocItem/Metadata/index.tsx +17 -0
- package/src/theme/DocItem/Paginator/index.tsx +20 -0
- package/src/theme/DocItem/TOC/Desktop/index.tsx +19 -0
- package/src/theme/DocItem/TOC/Mobile/index.tsx +22 -0
- package/src/theme/DocItem/TOC/Mobile/styles.module.css +26 -0
- package/src/theme/DocItem/index.tsx +23 -0
- package/src/theme/DocPaginator/index.tsx +46 -0
- package/src/theme/DocRoot/Layout/Main/index.tsx +31 -0
- package/src/theme/DocRoot/Layout/Main/styles.module.css +23 -0
- package/src/theme/DocRoot/Layout/Sidebar/ExpandButton/index.tsx +36 -0
- package/src/theme/DocRoot/Layout/Sidebar/ExpandButton/styles.module.css +29 -0
- package/src/theme/DocRoot/Layout/Sidebar/index.tsx +79 -0
- package/src/theme/DocRoot/Layout/Sidebar/styles.module.css +34 -0
- package/src/theme/DocRoot/Layout/index.tsx +32 -0
- package/src/theme/DocRoot/Layout/styles.module.css +11 -0
- package/src/theme/DocRoot/index.tsx +29 -0
- package/src/theme/DocSidebar/Desktop/CollapseButton/index.tsx +34 -0
- package/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +42 -0
- package/src/theme/DocSidebar/Desktop/Content/index.tsx +56 -0
- package/src/theme/DocSidebar/Desktop/Content/styles.module.css +18 -0
- package/src/theme/DocSidebar/Desktop/index.tsx +36 -0
- package/src/theme/DocSidebar/Desktop/styles.module.css +39 -0
- package/src/theme/DocSidebar/Mobile/index.tsx +49 -0
- package/src/theme/DocSidebar/index.tsx +25 -0
- package/src/theme/DocSidebarItem/Category/index.tsx +309 -0
- package/src/theme/DocSidebarItem/Category/styles.module.css +35 -0
- package/src/theme/DocSidebarItem/Html/index.tsx +30 -0
- package/src/theme/DocSidebarItem/Html/styles.module.css +8 -0
- package/src/theme/DocSidebarItem/Link/index.tsx +62 -0
- package/src/theme/DocSidebarItem/Link/styles.module.css +13 -0
- package/src/theme/DocSidebarItem/index.tsx +19 -0
- package/src/theme/DocSidebarItems/index.tsx +24 -0
- package/src/theme/DocTagDocListPage/index.tsx +113 -0
- package/src/theme/DocTagsListPage/index.tsx +52 -0
- package/src/theme/DocVersionBadge/index.tsx +29 -0
- package/src/theme/DocVersionBanner/index.tsx +171 -0
- package/src/theme/DocVersionRoot/index.tsx +46 -0
- package/src/theme/DocsRoot/index.tsx +17 -0
- package/src/theme/EditMetaRow/index.tsx +31 -0
- package/src/theme/EditMetaRow/styles.module.css +19 -0
- package/src/theme/EditThisPage/index.tsx +21 -0
- package/src/theme/ErrorPageContent.tsx +38 -0
- package/src/theme/Footer/Copyright/index.tsx +15 -0
- package/src/theme/Footer/Layout/index.tsx +42 -0
- package/src/theme/Footer/LinkItem/index.tsx +31 -0
- package/src/theme/Footer/Links/MultiColumn/index.tsx +53 -0
- package/src/theme/Footer/Links/Simple/index.tsx +38 -0
- package/src/theme/Footer/Links/index.tsx +16 -0
- package/src/theme/Footer/Logo/index.tsx +41 -0
- package/src/theme/Footer/Logo/styles.module.css +11 -0
- package/src/theme/Footer/index.tsx +28 -0
- package/src/theme/Heading/index.tsx +50 -0
- package/src/theme/Heading/styles.module.css +17 -0
- package/src/theme/Homepage/index.tsx +178 -0
- package/src/theme/Icon/AI/index.tsx +21 -0
- package/src/theme/Icon/AWS/index.tsx +22 -0
- package/src/theme/Icon/Arrow/index.tsx +15 -0
- package/src/theme/Icon/Azure/index.tsx +28 -0
- package/src/theme/Icon/Changelog/index.tsx +26 -0
- package/src/theme/Icon/ChatBubble/index.tsx +29 -0
- package/src/theme/Icon/ChatBubbles/index.tsx +42 -0
- package/src/theme/Icon/Close/index.tsx +21 -0
- package/src/theme/Icon/Cog/index.tsx +45 -0
- package/src/theme/Icon/Copy/index.tsx +15 -0
- package/src/theme/Icon/DarkMode/index.tsx +15 -0
- package/src/theme/Icon/Edit/index.tsx +24 -0
- package/src/theme/Icon/Edit/styles.module.css +6 -0
- package/src/theme/Icon/Envelope/index.tsx +33 -0
- package/src/theme/Icon/ExternalLink/index.tsx +30 -0
- package/src/theme/Icon/ExternalLink/styles.module.css +5 -0
- package/src/theme/Icon/Fusion/index.tsx +32 -0
- package/src/theme/Icon/GoogleCloud/index.tsx +56 -0
- package/src/theme/Icon/Home/index.tsx +15 -0
- package/src/theme/Icon/Language/index.tsx +24 -0
- package/src/theme/Icon/LightMode/index.tsx +15 -0
- package/src/theme/Icon/MCP/index.tsx +84 -0
- package/src/theme/Icon/Menu/index.tsx +29 -0
- package/src/theme/Icon/MultiQC/index.tsx +25 -0
- package/src/theme/Icon/Nextflow/index.tsx +25 -0
- package/src/theme/Icon/QuestionMark/index.tsx +46 -0
- package/src/theme/Icon/SeqeraCloud/index.tsx +35 -0
- package/src/theme/Icon/SeqeraEnterprise/index.tsx +372 -0
- package/src/theme/Icon/SeqeraLogo/index.tsx +22 -0
- package/src/theme/Icon/ServiceStatus/index.tsx +101 -0
- package/src/theme/Icon/Sidebar/index.tsx +8 -0
- package/src/theme/Icon/Socials/Bluesky/index.tsx +23 -0
- package/src/theme/Icon/Socials/Bluesky/styles.module.css +9 -0
- package/src/theme/Icon/Socials/Default/index.tsx +28 -0
- package/src/theme/Icon/Socials/Email/index.tsx +23 -0
- package/src/theme/Icon/Socials/GitHub/index.tsx +24 -0
- package/src/theme/Icon/Socials/GitHub/styles.module.css +9 -0
- package/src/theme/Icon/Socials/Instagram/index.tsx +23 -0
- package/src/theme/Icon/Socials/Instagram/styles.module.css +9 -0
- package/src/theme/Icon/Socials/LinkedIn/index.tsx +23 -0
- package/src/theme/Icon/Socials/LinkedIn/styles.module.css +9 -0
- package/src/theme/Icon/Socials/Mastodon/index.tsx +40 -0
- package/src/theme/Icon/Socials/StackOverflow/index.tsx +25 -0
- package/src/theme/Icon/Socials/Threads/index.tsx +25 -0
- package/src/theme/Icon/Socials/Threads/styles.module.css +9 -0
- package/src/theme/Icon/Socials/Twitch/index.tsx +32 -0
- package/src/theme/Icon/Socials/Twitter/index.tsx +22 -0
- package/src/theme/Icon/Socials/X/index.tsx +24 -0
- package/src/theme/Icon/Socials/X/styles.module.css +9 -0
- package/src/theme/Icon/Socials/YouTube/index.tsx +22 -0
- package/src/theme/Icon/Success/index.tsx +15 -0
- package/src/theme/Icon/SystemColorMode/index.tsx +15 -0
- package/src/theme/Icon/Wave/index.tsx +32 -0
- package/src/theme/Icon/WordWrap/index.tsx +15 -0
- package/src/theme/LastUpdated/index.tsx +91 -0
- package/src/theme/Layout/Provider/index.tsx +26 -0
- package/src/theme/Layout/index.tsx +59 -0
- package/src/theme/Layout/styles.module.css +23 -0
- package/src/theme/Logo/index.tsx +78 -0
- package/src/theme/MDXComponents/A/index.tsx +16 -0
- package/src/theme/MDXComponents/Button/index.tsx +43 -0
- package/src/theme/MDXComponents/Code.tsx +26 -0
- package/src/theme/MDXComponents/Details.tsx +26 -0
- package/src/theme/MDXComponents/Heading.tsx +9 -0
- package/src/theme/MDXComponents/Img/index.tsx +23 -0
- package/src/theme/MDXComponents/Img/styles.module.css +5 -0
- package/src/theme/MDXComponents/Li.tsx +17 -0
- package/src/theme/MDXComponents/Pre.tsx +10 -0
- package/src/theme/MDXComponents/Ul/index.tsx +25 -0
- package/src/theme/MDXComponents/Ul/styles.module.css +9 -0
- package/src/theme/MDXComponents/index.tsx +47 -0
- package/src/theme/MDXContent/index.tsx +10 -0
- package/src/theme/MDXPage/index.tsx +87 -0
- package/src/theme/MDXPage/styles.module.css +5 -0
- package/src/theme/Mermaid.tsx +11 -0
- package/src/theme/Navbar/ColorModeToggle/index.tsx +29 -0
- package/src/theme/Navbar/ColorModeToggle/styles.module.css +5 -0
- package/src/theme/Navbar/Content/index.tsx +152 -0
- package/src/theme/Navbar/Content/styles.module.css +19 -0
- package/src/theme/Navbar/Layout/index.tsx +59 -0
- package/src/theme/Navbar/Layout/styles.module.css +9 -0
- package/src/theme/Navbar/Logo/index.tsx +14 -0
- package/src/theme/Navbar/MobileSidebar/Header/index.tsx +37 -0
- package/src/theme/Navbar/MobileSidebar/Layout/index.tsx +72 -0
- package/src/theme/Navbar/MobileSidebar/Layout/styles.module.css +11 -0
- package/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx +90 -0
- package/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx +34 -0
- package/src/theme/Navbar/MobileSidebar/Toggle/index.tsx +25 -0
- package/src/theme/Navbar/MobileSidebar/index.tsx +28 -0
- package/src/theme/Navbar/Search/index.tsx +15 -0
- package/src/theme/Navbar/Search/styles.module.css +22 -0
- package/src/theme/Navbar/Submenu/SubmenuLinks.tsx +136 -0
- package/src/theme/Navbar/Submenu/index.tsx +84 -0
- package/src/theme/Navbar/Submenu/styles.module.css +82 -0
- package/src/theme/Navbar/index.tsx +13 -0
- package/src/theme/NavbarItem/ComponentTypes.tsx +27 -0
- package/src/theme/NavbarItem/DefaultNavbarItem/Desktop/index.tsx +29 -0
- package/src/theme/NavbarItem/DefaultNavbarItem/Mobile/index.tsx +18 -0
- package/src/theme/NavbarItem/DefaultNavbarItem/index.tsx +23 -0
- package/src/theme/NavbarItem/DocNavbarItem.tsx +38 -0
- package/src/theme/NavbarItem/DocSidebarNavbarItem.tsx +33 -0
- package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +189 -0
- package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +22 -0
- package/src/theme/NavbarItem/DropdownNavbarItem/Desktop/index.tsx +81 -0
- package/src/theme/NavbarItem/DropdownNavbarItem/Mobile/index.tsx +161 -0
- package/src/theme/NavbarItem/DropdownNavbarItem/Mobile/styles.module.css +5 -0
- package/src/theme/NavbarItem/DropdownNavbarItem/index.tsx +14 -0
- package/src/theme/NavbarItem/HtmlNavbarItem.tsx +27 -0
- package/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx +128 -0
- package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +6 -0
- package/src/theme/NavbarItem/NavbarNavLink.tsx +69 -0
- package/src/theme/NavbarItem/SearchNavbarItem.tsx +21 -0
- package/src/theme/NavbarItem/index.tsx +23 -0
- package/src/theme/NotFound/Content/index.tsx +34 -0
- package/src/theme/NotFound/index.tsx +22 -0
- package/src/theme/PaginatorNavLink/index.tsx +21 -0
- package/src/theme/SearchBar.tsx +8 -0
- package/src/theme/SearchMetadata/index.tsx +38 -0
- package/src/theme/SiteMetadata/index.tsx +153 -0
- package/src/theme/SkipToContent/index.tsx +9 -0
- package/src/theme/SkipToContent/styles.module.css +16 -0
- package/src/theme/TOC/index.tsx +26 -0
- package/src/theme/TOC/styles.module.css +23 -0
- package/src/theme/TOCCollapsible/CollapseButton/index.tsx +30 -0
- package/src/theme/TOCCollapsible/CollapseButton/styles.module.css +27 -0
- package/src/theme/TOCCollapsible/index.tsx +42 -0
- package/src/theme/TOCCollapsible/styles.module.css +26 -0
- package/src/theme/TOCInline/index.tsx +25 -0
- package/src/theme/TOCInline/styles.module.css +7 -0
- package/src/theme/TOCItems/Tree.tsx +40 -0
- package/src/theme/TOCItems/index.tsx +56 -0
- package/src/theme/TabItem/index.tsx +22 -0
- package/src/theme/TabItem/styles.module.css +5 -0
- package/src/theme/Tabs/index.tsx +167 -0
- package/src/theme/Tabs/styles.module.css +9 -0
- package/src/theme/Tag/index.tsx +30 -0
- package/src/theme/Tag/styles.module.css +65 -0
- package/src/theme/TagsListByLetter/index.tsx +40 -0
- package/src/theme/TagsListByLetter/styles.module.css +6 -0
- package/src/theme/TagsListInline/index.tsx +30 -0
- package/src/theme/TagsListInline/styles.module.css +10 -0
- package/src/theme/ThemeProvider/TitleFormatter/index.tsx +22 -0
- package/src/theme/ThemeProvider/index.tsx +9 -0
- package/src/theme/ThemedImage/index.tsx +21 -0
- package/src/theme/ThemedImage/styles.module.css +13 -0
- package/src/theme/pages/Home/index.tsx +19 -0
- package/src/theme/prism-include-languages.ts +39 -0
- package/src/theme-seqera.d.ts +2277 -0
- package/src/translations.ts +240 -0
- package/tailwind.config.js +7 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
|
|
6
|
+
import {ThemeClassNames} from '@docusaurus/theme-common';
|
|
7
|
+
import EditMetaRow from '@theme/EditMetaRow';
|
|
8
|
+
import TagsListInline from '@theme/TagsListInline';
|
|
9
|
+
import ReadMoreLink from '@theme/BlogPostItem/Footer/ReadMoreLink';
|
|
10
|
+
|
|
11
|
+
export default function BlogPostItemFooter(): ReactNode {
|
|
12
|
+
const {metadata, isBlogPostPage} = useBlogPost();
|
|
13
|
+
const {
|
|
14
|
+
tags,
|
|
15
|
+
title,
|
|
16
|
+
editUrl,
|
|
17
|
+
hasTruncateMarker,
|
|
18
|
+
lastUpdatedBy,
|
|
19
|
+
lastUpdatedAt,
|
|
20
|
+
} = metadata;
|
|
21
|
+
|
|
22
|
+
// A post is truncated if it's in the "list view" and it has a truncate marker
|
|
23
|
+
const truncatedPost = !isBlogPostPage && hasTruncateMarker;
|
|
24
|
+
|
|
25
|
+
const tagsExists = tags.length > 0;
|
|
26
|
+
|
|
27
|
+
const renderFooter = tagsExists || truncatedPost || editUrl;
|
|
28
|
+
|
|
29
|
+
if (!renderFooter) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// BlogPost footer - details view
|
|
34
|
+
if (isBlogPostPage) {
|
|
35
|
+
const canDisplayEditMetaRow = !!(editUrl || lastUpdatedAt || lastUpdatedBy);
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<footer className="docusaurus-mt-lg">
|
|
39
|
+
{tagsExists && (
|
|
40
|
+
<div
|
|
41
|
+
className={clsx(
|
|
42
|
+
'row',
|
|
43
|
+
'margin-top--sm',
|
|
44
|
+
ThemeClassNames.blog.blogFooterEditMetaRow,
|
|
45
|
+
)}>
|
|
46
|
+
<div className="col">
|
|
47
|
+
<TagsListInline tags={tags} />
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
)}
|
|
51
|
+
{canDisplayEditMetaRow && (
|
|
52
|
+
<EditMetaRow
|
|
53
|
+
className={clsx(
|
|
54
|
+
'margin-top--sm',
|
|
55
|
+
ThemeClassNames.blog.blogFooterEditMetaRow,
|
|
56
|
+
)}
|
|
57
|
+
editUrl={editUrl}
|
|
58
|
+
lastUpdatedAt={lastUpdatedAt}
|
|
59
|
+
lastUpdatedBy={lastUpdatedBy}
|
|
60
|
+
/>
|
|
61
|
+
)}
|
|
62
|
+
</footer>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
// BlogPost footer - list view
|
|
66
|
+
else {
|
|
67
|
+
return (
|
|
68
|
+
<footer className="row docusaurus-mt-lg">
|
|
69
|
+
{tagsExists && (
|
|
70
|
+
<div className={clsx('col', {'col--9': truncatedPost})}>
|
|
71
|
+
<TagsListInline tags={tags} />
|
|
72
|
+
</div>
|
|
73
|
+
)}
|
|
74
|
+
{truncatedPost && (
|
|
75
|
+
<div
|
|
76
|
+
className={clsx('col text--right', {
|
|
77
|
+
'col--3': tagsExists,
|
|
78
|
+
})}>
|
|
79
|
+
<ReadMoreLink blogPostTitle={title} to={metadata.permalink} />
|
|
80
|
+
</div>
|
|
81
|
+
)}
|
|
82
|
+
</footer>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
|
|
6
|
+
import BlogAuthor from '@theme/Blog/Components/Author';
|
|
7
|
+
import type {Props} from '@theme/BlogPostItem/Header/Authors';
|
|
8
|
+
import styles from './styles.module.css';
|
|
9
|
+
|
|
10
|
+
// Component responsible for the authors layout
|
|
11
|
+
export default function BlogPostItemHeaderAuthors({
|
|
12
|
+
className,
|
|
13
|
+
}: Props): ReactNode {
|
|
14
|
+
const {
|
|
15
|
+
metadata: {authors},
|
|
16
|
+
assets,
|
|
17
|
+
} = useBlogPost();
|
|
18
|
+
const authorsCount = authors.length;
|
|
19
|
+
if (authorsCount === 0) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const imageOnly = authors.every(({name}) => !name);
|
|
23
|
+
const singleAuthor = authors.length === 1;
|
|
24
|
+
return (
|
|
25
|
+
<div
|
|
26
|
+
className={clsx(
|
|
27
|
+
'margin-top--md margin-bottom--sm',
|
|
28
|
+
imageOnly ? styles.imageOnlyAuthorRow : 'row',
|
|
29
|
+
className,
|
|
30
|
+
)}>
|
|
31
|
+
{authors.map((author, idx) => (
|
|
32
|
+
<div
|
|
33
|
+
className={clsx(
|
|
34
|
+
!imageOnly && (singleAuthor ? 'col col--12' : 'col col--6'),
|
|
35
|
+
imageOnly ? styles.imageOnlyAuthorCol : styles.authorCol,
|
|
36
|
+
)}
|
|
37
|
+
key={idx}>
|
|
38
|
+
<BlogAuthor
|
|
39
|
+
author={{
|
|
40
|
+
...author,
|
|
41
|
+
// Handle author images using relative paths
|
|
42
|
+
imageURL: assets.authorsImageUrls[idx] ?? author.imageURL,
|
|
43
|
+
}}
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
))}
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {translate} from '@docusaurus/Translate';
|
|
6
|
+
import {usePluralForm} from '@docusaurus/theme-common';
|
|
7
|
+
import {useDateTimeFormat} from '@docusaurus/theme-common/internal';
|
|
8
|
+
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
|
|
9
|
+
import type {Props} from '@theme/BlogPostItem/Header/Info';
|
|
10
|
+
|
|
11
|
+
import styles from './styles.module.css';
|
|
12
|
+
|
|
13
|
+
// Very simple pluralization: probably good enough for now
|
|
14
|
+
function useReadingTimePlural() {
|
|
15
|
+
const {selectMessage} = usePluralForm();
|
|
16
|
+
return (readingTimeFloat: number) => {
|
|
17
|
+
const readingTime = Math.ceil(readingTimeFloat);
|
|
18
|
+
return selectMessage(
|
|
19
|
+
readingTime,
|
|
20
|
+
translate(
|
|
21
|
+
{
|
|
22
|
+
id: 'theme.blog.post.readingTime.plurals',
|
|
23
|
+
description:
|
|
24
|
+
'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',
|
|
25
|
+
message: 'One min read|{readingTime} min read',
|
|
26
|
+
},
|
|
27
|
+
{readingTime},
|
|
28
|
+
),
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function ReadingTime({readingTime}: {readingTime: number}) {
|
|
34
|
+
const readingTimePlural = useReadingTimePlural();
|
|
35
|
+
return <>{readingTimePlural(readingTime)}</>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function DateTime({
|
|
39
|
+
date,
|
|
40
|
+
formattedDate,
|
|
41
|
+
}: {
|
|
42
|
+
date: string;
|
|
43
|
+
formattedDate: string;
|
|
44
|
+
}) {
|
|
45
|
+
return <time dateTime={date}>{formattedDate}</time>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function Spacer() {
|
|
49
|
+
return <>{' · '}</>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default function BlogPostItemHeaderInfo({className}: Props): ReactNode {
|
|
53
|
+
const {metadata} = useBlogPost();
|
|
54
|
+
const {date, readingTime} = metadata;
|
|
55
|
+
|
|
56
|
+
const dateTimeFormat = useDateTimeFormat({
|
|
57
|
+
day: 'numeric',
|
|
58
|
+
month: 'long',
|
|
59
|
+
year: 'numeric',
|
|
60
|
+
timeZone: 'UTC',
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const formatDate = (blogDate: string) =>
|
|
64
|
+
dateTimeFormat.format(new Date(blogDate));
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<div className={clsx(styles.container, 'margin-vert--md', className)}>
|
|
68
|
+
<DateTime date={date} formattedDate={formatDate(date)} />
|
|
69
|
+
{typeof readingTime !== 'undefined' && (
|
|
70
|
+
<>
|
|
71
|
+
<Spacer />
|
|
72
|
+
<ReadingTime readingTime={readingTime} />
|
|
73
|
+
</>
|
|
74
|
+
)}
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import Link from '@docusaurus/Link';
|
|
6
|
+
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
|
|
7
|
+
import type {Props} from '@theme/BlogPostItem/Header/Title';
|
|
8
|
+
|
|
9
|
+
import styles from './styles.module.css';
|
|
10
|
+
|
|
11
|
+
export default function BlogPostItemHeaderTitle({className}: Props): ReactNode {
|
|
12
|
+
const {metadata, isBlogPostPage} = useBlogPost();
|
|
13
|
+
const {permalink, title} = metadata;
|
|
14
|
+
const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
|
|
15
|
+
return (
|
|
16
|
+
<TitleHeading className={clsx(styles.title, className)}>
|
|
17
|
+
{isBlogPostPage ? title : <Link to={permalink}>{title}</Link>}
|
|
18
|
+
</TitleHeading>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title';
|
|
5
|
+
import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info';
|
|
6
|
+
import BlogPostItemHeaderAuthors from '@theme/BlogPostItem/Header/Authors';
|
|
7
|
+
|
|
8
|
+
export default function BlogPostItemHeader(): ReactNode {
|
|
9
|
+
return (
|
|
10
|
+
<header>
|
|
11
|
+
<BlogPostItemHeaderTitle />
|
|
12
|
+
<BlogPostItemHeaderInfo />
|
|
13
|
+
<BlogPostItemHeaderAuthors />
|
|
14
|
+
</header>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
|
|
6
|
+
import BlogPostItemContainer from '@theme/BlogPostItem/Container';
|
|
7
|
+
import BlogPostItemHeader from '@theme/BlogPostItem/Header';
|
|
8
|
+
import BlogPostItemContent from '@theme/BlogPostItem/Content';
|
|
9
|
+
import BlogPostItemFooter from '@theme/BlogPostItem/Footer';
|
|
10
|
+
import type {Props} from '@theme/BlogPostItem';
|
|
11
|
+
|
|
12
|
+
// apply a bottom margin in list view
|
|
13
|
+
function useContainerClassName() {
|
|
14
|
+
const {isBlogPostPage} = useBlogPost();
|
|
15
|
+
return !isBlogPostPage ? 'margin-bottom--xl' : undefined;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default function BlogPostItem({children, className}: Props): ReactNode {
|
|
19
|
+
const containerClassName = useContainerClassName();
|
|
20
|
+
return (
|
|
21
|
+
<BlogPostItemContainer className={clsx(containerClassName, className)}>
|
|
22
|
+
<BlogPostItemHeader />
|
|
23
|
+
<BlogPostItemContent>{children}</BlogPostItemContent>
|
|
24
|
+
<BlogPostItemFooter />
|
|
25
|
+
</BlogPostItemContainer>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import {BlogPostProvider} from '@docusaurus/plugin-content-blog/client';
|
|
5
|
+
import BlogPostItem from '@theme/BlogPostItem';
|
|
6
|
+
import type {Props} from '@theme/BlogPostItems';
|
|
7
|
+
|
|
8
|
+
export default function BlogPostItems({
|
|
9
|
+
items,
|
|
10
|
+
component: BlogPostItemComponent = BlogPostItem,
|
|
11
|
+
}: Props): ReactNode {
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
{items.map(({content: BlogPostContent}) => (
|
|
15
|
+
<BlogPostProvider
|
|
16
|
+
key={BlogPostContent.metadata.permalink}
|
|
17
|
+
content={BlogPostContent}>
|
|
18
|
+
<BlogPostItemComponent>
|
|
19
|
+
<BlogPostContent />
|
|
20
|
+
</BlogPostItemComponent>
|
|
21
|
+
</BlogPostProvider>
|
|
22
|
+
))}
|
|
23
|
+
</>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import {PageMetadata} from '@docusaurus/theme-common';
|
|
5
|
+
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
|
|
6
|
+
|
|
7
|
+
export default function BlogPostPageMetadata(): ReactNode {
|
|
8
|
+
const {assets, metadata} = useBlogPost();
|
|
9
|
+
const {title, description, date, tags, authors, frontMatter} = metadata;
|
|
10
|
+
|
|
11
|
+
const {keywords} = frontMatter;
|
|
12
|
+
const image = assets.image ?? frontMatter.image;
|
|
13
|
+
return (
|
|
14
|
+
<PageMetadata
|
|
15
|
+
title={frontMatter.title_meta ?? title}
|
|
16
|
+
description={description}
|
|
17
|
+
keywords={keywords}
|
|
18
|
+
image={image}>
|
|
19
|
+
<meta property="og:type" content="article" />
|
|
20
|
+
<meta property="article:published_time" content={date} />
|
|
21
|
+
{/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
|
|
22
|
+
{authors.some((author) => author.url) && (
|
|
23
|
+
<meta
|
|
24
|
+
property="article:author"
|
|
25
|
+
content={authors
|
|
26
|
+
.map((author) => author.url)
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
.join(',')}
|
|
29
|
+
/>
|
|
30
|
+
)}
|
|
31
|
+
{tags.length > 0 && (
|
|
32
|
+
<meta
|
|
33
|
+
property="article:tag"
|
|
34
|
+
content={tags.map((tag) => tag.label).join(',')}
|
|
35
|
+
/>
|
|
36
|
+
)}
|
|
37
|
+
</PageMetadata>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import Head from '@docusaurus/Head';
|
|
5
|
+
import {useBlogPostStructuredData} from '@docusaurus/plugin-content-blog/client';
|
|
6
|
+
|
|
7
|
+
export default function BlogPostStructuredData(): ReactNode {
|
|
8
|
+
const structuredData = useBlogPostStructuredData();
|
|
9
|
+
return (
|
|
10
|
+
<Head>
|
|
11
|
+
<script type="application/ld+json">
|
|
12
|
+
{JSON.stringify(structuredData)}
|
|
13
|
+
</script>
|
|
14
|
+
</Head>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
|
|
6
|
+
import {
|
|
7
|
+
BlogPostProvider,
|
|
8
|
+
useBlogPost,
|
|
9
|
+
} from '@docusaurus/plugin-content-blog/client';
|
|
10
|
+
import BlogLayout from '@theme/BlogLayout';
|
|
11
|
+
import BlogPostItem from '@theme/BlogPostItem';
|
|
12
|
+
import BlogPostPaginator from '@theme/BlogPostPaginator';
|
|
13
|
+
import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata';
|
|
14
|
+
import BlogPostPageStructuredData from '@theme/BlogPostPage/StructuredData';
|
|
15
|
+
import TOC from '@theme/TOC';
|
|
16
|
+
import ContentVisibility from '@theme/ContentVisibility';
|
|
17
|
+
import type {Props} from '@theme/BlogPostPage';
|
|
18
|
+
import type {BlogSidebar} from '@docusaurus/plugin-content-blog';
|
|
19
|
+
|
|
20
|
+
function BlogPostPageContent({
|
|
21
|
+
sidebar,
|
|
22
|
+
children,
|
|
23
|
+
}: {
|
|
24
|
+
sidebar: BlogSidebar;
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}): ReactNode {
|
|
27
|
+
const {metadata, toc} = useBlogPost();
|
|
28
|
+
const {nextItem, prevItem, frontMatter} = metadata;
|
|
29
|
+
const {
|
|
30
|
+
hide_table_of_contents: hideTableOfContents,
|
|
31
|
+
toc_min_heading_level: tocMinHeadingLevel,
|
|
32
|
+
toc_max_heading_level: tocMaxHeadingLevel,
|
|
33
|
+
} = frontMatter;
|
|
34
|
+
return (
|
|
35
|
+
<BlogLayout
|
|
36
|
+
sidebar={sidebar}
|
|
37
|
+
toc={
|
|
38
|
+
!hideTableOfContents && toc.length > 0 ? (
|
|
39
|
+
<TOC
|
|
40
|
+
toc={toc}
|
|
41
|
+
minHeadingLevel={tocMinHeadingLevel}
|
|
42
|
+
maxHeadingLevel={tocMaxHeadingLevel}
|
|
43
|
+
/>
|
|
44
|
+
) : undefined
|
|
45
|
+
}>
|
|
46
|
+
<ContentVisibility metadata={metadata} />
|
|
47
|
+
|
|
48
|
+
<BlogPostItem>{children}</BlogPostItem>
|
|
49
|
+
|
|
50
|
+
{(nextItem || prevItem) && (
|
|
51
|
+
<BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
|
|
52
|
+
)}
|
|
53
|
+
</BlogLayout>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export default function BlogPostPage(props: Props): ReactNode {
|
|
58
|
+
const BlogPostContent = props.content;
|
|
59
|
+
return (
|
|
60
|
+
<BlogPostProvider content={props.content} isBlogPostPage>
|
|
61
|
+
<HtmlClassNameProvider
|
|
62
|
+
className={clsx(
|
|
63
|
+
ThemeClassNames.wrapper.blogPages,
|
|
64
|
+
ThemeClassNames.page.blogPostPage,
|
|
65
|
+
)}>
|
|
66
|
+
<BlogPostPageMetadata />
|
|
67
|
+
<BlogPostPageStructuredData />
|
|
68
|
+
<BlogPostPageContent sidebar={props.sidebar}>
|
|
69
|
+
<BlogPostContent />
|
|
70
|
+
</BlogPostPageContent>
|
|
71
|
+
</HtmlClassNameProvider>
|
|
72
|
+
</BlogPostProvider>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import Translate, {translate} from '@docusaurus/Translate';
|
|
5
|
+
import PaginatorNavLink from '@theme/PaginatorNavLink';
|
|
6
|
+
import type {Props} from '@theme/BlogPostPaginator';
|
|
7
|
+
|
|
8
|
+
export default function BlogPostPaginator(props: Props): ReactNode {
|
|
9
|
+
const {nextItem, prevItem} = props;
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<nav
|
|
13
|
+
className="pagination-nav docusaurus-mt-lg"
|
|
14
|
+
aria-label={translate({
|
|
15
|
+
id: 'theme.blog.post.paginator.navAriaLabel',
|
|
16
|
+
message: 'Blog post page navigation',
|
|
17
|
+
description: 'The ARIA label for the blog posts pagination',
|
|
18
|
+
})}>
|
|
19
|
+
{prevItem && (
|
|
20
|
+
<PaginatorNavLink
|
|
21
|
+
{...prevItem}
|
|
22
|
+
subLabel={
|
|
23
|
+
<Translate
|
|
24
|
+
id="theme.blog.post.paginator.newerPost"
|
|
25
|
+
description="The blog post button label to navigate to the newer/previous post">
|
|
26
|
+
Newer post
|
|
27
|
+
</Translate>
|
|
28
|
+
}
|
|
29
|
+
/>
|
|
30
|
+
)}
|
|
31
|
+
{nextItem && (
|
|
32
|
+
<PaginatorNavLink
|
|
33
|
+
{...nextItem}
|
|
34
|
+
subLabel={
|
|
35
|
+
<Translate
|
|
36
|
+
id="theme.blog.post.paginator.olderPost"
|
|
37
|
+
description="The blog post button label to navigate to the older/next post">
|
|
38
|
+
Older post
|
|
39
|
+
</Translate>
|
|
40
|
+
}
|
|
41
|
+
isNext
|
|
42
|
+
/>
|
|
43
|
+
)}
|
|
44
|
+
</nav>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
|
|
2
|
+
import React, {memo, type ReactNode} from 'react';
|
|
3
|
+
import {useThemeConfig} from '@docusaurus/theme-common';
|
|
4
|
+
import {groupBlogSidebarItemsByYear} from '@docusaurus/plugin-content-blog/client';
|
|
5
|
+
import Heading from '@theme/Heading';
|
|
6
|
+
import type {Props} from '@theme/BlogSidebar/Content';
|
|
7
|
+
|
|
8
|
+
function BlogSidebarYearGroup({
|
|
9
|
+
year,
|
|
10
|
+
yearGroupHeadingClassName,
|
|
11
|
+
children,
|
|
12
|
+
}: {
|
|
13
|
+
year: string;
|
|
14
|
+
yearGroupHeadingClassName?: string;
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
}) {
|
|
17
|
+
return (
|
|
18
|
+
<div role="group">
|
|
19
|
+
<Heading as="h3" className={yearGroupHeadingClassName}>
|
|
20
|
+
{year}
|
|
21
|
+
</Heading>
|
|
22
|
+
{children}
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function BlogSidebarContent({
|
|
28
|
+
items,
|
|
29
|
+
yearGroupHeadingClassName,
|
|
30
|
+
ListComponent,
|
|
31
|
+
}: Props): ReactNode {
|
|
32
|
+
const themeConfig = useThemeConfig();
|
|
33
|
+
if (themeConfig.blog.sidebar.groupByYear) {
|
|
34
|
+
const itemsByYear = groupBlogSidebarItemsByYear(items);
|
|
35
|
+
return (
|
|
36
|
+
<>
|
|
37
|
+
{itemsByYear.map(([year, yearItems]) => (
|
|
38
|
+
<BlogSidebarYearGroup
|
|
39
|
+
key={year}
|
|
40
|
+
year={year}
|
|
41
|
+
yearGroupHeadingClassName={yearGroupHeadingClassName}>
|
|
42
|
+
<ListComponent items={yearItems} />
|
|
43
|
+
</BlogSidebarYearGroup>
|
|
44
|
+
))}
|
|
45
|
+
</>
|
|
46
|
+
);
|
|
47
|
+
} else {
|
|
48
|
+
return <ListComponent items={items} />;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default memo(BlogSidebarContent);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {memo} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {translate} from '@docusaurus/Translate';
|
|
6
|
+
import {
|
|
7
|
+
useVisibleBlogSidebarItems,
|
|
8
|
+
BlogSidebarItemList,
|
|
9
|
+
} from '@docusaurus/plugin-content-blog/client';
|
|
10
|
+
import BlogSidebarContent from '@theme/BlogSidebar/Content';
|
|
11
|
+
import type {Props as BlogSidebarContentProps} from '@theme/BlogSidebar/Content';
|
|
12
|
+
import type {Props} from '@theme/BlogSidebar/Desktop';
|
|
13
|
+
|
|
14
|
+
import styles from './styles.module.css';
|
|
15
|
+
|
|
16
|
+
const ListComponent: BlogSidebarContentProps['ListComponent'] = ({items}) => {
|
|
17
|
+
return (
|
|
18
|
+
<BlogSidebarItemList
|
|
19
|
+
items={items}
|
|
20
|
+
ulClassName={clsx(styles.sidebarItemList, 'clean-list')}
|
|
21
|
+
liClassName={styles.sidebarItem}
|
|
22
|
+
linkClassName={styles.sidebarItemLink}
|
|
23
|
+
linkActiveClassName={styles.sidebarItemLinkActive}
|
|
24
|
+
/>
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function BlogSidebarDesktop({sidebar}: Props) {
|
|
29
|
+
const items = useVisibleBlogSidebarItems(sidebar.items);
|
|
30
|
+
return (
|
|
31
|
+
<aside className={`${styles.sidebarWrapper} col col--3 border-r border-base-content/20`}>
|
|
32
|
+
<nav
|
|
33
|
+
className={clsx(styles.sidebar, 'thin-scrollbar p-6 ')}
|
|
34
|
+
aria-label={translate({
|
|
35
|
+
id: 'theme.blog.sidebar.navAriaLabel',
|
|
36
|
+
message: 'Blog recent posts navigation',
|
|
37
|
+
description: 'The ARIA label for recent posts in the blog sidebar',
|
|
38
|
+
})}>
|
|
39
|
+
<div className={clsx(styles.sidebarItemTitle, 'margin-bottom--md')}>
|
|
40
|
+
{sidebar.title}
|
|
41
|
+
</div>
|
|
42
|
+
<BlogSidebarContent
|
|
43
|
+
items={items}
|
|
44
|
+
ListComponent={ListComponent}
|
|
45
|
+
yearGroupHeadingClassName={styles.yearGroupHeading}
|
|
46
|
+
/>
|
|
47
|
+
</nav>
|
|
48
|
+
</aside>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default memo(BlogSidebarDesktop);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
.sidebarWrapper {
|
|
2
|
+
max-width: var(--doc-sidebar-width);
|
|
3
|
+
}
|
|
4
|
+
.sidebar {
|
|
5
|
+
max-height: calc(100vh - (var(--ifm-navbar-height) + 2rem));
|
|
6
|
+
overflow-y: auto;
|
|
7
|
+
position: sticky;
|
|
8
|
+
top: calc(var(--ifm-navbar-height) + 2rem);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.sidebarItemTitle {
|
|
12
|
+
font-size: var(--ifm-h3-font-size);
|
|
13
|
+
font-weight: var(--ifm-font-weight-bold);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.sidebarItemList {
|
|
17
|
+
font-size: 0.9rem;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.sidebarItem {
|
|
21
|
+
margin-top: 0.7rem;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.sidebarItemLink {
|
|
25
|
+
color: var(--ifm-font-color-base);
|
|
26
|
+
display: block;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.sidebarItemLink:hover {
|
|
30
|
+
text-decoration: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.sidebarItemLinkActive {
|
|
34
|
+
color: var(--ifm-color-primary) !important;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@media (max-width: 996px) {
|
|
38
|
+
.sidebar {
|
|
39
|
+
display: none;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.yearGroupHeading {
|
|
44
|
+
margin-top: 1.6rem;
|
|
45
|
+
margin-bottom: 0.4rem;
|
|
46
|
+
}
|