@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,37 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal';
|
|
5
|
+
import {translate} from '@docusaurus/Translate';
|
|
6
|
+
import NavbarColorModeToggle from '@theme/Navbar/ColorModeToggle';
|
|
7
|
+
import IconClose from '@theme/Icon/Close';
|
|
8
|
+
import NavbarLogo from '@theme/Navbar/Logo';
|
|
9
|
+
|
|
10
|
+
function CloseButton() {
|
|
11
|
+
const mobileSidebar = useNavbarMobileSidebar();
|
|
12
|
+
return (
|
|
13
|
+
<button
|
|
14
|
+
type="button"
|
|
15
|
+
aria-label={translate({
|
|
16
|
+
id: 'theme.docs.sidebar.closeSidebarButtonAriaLabel',
|
|
17
|
+
message: 'Close navigation bar',
|
|
18
|
+
description: 'The ARIA label for close button of mobile sidebar',
|
|
19
|
+
})}
|
|
20
|
+
className="clean-btn navbar-sidebar__close"
|
|
21
|
+
onClick={() => mobileSidebar.toggle()}>
|
|
22
|
+
<IconClose color="var(--ifm-color-emphasis-600)" />
|
|
23
|
+
</button>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default function NavbarMobileSidebarHeader(): ReactNode {
|
|
28
|
+
return (
|
|
29
|
+
<div className="navbar-sidebar__brand w-full px-4 flex justify-between">
|
|
30
|
+
<div>
|
|
31
|
+
<NavbarLogo />
|
|
32
|
+
</div>
|
|
33
|
+
{/* <NavbarColorModeToggle className="margin-right--md" /> */}
|
|
34
|
+
<CloseButton />
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React, {version, type ReactNode} from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal';
|
|
4
|
+
import {ThemeClassNames} from '@docusaurus/theme-common';
|
|
5
|
+
import type {Props} from '@theme/Navbar/MobileSidebar/Layout';
|
|
6
|
+
import styles from './styles.module.css';
|
|
7
|
+
|
|
8
|
+
// TODO Docusaurus v4: remove temporary inert workaround
|
|
9
|
+
// See https://github.com/facebook/react/issues/17157
|
|
10
|
+
// See https://github.com/radix-ui/themes/pull/509
|
|
11
|
+
function inertProps(inert: boolean) {
|
|
12
|
+
const isBeforeReact19 = parseInt(version!.split('.')[0]!, 10) < 19;
|
|
13
|
+
if (isBeforeReact19) {
|
|
14
|
+
return {inert: inert ? '' : undefined};
|
|
15
|
+
}
|
|
16
|
+
return {inert};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function NavbarMobileSidebarPanel({
|
|
20
|
+
children,
|
|
21
|
+
inert,
|
|
22
|
+
}: {
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
inert: boolean;
|
|
25
|
+
}) {
|
|
26
|
+
return (
|
|
27
|
+
<div
|
|
28
|
+
className={clsx(
|
|
29
|
+
'relative w-full h-full p-4',
|
|
30
|
+
// ThemeClassNames.layout.navbar.mobileSidebar.panel,
|
|
31
|
+
// 'navbar-sidebar__item menu',
|
|
32
|
+
)}
|
|
33
|
+
{...inertProps(inert)}>
|
|
34
|
+
{children}
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default function NavbarMobileSidebarLayout({
|
|
40
|
+
header,
|
|
41
|
+
primaryMenu,
|
|
42
|
+
secondaryMenu,
|
|
43
|
+
}: Props): ReactNode {
|
|
44
|
+
const {shown: secondaryMenuShown} = useNavbarSecondaryMenu();
|
|
45
|
+
return (
|
|
46
|
+
<div
|
|
47
|
+
className={clsx(
|
|
48
|
+
ThemeClassNames.layout.navbar.mobileSidebar.container,
|
|
49
|
+
'navbar-sidebar',
|
|
50
|
+
)}>
|
|
51
|
+
{header}
|
|
52
|
+
|
|
53
|
+
<div
|
|
54
|
+
className={clsx('mobilemenu', {
|
|
55
|
+
hidden: secondaryMenuShown,
|
|
56
|
+
})}>
|
|
57
|
+
<NavbarMobileSidebarPanel inert={secondaryMenuShown}>
|
|
58
|
+
{primaryMenu}
|
|
59
|
+
</NavbarMobileSidebarPanel>
|
|
60
|
+
</div>
|
|
61
|
+
<div
|
|
62
|
+
className={clsx('mobilemenu', {
|
|
63
|
+
'flex': secondaryMenuShown,
|
|
64
|
+
'hidden' : !secondaryMenuShown,
|
|
65
|
+
})}>
|
|
66
|
+
<NavbarMobileSidebarPanel inert={!secondaryMenuShown}>
|
|
67
|
+
{secondaryMenu}
|
|
68
|
+
</NavbarMobileSidebarPanel>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import React, {type ReactNode} from 'react';
|
|
2
|
+
import {useThemeConfig} from '@docusaurus/theme-common';
|
|
3
|
+
import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal';
|
|
4
|
+
import NavbarItem, {type Props as NavbarItemConfig} from '@theme/NavbarItem';
|
|
5
|
+
import SubmenuLinks from '../../Submenu/SubmenuLinks';
|
|
6
|
+
import Link from '@docusaurus/Link';
|
|
7
|
+
|
|
8
|
+
function useNavbarItems() {
|
|
9
|
+
// TODO temporary casting until ThemeConfig type is improved
|
|
10
|
+
return useThemeConfig().navbar.items as NavbarItemConfig[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// The primary menu displays the navbar items
|
|
14
|
+
export default function NavbarMobilePrimaryMenu(): ReactNode {
|
|
15
|
+
const mobileSidebar = useNavbarMobileSidebar();
|
|
16
|
+
|
|
17
|
+
// TODO how can the order be defined for mobile?
|
|
18
|
+
// Should we allow providing a different list of items?
|
|
19
|
+
const items = useNavbarItems();
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<div>
|
|
23
|
+
<div className="relative flex flex-row justify-center items-stretch w-full max-w-full mb-10">
|
|
24
|
+
<a
|
|
25
|
+
className="btn btn-primary shadow-none border text-white btn-sm px-6 py-1 text-[.9rem] mr-2 flex-1"
|
|
26
|
+
href="https://cloud.seqera.io/oauth/login/auth0">
|
|
27
|
+
Log In
|
|
28
|
+
</a>
|
|
29
|
+
<a
|
|
30
|
+
className="btn btn-outline shadow-none btn-sm border flex-1 px-6 py-1 text-[.9rem] hover:border-black hover:bg-black bg-white text-black dark:text-black hover:text-white"
|
|
31
|
+
href="https://cloud.seqera.io/oauth/login/auth0">
|
|
32
|
+
Sign Up
|
|
33
|
+
</a>
|
|
34
|
+
</div>
|
|
35
|
+
<ul className="menu__list relative w-full">
|
|
36
|
+
<div className="flex flex-row">
|
|
37
|
+
<div>
|
|
38
|
+
<h3 className="font-semibold mb-3 text-[.8rem] text-gray-900 dark:text-gray-100">
|
|
39
|
+
Docs
|
|
40
|
+
</h3>
|
|
41
|
+
|
|
42
|
+
{items.map((item, i) => (
|
|
43
|
+
<NavbarItem
|
|
44
|
+
mobile
|
|
45
|
+
{...item}
|
|
46
|
+
onClick={() => mobileSidebar.toggle()}
|
|
47
|
+
key={i}
|
|
48
|
+
/>
|
|
49
|
+
))}
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<div className="flex flex-col ml-20">
|
|
53
|
+
<h3 className="font-semibold mb-3 text-[.8rem] text-gray-900 dark:text-gray-100">
|
|
54
|
+
Resources
|
|
55
|
+
</h3>
|
|
56
|
+
|
|
57
|
+
<li className="mb-3">
|
|
58
|
+
<li className="mb-3">
|
|
59
|
+
<Link
|
|
60
|
+
className="menu__link"
|
|
61
|
+
to={'/changelog'}
|
|
62
|
+
aria-label="Changelog">
|
|
63
|
+
Changelog
|
|
64
|
+
</Link>
|
|
65
|
+
</li>
|
|
66
|
+
<Link
|
|
67
|
+
className="menu__link"
|
|
68
|
+
to={'/platform-cloud/seqera-ai'}
|
|
69
|
+
aria-label="Seqera AI">
|
|
70
|
+
Seqera AI
|
|
71
|
+
</Link>
|
|
72
|
+
</li>
|
|
73
|
+
<li className="mb-3">
|
|
74
|
+
<Link
|
|
75
|
+
className="menu__link"
|
|
76
|
+
to={'/platform-cloud/seqera-mcp'}
|
|
77
|
+
aria-label="Seqera MCP">
|
|
78
|
+
Seqera MCP
|
|
79
|
+
</Link>
|
|
80
|
+
</li>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</ul>
|
|
84
|
+
|
|
85
|
+
<div className="w-full border-t border-gray-600 pt-4 mt-8">
|
|
86
|
+
<SubmenuLinks />
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ComponentProps, type ReactNode} from 'react';
|
|
4
|
+
import {useThemeConfig} from '@docusaurus/theme-common';
|
|
5
|
+
import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal';
|
|
6
|
+
import Translate from '@docusaurus/Translate';
|
|
7
|
+
|
|
8
|
+
function SecondaryMenuBackButton(props: ComponentProps<'button'>) {
|
|
9
|
+
return (
|
|
10
|
+
<button {...props} type="button" className="clean-btn navbar-sidebar__back mb-4 text-[.875rem] text-gray-900 font-semibold mt-4">
|
|
11
|
+
<Translate
|
|
12
|
+
id="theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel"
|
|
13
|
+
description="The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)">
|
|
14
|
+
← Main Menu
|
|
15
|
+
</Translate>
|
|
16
|
+
</button>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The secondary menu slides from the right and shows contextual information
|
|
21
|
+
// such as the docs sidebar
|
|
22
|
+
export default function NavbarMobileSidebarSecondaryMenu(): ReactNode {
|
|
23
|
+
const isPrimaryMenuEmpty = useThemeConfig().navbar.items.length === 0;
|
|
24
|
+
const secondaryMenu = useNavbarSecondaryMenu();
|
|
25
|
+
return (
|
|
26
|
+
<>
|
|
27
|
+
{/* edge-case: prevent returning to the primaryMenu when it's empty */}
|
|
28
|
+
{!isPrimaryMenuEmpty && (
|
|
29
|
+
<SecondaryMenuBackButton onClick={() => secondaryMenu.hide()} />
|
|
30
|
+
)}
|
|
31
|
+
{secondaryMenu.content}
|
|
32
|
+
</>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal';
|
|
5
|
+
import {translate} from '@docusaurus/Translate';
|
|
6
|
+
import IconMenu from '@theme/Icon/Menu';
|
|
7
|
+
|
|
8
|
+
export default function MobileSidebarToggle(): ReactNode {
|
|
9
|
+
const {toggle, shown} = useNavbarMobileSidebar();
|
|
10
|
+
return (
|
|
11
|
+
<button
|
|
12
|
+
onClick={toggle}
|
|
13
|
+
aria-label={translate({
|
|
14
|
+
id: 'theme.docs.sidebar.toggleSidebarButtonAriaLabel',
|
|
15
|
+
message: 'Toggle navigation bar',
|
|
16
|
+
description:
|
|
17
|
+
'The ARIA label for hamburger menu button of mobile navigation',
|
|
18
|
+
})}
|
|
19
|
+
aria-expanded={shown}
|
|
20
|
+
className="navbar__toggle clean-btn"
|
|
21
|
+
type="button">
|
|
22
|
+
<IconMenu />
|
|
23
|
+
</button>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import {
|
|
5
|
+
useLockBodyScroll,
|
|
6
|
+
useNavbarMobileSidebar,
|
|
7
|
+
} from '@docusaurus/theme-common/internal';
|
|
8
|
+
import NavbarMobileSidebarLayout from '@theme/Navbar/MobileSidebar/Layout';
|
|
9
|
+
import NavbarMobileSidebarHeader from '@theme/Navbar/MobileSidebar/Header';
|
|
10
|
+
import NavbarMobileSidebarPrimaryMenu from '@theme/Navbar/MobileSidebar/PrimaryMenu';
|
|
11
|
+
import NavbarMobileSidebarSecondaryMenu from '@theme/Navbar/MobileSidebar/SecondaryMenu';
|
|
12
|
+
|
|
13
|
+
export default function NavbarMobileSidebar(): ReactNode {
|
|
14
|
+
const mobileSidebar = useNavbarMobileSidebar();
|
|
15
|
+
useLockBodyScroll(mobileSidebar.shown);
|
|
16
|
+
|
|
17
|
+
if (!mobileSidebar.shouldRender) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<NavbarMobileSidebarLayout
|
|
23
|
+
header={<NavbarMobileSidebarHeader />}
|
|
24
|
+
primaryMenu={<NavbarMobileSidebarPrimaryMenu />}
|
|
25
|
+
secondaryMenu={<NavbarMobileSidebarSecondaryMenu />}
|
|
26
|
+
/>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import type {Props} from '@theme/Navbar/Search';
|
|
6
|
+
|
|
7
|
+
import styles from './styles.module.css';
|
|
8
|
+
|
|
9
|
+
export default function NavbarSearch({children, className}: Props): ReactNode {
|
|
10
|
+
return (
|
|
11
|
+
<div className={clsx(className, styles.navbarSearchContainer)}>
|
|
12
|
+
{children}
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
Workaround to avoid rendering empty search container
|
|
5
|
+
See https://github.com/facebook/docusaurus/pull/9385
|
|
6
|
+
*/
|
|
7
|
+
.navbarSearchContainer:empty {
|
|
8
|
+
display: none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@media (max-width: 996px) {
|
|
12
|
+
.navbarSearchContainer {
|
|
13
|
+
position: absolute;
|
|
14
|
+
right: var(--ifm-navbar-padding-horizontal);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@media (min-width: 997px) {
|
|
19
|
+
.navbarSearchContainer {
|
|
20
|
+
padding: 0 var(--ifm-navbar-item-padding-horizontal);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import Link from '@docusaurus/Link';
|
|
4
|
+
import type {ComponentType, ReactNode} from 'react';
|
|
5
|
+
import IconNextflow from '@theme/Icon/Nextflow';
|
|
6
|
+
import IconSeqeraLogo from '@theme/Icon/SeqeraLogo';
|
|
7
|
+
import IconQuestionMark from '@theme/Icon/QuestionMark';
|
|
8
|
+
import IconChatBubble from '@theme/Icon/ChatBubble';
|
|
9
|
+
import IconChatBubbles from '@theme/Icon/ChatBubbles';
|
|
10
|
+
import IconAI from '@theme/Icon/AI';
|
|
11
|
+
import IconEnvelope from '@theme/Icon/Envelope';
|
|
12
|
+
|
|
13
|
+
interface LinkConfig {
|
|
14
|
+
label: string;
|
|
15
|
+
href: string;
|
|
16
|
+
icon: ComponentType<any>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface LinksConfig {
|
|
20
|
+
[key: string]: LinkConfig[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface LinkItemProps {
|
|
24
|
+
to: string;
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface ColumnProps {
|
|
29
|
+
title: string;
|
|
30
|
+
links: LinkConfig[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const LINKS_CONFIG: LinksConfig = {
|
|
34
|
+
Help: [
|
|
35
|
+
{label: 'Forum', href: 'https://community.seqera.io', icon: IconChatBubbles},
|
|
36
|
+
{
|
|
37
|
+
label: 'Support Portal',
|
|
38
|
+
href: 'https://support.seqera.io',
|
|
39
|
+
icon: IconQuestionMark,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
label: 'Nextflow Slack',
|
|
43
|
+
href: 'https://www.nextflow.io/slack-invite.html',
|
|
44
|
+
icon: IconNextflow,
|
|
45
|
+
},
|
|
46
|
+
{label: 'Seqera AI', href: '/ask-ai', icon: IconAI},
|
|
47
|
+
],
|
|
48
|
+
Company: [
|
|
49
|
+
{label: 'Seqera.io', href: '/about/', icon: IconSeqeraLogo},
|
|
50
|
+
{label: 'Contact us', href: '/contact-us/', icon: IconEnvelope},
|
|
51
|
+
{label: 'Submit Feedback', href: '/feedback/', icon: IconChatBubble},
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
function isActive(path: string): boolean {
|
|
56
|
+
if (typeof window === 'undefined') return false;
|
|
57
|
+
return window.location.pathname === path;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function getLinkHref(to: string): string {
|
|
61
|
+
if (to.startsWith('http')) {
|
|
62
|
+
return to;
|
|
63
|
+
}
|
|
64
|
+
return `https://seqera.io${to}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isExternalNonSeqera(href: string): boolean {
|
|
68
|
+
return href.startsWith('http') && !href.includes('seqera.io');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function LinkItem({to, children}: LinkItemProps): ReactNode {
|
|
72
|
+
const href = getLinkHref(to);
|
|
73
|
+
const isExternal = isExternalNonSeqera(href);
|
|
74
|
+
|
|
75
|
+
const externalProps = isExternal
|
|
76
|
+
? {target: '_blank', rel: 'noopener noreferrer'}
|
|
77
|
+
: {};
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<Link
|
|
81
|
+
to={href}
|
|
82
|
+
{...externalProps}
|
|
83
|
+
className={clsx(
|
|
84
|
+
'flex items-center gap-2 px-2 rounded-md h-[37px] mb-1',
|
|
85
|
+
'text-sm text-gray-900 dark:text-gray-100',
|
|
86
|
+
'transition-all duration-500 ease-in-out',
|
|
87
|
+
'hover:bg-nextflow-100 dark:hover:bg-gray-800 hover:no-underline',
|
|
88
|
+
isActive(href) && 'bg-blue-50 dark:bg-blue-900/30',
|
|
89
|
+
)}>
|
|
90
|
+
{children}
|
|
91
|
+
</Link>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function Column({title, links}: ColumnProps): ReactNode {
|
|
96
|
+
return (
|
|
97
|
+
<div className="flex flex-col items-start">
|
|
98
|
+
<h3 className="text-[0.8rem] font-semibold my-0.5 text-gray-900 dark:text-gray-100">
|
|
99
|
+
{title}
|
|
100
|
+
</h3>
|
|
101
|
+
<ul className="mt-3 -mx-2 p-0 list-none mb-0">
|
|
102
|
+
{links.map(({label, href, icon: Icon}) => (
|
|
103
|
+
<li key={label}>
|
|
104
|
+
<LinkItem to={href}>
|
|
105
|
+
<div
|
|
106
|
+
className={clsx(
|
|
107
|
+
'flex items-center justify-center',
|
|
108
|
+
'w-8 h-8 shrink-0 rounded p-2',
|
|
109
|
+
'border border-gray-300 dark:border-gray-600',
|
|
110
|
+
)}
|
|
111
|
+
style={{
|
|
112
|
+
backgroundColor: 'var(--ifm-navbar-background-color)',
|
|
113
|
+
borderColor: 'var(--ifm-color-emphasis-300)',
|
|
114
|
+
}}>
|
|
115
|
+
<Icon className="text-black dark:text-white" />
|
|
116
|
+
</div>
|
|
117
|
+
<span className="text-black dark:text-white">{label}</span>
|
|
118
|
+
</LinkItem>
|
|
119
|
+
</li>
|
|
120
|
+
))}
|
|
121
|
+
</ul>
|
|
122
|
+
</div>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export default function SubmenuLinks(): ReactNode {
|
|
127
|
+
return (
|
|
128
|
+
<div className="flex p-2">
|
|
129
|
+
<div className="flex-auto flex flex-row gap-8">
|
|
130
|
+
{Object.entries(LINKS_CONFIG).map(([title, links]) => (
|
|
131
|
+
<Column key={title} title={title} links={links} />
|
|
132
|
+
))}
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import React, {useState, useRef, useEffect, type ReactNode} from 'react';
|
|
2
|
+
import {translate} from '@docusaurus/Translate';
|
|
3
|
+
import styles from './styles.module.css';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import SubmenuLinks from './SubmenuLinks';
|
|
6
|
+
|
|
7
|
+
export default function Submenu(): ReactNode {
|
|
8
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
9
|
+
const submenuRef = useRef<HTMLDivElement>(null);
|
|
10
|
+
const buttonRef = useRef<HTMLButtonElement>(null);
|
|
11
|
+
|
|
12
|
+
const toggle = () => setIsOpen(!isOpen);
|
|
13
|
+
const close = () => setIsOpen(false);
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
17
|
+
if (
|
|
18
|
+
submenuRef.current &&
|
|
19
|
+
buttonRef.current &&
|
|
20
|
+
!submenuRef.current.contains(event.target as Node) &&
|
|
21
|
+
!buttonRef.current.contains(event.target as Node)
|
|
22
|
+
) {
|
|
23
|
+
close();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const handleEscape = (event: KeyboardEvent) => {
|
|
28
|
+
if (event.key === 'Escape') {
|
|
29
|
+
close();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
if (isOpen) {
|
|
34
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
35
|
+
document.addEventListener('keydown', handleEscape);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return () => {
|
|
39
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
40
|
+
document.removeEventListener('keydown', handleEscape);
|
|
41
|
+
};
|
|
42
|
+
}, [isOpen]);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<>
|
|
46
|
+
<button
|
|
47
|
+
ref={buttonRef}
|
|
48
|
+
onClick={toggle}
|
|
49
|
+
className="hover:opacity-70"
|
|
50
|
+
aria-label={translate({
|
|
51
|
+
id: 'theme.docs.sidebar.toggleSidebarButtonAriaLabel',
|
|
52
|
+
message: 'Toggle navigation bar',
|
|
53
|
+
description: 'The ARIA label for hamburger menu button',
|
|
54
|
+
})}
|
|
55
|
+
aria-expanded={isOpen}
|
|
56
|
+
type="button">
|
|
57
|
+
<div className={clsx(styles.hamburger)}>
|
|
58
|
+
<span />
|
|
59
|
+
<span />
|
|
60
|
+
<span />
|
|
61
|
+
</div>
|
|
62
|
+
</button>
|
|
63
|
+
|
|
64
|
+
<div
|
|
65
|
+
ref={submenuRef}
|
|
66
|
+
style={{
|
|
67
|
+
backgroundColor: 'var(--ifm-navbar-background-color)',
|
|
68
|
+
borderColor: 'var(--ifm-color-emphasis-300)',
|
|
69
|
+
}}
|
|
70
|
+
className={clsx(
|
|
71
|
+
styles.submenu,
|
|
72
|
+
'border rounded-sm',
|
|
73
|
+
'border-gray-300 dark:border-gray-700',
|
|
74
|
+
isOpen && styles.open,
|
|
75
|
+
)}>
|
|
76
|
+
<div className="flex p-2 pl-4">
|
|
77
|
+
<div className="flex-auto flex">
|
|
78
|
+
<SubmenuLinks />
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
.hamburger {
|
|
2
|
+
position: relative;
|
|
3
|
+
transition: all 0.3s ease-in-out;
|
|
4
|
+
outline: none !important;
|
|
5
|
+
border: none;
|
|
6
|
+
background: transparent;
|
|
7
|
+
padding: 0;
|
|
8
|
+
margin: 0;
|
|
9
|
+
border-radius: 0;
|
|
10
|
+
width: 40px;
|
|
11
|
+
&:hover {
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
background: transparent;
|
|
14
|
+
}
|
|
15
|
+
&:focus {
|
|
16
|
+
border: 2px solid blue;
|
|
17
|
+
}
|
|
18
|
+
& span {
|
|
19
|
+
width: 20px;
|
|
20
|
+
height: 2px;
|
|
21
|
+
background-color: black;
|
|
22
|
+
display: block;
|
|
23
|
+
margin: 4.8px auto;
|
|
24
|
+
transition: all 0.3s ease-in-out;
|
|
25
|
+
}
|
|
26
|
+
&:before {
|
|
27
|
+
content: '';
|
|
28
|
+
position: absolute;
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
width: 20px;
|
|
31
|
+
height: 42px;
|
|
32
|
+
border: 3px solid transparent;
|
|
33
|
+
top: calc(50% - 21px);
|
|
34
|
+
left: calc(50% - 21px);
|
|
35
|
+
border-radius: 100%;
|
|
36
|
+
transition: all 0.3s ease-in-out;
|
|
37
|
+
background: none;
|
|
38
|
+
}
|
|
39
|
+
&.open {
|
|
40
|
+
@media (max-width: 996px) {
|
|
41
|
+
transform: rotate(45deg) translate(0, 0);
|
|
42
|
+
& span {
|
|
43
|
+
width: 21px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
& span:nth-child(2) {
|
|
47
|
+
opacity: 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
& span:nth-child(1) {
|
|
51
|
+
transform: translateY(7px);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
& span:nth-child(3) {
|
|
55
|
+
transform: translateY(-6.5px) rotate(90deg);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
html[data-theme='dark'] .hamburger {
|
|
62
|
+
&:focus {
|
|
63
|
+
border: 2px solid #f1f1f1;
|
|
64
|
+
}
|
|
65
|
+
& span {
|
|
66
|
+
background-color: #f1f1f1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.submenu {
|
|
71
|
+
display: none;
|
|
72
|
+
position: fixed;
|
|
73
|
+
top: 3.5rem;
|
|
74
|
+
right: 1.5rem;
|
|
75
|
+
width: auto;
|
|
76
|
+
box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);
|
|
77
|
+
z-index: 200;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.submenu.open {
|
|
81
|
+
display: flex;
|
|
82
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import React, {type ReactNode} from 'react';
|
|
4
|
+
import NavbarLayout from '@theme/Navbar/Layout';
|
|
5
|
+
import NavbarContent from '@theme/Navbar/Content';
|
|
6
|
+
|
|
7
|
+
export default function Navbar(): ReactNode {
|
|
8
|
+
return (
|
|
9
|
+
<NavbarLayout>
|
|
10
|
+
<NavbarContent />
|
|
11
|
+
</NavbarLayout>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
|
|
4
|
+
import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem';
|
|
5
|
+
import LocaleDropdownNavbarItem from '@theme/NavbarItem/LocaleDropdownNavbarItem';
|
|
6
|
+
import SearchNavbarItem from '@theme/NavbarItem/SearchNavbarItem';
|
|
7
|
+
import HtmlNavbarItem from '@theme/NavbarItem/HtmlNavbarItem';
|
|
8
|
+
import DocNavbarItem from '@theme/NavbarItem/DocNavbarItem';
|
|
9
|
+
import DocSidebarNavbarItem from '@theme/NavbarItem/DocSidebarNavbarItem';
|
|
10
|
+
import DocsVersionNavbarItem from '@theme/NavbarItem/DocsVersionNavbarItem';
|
|
11
|
+
import DocsVersionDropdownNavbarItem from '@theme/NavbarItem/DocsVersionDropdownNavbarItem';
|
|
12
|
+
|
|
13
|
+
import type {ComponentTypesObject} from '@theme/NavbarItem/ComponentTypes';
|
|
14
|
+
|
|
15
|
+
const ComponentTypes: ComponentTypesObject = {
|
|
16
|
+
default: DefaultNavbarItem,
|
|
17
|
+
localeDropdown: LocaleDropdownNavbarItem,
|
|
18
|
+
search: SearchNavbarItem,
|
|
19
|
+
dropdown: DropdownNavbarItem,
|
|
20
|
+
html: HtmlNavbarItem,
|
|
21
|
+
doc: DocNavbarItem,
|
|
22
|
+
docSidebar: DocSidebarNavbarItem,
|
|
23
|
+
docsVersion: DocsVersionNavbarItem,
|
|
24
|
+
docsVersionDropdown: DocsVersionDropdownNavbarItem,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default ComponentTypes;
|