@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,34 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--docusaurus-blog-social-icon-size: 1rem;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.authorSocials {
|
|
8
|
+
/*
|
|
9
|
+
This ensures that container takes height even if there's no social link
|
|
10
|
+
This keeps author names aligned even if only some have socials
|
|
11
|
+
*/
|
|
12
|
+
height: var(--docusaurus-blog-social-icon-size);
|
|
13
|
+
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-wrap: wrap;
|
|
16
|
+
align-items: center;
|
|
17
|
+
line-height: 0;
|
|
18
|
+
overflow: hidden;
|
|
19
|
+
line-clamp: 1;
|
|
20
|
+
-webkit-line-clamp: 1;
|
|
21
|
+
-webkit-box-orient: vertical;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.authorSocialLink {
|
|
25
|
+
height: var(--docusaurus-blog-social-icon-size);
|
|
26
|
+
width: var(--docusaurus-blog-social-icon-size);
|
|
27
|
+
line-height: 0;
|
|
28
|
+
margin-right: 0.4rem;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.authorSocialIcon {
|
|
32
|
+
width: var(--docusaurus-blog-social-icon-size);
|
|
33
|
+
height: var(--docusaurus-blog-social-icon-size);
|
|
34
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import Link, {type Props as LinkProps} from '@docusaurus/Link';
|
|
6
|
+
import AuthorSocials from '@theme/Blog/Components/Author/Socials';
|
|
7
|
+
import type {Props} from '@theme/Blog/Components/Author';
|
|
8
|
+
import Heading from '@theme/Heading';
|
|
9
|
+
import styles from './styles.module.css';
|
|
10
|
+
|
|
11
|
+
function MaybeLink(props: LinkProps): ReactNode {
|
|
12
|
+
if (props.href) {
|
|
13
|
+
return <Link {...props} />;
|
|
14
|
+
}
|
|
15
|
+
return <>{props.children}</>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function AuthorTitle({title}: {title: string}) {
|
|
19
|
+
return (
|
|
20
|
+
<small className={styles.authorTitle} title={title}>
|
|
21
|
+
{title}
|
|
22
|
+
</small>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function AuthorName({name, as}: {name: string; as: Props['as']}) {
|
|
27
|
+
if (!as) {
|
|
28
|
+
return (
|
|
29
|
+
<span className={styles.authorName} translate="no">
|
|
30
|
+
{name}
|
|
31
|
+
</span>
|
|
32
|
+
);
|
|
33
|
+
} else {
|
|
34
|
+
return (
|
|
35
|
+
<Heading as={as} className={styles.authorName} translate="no">
|
|
36
|
+
{name}
|
|
37
|
+
</Heading>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function AuthorBlogPostCount({count}: {count: number}) {
|
|
43
|
+
return <span className={clsx(styles.authorBlogPostCount)}>{count}</span>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Note: in the future we might want to have multiple "BlogAuthor" components
|
|
47
|
+
// Creating different display modes with the "as" prop may not be the best idea
|
|
48
|
+
// Explainer: https://kyleshevlin.com/prefer-multiple-compositions/
|
|
49
|
+
// For now, we almost use the same design for all cases, so it's good enough
|
|
50
|
+
export default function BlogAuthor({
|
|
51
|
+
as,
|
|
52
|
+
author,
|
|
53
|
+
className,
|
|
54
|
+
count,
|
|
55
|
+
}: Props): ReactNode {
|
|
56
|
+
const {name, title, url, imageURL, email, page} = author;
|
|
57
|
+
const link =
|
|
58
|
+
page?.permalink || url || (email && `mailto:${email}`) || undefined;
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
<div
|
|
62
|
+
className={clsx(
|
|
63
|
+
'avatar margin-bottom--sm',
|
|
64
|
+
className,
|
|
65
|
+
styles[`author-as-${as}`],
|
|
66
|
+
)}>
|
|
67
|
+
{imageURL && (
|
|
68
|
+
<MaybeLink href={link} className="avatar__photo-link">
|
|
69
|
+
<img
|
|
70
|
+
className={clsx('avatar__photo', styles.authorImage)}
|
|
71
|
+
src={imageURL}
|
|
72
|
+
alt={name}
|
|
73
|
+
/>
|
|
74
|
+
</MaybeLink>
|
|
75
|
+
)}
|
|
76
|
+
|
|
77
|
+
{(name || title) && (
|
|
78
|
+
<div className={clsx('avatar__intro', styles.authorDetails)}>
|
|
79
|
+
<div className="avatar__name">
|
|
80
|
+
{name && (
|
|
81
|
+
<MaybeLink href={link}>
|
|
82
|
+
<AuthorName name={name} as={as} />
|
|
83
|
+
</MaybeLink>
|
|
84
|
+
)}
|
|
85
|
+
{count !== undefined && <AuthorBlogPostCount count={count} />}
|
|
86
|
+
</div>
|
|
87
|
+
{!!title && <AuthorTitle title={title} />}
|
|
88
|
+
|
|
89
|
+
{/*
|
|
90
|
+
We always render AuthorSocials even if there's none
|
|
91
|
+
This keeps other things aligned with flexbox layout
|
|
92
|
+
*/}
|
|
93
|
+
<AuthorSocials author={author} />
|
|
94
|
+
</div>
|
|
95
|
+
)}
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
.authorImage {
|
|
4
|
+
--ifm-avatar-photo-size: 3.6rem;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.author-as-h1 .authorImage {
|
|
8
|
+
--ifm-avatar-photo-size: 7rem;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.author-as-h2 .authorImage {
|
|
12
|
+
--ifm-avatar-photo-size: 5.4rem;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.authorDetails {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
align-items: flex-start;
|
|
19
|
+
justify-content: space-around;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.authorName {
|
|
23
|
+
font-size: 1.1rem;
|
|
24
|
+
line-height: 1.1rem;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: row;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.author-as-h1 .authorName {
|
|
30
|
+
font-size: 2.4rem;
|
|
31
|
+
line-height: 2.4rem;
|
|
32
|
+
display: inline;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.author-as-h2 .authorName {
|
|
36
|
+
font-size: 1.4rem;
|
|
37
|
+
line-height: 1.4rem;
|
|
38
|
+
display: inline;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.authorTitle {
|
|
42
|
+
font-size: 0.8rem;
|
|
43
|
+
line-height: 1rem;
|
|
44
|
+
display: -webkit-box;
|
|
45
|
+
overflow: hidden;
|
|
46
|
+
line-clamp: 1;
|
|
47
|
+
-webkit-line-clamp: 1;
|
|
48
|
+
-webkit-box-orient: vertical;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.author-as-h1 .authorTitle {
|
|
52
|
+
font-size: 1.2rem;
|
|
53
|
+
line-height: 1.6rem;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.author-as-h2 .authorTitle {
|
|
57
|
+
font-size: 1rem;
|
|
58
|
+
line-height: 1.3rem;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.authorBlogPostCount {
|
|
62
|
+
background: var(--ifm-color-secondary);
|
|
63
|
+
color: var(--ifm-color-black);
|
|
64
|
+
font-size: 0.8rem;
|
|
65
|
+
line-height: 1.2;
|
|
66
|
+
border-radius: var(--ifm-global-radius);
|
|
67
|
+
padding: 0.1rem 0.4rem;
|
|
68
|
+
margin-left: 0.3rem;
|
|
69
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
|
|
2
|
+
import React, {type ReactNode} from 'react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import {
|
|
5
|
+
PageMetadata,
|
|
6
|
+
HtmlClassNameProvider,
|
|
7
|
+
ThemeClassNames,
|
|
8
|
+
} from '@docusaurus/theme-common';
|
|
9
|
+
import {translateBlogAuthorsListPageTitle} from '@docusaurus/theme-common/internal';
|
|
10
|
+
import BlogLayout from '@theme/BlogLayout';
|
|
11
|
+
import type {Props} from '@theme/Blog/Pages/BlogAuthorsListPage';
|
|
12
|
+
import SearchMetadata from '@theme/SearchMetadata';
|
|
13
|
+
import Heading from '@theme/Heading';
|
|
14
|
+
import Author from '@theme/Blog/Components/Author';
|
|
15
|
+
import type {AuthorItemProp} from '@docusaurus/plugin-content-blog';
|
|
16
|
+
import styles from './styles.module.css';
|
|
17
|
+
|
|
18
|
+
function AuthorListItem({author}: {author: AuthorItemProp}) {
|
|
19
|
+
return (
|
|
20
|
+
<li className={styles.authorListItem}>
|
|
21
|
+
<Author as="h2" author={author} count={author.count} />
|
|
22
|
+
</li>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function AuthorsList({authors}: {authors: Props['authors']}) {
|
|
27
|
+
return (
|
|
28
|
+
<section className={clsx('margin-vert--lg', styles.authorsListSection)}>
|
|
29
|
+
<ul>
|
|
30
|
+
{authors.map((author) => (
|
|
31
|
+
<AuthorListItem key={author.key} author={author} />
|
|
32
|
+
))}
|
|
33
|
+
</ul>
|
|
34
|
+
</section>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export default function BlogAuthorsListPage({
|
|
39
|
+
authors,
|
|
40
|
+
sidebar,
|
|
41
|
+
}: Props): ReactNode {
|
|
42
|
+
const title: string = translateBlogAuthorsListPageTitle();
|
|
43
|
+
return (
|
|
44
|
+
<HtmlClassNameProvider
|
|
45
|
+
className={clsx(
|
|
46
|
+
ThemeClassNames.wrapper.blogPages,
|
|
47
|
+
ThemeClassNames.page.blogAuthorsListPage,
|
|
48
|
+
)}>
|
|
49
|
+
<PageMetadata title={title} />
|
|
50
|
+
<SearchMetadata tag="blog_authors_list" />
|
|
51
|
+
<BlogLayout sidebar={sidebar}>
|
|
52
|
+
<Heading as="h1">{title}</Heading>
|
|
53
|
+
<AuthorsList authors={authors} />
|
|
54
|
+
</BlogLayout>
|
|
55
|
+
</HtmlClassNameProvider>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {
|
|
6
|
+
PageMetadata,
|
|
7
|
+
HtmlClassNameProvider,
|
|
8
|
+
ThemeClassNames,
|
|
9
|
+
} from '@docusaurus/theme-common';
|
|
10
|
+
import {
|
|
11
|
+
useBlogAuthorPageTitle,
|
|
12
|
+
BlogAuthorsListViewAllLabel,
|
|
13
|
+
BlogAuthorNoPostsLabel,
|
|
14
|
+
} from '@docusaurus/theme-common/internal';
|
|
15
|
+
import Link from '@docusaurus/Link';
|
|
16
|
+
import {useBlogMetadata} from '@docusaurus/plugin-content-blog/client';
|
|
17
|
+
import BlogLayout from '@theme/BlogLayout';
|
|
18
|
+
import BlogListPaginator from '@theme/BlogListPaginator';
|
|
19
|
+
import SearchMetadata from '@theme/SearchMetadata';
|
|
20
|
+
import type {Props} from '@theme/Blog/Pages/BlogAuthorsPostsPage';
|
|
21
|
+
import BlogPostItems from '@theme/BlogPostItems';
|
|
22
|
+
import Author from '@theme/Blog/Components/Author';
|
|
23
|
+
|
|
24
|
+
function Metadata({author}: Props): ReactNode {
|
|
25
|
+
const title = useBlogAuthorPageTitle(author);
|
|
26
|
+
return (
|
|
27
|
+
<>
|
|
28
|
+
<PageMetadata title={title} />
|
|
29
|
+
<SearchMetadata tag="blog_authors_posts" />
|
|
30
|
+
</>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function ViewAllAuthorsLink() {
|
|
35
|
+
const {authorsListPath} = useBlogMetadata();
|
|
36
|
+
return (
|
|
37
|
+
<Link href={authorsListPath}>
|
|
38
|
+
<BlogAuthorsListViewAllLabel />
|
|
39
|
+
</Link>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function Content({author, items, sidebar, listMetadata}: Props): ReactNode {
|
|
44
|
+
return (
|
|
45
|
+
<BlogLayout sidebar={sidebar}>
|
|
46
|
+
<header className="margin-bottom--xl">
|
|
47
|
+
<Author as="h1" author={author} />
|
|
48
|
+
{author.description && <p>{author.description}</p>}
|
|
49
|
+
<ViewAllAuthorsLink />
|
|
50
|
+
</header>
|
|
51
|
+
{items.length === 0 ? (
|
|
52
|
+
<p>
|
|
53
|
+
<BlogAuthorNoPostsLabel />
|
|
54
|
+
</p>
|
|
55
|
+
) : (
|
|
56
|
+
<>
|
|
57
|
+
<hr />
|
|
58
|
+
<BlogPostItems items={items} />
|
|
59
|
+
<BlogListPaginator metadata={listMetadata} />
|
|
60
|
+
</>
|
|
61
|
+
)}
|
|
62
|
+
</BlogLayout>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export default function BlogAuthorsPostsPage(props: Props): ReactNode {
|
|
67
|
+
return (
|
|
68
|
+
<HtmlClassNameProvider
|
|
69
|
+
className={clsx(
|
|
70
|
+
ThemeClassNames.wrapper.blogPages,
|
|
71
|
+
ThemeClassNames.page.blogAuthorsPostsPage,
|
|
72
|
+
)}>
|
|
73
|
+
<Metadata {...props} />
|
|
74
|
+
<Content {...props} />
|
|
75
|
+
</HtmlClassNameProvider>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import Link from '@docusaurus/Link';
|
|
5
|
+
import {translate} from '@docusaurus/Translate';
|
|
6
|
+
import {PageMetadata} from '@docusaurus/theme-common';
|
|
7
|
+
import {useDateTimeFormat} from '@docusaurus/theme-common/internal';
|
|
8
|
+
import Layout from '@theme/Layout';
|
|
9
|
+
import type {ArchiveBlogPost, Props} from '@theme/BlogArchivePage';
|
|
10
|
+
import Heading from '@theme/Heading';
|
|
11
|
+
|
|
12
|
+
type YearProp = {
|
|
13
|
+
year: string;
|
|
14
|
+
posts: ArchiveBlogPost[];
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
function Year({year, posts}: YearProp) {
|
|
18
|
+
const dateTimeFormat = useDateTimeFormat({
|
|
19
|
+
day: 'numeric',
|
|
20
|
+
month: 'long',
|
|
21
|
+
timeZone: 'UTC',
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const formatDate = (lastUpdated: string) =>
|
|
25
|
+
dateTimeFormat.format(new Date(lastUpdated));
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<>
|
|
29
|
+
<Heading as="h3" id={year}>
|
|
30
|
+
{year}
|
|
31
|
+
</Heading>
|
|
32
|
+
<ul>
|
|
33
|
+
{posts.map((post) => (
|
|
34
|
+
<li key={post.metadata.date}>
|
|
35
|
+
<Link to={post.metadata.permalink}>
|
|
36
|
+
{formatDate(post.metadata.date)} - {post.metadata.title}
|
|
37
|
+
</Link>
|
|
38
|
+
</li>
|
|
39
|
+
))}
|
|
40
|
+
</ul>
|
|
41
|
+
</>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function YearsSection({years}: {years: YearProp[]}) {
|
|
46
|
+
return (
|
|
47
|
+
<section className="margin-vert--lg">
|
|
48
|
+
<div className="container">
|
|
49
|
+
<div className="row">
|
|
50
|
+
{years.map((_props, idx) => (
|
|
51
|
+
<div key={idx} className="col col--4 margin-vert--lg">
|
|
52
|
+
<Year {..._props} />
|
|
53
|
+
</div>
|
|
54
|
+
))}
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</section>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function listPostsByYears(blogPosts: readonly ArchiveBlogPost[]): YearProp[] {
|
|
62
|
+
const postsByYear = blogPosts.reduce((posts, post) => {
|
|
63
|
+
const year = post.metadata.date.split('-')[0]!;
|
|
64
|
+
const yearPosts = posts.get(year) ?? [];
|
|
65
|
+
return posts.set(year, [post, ...yearPosts]);
|
|
66
|
+
}, new Map<string, ArchiveBlogPost[]>());
|
|
67
|
+
|
|
68
|
+
return Array.from(postsByYear, ([year, posts]) => ({
|
|
69
|
+
year,
|
|
70
|
+
posts,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export default function BlogArchive({archive}: Props): ReactNode {
|
|
75
|
+
const title = translate({
|
|
76
|
+
id: 'theme.blog.archive.title',
|
|
77
|
+
message: 'Archive',
|
|
78
|
+
description: 'The page & hero title of the blog archive page',
|
|
79
|
+
});
|
|
80
|
+
const description = translate({
|
|
81
|
+
id: 'theme.blog.archive.description',
|
|
82
|
+
message: 'Archive',
|
|
83
|
+
description: 'The page & hero description of the blog archive page',
|
|
84
|
+
});
|
|
85
|
+
const years = listPostsByYears(archive.blogPosts);
|
|
86
|
+
return (
|
|
87
|
+
<>
|
|
88
|
+
<PageMetadata title={title} description={description} />
|
|
89
|
+
<Layout>
|
|
90
|
+
<header className="hero hero--primary">
|
|
91
|
+
<div className="container">
|
|
92
|
+
<Heading as="h1" className="hero__title">
|
|
93
|
+
{title}
|
|
94
|
+
</Heading>
|
|
95
|
+
<p className="hero__subtitle">{description}</p>
|
|
96
|
+
</div>
|
|
97
|
+
</header>
|
|
98
|
+
<main>{years.length > 0 && <YearsSection years={years} />}</main>
|
|
99
|
+
</Layout>
|
|
100
|
+
</>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import Layout from '@theme/Layout';
|
|
6
|
+
import BlogSidebar from '@theme/BlogSidebar';
|
|
7
|
+
|
|
8
|
+
import type {Props} from '@theme/BlogLayout';
|
|
9
|
+
|
|
10
|
+
export default function BlogLayout(props: Props): ReactNode {
|
|
11
|
+
const {sidebar, toc, children, ...layoutProps} = props;
|
|
12
|
+
const hasSidebar = sidebar && sidebar.items.length > 0;
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<Layout {...layoutProps}>
|
|
16
|
+
<div className="container">
|
|
17
|
+
<div className="row">
|
|
18
|
+
<BlogSidebar sidebar={sidebar} />
|
|
19
|
+
<main
|
|
20
|
+
className={clsx('prose__wrapper col p-6', {
|
|
21
|
+
'col--7': hasSidebar,
|
|
22
|
+
'col--9 col--offset-1': !hasSidebar,
|
|
23
|
+
})}>
|
|
24
|
+
{children}
|
|
25
|
+
</main>
|
|
26
|
+
{toc && <div className="col col--2">{toc}</div>}
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</Layout>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import Head from '@docusaurus/Head';
|
|
5
|
+
import {useBlogListPageStructuredData} from '@docusaurus/plugin-content-blog/client';
|
|
6
|
+
import type {Props} from '@theme/BlogListPage/StructuredData';
|
|
7
|
+
|
|
8
|
+
export default function BlogListPageStructuredData(props: Props): ReactNode {
|
|
9
|
+
const structuredData = useBlogListPageStructuredData(props);
|
|
10
|
+
return (
|
|
11
|
+
<Head>
|
|
12
|
+
<script type="application/ld+json">
|
|
13
|
+
{JSON.stringify(structuredData)}
|
|
14
|
+
</script>
|
|
15
|
+
</Head>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
|
|
6
|
+
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
|
7
|
+
import {
|
|
8
|
+
PageMetadata,
|
|
9
|
+
HtmlClassNameProvider,
|
|
10
|
+
ThemeClassNames,
|
|
11
|
+
} from '@docusaurus/theme-common';
|
|
12
|
+
import BlogLayout from '@theme/BlogLayout';
|
|
13
|
+
import BlogListPaginator from '@theme/BlogListPaginator';
|
|
14
|
+
import SearchMetadata from '@theme/SearchMetadata';
|
|
15
|
+
import type {Props} from '@theme/BlogListPage';
|
|
16
|
+
import BlogPostItems from '@theme/BlogPostItems';
|
|
17
|
+
import BlogListPageStructuredData from '@theme/BlogListPage/StructuredData';
|
|
18
|
+
|
|
19
|
+
function BlogListPageMetadata(props: Props): ReactNode {
|
|
20
|
+
const {metadata} = props;
|
|
21
|
+
const {
|
|
22
|
+
siteConfig: {title: siteTitle},
|
|
23
|
+
} = useDocusaurusContext();
|
|
24
|
+
const {blogDescription, blogTitle, permalink} = metadata;
|
|
25
|
+
const isBlogOnlyMode = permalink === '/';
|
|
26
|
+
const title = isBlogOnlyMode ? siteTitle : blogTitle;
|
|
27
|
+
return (
|
|
28
|
+
<>
|
|
29
|
+
<PageMetadata title={title} description={blogDescription} />
|
|
30
|
+
<SearchMetadata tag="blog_posts_list" />
|
|
31
|
+
</>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function BlogListPageContent(props: Props): ReactNode {
|
|
36
|
+
const {metadata, items, sidebar} = props;
|
|
37
|
+
return (
|
|
38
|
+
<BlogLayout sidebar={sidebar}>
|
|
39
|
+
<BlogPostItems items={items} />
|
|
40
|
+
<BlogListPaginator metadata={metadata} />
|
|
41
|
+
</BlogLayout>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default function BlogListPage(props: Props): ReactNode {
|
|
46
|
+
return (
|
|
47
|
+
<HtmlClassNameProvider
|
|
48
|
+
className={clsx(
|
|
49
|
+
ThemeClassNames.wrapper.blogPages,
|
|
50
|
+
ThemeClassNames.page.blogListPage,
|
|
51
|
+
)}>
|
|
52
|
+
<BlogListPageMetadata {...props} />
|
|
53
|
+
<BlogListPageStructuredData {...props} />
|
|
54
|
+
<BlogListPageContent {...props} />
|
|
55
|
+
</HtmlClassNameProvider>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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/BlogListPaginator';
|
|
7
|
+
|
|
8
|
+
export default function BlogListPaginator(props: Props): ReactNode {
|
|
9
|
+
const {metadata} = props;
|
|
10
|
+
const {previousPage, nextPage} = metadata;
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<nav
|
|
14
|
+
className="pagination-nav"
|
|
15
|
+
aria-label={translate({
|
|
16
|
+
id: 'theme.blog.paginator.navAriaLabel',
|
|
17
|
+
message: 'Blog list page navigation',
|
|
18
|
+
description: 'The ARIA label for the blog pagination',
|
|
19
|
+
})}>
|
|
20
|
+
{previousPage && (
|
|
21
|
+
<PaginatorNavLink
|
|
22
|
+
permalink={previousPage}
|
|
23
|
+
title={
|
|
24
|
+
<Translate
|
|
25
|
+
id="theme.blog.paginator.newerEntries"
|
|
26
|
+
description="The label used to navigate to the newer blog posts page (previous page)">
|
|
27
|
+
Newer entries
|
|
28
|
+
</Translate>
|
|
29
|
+
}
|
|
30
|
+
/>
|
|
31
|
+
)}
|
|
32
|
+
{nextPage && (
|
|
33
|
+
<PaginatorNavLink
|
|
34
|
+
permalink={nextPage}
|
|
35
|
+
title={
|
|
36
|
+
<Translate
|
|
37
|
+
id="theme.blog.paginator.olderEntries"
|
|
38
|
+
description="The label used to navigate to the older blog posts page (next page)">
|
|
39
|
+
Older entries
|
|
40
|
+
</Translate>
|
|
41
|
+
}
|
|
42
|
+
isNext
|
|
43
|
+
/>
|
|
44
|
+
)}
|
|
45
|
+
</nav>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import type {Props} from '@theme/BlogPostItem/Container';
|
|
5
|
+
|
|
6
|
+
export default function BlogPostItemContainer({
|
|
7
|
+
children,
|
|
8
|
+
className,
|
|
9
|
+
}: Props): ReactNode {
|
|
10
|
+
return <article className={className}>{children}</article>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import {blogPostContainerID} from '@docusaurus/utils-common';
|
|
6
|
+
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
|
|
7
|
+
import MDXContent from '@theme/MDXContent';
|
|
8
|
+
import type {Props} from '@theme/BlogPostItem/Content';
|
|
9
|
+
|
|
10
|
+
export default function BlogPostItemContent({
|
|
11
|
+
children,
|
|
12
|
+
className,
|
|
13
|
+
}: Props): ReactNode {
|
|
14
|
+
const {isBlogPostPage} = useBlogPost();
|
|
15
|
+
return (
|
|
16
|
+
<div
|
|
17
|
+
// This ID is used for the feed generation to locate the main content
|
|
18
|
+
id={isBlogPostPage ? blogPostContainerID : undefined}
|
|
19
|
+
className={clsx('markdown', className)}>
|
|
20
|
+
<MDXContent>{children}</MDXContent>
|
|
21
|
+
</div>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import Translate, {translate} from '@docusaurus/Translate';
|
|
5
|
+
import Link from '@docusaurus/Link';
|
|
6
|
+
import type {Props} from '@theme/BlogPostItem/Footer/ReadMoreLink';
|
|
7
|
+
|
|
8
|
+
function ReadMoreLabel() {
|
|
9
|
+
return (
|
|
10
|
+
<b>
|
|
11
|
+
<Translate
|
|
12
|
+
id="theme.blog.post.readMore"
|
|
13
|
+
description="The label used in blog post item excerpts to link to full blog posts">
|
|
14
|
+
Read more
|
|
15
|
+
</Translate>
|
|
16
|
+
</b>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default function BlogPostItemFooterReadMoreLink(
|
|
21
|
+
props: Props,
|
|
22
|
+
): ReactNode {
|
|
23
|
+
const {blogPostTitle, ...linkProps} = props;
|
|
24
|
+
return (
|
|
25
|
+
<Link
|
|
26
|
+
aria-label={translate(
|
|
27
|
+
{
|
|
28
|
+
message: 'Read more about {title}',
|
|
29
|
+
id: 'theme.blog.post.readMoreLabel',
|
|
30
|
+
description:
|
|
31
|
+
'The ARIA label for the link to full blog posts from excerpts',
|
|
32
|
+
},
|
|
33
|
+
{title: blogPostTitle},
|
|
34
|
+
)}
|
|
35
|
+
{...linkProps}>
|
|
36
|
+
<ReadMoreLabel />
|
|
37
|
+
</Link>
|
|
38
|
+
);
|
|
39
|
+
}
|