@docusaurus/theme-classic 2.0.0-beta.8e9b829d9 → 2.0.0-beta.9
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/codeTranslations/ar.json +12 -6
- package/codeTranslations/base.json +12 -0
- package/codeTranslations/bn.json +6 -0
- package/codeTranslations/cs.json +62 -0
- package/codeTranslations/da.json +6 -0
- package/codeTranslations/de.json +8 -2
- package/codeTranslations/es.json +10 -4
- package/codeTranslations/fa.json +9 -3
- package/codeTranslations/fil.json +6 -0
- package/codeTranslations/fr.json +6 -0
- package/codeTranslations/he.json +6 -0
- package/codeTranslations/hi.json +6 -0
- package/codeTranslations/ja.json +6 -0
- package/codeTranslations/ko.json +6 -0
- package/codeTranslations/pl.json +6 -0
- package/codeTranslations/pt-BR.json +8 -2
- package/codeTranslations/pt-PT.json +6 -0
- package/codeTranslations/ru.json +6 -0
- package/codeTranslations/sr.json +62 -0
- package/codeTranslations/tr.json +9 -3
- package/codeTranslations/vi.json +10 -4
- package/codeTranslations/zh-Hans.json +6 -0
- package/codeTranslations/zh-Hant.json +6 -0
- package/lib/__tests__/validateThemeConfig.test.js +154 -4
- package/lib/index.js +2 -3
- package/lib/prism-include-languages.js +9 -5
- package/lib/theme/AnnouncementBar/index.js +8 -12
- package/lib/theme/AnnouncementBar/styles.module.css +23 -32
- package/lib/theme/BackToTopButton/index.js +27 -13
- package/lib/theme/BackToTopButton/styles.module.css +17 -14
- package/lib/theme/BlogArchivePage/index.js +89 -0
- package/lib/theme/BlogLayout/index.js +2 -6
- package/lib/theme/BlogListPage/index.js +1 -1
- 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 +33 -4
- package/lib/theme/BlogSidebar/styles.module.css +2 -2
- package/lib/theme/BlogTagsListPage/index.js +3 -28
- package/lib/theme/BlogTagsPostsPage/index.js +5 -8
- package/lib/theme/CodeBlock/index.js +44 -37
- package/lib/theme/CodeBlock/styles.module.css +1 -2
- package/lib/theme/DocItem/index.js +15 -40
- package/lib/theme/DocItem/styles.module.css +2 -12
- package/lib/theme/DocItemFooter/index.js +79 -0
- package/lib/theme/DocItemFooter/styles.module.css +18 -0
- package/lib/theme/DocPage/index.js +18 -13
- package/lib/theme/DocSidebar/index.js +11 -16
- package/lib/theme/DocSidebarItem/index.js +12 -10
- package/lib/theme/DocTagDocListPage/index.js +89 -0
- package/lib/theme/DocTagsListPage/index.js +44 -0
- package/lib/theme/DocVersionBanner/index.js +6 -4
- package/lib/theme/EditThisPage/index.js +3 -1
- package/lib/theme/Footer/index.js +5 -3
- package/lib/theme/Heading/index.js +7 -9
- package/lib/theme/Heading/styles.css +4 -6
- package/lib/theme/Heading/styles.module.css +9 -5
- package/lib/theme/IconClose/index.js +31 -0
- package/lib/theme/LastUpdated/index.js +4 -2
- package/lib/theme/LayoutHead/index.js +13 -11
- package/lib/theme/LayoutProviders/index.js +7 -5
- package/lib/theme/Logo/index.js +14 -12
- package/lib/theme/MDXComponents/index.js +27 -1
- package/lib/theme/MDXComponents/styles.css +11 -0
- package/lib/theme/MDXPage/index.js +2 -1
- package/lib/theme/Navbar/index.js +20 -3
- package/lib/theme/Navbar/styles.module.css +5 -1
- package/lib/theme/NavbarItem/DefaultNavbarItem.js +12 -4
- package/lib/theme/NavbarItem/DocNavbarItem.js +5 -3
- package/lib/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +7 -1
- package/lib/theme/NavbarItem/DropdownNavbarItem.js +3 -3
- package/lib/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +3 -4
- package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib/theme/NavbarItem/index.js +5 -0
- package/lib/theme/Seo/index.js +10 -7
- package/lib/theme/TOC/index.js +9 -30
- package/lib/theme/TOC/styles.module.css +1 -1
- package/lib/theme/TOCCollapsible/index.js +5 -3
- 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/ThemedImage/index.js +3 -5
- package/lib/theme/Toggle/index.js +23 -18
- package/lib/theme/Toggle/styles.module.css +91 -0
- package/lib/theme/hooks/useHideableNavbar.js +14 -31
- package/lib/theme/hooks/useTheme.js +2 -2
- package/lib/theme/hooks/useWindowSize.js +2 -7
- package/lib/theme/prism-include-languages.js +4 -3
- package/lib/translations.js +4 -4
- package/lib/types.d.ts +216 -105
- package/lib/validateThemeConfig.js +215 -254
- package/lib-next/__tests__/validateThemeConfig.test.js +154 -4
- package/lib-next/index.js +1 -2
- package/lib-next/prism-include-languages.js +0 -2
- package/lib-next/theme/AnnouncementBar/index.js +7 -12
- package/lib-next/theme/AnnouncementBar/styles.module.css +23 -32
- package/lib-next/theme/BackToTopButton/index.js +37 -17
- package/lib-next/theme/BackToTopButton/styles.module.css +17 -14
- package/lib-next/theme/BlogArchivePage/index.js +80 -0
- package/lib-next/theme/BlogLayout/index.js +4 -7
- package/lib-next/theme/BlogListPage/index.js +1 -0
- 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 +55 -8
- package/lib-next/theme/BlogSidebar/styles.module.css +2 -2
- package/lib-next/theme/BlogTagsListPage/index.js +7 -39
- package/lib-next/theme/BlogTagsPostsPage/index.js +3 -4
- package/lib-next/theme/CodeBlock/index.js +53 -49
- package/lib-next/theme/CodeBlock/styles.module.css +1 -2
- package/lib-next/theme/DocItem/index.js +27 -45
- package/lib-next/theme/DocItem/styles.module.css +2 -12
- 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 +18 -14
- package/lib-next/theme/DocSidebar/index.js +18 -15
- package/lib-next/theme/DocSidebarItem/index.js +31 -11
- package/lib-next/theme/DocTagDocListPage/index.js +89 -0
- package/lib-next/theme/DocTagsListPage/index.js +38 -0
- package/lib-next/theme/DocVersionBanner/index.js +16 -9
- package/lib-next/theme/EditThisPage/index.js +6 -1
- package/lib-next/theme/Footer/index.js +14 -3
- package/lib-next/theme/Heading/index.js +10 -13
- package/lib-next/theme/Heading/styles.css +4 -6
- package/lib-next/theme/Heading/styles.module.css +9 -5
- package/lib-next/theme/IconClose/index.js +23 -0
- package/lib-next/theme/LastUpdated/index.js +3 -2
- package/lib-next/theme/LayoutHead/index.js +9 -15
- package/lib-next/theme/LayoutProviders/index.js +8 -5
- package/lib-next/theme/Logo/index.js +23 -19
- package/lib-next/theme/MDXComponents/index.js +20 -1
- 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 +27 -3
- package/lib-next/theme/Navbar/styles.module.css +5 -1
- package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +15 -4
- package/lib-next/theme/NavbarItem/DocNavbarItem.js +5 -3
- package/lib-next/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +12 -4
- package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +4 -6
- package/lib-next/theme/NavbarItem/{LocaleDropdownNavbarItem.js → LocaleDropdownNavbarItem/index.js} +2 -6
- package/lib-next/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/lib-next/theme/NavbarItem/index.js +2 -0
- package/lib-next/theme/Seo/index.js +11 -7
- 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 +12 -3
- 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/ThemedImage/index.js +3 -3
- package/lib-next/theme/Toggle/index.js +20 -15
- package/lib-next/theme/Toggle/styles.module.css +91 -0
- package/lib-next/theme/hooks/useHideableNavbar.js +31 -47
- package/lib-next/theme/hooks/useTheme.js +2 -2
- package/lib-next/theme/hooks/useWindowSize.js +2 -6
- package/lib-next/theme/prism-include-languages.js +2 -1
- package/lib-next/translations.js +6 -10
- package/lib-next/types.d.ts +216 -105
- package/lib-next/validateThemeConfig.js +40 -36
- package/package.json +23 -19
- package/src/__tests__/validateThemeConfig.test.js +154 -4
- package/src/index.ts +11 -9
- package/src/{prism-include-languages.js → prism-include-languages.ts} +0 -0
- package/src/theme/AnnouncementBar/index.tsx +8 -12
- package/src/theme/AnnouncementBar/styles.module.css +23 -32
- package/src/theme/BackToTopButton/index.tsx +39 -17
- package/src/theme/BackToTopButton/styles.module.css +17 -14
- package/src/theme/BlogArchivePage/index.tsx +91 -0
- package/src/theme/BlogLayout/index.tsx +4 -8
- package/src/theme/BlogListPage/index.tsx +1 -0
- package/src/theme/BlogPostAuthor/index.tsx +49 -0
- package/src/theme/BlogPostAuthor/styles.module.css +12 -0
- package/src/theme/BlogPostAuthors/index.tsx +36 -0
- package/src/theme/BlogPostAuthors/styles.module.css +11 -0
- package/src/theme/BlogPostItem/index.tsx +70 -80
- package/src/theme/BlogPostPage/index.tsx +57 -8
- package/src/theme/BlogSidebar/styles.module.css +2 -2
- package/src/theme/BlogTagsListPage/index.tsx +7 -41
- package/src/theme/BlogTagsPostsPage/index.tsx +3 -4
- package/src/theme/CodeBlock/index.tsx +63 -47
- package/src/theme/CodeBlock/styles.module.css +1 -2
- package/src/theme/DocItem/index.tsx +27 -46
- package/src/theme/DocItem/styles.module.css +2 -12
- package/src/theme/DocItemFooter/index.tsx +91 -0
- package/src/theme/DocItemFooter/styles.module.css +18 -0
- package/src/theme/DocPage/index.tsx +16 -12
- package/src/theme/DocSidebar/index.tsx +20 -16
- package/src/theme/DocSidebarItem/index.tsx +29 -10
- package/src/theme/DocTagDocListPage/index.tsx +89 -0
- package/src/theme/DocTagsListPage/index.tsx +41 -0
- package/src/theme/DocVersionBanner/index.tsx +26 -15
- package/src/theme/EditThisPage/index.tsx +6 -1
- package/src/theme/Footer/index.tsx +16 -3
- package/src/theme/Heading/index.tsx +10 -13
- package/src/theme/Heading/styles.css +4 -6
- package/src/theme/Heading/styles.module.css +9 -5
- package/src/theme/IconClose/index.tsx +26 -0
- package/src/theme/LastUpdated/index.tsx +3 -2
- package/src/theme/LayoutHead/index.tsx +9 -9
- package/src/theme/LayoutProviders/index.tsx +8 -5
- package/src/theme/Logo/index.tsx +19 -15
- package/src/theme/MDXComponents/index.tsx +20 -1
- package/src/theme/MDXComponents/styles.css +11 -0
- package/src/theme/MDXPage/index.tsx +10 -2
- package/src/theme/Navbar/index.tsx +26 -2
- package/src/theme/Navbar/styles.module.css +5 -1
- package/src/theme/NavbarItem/DefaultNavbarItem.tsx +15 -4
- package/src/theme/NavbarItem/DocNavbarItem.tsx +9 -5
- package/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.tsx +15 -6
- package/src/theme/NavbarItem/DocsVersionNavbarItem.tsx +7 -3
- package/src/theme/NavbarItem/DropdownNavbarItem.tsx +4 -6
- package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx} +6 -5
- package/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +11 -0
- package/src/theme/NavbarItem/index.tsx +6 -1
- package/src/theme/Seo/index.tsx +7 -4
- package/src/theme/TOC/index.tsx +13 -38
- package/src/theme/TOC/styles.module.css +1 -1
- package/src/theme/TOCCollapsible/index.tsx +8 -2
- 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/ThemedImage/index.tsx +3 -3
- package/src/theme/Toggle/index.tsx +20 -15
- package/src/theme/Toggle/styles.module.css +91 -0
- package/src/theme/hooks/useContextualSearchFilters.ts +1 -1
- package/src/theme/hooks/useHideableNavbar.ts +32 -47
- package/src/theme/hooks/useTabGroupChoice.ts +2 -2
- package/src/theme/hooks/useTheme.ts +2 -2
- package/src/theme/hooks/useWindowSize.ts +2 -7
- package/src/theme/prism-include-languages.ts +3 -2
- package/src/translations.ts +6 -10
- package/src/types.d.ts +216 -105
- package/src/{validateThemeConfig.js → validateThemeConfig.ts} +46 -12
- package/tsconfig.json +0 -1
- package/update-code-translations.js +5 -4
- package/update-code-translations.test.js +1 -1
- package/update.js +151 -0
- package/lib/theme/Toggle/styles.css +0 -103
- package/lib/theme/hooks/useScrollPosition.js +0 -51
- package/lib/theme/hooks/useTOCHighlight.js +0 -87
- package/lib-next/theme/Toggle/styles.css +0 -103
- package/lib-next/theme/hooks/useScrollPosition.js +0 -42
- package/lib-next/theme/hooks/useTOCHighlight.js +0 -84
- package/src/theme/Toggle/styles.css +0 -103
- package/src/theme/hooks/useScrollPosition.ts +0 -52
- package/src/theme/hooks/useTOCHighlight.ts +0 -98
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
DEFAULT_SEARCH_TAG,
|
|
17
17
|
useTitleFormatter,
|
|
18
18
|
useAlternatePageUtils,
|
|
19
|
+
useThemeConfig,
|
|
19
20
|
} from '@docusaurus/theme-common';
|
|
20
21
|
import {useLocation} from '@docusaurus/router';
|
|
21
22
|
|
|
@@ -83,12 +84,10 @@ function CanonicalUrlHeaders({permalink}: {permalink?: string}) {
|
|
|
83
84
|
|
|
84
85
|
export default function LayoutHead(props: Props): JSX.Element {
|
|
85
86
|
const {
|
|
86
|
-
siteConfig: {
|
|
87
|
-
favicon,
|
|
88
|
-
themeConfig: {metadatas, image: defaultImage},
|
|
89
|
-
},
|
|
87
|
+
siteConfig: {favicon},
|
|
90
88
|
i18n: {currentLocale, localeConfigs},
|
|
91
89
|
} = useDocusaurusContext();
|
|
90
|
+
const {metadatas, image: defaultImage} = useThemeConfig();
|
|
92
91
|
const {title, description, image, keywords, searchMetadatas} = props;
|
|
93
92
|
const faviconUrl = useBaseUrl(favicon);
|
|
94
93
|
const pageTitle = useTitleFormatter(title);
|
|
@@ -105,13 +104,14 @@ export default function LayoutHead(props: Props): JSX.Element {
|
|
|
105
104
|
{favicon && <link rel="shortcut icon" href={faviconUrl} />}
|
|
106
105
|
<title>{pageTitle}</title>
|
|
107
106
|
<meta property="og:title" content={pageTitle} />
|
|
108
|
-
|
|
109
|
-
(defaultImage && (
|
|
110
|
-
<meta name="twitter:card" content="summary_large_image" />
|
|
111
|
-
))}
|
|
107
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
112
108
|
</Head>
|
|
113
109
|
|
|
114
|
-
|
|
110
|
+
{/* image can override the default image */}
|
|
111
|
+
{defaultImage && <Seo image={defaultImage} />}
|
|
112
|
+
{image && <Seo image={image} />}
|
|
113
|
+
|
|
114
|
+
<Seo description={description} keywords={keywords} />
|
|
115
115
|
|
|
116
116
|
<CanonicalUrlHeaders />
|
|
117
117
|
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
AnnouncementBarProvider,
|
|
13
13
|
DocsPreferredVersionContextProvider,
|
|
14
14
|
MobileSecondaryMenuProvider,
|
|
15
|
+
ScrollControllerProvider,
|
|
15
16
|
} from '@docusaurus/theme-common';
|
|
16
17
|
import type {Props} from '@theme/LayoutProviders';
|
|
17
18
|
|
|
@@ -20,11 +21,13 @@ export default function LayoutProviders({children}: Props): JSX.Element {
|
|
|
20
21
|
<ThemeProvider>
|
|
21
22
|
<AnnouncementBarProvider>
|
|
22
23
|
<UserPreferencesProvider>
|
|
23
|
-
<
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
<ScrollControllerProvider>
|
|
25
|
+
<DocsPreferredVersionContextProvider>
|
|
26
|
+
<MobileSecondaryMenuProvider>
|
|
27
|
+
{children}
|
|
28
|
+
</MobileSecondaryMenuProvider>
|
|
29
|
+
</DocsPreferredVersionContextProvider>
|
|
30
|
+
</ScrollControllerProvider>
|
|
28
31
|
</UserPreferencesProvider>
|
|
29
32
|
</AnnouncementBarProvider>
|
|
30
33
|
</ThemeProvider>
|
package/src/theme/Logo/index.tsx
CHANGED
|
@@ -12,17 +12,15 @@ import Link from '@docusaurus/Link';
|
|
|
12
12
|
import ThemedImage from '@theme/ThemedImage';
|
|
13
13
|
import useBaseUrl from '@docusaurus/useBaseUrl';
|
|
14
14
|
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
|
15
|
+
import {useThemeConfig} from '@docusaurus/theme-common';
|
|
15
16
|
|
|
16
17
|
const Logo = (props: Props): JSX.Element => {
|
|
17
18
|
const {
|
|
18
|
-
siteConfig: {
|
|
19
|
-
title,
|
|
20
|
-
themeConfig: {
|
|
21
|
-
navbar: {title: navbarTitle, logo = {src: ''}},
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
isClient,
|
|
19
|
+
siteConfig: {title},
|
|
25
20
|
} = useDocusaurusContext();
|
|
21
|
+
const {
|
|
22
|
+
navbar: {title: navbarTitle, logo = {src: ''}},
|
|
23
|
+
} = useThemeConfig();
|
|
26
24
|
|
|
27
25
|
const {imageClassName, titleClassName, ...propsRest} = props;
|
|
28
26
|
const logoLink = useBaseUrl(logo.href || '/');
|
|
@@ -30,20 +28,26 @@ const Logo = (props: Props): JSX.Element => {
|
|
|
30
28
|
light: useBaseUrl(logo.src),
|
|
31
29
|
dark: useBaseUrl(logo.srcDark || logo.src),
|
|
32
30
|
};
|
|
31
|
+
const themedImage = (
|
|
32
|
+
<ThemedImage
|
|
33
|
+
sources={sources}
|
|
34
|
+
height={logo.height}
|
|
35
|
+
width={logo.width}
|
|
36
|
+
alt={logo.alt || navbarTitle || title}
|
|
37
|
+
/>
|
|
38
|
+
);
|
|
33
39
|
|
|
34
40
|
return (
|
|
35
41
|
<Link
|
|
36
42
|
to={logoLink}
|
|
37
43
|
{...propsRest}
|
|
38
44
|
{...(logo.target && {target: logo.target})}>
|
|
39
|
-
{logo.src &&
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
/>
|
|
46
|
-
)}
|
|
45
|
+
{logo.src &&
|
|
46
|
+
(imageClassName ? (
|
|
47
|
+
<div className={imageClassName}>{themedImage}</div>
|
|
48
|
+
) : (
|
|
49
|
+
<>{themedImage}</>
|
|
50
|
+
))}
|
|
47
51
|
{navbarTitle != null && <b className={titleClassName}>{navbarTitle}</b>}
|
|
48
52
|
</Link>
|
|
49
53
|
);
|
|
@@ -6,13 +6,32 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import React, {ComponentProps, isValidElement, ReactElement} from 'react';
|
|
9
|
+
import Head from '@docusaurus/Head';
|
|
9
10
|
import Link from '@docusaurus/Link';
|
|
10
11
|
import CodeBlock, {Props} from '@theme/CodeBlock';
|
|
11
12
|
import Heading from '@theme/Heading';
|
|
12
13
|
import Details from '@theme/Details';
|
|
13
14
|
import type {MDXComponentsObject} from '@theme/MDXComponents';
|
|
14
15
|
|
|
16
|
+
import './styles.css';
|
|
17
|
+
|
|
18
|
+
// MDX elements are wrapped through the MDX pragma
|
|
19
|
+
// In some cases (notably usage with Head/Helmet) we need to unwrap those elements.
|
|
20
|
+
function unwrapMDXElement(element: ReactElement) {
|
|
21
|
+
if (element?.props?.mdxType && element?.props?.originalType) {
|
|
22
|
+
const {mdxType, originalType, ...newProps} = element.props;
|
|
23
|
+
return React.createElement(element.props.originalType, newProps);
|
|
24
|
+
}
|
|
25
|
+
return element;
|
|
26
|
+
}
|
|
27
|
+
|
|
15
28
|
const MDXComponents: MDXComponentsObject = {
|
|
29
|
+
head: (props) => {
|
|
30
|
+
const unwrappedChildren = React.Children.map(props.children, (child) =>
|
|
31
|
+
unwrapMDXElement(child as ReactElement),
|
|
32
|
+
);
|
|
33
|
+
return <Head {...props}>{unwrappedChildren}</Head>;
|
|
34
|
+
},
|
|
16
35
|
code: (props) => {
|
|
17
36
|
const {children} = props;
|
|
18
37
|
|
|
@@ -34,7 +53,7 @@ const MDXComponents: MDXComponentsObject = {
|
|
|
34
53
|
|
|
35
54
|
// See comment for `code` above
|
|
36
55
|
if (isValidElement(children) && isValidElement(children?.props?.children)) {
|
|
37
|
-
return children
|
|
56
|
+
return children.props.children;
|
|
38
57
|
}
|
|
39
58
|
|
|
40
59
|
return (
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
|
|
8
|
+
ul.contains-task-list {
|
|
9
|
+
padding-left: 0;
|
|
10
|
+
list-style: none;
|
|
11
|
+
}
|
|
@@ -18,7 +18,11 @@ import styles from './styles.module.css';
|
|
|
18
18
|
|
|
19
19
|
function MDXPage(props: Props): JSX.Element {
|
|
20
20
|
const {content: MDXPageContent} = props;
|
|
21
|
-
const {
|
|
21
|
+
const {
|
|
22
|
+
// TODO this frontmatter is not validated/normalized, it's the raw user-provided one. We should expose normalized one too!
|
|
23
|
+
frontMatter,
|
|
24
|
+
metadata,
|
|
25
|
+
} = MDXPageContent;
|
|
22
26
|
|
|
23
27
|
const {
|
|
24
28
|
title,
|
|
@@ -44,7 +48,11 @@ function MDXPage(props: Props): JSX.Element {
|
|
|
44
48
|
</div>
|
|
45
49
|
{!hideTableOfContents && MDXPageContent.toc && (
|
|
46
50
|
<div className="col col--2">
|
|
47
|
-
<TOC
|
|
51
|
+
<TOC
|
|
52
|
+
toc={MDXPageContent.toc}
|
|
53
|
+
minHeadingLevel={frontMatter.toc_min_heading_level}
|
|
54
|
+
maxHeadingLevel={frontMatter.toc_max_heading_level}
|
|
55
|
+
/>
|
|
48
56
|
</div>
|
|
49
57
|
)}
|
|
50
58
|
</div>
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
useThemeConfig,
|
|
16
16
|
useMobileSecondaryMenuRenderer,
|
|
17
17
|
usePrevious,
|
|
18
|
+
useHistoryPopHandler,
|
|
18
19
|
} from '@docusaurus/theme-common';
|
|
19
20
|
import useHideableNavbar from '@theme/hooks/useHideableNavbar';
|
|
20
21
|
import useLockBodyScroll from '@theme/hooks/useLockBodyScroll';
|
|
@@ -23,6 +24,7 @@ import {useActivePlugin} from '@theme/hooks/useDocs';
|
|
|
23
24
|
import NavbarItem, {Props as NavbarItemConfig} from '@theme/NavbarItem';
|
|
24
25
|
import Logo from '@theme/Logo';
|
|
25
26
|
import IconMenu from '@theme/IconMenu';
|
|
27
|
+
import IconClose from '@theme/IconClose';
|
|
26
28
|
|
|
27
29
|
import styles from './styles.module.css';
|
|
28
30
|
|
|
@@ -57,6 +59,18 @@ function useMobileSidebar() {
|
|
|
57
59
|
|
|
58
60
|
const [shown, setShown] = useState(false);
|
|
59
61
|
|
|
62
|
+
// Close mobile sidebar on navigation pop
|
|
63
|
+
// Most likely firing when using the Android back button (but not only)
|
|
64
|
+
useHistoryPopHandler(() => {
|
|
65
|
+
if (shown) {
|
|
66
|
+
setShown(false);
|
|
67
|
+
// Should we prevent the navigation here?
|
|
68
|
+
// See https://github.com/facebook/docusaurus/pull/5462#issuecomment-911699846
|
|
69
|
+
return false; // prevent pop navigation
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
});
|
|
73
|
+
|
|
60
74
|
const toggle = useCallback(() => {
|
|
61
75
|
setShown((s) => !s);
|
|
62
76
|
}, []);
|
|
@@ -155,12 +169,22 @@ function NavbarMobileSidebar({
|
|
|
155
169
|
imageClassName="navbar__logo"
|
|
156
170
|
titleClassName="navbar__title"
|
|
157
171
|
/>
|
|
158
|
-
{!colorModeToggle.disabled &&
|
|
172
|
+
{!colorModeToggle.disabled && (
|
|
159
173
|
<Toggle
|
|
174
|
+
className={styles.navbarSidebarToggle}
|
|
160
175
|
checked={colorModeToggle.isDarkTheme}
|
|
161
176
|
onChange={colorModeToggle.toggle}
|
|
162
177
|
/>
|
|
163
178
|
)}
|
|
179
|
+
<button
|
|
180
|
+
type="button"
|
|
181
|
+
className="clean-btn navbar-sidebar__close"
|
|
182
|
+
onClick={toggleSidebar}>
|
|
183
|
+
<IconClose
|
|
184
|
+
color="var(--ifm-color-emphasis-600)"
|
|
185
|
+
className={styles.navbarSidebarCloseSvg}
|
|
186
|
+
/>
|
|
187
|
+
</button>
|
|
164
188
|
</div>
|
|
165
189
|
|
|
166
190
|
<div
|
|
@@ -175,7 +199,7 @@ function NavbarMobileSidebar({
|
|
|
175
199
|
</ul>
|
|
176
200
|
</div>
|
|
177
201
|
|
|
178
|
-
<div className="navbar-sidebar__item
|
|
202
|
+
<div className="navbar-sidebar__item menu">
|
|
179
203
|
{items.length > 0 && (
|
|
180
204
|
<button
|
|
181
205
|
type="button"
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
/*
|
|
9
9
|
Hide toggle in small viewports
|
|
10
10
|
*/
|
|
11
|
-
@media
|
|
11
|
+
@media (max-width: 996px) {
|
|
12
12
|
.toggle {
|
|
13
13
|
display: none;
|
|
14
14
|
}
|
|
@@ -21,3 +21,7 @@ Hide toggle in small viewports
|
|
|
21
21
|
.navbarHidden {
|
|
22
22
|
transform: translate3d(0, calc(-100% - 2px), 0);
|
|
23
23
|
}
|
|
24
|
+
|
|
25
|
+
.navbarSidebarToggle {
|
|
26
|
+
margin-right: 1rem;
|
|
27
|
+
}
|
|
@@ -16,6 +16,8 @@ import type {
|
|
|
16
16
|
} from '@theme/NavbarItem/DefaultNavbarItem';
|
|
17
17
|
import IconExternalLink from '@theme/IconExternalLink';
|
|
18
18
|
import isInternalUrl from '@docusaurus/isInternalUrl';
|
|
19
|
+
import {isRegexpStringMatch} from '@docusaurus/theme-common';
|
|
20
|
+
import {getInfimaActiveClassName} from './index';
|
|
19
21
|
|
|
20
22
|
const dropdownLinkActiveClass = 'dropdown__link--active';
|
|
21
23
|
|
|
@@ -25,7 +27,7 @@ export function NavLink({
|
|
|
25
27
|
to,
|
|
26
28
|
href,
|
|
27
29
|
label,
|
|
28
|
-
activeClassName = '
|
|
30
|
+
activeClassName = '',
|
|
29
31
|
prependBaseUrlToHref,
|
|
30
32
|
...props
|
|
31
33
|
}: NavLinkProps): JSX.Element {
|
|
@@ -45,13 +47,15 @@ export function NavLink({
|
|
|
45
47
|
}
|
|
46
48
|
: {
|
|
47
49
|
isNavLink: true,
|
|
48
|
-
activeClassName
|
|
50
|
+
activeClassName: !props.className?.includes(activeClassName)
|
|
51
|
+
? activeClassName
|
|
52
|
+
: '',
|
|
49
53
|
to: toUrl,
|
|
50
54
|
...(activeBasePath || activeBaseRegex
|
|
51
55
|
? {
|
|
52
56
|
isActive: (_match, location) =>
|
|
53
57
|
activeBaseRegex
|
|
54
|
-
?
|
|
58
|
+
? isRegexpStringMatch(activeBaseRegex, location.pathname)
|
|
55
59
|
: location.pathname.startsWith(activeBaseUrl),
|
|
56
60
|
}
|
|
57
61
|
: null),
|
|
@@ -109,7 +113,14 @@ function DefaultNavbarItem({
|
|
|
109
113
|
...props
|
|
110
114
|
}: Props): JSX.Element {
|
|
111
115
|
const Comp = mobile ? DefaultNavbarItemMobile : DefaultNavbarItemDesktop;
|
|
112
|
-
return
|
|
116
|
+
return (
|
|
117
|
+
<Comp
|
|
118
|
+
{...props}
|
|
119
|
+
activeClassName={
|
|
120
|
+
props.activeClassName ?? getInfimaActiveClassName(mobile)
|
|
121
|
+
}
|
|
122
|
+
/>
|
|
123
|
+
);
|
|
113
124
|
}
|
|
114
125
|
|
|
115
126
|
export default DefaultNavbarItem;
|
|
@@ -9,6 +9,7 @@ import React from 'react';
|
|
|
9
9
|
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
|
|
10
10
|
import {useLatestVersion, useActiveDocContext} from '@theme/hooks/useDocs';
|
|
11
11
|
import clsx from 'clsx';
|
|
12
|
+
import {getInfimaActiveClassName} from './index';
|
|
12
13
|
import type {Props} from '@theme/NavbarItem/DocNavbarItem';
|
|
13
14
|
import {useDocsPreferredVersion} from '@docusaurus/theme-common';
|
|
14
15
|
import {uniq} from '@docusaurus/utils-common';
|
|
@@ -31,7 +32,6 @@ Available doc ids are:\n- ${docIds}`,
|
|
|
31
32
|
|
|
32
33
|
export default function DocNavbarItem({
|
|
33
34
|
docId,
|
|
34
|
-
activeSidebarClassName,
|
|
35
35
|
label: staticLabel,
|
|
36
36
|
docsPluginId,
|
|
37
37
|
...props
|
|
@@ -41,19 +41,23 @@ export default function DocNavbarItem({
|
|
|
41
41
|
const latestVersion = useLatestVersion(docsPluginId);
|
|
42
42
|
|
|
43
43
|
// Versions used to look for the doc to link to, ordered + no duplicate
|
|
44
|
-
const versions
|
|
45
|
-
[activeVersion, preferredVersion, latestVersion].filter(
|
|
44
|
+
const versions = uniq(
|
|
45
|
+
[activeVersion, preferredVersion, latestVersion].filter(
|
|
46
|
+
Boolean,
|
|
47
|
+
) as GlobalDataVersion[],
|
|
46
48
|
);
|
|
47
49
|
const doc = getDocInVersions(versions, docId);
|
|
50
|
+
const activeDocInfimaClassName = getInfimaActiveClassName(props.mobile);
|
|
48
51
|
|
|
49
52
|
return (
|
|
50
53
|
<DefaultNavbarItem
|
|
51
54
|
exact
|
|
52
55
|
{...props}
|
|
53
56
|
className={clsx(props.className, {
|
|
54
|
-
[
|
|
55
|
-
activeDoc && activeDoc.sidebar === doc.sidebar,
|
|
57
|
+
[activeDocInfimaClassName]:
|
|
58
|
+
activeDoc?.sidebar && activeDoc.sidebar === doc.sidebar,
|
|
56
59
|
})}
|
|
60
|
+
activeClassName={activeDocInfimaClassName}
|
|
57
61
|
label={staticLabel ?? doc.id}
|
|
58
62
|
to={doc.path}
|
|
59
63
|
/>
|
|
@@ -15,9 +15,11 @@ import {
|
|
|
15
15
|
} from '@theme/hooks/useDocs';
|
|
16
16
|
import type {Props} from '@theme/NavbarItem/DocsVersionDropdownNavbarItem';
|
|
17
17
|
import {useDocsPreferredVersion} from '@docusaurus/theme-common';
|
|
18
|
+
import {translate} from '@docusaurus/Translate';
|
|
19
|
+
import type {GlobalDataVersion} from '@docusaurus/plugin-content-docs-types';
|
|
18
20
|
|
|
19
|
-
const getVersionMainDoc = (version) =>
|
|
20
|
-
version.docs.find((doc) => doc.id === version.mainDocId)
|
|
21
|
+
const getVersionMainDoc = (version: GlobalDataVersion) =>
|
|
22
|
+
version.docs.find((doc) => doc.id === version.mainDocId)!;
|
|
21
23
|
|
|
22
24
|
export default function DocsVersionDropdownNavbarItem({
|
|
23
25
|
mobile,
|
|
@@ -31,9 +33,8 @@ export default function DocsVersionDropdownNavbarItem({
|
|
|
31
33
|
const versions = useVersions(docsPluginId);
|
|
32
34
|
const latestVersion = useLatestVersion(docsPluginId);
|
|
33
35
|
|
|
34
|
-
const {preferredVersion, savePreferredVersionName} =
|
|
35
|
-
docsPluginId
|
|
36
|
-
);
|
|
36
|
+
const {preferredVersion, savePreferredVersionName} =
|
|
37
|
+
useDocsPreferredVersion(docsPluginId);
|
|
37
38
|
|
|
38
39
|
function getItems() {
|
|
39
40
|
const versionLinks = versions.map((version) => {
|
|
@@ -62,7 +63,15 @@ export default function DocsVersionDropdownNavbarItem({
|
|
|
62
63
|
activeDocContext.activeVersion ?? preferredVersion ?? latestVersion;
|
|
63
64
|
|
|
64
65
|
// Mobile dropdown is handled a bit differently
|
|
65
|
-
const dropdownLabel =
|
|
66
|
+
const dropdownLabel =
|
|
67
|
+
mobile && items
|
|
68
|
+
? translate({
|
|
69
|
+
id: 'theme.navbar.mobileVersionsDropdown.label',
|
|
70
|
+
message: 'Versions',
|
|
71
|
+
description:
|
|
72
|
+
'The label for the navbar versions dropdown on mobile view',
|
|
73
|
+
})
|
|
74
|
+
: dropdownVersion.label;
|
|
66
75
|
const dropdownTo =
|
|
67
76
|
mobile && items ? undefined : getVersionMainDoc(dropdownVersion).path;
|
|
68
77
|
|
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
|
|
8
8
|
import React from 'react';
|
|
9
9
|
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
useActiveVersion,
|
|
12
|
+
useLatestVersion,
|
|
13
|
+
GlobalVersion,
|
|
14
|
+
} from '@theme/hooks/useDocs';
|
|
11
15
|
import type {Props} from '@theme/NavbarItem/DocsVersionNavbarItem';
|
|
12
16
|
import {useDocsPreferredVersion} from '@docusaurus/theme-common';
|
|
13
17
|
|
|
14
|
-
const getVersionMainDoc = (version) =>
|
|
15
|
-
version.docs.find((doc) => doc.id === version.mainDocId)
|
|
18
|
+
const getVersionMainDoc = (version: GlobalVersion) =>
|
|
19
|
+
version.docs.find((doc) => doc.id === version.mainDocId)!;
|
|
16
20
|
|
|
17
21
|
export default function DocsVersionNavbarItem({
|
|
18
22
|
label: staticLabel,
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
isSamePath,
|
|
12
12
|
useCollapsible,
|
|
13
13
|
Collapsible,
|
|
14
|
+
isRegexpStringMatch,
|
|
14
15
|
useLocalPathname,
|
|
15
16
|
} from '@docusaurus/theme-common';
|
|
16
17
|
import type {
|
|
@@ -31,10 +32,7 @@ function isItemActive(
|
|
|
31
32
|
if (isSamePath(item.to, localPathname)) {
|
|
32
33
|
return true;
|
|
33
34
|
}
|
|
34
|
-
if (
|
|
35
|
-
item.activeBaseRegex &&
|
|
36
|
-
new RegExp(item.activeBaseRegex).test(localPathname)
|
|
37
|
-
) {
|
|
35
|
+
if (isRegexpStringMatch(item.activeBaseRegex, localPathname)) {
|
|
38
36
|
return true;
|
|
39
37
|
}
|
|
40
38
|
if (item.activeBasePath && localPathname.startsWith(item.activeBasePath)) {
|
|
@@ -88,7 +86,7 @@ function DropdownNavbarItemDesktop({
|
|
|
88
86
|
'dropdown--show': showDropdown,
|
|
89
87
|
})}>
|
|
90
88
|
<NavLink
|
|
91
|
-
className={clsx('
|
|
89
|
+
className={clsx('navbar__link', className)}
|
|
92
90
|
{...props}
|
|
93
91
|
onClick={props.to ? undefined : (e) => e.preventDefault()}
|
|
94
92
|
onKeyDown={(e) => {
|
|
@@ -141,7 +139,7 @@ function DropdownNavbarItemMobile({
|
|
|
141
139
|
if (containsActive) {
|
|
142
140
|
setCollapsed(!containsActive);
|
|
143
141
|
}
|
|
144
|
-
}, [localPathname, containsActive]);
|
|
142
|
+
}, [localPathname, containsActive, setCollapsed]);
|
|
145
143
|
|
|
146
144
|
return (
|
|
147
145
|
<li
|
package/src/theme/NavbarItem/{LocaleDropdownNavbarItem.tsx → LocaleDropdownNavbarItem/index.tsx}
RENAMED
|
@@ -11,6 +11,9 @@ import IconLanguage from '@theme/IconLanguage';
|
|
|
11
11
|
import type {Props} from '@theme/NavbarItem/LocaleDropdownNavbarItem';
|
|
12
12
|
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
|
13
13
|
import {useAlternatePageUtils} from '@docusaurus/theme-common';
|
|
14
|
+
import type {LinkLikeNavbarItemProps} from '@theme/NavbarItem';
|
|
15
|
+
|
|
16
|
+
import styles from './styles.module.css';
|
|
14
17
|
|
|
15
18
|
export default function LocaleDropdownNavbarItem({
|
|
16
19
|
mobile,
|
|
@@ -23,11 +26,11 @@ export default function LocaleDropdownNavbarItem({
|
|
|
23
26
|
} = useDocusaurusContext();
|
|
24
27
|
const alternatePageUtils = useAlternatePageUtils();
|
|
25
28
|
|
|
26
|
-
function getLocaleLabel(locale) {
|
|
29
|
+
function getLocaleLabel(locale: string) {
|
|
27
30
|
return localeConfigs[locale].label;
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
const localeItems = locales.map((locale) => {
|
|
33
|
+
const localeItems = locales.map((locale): LinkLikeNavbarItemProps => {
|
|
31
34
|
const to = `pathname://${alternatePageUtils.createUrl({
|
|
32
35
|
locale,
|
|
33
36
|
fullyQualified: false,
|
|
@@ -55,9 +58,7 @@ export default function LocaleDropdownNavbarItem({
|
|
|
55
58
|
mobile={mobile}
|
|
56
59
|
label={
|
|
57
60
|
<span>
|
|
58
|
-
<IconLanguage
|
|
59
|
-
style={{verticalAlign: 'text-bottom', marginRight: 5}}
|
|
60
|
-
/>
|
|
61
|
+
<IconLanguage className={styles.iconLanguage} />
|
|
61
62
|
<span>{dropdownLabel}</span>
|
|
62
63
|
</span>
|
|
63
64
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
|
|
8
|
+
.iconLanguage {
|
|
9
|
+
vertical-align: text-bottom;
|
|
10
|
+
margin-right: 5px;
|
|
11
|
+
}
|
|
@@ -16,7 +16,9 @@ import type {Types, Props} from '@theme/NavbarItem';
|
|
|
16
16
|
|
|
17
17
|
const NavbarItemComponents: Record<
|
|
18
18
|
Exclude<Types, undefined>,
|
|
19
|
-
|
|
19
|
+
// TODO: properly type this
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
() => (props: any) => JSX.Element
|
|
20
22
|
> = {
|
|
21
23
|
default: () => DefaultNavbarItem,
|
|
22
24
|
localeDropdown: () => LocaleDropdownNavbarItem,
|
|
@@ -55,6 +57,9 @@ function getComponentType(
|
|
|
55
57
|
return type as NavbarItemComponentType;
|
|
56
58
|
}
|
|
57
59
|
|
|
60
|
+
export const getInfimaActiveClassName = (mobile?: boolean): string =>
|
|
61
|
+
mobile ? 'menu__link--active' : 'navbar__link--active';
|
|
62
|
+
|
|
58
63
|
export default function NavbarItem({type, ...props}: Props): JSX.Element {
|
|
59
64
|
const componentType = getComponentType(
|
|
60
65
|
type,
|
package/src/theme/Seo/index.tsx
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
import React from 'react';
|
|
9
9
|
import Head from '@docusaurus/Head';
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
10
|
+
import {useTitleFormatter} from '@docusaurus/theme-common';
|
|
11
|
+
import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
|
|
12
12
|
|
|
13
13
|
import type {Props} from '@theme/Seo';
|
|
14
14
|
|
|
@@ -17,10 +17,11 @@ export default function Seo({
|
|
|
17
17
|
description,
|
|
18
18
|
keywords,
|
|
19
19
|
image,
|
|
20
|
+
children,
|
|
20
21
|
}: Props): JSX.Element {
|
|
21
|
-
const {image: defaultImage} = useThemeConfig();
|
|
22
22
|
const pageTitle = useTitleFormatter(title);
|
|
23
|
-
const
|
|
23
|
+
const {withBaseUrl} = useBaseUrlUtils();
|
|
24
|
+
const pageImage = image ? withBaseUrl(image, {absolute: true}) : undefined;
|
|
24
25
|
|
|
25
26
|
return (
|
|
26
27
|
<Head>
|
|
@@ -41,6 +42,8 @@ export default function Seo({
|
|
|
41
42
|
|
|
42
43
|
{pageImage && <meta property="og:image" content={pageImage} />}
|
|
43
44
|
{pageImage && <meta name="twitter:image" content={pageImage} />}
|
|
45
|
+
|
|
46
|
+
{children}
|
|
44
47
|
</Head>
|
|
45
48
|
);
|
|
46
49
|
}
|
package/src/theme/TOC/index.tsx
CHANGED
|
@@ -7,48 +7,23 @@
|
|
|
7
7
|
|
|
8
8
|
import React from 'react';
|
|
9
9
|
import clsx from 'clsx';
|
|
10
|
-
import
|
|
11
|
-
import
|
|
10
|
+
import type {TOCProps} from '@theme/TOC';
|
|
11
|
+
import TOCItems from '@theme/TOCItems';
|
|
12
12
|
import styles from './styles.module.css';
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
14
|
+
// Using a custom className
|
|
15
|
+
// This prevents TOC highlighting to highlight TOCInline/TOCCollapsible by mistake
|
|
16
|
+
const LINK_CLASS_NAME = 'table-of-contents__link toc-highlight';
|
|
17
|
+
const LINK_ACTIVE_CLASS_NAME = 'table-of-contents__link--active';
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
export function TOCHeadings({
|
|
20
|
-
toc,
|
|
21
|
-
isChild,
|
|
22
|
-
}: TOCHeadingsProps): JSX.Element | null {
|
|
23
|
-
if (!toc.length) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
19
|
+
function TOC({className, ...props}: TOCProps): JSX.Element {
|
|
26
20
|
return (
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
<a
|
|
34
|
-
href={`#${heading.id}`}
|
|
35
|
-
className={LINK_CLASS_NAME}
|
|
36
|
-
// Developer provided the HTML, so assume it's safe.
|
|
37
|
-
// eslint-disable-next-line react/no-danger
|
|
38
|
-
dangerouslySetInnerHTML={{__html: heading.value}}
|
|
39
|
-
/>
|
|
40
|
-
<TOCHeadings isChild toc={heading.children} />
|
|
41
|
-
</li>
|
|
42
|
-
))}
|
|
43
|
-
</ul>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function TOC({toc}: TOCProps): JSX.Element {
|
|
48
|
-
useTOCHighlight(LINK_CLASS_NAME, ACTIVE_LINK_CLASS_NAME, TOP_OFFSET);
|
|
49
|
-
return (
|
|
50
|
-
<div className={clsx(styles.tableOfContents, 'thin-scrollbar')}>
|
|
51
|
-
<TOCHeadings toc={toc} />
|
|
21
|
+
<div className={clsx(styles.tableOfContents, 'thin-scrollbar', className)}>
|
|
22
|
+
<TOCItems
|
|
23
|
+
{...props}
|
|
24
|
+
linkClassName={LINK_CLASS_NAME}
|
|
25
|
+
linkActiveClassName={LINK_ACTIVE_CLASS_NAME}
|
|
26
|
+
/>
|
|
52
27
|
</div>
|
|
53
28
|
);
|
|
54
29
|
}
|