@docusaurus/theme-classic 2.0.0-beta.1 → 2.0.0-beta.10
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 +1 -1
- package/lib/__tests__/validateThemeConfig.test.js +277 -3
- package/lib/admonitions.css +35 -0
- package/lib/deps.d.ts +13 -0
- package/lib/index.js +41 -16
- package/lib/prism-include-languages.js +9 -5
- package/lib/theme/AnnouncementBar/index.js +10 -16
- package/lib/theme/AnnouncementBar/styles.module.css +25 -30
- package/lib/theme/BackToTopButton/index.js +140 -0
- package/lib/theme/BackToTopButton/styles.module.css +42 -0
- package/lib/theme/BlogArchivePage/index.js +89 -0
- package/lib/theme/BlogLayout/index.js +51 -0
- package/lib/theme/BlogListPage/index.js +10 -21
- package/lib/theme/BlogPostAuthor/index.js +51 -0
- package/lib/theme/BlogPostAuthor/styles.module.css +12 -0
- package/lib/theme/BlogPostAuthors/index.js +47 -0
- package/lib/theme/BlogPostAuthors/styles.module.css +11 -0
- package/lib/theme/BlogPostItem/index.js +58 -67
- package/lib/theme/BlogPostPage/index.js +37 -24
- package/lib/theme/BlogSidebar/index.js +5 -7
- package/lib/theme/BlogSidebar/styles.module.css +2 -2
- package/lib/theme/BlogTagsListPage/index.js +8 -44
- package/lib/theme/BlogTagsPostsPage/index.js +24 -38
- package/lib/theme/CodeBlock/index.js +18 -138
- package/lib/theme/CodeBlock/styles.module.css +6 -9
- package/lib/theme/Details/index.js +30 -0
- package/lib/theme/Details/styles.module.css +13 -0
- package/lib/theme/DocCard/index.js +84 -0
- package/lib/theme/DocCard/styles.module.css +43 -0
- package/lib/theme/DocCardList/index.js +28 -0
- package/lib/theme/DocCategoryGeneratedIndexPage/index.js +57 -0
- package/lib/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
- package/lib/theme/DocItem/index.js +29 -46
- package/lib/theme/DocItem/styles.module.css +5 -9
- package/lib/theme/DocItemFooter/index.js +79 -0
- package/lib/theme/DocItemFooter/styles.module.css +18 -0
- package/lib/theme/DocPage/index.js +35 -52
- package/lib/theme/DocPage/styles.module.css +8 -23
- package/lib/theme/DocPaginator/index.js +6 -7
- package/lib/theme/DocSidebar/index.js +53 -235
- package/lib/theme/DocSidebar/styles.module.css +0 -18
- package/lib/theme/DocSidebarItem/index.js +209 -0
- package/lib/theme/DocSidebarItem/styles.module.css +19 -0
- package/lib/theme/DocTagDocListPage/index.js +89 -0
- package/lib/theme/DocTagsListPage/index.js +44 -0
- package/lib/theme/DocVersionBadge/index.js +34 -0
- package/lib/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +39 -20
- package/lib/theme/EditThisPage/index.js +3 -1
- package/lib/theme/ErrorPageContent.js +43 -0
- package/lib/theme/Footer/index.js +16 -5
- package/lib/theme/Heading/index.js +17 -22
- package/lib/theme/Heading/styles.css +5 -6
- package/lib/theme/Heading/styles.module.css +9 -5
- package/lib/theme/IconArrow/index.js +2 -2
- package/lib/theme/IconClose/index.js +31 -0
- package/lib/theme/IconEdit/index.js +3 -3
- package/lib/theme/IconExternalLink/index.js +3 -3
- package/lib/theme/IconLanguage/index.js +3 -3
- package/lib/theme/IconMenu/index.js +3 -3
- package/lib/theme/LastUpdated/index.js +4 -2
- package/lib/theme/Layout/index.js +5 -1
- package/lib/theme/LayoutHead/index.js +22 -17
- package/lib/theme/LayoutProviders/index.js +11 -5
- package/lib/theme/Logo/index.js +16 -14
- package/lib/theme/MDXComponents/index.js +45 -4
- package/lib/theme/MDXComponents/styles.css +11 -0
- package/lib/theme/MDXPage/index.js +2 -1
- package/lib/theme/Navbar/index.js +162 -42
- package/lib/theme/Navbar/styles.module.css +10 -3
- package/lib/theme/NavbarItem/DefaultNavbarItem.js +27 -123
- package/lib/theme/NavbarItem/DocNavbarItem.js +7 -8
- package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +19 -12
- package/lib/theme/NavbarItem/DropdownNavbarItem.js +155 -0
- package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +6 -10
- package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib/theme/NavbarItem/index.js +31 -11
- package/lib/theme/{SearchMetadatas → SearchMetadata}/index.js +2 -2
- package/lib/theme/Seo/index.js +10 -7
- package/lib/theme/SkipToContent/index.js +12 -4
- package/lib/theme/SkipToContent/styles.module.css +1 -0
- package/lib/theme/TOC/index.js +9 -29
- package/lib/theme/TOC/styles.module.css +1 -1
- package/lib/theme/TOCCollapsible/index.js +53 -0
- package/lib/theme/TOCCollapsible/styles.module.css +50 -0
- package/lib/theme/TOCInline/index.js +7 -27
- package/lib/theme/TOCItems/index.js +78 -0
- package/lib/theme/Tabs/__tests__/index.test.js +123 -0
- package/lib/theme/Tabs/index.js +73 -50
- package/lib/theme/Tabs/styles.module.css +0 -13
- package/lib/theme/Tag/index.js +40 -0
- package/lib/theme/Tag/styles.module.css +70 -0
- package/lib/theme/TagsListByLetter/index.js +48 -0
- package/lib/theme/TagsListByLetter/styles.module.css +11 -0
- package/lib/theme/TagsListInline/index.js +44 -0
- package/lib/theme/TagsListInline/styles.module.css +15 -0
- package/lib/theme/ThemeProvider/index.js +8 -3
- package/lib/theme/ThemedImage/index.js +6 -7
- package/lib/theme/Toggle/index.js +41 -44
- package/lib/theme/Toggle/styles.module.css +91 -3
- package/lib/theme/UserPreferencesProvider/index.js +9 -12
- package/lib/theme/hooks/useHideableNavbar.js +14 -32
- package/lib/theme/hooks/useTabGroupChoice.js +2 -4
- package/lib/theme/hooks/useTheme.js +3 -5
- package/lib/theme/hooks/useWindowSize.js +33 -20
- package/lib/theme/prism-include-languages.js +4 -3
- package/lib/theme-classic.d.ts +806 -0
- package/lib/translations.js +4 -4
- package/lib/types.d.ts +0 -599
- package/lib/validateThemeConfig.js +230 -246
- package/lib-next/__tests__/validateThemeConfig.test.js +277 -3
- package/lib-next/admonitions.css +35 -0
- package/lib-next/deps.d.ts +13 -0
- package/lib-next/index.js +45 -13
- package/lib-next/prism-include-languages.js +0 -2
- package/lib-next/theme/AnnouncementBar/index.js +9 -18
- package/lib-next/theme/AnnouncementBar/styles.module.css +25 -30
- package/lib-next/theme/BackToTopButton/index.js +131 -0
- package/lib-next/theme/BackToTopButton/styles.module.css +42 -0
- package/lib-next/theme/BlogArchivePage/index.js +80 -0
- package/lib-next/theme/BlogLayout/index.js +40 -0
- package/lib-next/theme/BlogListPage/index.js +17 -25
- package/lib-next/theme/BlogPostAuthor/index.js +46 -0
- package/lib-next/theme/BlogPostAuthor/styles.module.css +12 -0
- package/lib-next/theme/BlogPostAuthors/index.js +34 -0
- package/lib-next/theme/BlogPostAuthors/styles.module.css +11 -0
- package/lib-next/theme/BlogPostItem/index.js +79 -86
- package/lib-next/theme/BlogPostPage/index.js +70 -35
- package/lib-next/theme/BlogSidebar/index.js +11 -13
- package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
- package/lib-next/theme/BlogTagsListPage/index.js +14 -55
- package/lib-next/theme/BlogTagsPostsPage/index.js +29 -39
- package/lib-next/theme/CodeBlock/index.js +17 -149
- package/lib-next/theme/CodeBlock/styles.module.css +6 -9
- package/lib-next/theme/Details/index.js +20 -0
- package/lib-next/theme/Details/styles.module.css +13 -0
- package/lib-next/theme/DocCard/index.js +80 -0
- package/lib-next/theme/DocCard/styles.module.css +43 -0
- package/lib-next/theme/DocCardList/index.js +19 -0
- package/lib-next/theme/DocCategoryGeneratedIndexPage/index.js +49 -0
- package/lib-next/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
- package/lib-next/theme/DocItem/index.js +40 -56
- package/lib-next/theme/DocItem/styles.module.css +5 -9
- package/lib-next/theme/DocItemFooter/index.js +79 -0
- package/lib-next/theme/DocItemFooter/styles.module.css +18 -0
- package/lib-next/theme/DocPage/index.js +46 -47
- package/lib-next/theme/DocPage/styles.module.css +8 -23
- package/lib-next/theme/DocPaginator/index.js +7 -11
- package/lib-next/theme/DocSidebar/index.js +69 -295
- package/lib-next/theme/DocSidebar/styles.module.css +0 -18
- package/lib-next/theme/DocSidebarItem/index.js +217 -0
- package/lib-next/theme/DocSidebarItem/styles.module.css +19 -0
- package/lib-next/theme/DocTagDocListPage/index.js +89 -0
- package/lib-next/theme/DocTagsListPage/index.js +38 -0
- package/lib-next/theme/DocVersionBadge/index.js +27 -0
- package/lib-next/theme/{DocVersionSuggestions → DocVersionBanner}/index.js +51 -36
- package/lib-next/theme/EditThisPage/index.js +6 -1
- package/lib-next/theme/ErrorPageContent.js +35 -0
- package/lib-next/theme/Footer/index.js +27 -5
- package/lib-next/theme/Heading/index.js +25 -29
- package/lib-next/theme/Heading/styles.css +5 -6
- package/lib-next/theme/Heading/styles.module.css +9 -5
- package/lib-next/theme/IconArrow/index.js +2 -2
- package/lib-next/theme/IconClose/index.js +23 -0
- package/lib-next/theme/IconEdit/index.js +2 -2
- package/lib-next/theme/IconExternalLink/index.js +2 -2
- package/lib-next/theme/IconLanguage/index.js +2 -2
- package/lib-next/theme/IconMenu/index.js +2 -2
- package/lib-next/theme/LastUpdated/index.js +3 -2
- package/lib-next/theme/Layout/index.js +3 -1
- package/lib-next/theme/LayoutHead/index.js +18 -23
- package/lib-next/theme/LayoutProviders/index.js +17 -6
- package/lib-next/theme/Logo/index.js +25 -21
- package/lib-next/theme/MDXComponents/index.js +34 -7
- package/lib-next/theme/MDXComponents/styles.css +11 -0
- package/lib-next/theme/MDXPage/index.js +10 -2
- package/lib-next/theme/Navbar/index.js +193 -56
- package/lib-next/theme/Navbar/styles.module.css +10 -3
- package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +45 -147
- package/lib-next/theme/NavbarItem/DocNavbarItem.js +7 -7
- package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +31 -19
- package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +159 -0
- package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +4 -12
- package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib-next/theme/NavbarItem/index.js +25 -12
- package/lib-next/theme/{SearchMetadatas → SearchMetadata}/index.js +1 -1
- package/lib-next/theme/Seo/index.js +11 -7
- package/lib-next/theme/SkipToContent/index.js +7 -8
- package/lib-next/theme/SkipToContent/styles.module.css +1 -0
- package/lib-next/theme/TOC/index.js +12 -36
- package/lib-next/theme/TOC/styles.module.css +1 -1
- package/lib-next/theme/TOCCollapsible/index.js +54 -0
- package/lib-next/theme/TOCCollapsible/styles.module.css +50 -0
- package/lib-next/theme/TOCInline/index.js +10 -28
- package/lib-next/theme/TOCItems/index.js +85 -0
- package/lib-next/theme/Tabs/__tests__/index.test.js +142 -0
- package/lib-next/theme/Tabs/index.js +91 -43
- package/lib-next/theme/Tabs/styles.module.css +0 -13
- package/lib-next/theme/Tag/index.js +27 -0
- package/lib-next/theme/Tag/styles.module.css +70 -0
- package/lib-next/theme/TagsListByLetter/index.js +42 -0
- package/lib-next/theme/TagsListByLetter/styles.module.css +11 -0
- package/lib-next/theme/TagsListInline/index.js +31 -0
- package/lib-next/theme/TagsListInline/styles.module.css +15 -0
- package/lib-next/theme/ThemeProvider/index.js +10 -7
- package/lib-next/theme/ThemedImage/index.js +7 -8
- package/lib-next/theme/Toggle/index.js +34 -37
- package/lib-next/theme/Toggle/styles.module.css +91 -3
- package/lib-next/theme/UserPreferencesProvider/index.js +9 -10
- package/lib-next/theme/hooks/useHideableNavbar.js +31 -44
- package/lib-next/theme/hooks/useTabGroupChoice.js +2 -4
- package/lib-next/theme/hooks/useTheme.js +4 -5
- package/lib-next/theme/hooks/useWindowSize.js +34 -20
- package/lib-next/theme/prism-include-languages.js +2 -1
- package/lib-next/theme-classic.d.ts +806 -0
- package/lib-next/translations.js +6 -10
- package/lib-next/types.d.ts +0 -599
- package/lib-next/validateThemeConfig.js +141 -114
- package/package.json +28 -25
- package/src/__tests__/validateThemeConfig.test.js +277 -3
- package/src/admonitions.css +35 -0
- package/src/deps.d.ts +13 -0
- package/src/index.ts +55 -22
- package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
- package/src/theme/AnnouncementBar/index.tsx +10 -17
- package/src/theme/AnnouncementBar/styles.module.css +25 -30
- package/src/theme/BackToTopButton/index.tsx +142 -0
- package/src/theme/BackToTopButton/styles.module.css +42 -0
- package/src/theme/BlogArchivePage/index.tsx +91 -0
- package/src/theme/BlogLayout/index.tsx +44 -0
- package/src/theme/BlogListPage/index.tsx +18 -25
- package/src/theme/BlogPostAuthor/index.tsx +49 -0
- package/src/theme/BlogPostAuthor/styles.module.css +12 -0
- package/src/theme/BlogPostAuthors/index.tsx +39 -0
- package/src/theme/BlogPostAuthors/styles.module.css +11 -0
- package/src/theme/BlogPostItem/index.tsx +70 -80
- package/src/theme/BlogPostPage/index.tsx +72 -35
- package/src/theme/BlogSidebar/index.tsx +11 -13
- package/src/theme/BlogSidebar/styles.module.css +2 -2
- package/src/theme/BlogTagsListPage/index.tsx +14 -57
- package/src/theme/BlogTagsPostsPage/index.tsx +29 -39
- package/src/theme/CodeBlock/index.tsx +21 -151
- package/src/theme/CodeBlock/styles.module.css +6 -9
- package/src/theme/Details/index.tsx +24 -0
- package/src/theme/Details/styles.module.css +13 -0
- package/src/theme/DocCard/index.tsx +100 -0
- package/src/theme/DocCard/styles.module.css +43 -0
- package/src/theme/DocCardList/index.tsx +27 -0
- package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +53 -0
- package/src/theme/DocCategoryGeneratedIndexPage/styles.module.css +18 -0
- package/src/theme/DocItem/index.tsx +43 -56
- package/src/theme/DocItem/styles.module.css +5 -9
- package/src/theme/DocItemFooter/index.tsx +91 -0
- package/src/theme/DocItemFooter/styles.module.css +18 -0
- package/src/theme/DocPage/index.tsx +44 -42
- package/src/theme/DocPage/styles.module.css +8 -23
- package/src/theme/DocPaginator/index.tsx +9 -13
- package/src/theme/DocSidebar/index.tsx +80 -307
- package/src/theme/DocSidebar/styles.module.css +0 -18
- package/src/theme/DocSidebarItem/index.tsx +242 -0
- package/src/theme/DocSidebarItem/styles.module.css +19 -0
- package/src/theme/DocTagDocListPage/index.tsx +89 -0
- package/src/theme/DocTagsListPage/index.tsx +41 -0
- package/src/theme/DocVersionBadge/index.tsx +30 -0
- package/src/theme/{DocVersionSuggestions → DocVersionBanner}/index.tsx +74 -44
- package/src/theme/EditThisPage/index.tsx +6 -1
- package/src/theme/ErrorPageContent.tsx +41 -0
- package/src/theme/Footer/index.tsx +30 -6
- package/src/theme/Heading/index.tsx +25 -31
- package/src/theme/Heading/styles.css +5 -6
- package/src/theme/Heading/styles.module.css +9 -5
- package/src/theme/IconArrow/index.tsx +2 -2
- package/src/theme/IconClose/index.tsx +26 -0
- package/src/theme/IconEdit/index.tsx +2 -2
- package/src/theme/IconExternalLink/index.tsx +2 -5
- package/src/theme/IconLanguage/index.tsx +2 -6
- package/src/theme/IconMenu/index.tsx +3 -3
- package/src/theme/LastUpdated/index.tsx +3 -2
- package/src/theme/Layout/index.tsx +3 -1
- package/src/theme/LayoutHead/index.tsx +18 -17
- package/src/theme/LayoutProviders/index.tsx +17 -6
- package/src/theme/Logo/index.tsx +21 -17
- package/src/theme/MDXComponents/index.tsx +39 -5
- package/src/theme/MDXComponents/styles.css +11 -0
- package/src/theme/MDXPage/index.tsx +10 -2
- package/src/theme/Navbar/index.tsx +203 -61
- package/src/theme/Navbar/styles.module.css +10 -3
- package/src/theme/NavbarItem/DefaultNavbarItem.tsx +42 -154
- package/src/theme/NavbarItem/DocNavbarItem.tsx +12 -16
- package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +33 -21
- package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
- package/src/theme/NavbarItem/DropdownNavbarItem.tsx +181 -0
- package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +8 -9
- package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/src/theme/NavbarItem/index.tsx +41 -16
- package/src/theme/{SearchMetadatas → SearchMetadata}/index.tsx +2 -2
- package/src/theme/Seo/index.tsx +7 -4
- package/src/theme/SkipToContent/index.tsx +7 -8
- package/src/theme/SkipToContent/styles.module.css +1 -0
- package/src/theme/TOC/index.tsx +12 -41
- package/src/theme/TOC/styles.module.css +1 -1
- package/src/theme/TOCCollapsible/index.tsx +58 -0
- package/src/theme/TOCCollapsible/styles.module.css +50 -0
- package/src/theme/TOCInline/index.tsx +13 -32
- package/src/theme/TOCItems/index.tsx +96 -0
- package/src/theme/Tabs/__tests__/index.test.tsx +129 -0
- package/src/theme/Tabs/index.tsx +93 -49
- package/src/theme/Tabs/styles.module.css +0 -13
- package/src/theme/Tag/index.tsx +31 -0
- package/src/theme/Tag/styles.module.css +70 -0
- package/src/theme/TagsListByLetter/index.tsx +45 -0
- package/src/theme/TagsListByLetter/styles.module.css +11 -0
- package/src/theme/TagsListInline/index.tsx +35 -0
- package/src/theme/TagsListInline/styles.module.css +15 -0
- package/src/theme/ThemeProvider/index.tsx +6 -2
- package/src/theme/ThemedImage/index.tsx +8 -8
- package/src/theme/Toggle/index.tsx +36 -43
- package/src/theme/Toggle/styles.module.css +91 -3
- package/src/theme/UserPreferencesProvider/index.tsx +9 -11
- package/src/theme/hooks/useHideableNavbar.ts +32 -45
- package/src/theme/hooks/useTabGroupChoice.ts +4 -4
- package/src/theme/hooks/useTheme.ts +4 -5
- package/src/theme/hooks/useWindowSize.ts +38 -20
- package/src/theme/prism-include-languages.ts +3 -2
- package/src/theme-classic.d.ts +806 -0
- package/src/translations.ts +8 -10
- package/src/types.d.ts +0 -599
- package/src/{validateThemeConfig.js → validateThemeConfig.ts} +151 -94
- package/tsconfig.json +1 -2
- package/codeTranslations/README.md +0 -20
- package/codeTranslations/ar.json +0 -57
- package/codeTranslations/base.json +0 -112
- package/codeTranslations/bn.json +0 -56
- package/codeTranslations/da.json +0 -57
- package/codeTranslations/de.json +0 -57
- package/codeTranslations/es.json +0 -57
- package/codeTranslations/fa.json +0 -57
- package/codeTranslations/fil.json +0 -57
- package/codeTranslations/fr.json +0 -57
- package/codeTranslations/he.json +0 -57
- package/codeTranslations/hi.json +0 -57
- package/codeTranslations/ja.json +0 -57
- package/codeTranslations/ko.json +0 -57
- package/codeTranslations/pl.json +0 -57
- package/codeTranslations/pt-BR.json +0 -57
- package/codeTranslations/pt-PT.json +0 -57
- package/codeTranslations/ru.json +0 -57
- package/codeTranslations/tr.json +0 -57
- package/codeTranslations/vi.json +0 -57
- package/codeTranslations/zh-Hans.json +0 -57
- package/codeTranslations/zh-Hant.json +0 -57
- package/lib/theme/Toggle/styles.css +0 -103
- package/lib/theme/hooks/useAnnouncementBar.js +0 -63
- package/lib/theme/hooks/useContextualSearchFilters.js +0 -47
- package/lib/theme/hooks/useScrollPosition.js +0 -49
- package/lib/theme/hooks/useTOCHighlight.js +0 -87
- package/lib-next/theme/Toggle/styles.css +0 -103
- package/lib-next/theme/hooks/useAnnouncementBar.js +0 -49
- package/lib-next/theme/hooks/useContextualSearchFilters.js +0 -41
- package/lib-next/theme/hooks/useScrollPosition.js +0 -38
- package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
- package/src/theme/Toggle/styles.css +0 -103
- package/src/theme/hooks/useAnnouncementBar.ts +0 -58
- package/src/theme/hooks/useContextualSearchFilters.ts +0 -52
- package/src/theme/hooks/useScrollPosition.ts +0 -45
- package/src/theme/hooks/useTOCHighlight.ts +0 -98
- package/update-code-translations.js +0 -239
- package/update-code-translations.test.js +0 -33
|
@@ -9,7 +9,7 @@ import Link from '@docusaurus/Link';
|
|
|
9
9
|
import Translate, {translate} from '@docusaurus/Translate';
|
|
10
10
|
|
|
11
11
|
function DocPaginator(props) {
|
|
12
|
-
const {
|
|
12
|
+
const {previous, next} = props;
|
|
13
13
|
return (
|
|
14
14
|
<nav
|
|
15
15
|
className="pagination-nav docusaurus-mt-lg"
|
|
@@ -19,10 +19,8 @@ function DocPaginator(props) {
|
|
|
19
19
|
description: 'The ARIA label for the docs pagination',
|
|
20
20
|
})}>
|
|
21
21
|
<div className="pagination-nav__item">
|
|
22
|
-
{
|
|
23
|
-
<Link
|
|
24
|
-
className="pagination-nav__link"
|
|
25
|
-
to={metadata.previous.permalink}>
|
|
22
|
+
{previous && (
|
|
23
|
+
<Link className="pagination-nav__link" to={previous.permalink}>
|
|
26
24
|
<div className="pagination-nav__sublabel">
|
|
27
25
|
<Translate
|
|
28
26
|
id="theme.docs.paginator.previous"
|
|
@@ -31,14 +29,14 @@ function DocPaginator(props) {
|
|
|
31
29
|
</Translate>
|
|
32
30
|
</div>
|
|
33
31
|
<div className="pagination-nav__label">
|
|
34
|
-
« {
|
|
32
|
+
« {previous.title}
|
|
35
33
|
</div>
|
|
36
34
|
</Link>
|
|
37
35
|
)}
|
|
38
36
|
</div>
|
|
39
37
|
<div className="pagination-nav__item pagination-nav__item--next">
|
|
40
|
-
{
|
|
41
|
-
<Link className="pagination-nav__link" to={
|
|
38
|
+
{next && (
|
|
39
|
+
<Link className="pagination-nav__link" to={next.permalink}>
|
|
42
40
|
<div className="pagination-nav__sublabel">
|
|
43
41
|
<Translate
|
|
44
42
|
id="theme.docs.paginator.next"
|
|
@@ -46,9 +44,7 @@ function DocPaginator(props) {
|
|
|
46
44
|
Next
|
|
47
45
|
</Translate>
|
|
48
46
|
</div>
|
|
49
|
-
<div className="pagination-nav__label">
|
|
50
|
-
{metadata.next.title} »
|
|
51
|
-
</div>
|
|
47
|
+
<div className="pagination-nav__label">{next.title} »</div>
|
|
52
48
|
</Link>
|
|
53
49
|
)}
|
|
54
50
|
</div>
|
|
@@ -4,231 +4,34 @@
|
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
-
import React, {useState
|
|
7
|
+
import React, {useState} from 'react';
|
|
8
8
|
import clsx from 'clsx';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
import {
|
|
10
|
+
useThemeConfig,
|
|
11
|
+
useAnnouncementBar,
|
|
12
|
+
MobileSecondaryMenuFiller,
|
|
13
|
+
ThemeClassNames,
|
|
14
|
+
useScrollPosition,
|
|
15
|
+
} from '@docusaurus/theme-common';
|
|
16
|
+
import useWindowSize from '@theme/hooks/useWindowSize';
|
|
16
17
|
import Logo from '@theme/Logo';
|
|
17
18
|
import IconArrow from '@theme/IconArrow';
|
|
18
|
-
import IconMenu from '@theme/IconMenu';
|
|
19
|
-
import IconExternalLink from '@theme/IconExternalLink';
|
|
20
19
|
import {translate} from '@docusaurus/Translate';
|
|
20
|
+
import {DocSidebarItems} from '@theme/DocSidebarItem';
|
|
21
21
|
import styles from './styles.module.css';
|
|
22
|
-
const MOBILE_TOGGLE_SIZE = 24;
|
|
23
|
-
|
|
24
|
-
function usePrevious(value) {
|
|
25
|
-
const ref = useRef(value);
|
|
26
|
-
useEffect(() => {
|
|
27
|
-
ref.current = value;
|
|
28
|
-
}, [value]);
|
|
29
|
-
return ref.current;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const isActiveSidebarItem = (item, activePath) => {
|
|
33
|
-
if (item.type === 'link') {
|
|
34
|
-
return isSamePath(item.href, activePath);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (item.type === 'category') {
|
|
38
|
-
return item.items.some((subItem) =>
|
|
39
|
-
isActiveSidebarItem(subItem, activePath),
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return false;
|
|
44
|
-
}; // Optimize sidebar at each "level"
|
|
45
|
-
// TODO this item should probably not receive the "activePath" props
|
|
46
|
-
// TODO this triggers whole sidebar re-renders on navigation
|
|
47
|
-
|
|
48
|
-
const DocSidebarItems = memo(function DocSidebarItems({items, ...props}) {
|
|
49
|
-
return items.map((item, index) => (
|
|
50
|
-
<DocSidebarItem
|
|
51
|
-
key={index} // sidebar is static, the index does not change
|
|
52
|
-
item={item}
|
|
53
|
-
{...props}
|
|
54
|
-
/>
|
|
55
|
-
));
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
function DocSidebarItem(props) {
|
|
59
|
-
switch (props.item.type) {
|
|
60
|
-
case 'category':
|
|
61
|
-
return <DocSidebarItemCategory {...props} />;
|
|
62
|
-
|
|
63
|
-
case 'link':
|
|
64
|
-
default:
|
|
65
|
-
return <DocSidebarItemLink {...props} />;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function DocSidebarItemCategory({
|
|
70
|
-
item,
|
|
71
|
-
onItemClick,
|
|
72
|
-
collapsible,
|
|
73
|
-
activePath,
|
|
74
|
-
...props
|
|
75
|
-
}) {
|
|
76
|
-
const {items, label} = item;
|
|
77
|
-
const isActive = isActiveSidebarItem(item, activePath);
|
|
78
|
-
const wasActive = usePrevious(isActive); // active categories are always initialized as expanded
|
|
79
|
-
// the default (item.collapsed) is only used for non-active categories
|
|
80
|
-
|
|
81
|
-
const [collapsed, setCollapsed] = useState(() => {
|
|
82
|
-
if (!collapsible) {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return isActive ? false : item.collapsed;
|
|
87
|
-
});
|
|
88
|
-
const menuListRef = useRef(null);
|
|
89
|
-
const [menuListHeight, setMenuListHeight] = useState(undefined);
|
|
90
|
-
|
|
91
|
-
const handleMenuListHeight = (calc = true) => {
|
|
92
|
-
setMenuListHeight(
|
|
93
|
-
calc ? `${menuListRef.current?.scrollHeight}px` : undefined,
|
|
94
|
-
);
|
|
95
|
-
}; // If we navigate to a category, it should automatically expand itself
|
|
96
|
-
|
|
97
|
-
useEffect(() => {
|
|
98
|
-
const justBecameActive = isActive && !wasActive;
|
|
99
|
-
|
|
100
|
-
if (justBecameActive && collapsed) {
|
|
101
|
-
setCollapsed(false);
|
|
102
|
-
}
|
|
103
|
-
}, [isActive, wasActive, collapsed]);
|
|
104
|
-
const handleItemClick = useCallback(
|
|
105
|
-
(e) => {
|
|
106
|
-
e.preventDefault();
|
|
107
|
-
|
|
108
|
-
if (!menuListHeight) {
|
|
109
|
-
handleMenuListHeight();
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
setTimeout(() => setCollapsed((state) => !state), 100);
|
|
113
|
-
},
|
|
114
|
-
[menuListHeight],
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
if (items.length === 0) {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return (
|
|
122
|
-
<li
|
|
123
|
-
className={clsx('menu__list-item', {
|
|
124
|
-
'menu__list-item--collapsed': collapsed,
|
|
125
|
-
})}>
|
|
126
|
-
<a
|
|
127
|
-
className={clsx('menu__link', {
|
|
128
|
-
'menu__link--sublist': collapsible,
|
|
129
|
-
'menu__link--active': collapsible && isActive,
|
|
130
|
-
[styles.menuLinkText]: !collapsible,
|
|
131
|
-
})}
|
|
132
|
-
onClick={collapsible ? handleItemClick : undefined}
|
|
133
|
-
href={collapsible ? '#!' : undefined}
|
|
134
|
-
{...props}>
|
|
135
|
-
{label}
|
|
136
|
-
</a>
|
|
137
|
-
<ul
|
|
138
|
-
className="menu__list"
|
|
139
|
-
ref={menuListRef}
|
|
140
|
-
style={{
|
|
141
|
-
height: menuListHeight,
|
|
142
|
-
}}
|
|
143
|
-
onTransitionEnd={() => {
|
|
144
|
-
if (!collapsed) {
|
|
145
|
-
handleMenuListHeight(false);
|
|
146
|
-
}
|
|
147
|
-
}}>
|
|
148
|
-
<DocSidebarItems
|
|
149
|
-
items={items}
|
|
150
|
-
tabIndex={collapsed ? '-1' : '0'}
|
|
151
|
-
onItemClick={onItemClick}
|
|
152
|
-
collapsible={collapsible}
|
|
153
|
-
activePath={activePath}
|
|
154
|
-
/>
|
|
155
|
-
</ul>
|
|
156
|
-
</li>
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function DocSidebarItemLink({
|
|
161
|
-
item,
|
|
162
|
-
onItemClick,
|
|
163
|
-
activePath,
|
|
164
|
-
collapsible: _collapsible,
|
|
165
|
-
...props
|
|
166
|
-
}) {
|
|
167
|
-
const {href, label} = item;
|
|
168
|
-
const isActive = isActiveSidebarItem(item, activePath);
|
|
169
|
-
return (
|
|
170
|
-
<li className="menu__list-item" key={label}>
|
|
171
|
-
<Link
|
|
172
|
-
className={clsx('menu__link', {
|
|
173
|
-
'menu__link--active': isActive,
|
|
174
|
-
})}
|
|
175
|
-
to={href}
|
|
176
|
-
{...(isInternalUrl(href) && {
|
|
177
|
-
isNavLink: true,
|
|
178
|
-
exact: true,
|
|
179
|
-
onClick: onItemClick,
|
|
180
|
-
})}
|
|
181
|
-
{...props}>
|
|
182
|
-
{isInternalUrl(href) ? (
|
|
183
|
-
label
|
|
184
|
-
) : (
|
|
185
|
-
<span>
|
|
186
|
-
{label}
|
|
187
|
-
<IconExternalLink />
|
|
188
|
-
</span>
|
|
189
|
-
)}
|
|
190
|
-
</Link>
|
|
191
|
-
</li>
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
22
|
|
|
195
23
|
function useShowAnnouncementBar() {
|
|
196
|
-
const {
|
|
197
|
-
const [showAnnouncementBar, setShowAnnouncementBar] = useState(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
return showAnnouncementBar;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
function useResponsiveSidebar() {
|
|
209
|
-
const [showResponsiveSidebar, setShowResponsiveSidebar] = useState(false);
|
|
210
|
-
useLockBodyScroll(showResponsiveSidebar);
|
|
211
|
-
const windowSize = useWindowSize();
|
|
212
|
-
useEffect(() => {
|
|
213
|
-
if (windowSize === windowSizes.desktop) {
|
|
214
|
-
setShowResponsiveSidebar(false);
|
|
215
|
-
}
|
|
216
|
-
}, [windowSize]);
|
|
217
|
-
const closeResponsiveSidebar = useCallback(
|
|
218
|
-
(e) => {
|
|
219
|
-
e.target.blur();
|
|
220
|
-
setShowResponsiveSidebar(false);
|
|
24
|
+
const {isActive} = useAnnouncementBar();
|
|
25
|
+
const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive);
|
|
26
|
+
useScrollPosition(
|
|
27
|
+
({scrollY}) => {
|
|
28
|
+
if (isActive) {
|
|
29
|
+
setShowAnnouncementBar(scrollY === 0);
|
|
30
|
+
}
|
|
221
31
|
},
|
|
222
|
-
[
|
|
32
|
+
[isActive],
|
|
223
33
|
);
|
|
224
|
-
|
|
225
|
-
setShowResponsiveSidebar((value) => !value);
|
|
226
|
-
}, [setShowResponsiveSidebar]);
|
|
227
|
-
return {
|
|
228
|
-
showResponsiveSidebar,
|
|
229
|
-
closeResponsiveSidebar,
|
|
230
|
-
toggleResponsiveSidebar,
|
|
231
|
-
};
|
|
34
|
+
return isActive && showAnnouncementBar;
|
|
232
35
|
}
|
|
233
36
|
|
|
234
37
|
function HideableSidebarButton({onClick}) {
|
|
@@ -255,62 +58,12 @@ function HideableSidebarButton({onClick}) {
|
|
|
255
58
|
);
|
|
256
59
|
}
|
|
257
60
|
|
|
258
|
-
function
|
|
259
|
-
return (
|
|
260
|
-
<button
|
|
261
|
-
aria-label={
|
|
262
|
-
responsiveSidebarOpened
|
|
263
|
-
? translate({
|
|
264
|
-
id: 'theme.docs.sidebar.responsiveCloseButtonLabel',
|
|
265
|
-
message: 'Close menu',
|
|
266
|
-
description:
|
|
267
|
-
'The ARIA label for close button of mobile doc sidebar',
|
|
268
|
-
})
|
|
269
|
-
: translate({
|
|
270
|
-
id: 'theme.docs.sidebar.responsiveOpenButtonLabel',
|
|
271
|
-
message: 'Open menu',
|
|
272
|
-
description:
|
|
273
|
-
'The ARIA label for open button of mobile doc sidebar',
|
|
274
|
-
})
|
|
275
|
-
}
|
|
276
|
-
aria-haspopup="true"
|
|
277
|
-
className="button button--secondary button--sm menu__button"
|
|
278
|
-
type="button"
|
|
279
|
-
onClick={onClick}>
|
|
280
|
-
{responsiveSidebarOpened ? (
|
|
281
|
-
<span
|
|
282
|
-
className={clsx(styles.sidebarMenuIcon, styles.sidebarMenuCloseIcon)}>
|
|
283
|
-
×
|
|
284
|
-
</span>
|
|
285
|
-
) : (
|
|
286
|
-
<IconMenu
|
|
287
|
-
className={styles.sidebarMenuIcon}
|
|
288
|
-
height={MOBILE_TOGGLE_SIZE}
|
|
289
|
-
width={MOBILE_TOGGLE_SIZE}
|
|
290
|
-
/>
|
|
291
|
-
)}
|
|
292
|
-
</button>
|
|
293
|
-
);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
function DocSidebar({
|
|
297
|
-
path,
|
|
298
|
-
sidebar,
|
|
299
|
-
sidebarCollapsible = true,
|
|
300
|
-
onCollapse,
|
|
301
|
-
isHidden,
|
|
302
|
-
}) {
|
|
61
|
+
function DocSidebarDesktop({path, sidebar, onCollapse, isHidden}) {
|
|
303
62
|
const showAnnouncementBar = useShowAnnouncementBar();
|
|
304
63
|
const {
|
|
305
64
|
navbar: {hideOnScroll},
|
|
306
65
|
hideableSidebar,
|
|
307
66
|
} = useThemeConfig();
|
|
308
|
-
const {isAnnouncementBarClosed} = useUserPreferencesContext();
|
|
309
|
-
const {
|
|
310
|
-
showResponsiveSidebar,
|
|
311
|
-
closeResponsiveSidebar,
|
|
312
|
-
toggleResponsiveSidebar,
|
|
313
|
-
} = useResponsiveSidebar();
|
|
314
67
|
return (
|
|
315
68
|
<div
|
|
316
69
|
className={clsx(styles.sidebar, {
|
|
@@ -319,39 +72,60 @@ function DocSidebar({
|
|
|
319
72
|
})}>
|
|
320
73
|
{hideOnScroll && <Logo tabIndex={-1} className={styles.sidebarLogo} />}
|
|
321
74
|
<nav
|
|
322
|
-
className={clsx(
|
|
323
|
-
|
|
324
|
-
'menu--responsive',
|
|
325
|
-
'thin-scrollbar',
|
|
326
|
-
styles.menu,
|
|
327
|
-
{
|
|
328
|
-
'menu--show': showResponsiveSidebar,
|
|
329
|
-
[styles.menuWithAnnouncementBar]:
|
|
330
|
-
!isAnnouncementBarClosed && showAnnouncementBar,
|
|
331
|
-
},
|
|
332
|
-
)}
|
|
333
|
-
aria-label={translate({
|
|
334
|
-
id: 'theme.docs.sidebar.navAriaLabel',
|
|
335
|
-
message: 'Sidebar navigation',
|
|
336
|
-
description: 'The ARIA label for documentation menu',
|
|
75
|
+
className={clsx('menu thin-scrollbar', styles.menu, {
|
|
76
|
+
[styles.menuWithAnnouncementBar]: showAnnouncementBar,
|
|
337
77
|
})}>
|
|
338
|
-
<
|
|
339
|
-
|
|
340
|
-
onClick={toggleResponsiveSidebar}
|
|
341
|
-
/>
|
|
342
|
-
|
|
343
|
-
<ul className="menu__list">
|
|
344
|
-
<DocSidebarItems
|
|
345
|
-
items={sidebar}
|
|
346
|
-
onItemClick={closeResponsiveSidebar}
|
|
347
|
-
collapsible={sidebarCollapsible}
|
|
348
|
-
activePath={path}
|
|
349
|
-
/>
|
|
78
|
+
<ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
|
|
79
|
+
<DocSidebarItems items={sidebar} activePath={path} level={1} />
|
|
350
80
|
</ul>
|
|
351
81
|
</nav>
|
|
352
82
|
{hideableSidebar && <HideableSidebarButton onClick={onCollapse} />}
|
|
353
83
|
</div>
|
|
354
84
|
);
|
|
85
|
+
} // eslint-disable-next-line react/function-component-definition
|
|
86
|
+
|
|
87
|
+
const DocSidebarMobileSecondaryMenu = ({toggleSidebar, sidebar, path}) => (
|
|
88
|
+
<ul className={clsx(ThemeClassNames.docs.docSidebarMenu, 'menu__list')}>
|
|
89
|
+
<DocSidebarItems
|
|
90
|
+
items={sidebar}
|
|
91
|
+
activePath={path}
|
|
92
|
+
onItemClick={(item) => {
|
|
93
|
+
// Mobile sidebar should only be closed if the category has a link
|
|
94
|
+
if (item.type === 'category' && item.href) {
|
|
95
|
+
toggleSidebar();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (item.type === 'link') {
|
|
99
|
+
toggleSidebar();
|
|
100
|
+
}
|
|
101
|
+
}}
|
|
102
|
+
level={1}
|
|
103
|
+
/>
|
|
104
|
+
</ul>
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
function DocSidebarMobile(props) {
|
|
108
|
+
return (
|
|
109
|
+
<MobileSecondaryMenuFiller
|
|
110
|
+
component={DocSidebarMobileSecondaryMenu}
|
|
111
|
+
props={props}
|
|
112
|
+
/>
|
|
113
|
+
);
|
|
355
114
|
}
|
|
356
115
|
|
|
357
|
-
|
|
116
|
+
const DocSidebarDesktopMemo = React.memo(DocSidebarDesktop);
|
|
117
|
+
const DocSidebarMobileMemo = React.memo(DocSidebarMobile);
|
|
118
|
+
export default function DocSidebar(props) {
|
|
119
|
+
const windowSize = useWindowSize(); // Desktop sidebar visible on hydration: need SSR rendering
|
|
120
|
+
|
|
121
|
+
const shouldRenderSidebarDesktop =
|
|
122
|
+
windowSize === 'desktop' || windowSize === 'ssr'; // Mobile sidebar not visible on hydration: can avoid SSR rendering
|
|
123
|
+
|
|
124
|
+
const shouldRenderSidebarMobile = windowSize === 'mobile';
|
|
125
|
+
return (
|
|
126
|
+
<>
|
|
127
|
+
{shouldRenderSidebarDesktop && <DocSidebarDesktopMemo {...props} />}
|
|
128
|
+
{shouldRenderSidebarMobile && <DocSidebarMobileMemo {...props} />}
|
|
129
|
+
</>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
@@ -53,14 +53,6 @@
|
|
|
53
53
|
padding: 0.5rem;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
.menuLinkText {
|
|
57
|
-
cursor: initial;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.menuLinkText:hover {
|
|
61
|
-
background: none;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
56
|
.menuWithAnnouncementBar {
|
|
65
57
|
margin-bottom: var(--docusaurus-announcement-bar-height);
|
|
66
58
|
}
|
|
@@ -112,13 +104,3 @@
|
|
|
112
104
|
line-height: 0.9;
|
|
113
105
|
width: 24px;
|
|
114
106
|
}
|
|
115
|
-
|
|
116
|
-
:global(.menu__list) :global(.menu__list) {
|
|
117
|
-
overflow-y: hidden;
|
|
118
|
-
will-change: height;
|
|
119
|
-
transition: height var(--ifm-transition-fast) linear;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
:global(.menu__list-item--collapsed) :global(.menu__list) {
|
|
123
|
-
height: 0 !important;
|
|
124
|
-
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
import React, {useEffect, memo, useMemo} from 'react';
|
|
8
|
+
import clsx from 'clsx';
|
|
9
|
+
import {
|
|
10
|
+
isActiveSidebarItem,
|
|
11
|
+
usePrevious,
|
|
12
|
+
Collapsible,
|
|
13
|
+
useCollapsible,
|
|
14
|
+
findFirstCategoryLink,
|
|
15
|
+
ThemeClassNames,
|
|
16
|
+
} from '@docusaurus/theme-common';
|
|
17
|
+
import Link from '@docusaurus/Link';
|
|
18
|
+
import isInternalUrl from '@docusaurus/isInternalUrl';
|
|
19
|
+
import {translate} from '@docusaurus/Translate';
|
|
20
|
+
import IconExternalLink from '@theme/IconExternalLink';
|
|
21
|
+
import styles from './styles.module.css';
|
|
22
|
+
import useIsBrowser from '@docusaurus/useIsBrowser'; // Optimize sidebar at each "level"
|
|
23
|
+
// TODO this item should probably not receive the "activePath" props
|
|
24
|
+
// TODO this triggers whole sidebar re-renders on navigation
|
|
25
|
+
|
|
26
|
+
export const DocSidebarItems = memo(({items, ...props}) => (
|
|
27
|
+
<>
|
|
28
|
+
{items.map((item, index) => (
|
|
29
|
+
<DocSidebarItem
|
|
30
|
+
key={index} // sidebar is static, the index does not change
|
|
31
|
+
item={item}
|
|
32
|
+
{...props}
|
|
33
|
+
/>
|
|
34
|
+
))}
|
|
35
|
+
</>
|
|
36
|
+
));
|
|
37
|
+
export default function DocSidebarItem({item, ...props}) {
|
|
38
|
+
switch (item.type) {
|
|
39
|
+
case 'category':
|
|
40
|
+
if (item.items.length === 0) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return <DocSidebarItemCategory item={item} {...props} />;
|
|
45
|
+
|
|
46
|
+
case 'link':
|
|
47
|
+
default:
|
|
48
|
+
return <DocSidebarItemLink item={item} {...props} />;
|
|
49
|
+
}
|
|
50
|
+
} // If we navigate to a category and it becomes active, it should automatically expand itself
|
|
51
|
+
|
|
52
|
+
function useAutoExpandActiveCategory({isActive, collapsed, setCollapsed}) {
|
|
53
|
+
const wasActive = usePrevious(isActive);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const justBecameActive = isActive && !wasActive;
|
|
56
|
+
|
|
57
|
+
if (justBecameActive && collapsed) {
|
|
58
|
+
setCollapsed(false);
|
|
59
|
+
}
|
|
60
|
+
}, [isActive, wasActive, collapsed, setCollapsed]);
|
|
61
|
+
} // When a collapsible category has no link, we still link it to its first child during SSR as a temporary fallback
|
|
62
|
+
// This allows to be able to navigate inside the category even when JS fails to load, is delayed or simply disabled
|
|
63
|
+
// React hydration becomes an optional progressive enhancement
|
|
64
|
+
// see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188
|
|
65
|
+
// see https://github.com/facebook/docusaurus/issues/3030
|
|
66
|
+
|
|
67
|
+
function useCategoryHrefWithSSRFallback(item) {
|
|
68
|
+
const isBrowser = useIsBrowser();
|
|
69
|
+
return useMemo(() => {
|
|
70
|
+
if (item.href) {
|
|
71
|
+
return item.href;
|
|
72
|
+
} // In these cases, it's not necessary to render a fallback
|
|
73
|
+
// We skip the "findFirstCategoryLink" computation
|
|
74
|
+
|
|
75
|
+
if (isBrowser || !item.collapsible) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return findFirstCategoryLink(item);
|
|
80
|
+
}, [item, isBrowser]);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function DocSidebarItemCategory({
|
|
84
|
+
item,
|
|
85
|
+
onItemClick,
|
|
86
|
+
activePath,
|
|
87
|
+
level,
|
|
88
|
+
...props
|
|
89
|
+
}) {
|
|
90
|
+
const {items, label, collapsible, className, href} = item;
|
|
91
|
+
const hrefWithSSRFallback = useCategoryHrefWithSSRFallback(item);
|
|
92
|
+
const isActive = isActiveSidebarItem(item, activePath);
|
|
93
|
+
const {collapsed, setCollapsed, toggleCollapsed} = useCollapsible({
|
|
94
|
+
// active categories are always initialized as expanded
|
|
95
|
+
// the default (item.collapsed) is only used for non-active categories
|
|
96
|
+
initialState: () => {
|
|
97
|
+
if (!collapsible) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return isActive ? false : item.collapsed;
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
useAutoExpandActiveCategory({
|
|
105
|
+
isActive,
|
|
106
|
+
collapsed,
|
|
107
|
+
setCollapsed,
|
|
108
|
+
});
|
|
109
|
+
return (
|
|
110
|
+
<li
|
|
111
|
+
className={clsx(
|
|
112
|
+
ThemeClassNames.docs.docSidebarItemCategory,
|
|
113
|
+
ThemeClassNames.docs.docSidebarItemCategoryLevel(level),
|
|
114
|
+
'menu__list-item',
|
|
115
|
+
{
|
|
116
|
+
'menu__list-item--collapsed': collapsed,
|
|
117
|
+
},
|
|
118
|
+
className,
|
|
119
|
+
)}>
|
|
120
|
+
<div className="menu__list-item-collapsible">
|
|
121
|
+
<Link
|
|
122
|
+
className={clsx('menu__link', {
|
|
123
|
+
'menu__link--sublist': collapsible && !href,
|
|
124
|
+
'menu__link--active': isActive,
|
|
125
|
+
[styles.menuLinkText]: !collapsible,
|
|
126
|
+
[styles.hasHref]: !!hrefWithSSRFallback,
|
|
127
|
+
})}
|
|
128
|
+
onClick={
|
|
129
|
+
collapsible
|
|
130
|
+
? (e) => {
|
|
131
|
+
onItemClick?.(item);
|
|
132
|
+
|
|
133
|
+
if (href) {
|
|
134
|
+
setCollapsed(false);
|
|
135
|
+
} else {
|
|
136
|
+
e.preventDefault();
|
|
137
|
+
toggleCollapsed();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
: () => {
|
|
141
|
+
onItemClick?.(item);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
href={collapsible ? hrefWithSSRFallback ?? '#' : hrefWithSSRFallback}
|
|
145
|
+
{...props}>
|
|
146
|
+
{label}
|
|
147
|
+
</Link>
|
|
148
|
+
{href && collapsible && (
|
|
149
|
+
<button
|
|
150
|
+
aria-label={translate(
|
|
151
|
+
{
|
|
152
|
+
id: 'theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel',
|
|
153
|
+
message: "Toggle the collapsible sidebar category '{label}'",
|
|
154
|
+
description:
|
|
155
|
+
'The ARIA label to toggle the collapsible sidebar category',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
label,
|
|
159
|
+
},
|
|
160
|
+
)}
|
|
161
|
+
type="button"
|
|
162
|
+
className="clean-btn menu__caret"
|
|
163
|
+
onClick={(e) => {
|
|
164
|
+
e.preventDefault();
|
|
165
|
+
toggleCollapsed();
|
|
166
|
+
}}
|
|
167
|
+
/>
|
|
168
|
+
)}
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
<Collapsible lazy as="ul" className="menu__list" collapsed={collapsed}>
|
|
172
|
+
<DocSidebarItems
|
|
173
|
+
items={items}
|
|
174
|
+
tabIndex={collapsed ? -1 : 0}
|
|
175
|
+
onItemClick={onItemClick}
|
|
176
|
+
activePath={activePath}
|
|
177
|
+
level={level + 1}
|
|
178
|
+
/>
|
|
179
|
+
</Collapsible>
|
|
180
|
+
</li>
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function DocSidebarItemLink({item, onItemClick, activePath, level, ...props}) {
|
|
185
|
+
const {href, label, className} = item;
|
|
186
|
+
const isActive = isActiveSidebarItem(item, activePath);
|
|
187
|
+
return (
|
|
188
|
+
<li
|
|
189
|
+
className={clsx(
|
|
190
|
+
ThemeClassNames.docs.docSidebarItemLink,
|
|
191
|
+
ThemeClassNames.docs.docSidebarItemLinkLevel(level),
|
|
192
|
+
'menu__list-item',
|
|
193
|
+
className,
|
|
194
|
+
)}
|
|
195
|
+
key={label}>
|
|
196
|
+
<Link
|
|
197
|
+
className={clsx('menu__link', {
|
|
198
|
+
'menu__link--active': isActive,
|
|
199
|
+
})}
|
|
200
|
+
aria-current={isActive ? 'page' : undefined}
|
|
201
|
+
to={href}
|
|
202
|
+
{...(isInternalUrl(href) && {
|
|
203
|
+
onClick: onItemClick ? () => onItemClick(item) : undefined,
|
|
204
|
+
})}
|
|
205
|
+
{...props}>
|
|
206
|
+
{isInternalUrl(href) ? (
|
|
207
|
+
label
|
|
208
|
+
) : (
|
|
209
|
+
<span>
|
|
210
|
+
{label}
|
|
211
|
+
<IconExternalLink />
|
|
212
|
+
</span>
|
|
213
|
+
)}
|
|
214
|
+
</Link>
|
|
215
|
+
</li>
|
|
216
|
+
);
|
|
217
|
+
}
|