@docusaurus/theme-classic 2.0.0-beta.17 → 2.0.0-beta.18

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.
Files changed (184) hide show
  1. package/lib/getSwizzleConfig.js +113 -2
  2. package/lib/index.js +7 -12
  3. package/lib/theme-classic.d.ts +286 -60
  4. package/lib/translations.js +12 -2
  5. package/lib/validateThemeConfig.js +1 -1
  6. package/lib-next/theme/BackToTopButton/index.js +1 -3
  7. package/lib-next/theme/BlogArchivePage/index.js +14 -10
  8. package/lib-next/theme/BlogListPage/index.js +34 -13
  9. package/lib-next/theme/BlogPostItem/index.js +6 -6
  10. package/lib-next/theme/BlogPostPage/index.js +56 -45
  11. package/lib-next/theme/BlogTagsListPage/index.js +16 -12
  12. package/lib-next/theme/BlogTagsPostsPage/index.js +40 -33
  13. package/lib-next/theme/CodeBlock/CopyButton/index.js +60 -0
  14. package/lib-next/theme/CodeBlock/CopyButton/styles.module.css +66 -0
  15. package/lib-next/theme/CodeBlock/index.js +4 -36
  16. package/lib-next/theme/CodeBlock/styles.module.css +2 -22
  17. package/lib-next/theme/ColorModeToggle/index.js +36 -57
  18. package/lib-next/theme/ColorModeToggle/styles.module.css +8 -24
  19. package/lib-next/theme/DocBreadcrumbs/index.js +28 -11
  20. package/lib-next/theme/DocBreadcrumbs/styles.module.css +2 -17
  21. package/lib-next/theme/DocCard/index.js +17 -15
  22. package/lib-next/theme/DocCard/styles.module.css +8 -17
  23. package/lib-next/theme/DocCardList/index.js +15 -3
  24. package/lib-next/theme/DocCategoryGeneratedIndexPage/index.js +27 -6
  25. package/lib-next/theme/DocItem/index.js +84 -66
  26. package/lib-next/theme/DocPage/index.js +88 -89
  27. package/lib-next/theme/DocPage/styles.module.css +0 -4
  28. package/lib-next/theme/DocSidebar/Desktop/CollapseButton/index.js +34 -0
  29. package/lib-next/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +44 -0
  30. package/lib-next/theme/DocSidebar/Desktop/Content/index.js +46 -0
  31. package/lib-next/theme/DocSidebar/Desktop/Content/styles.module.css +17 -0
  32. package/lib-next/theme/DocSidebar/Desktop/index.js +34 -0
  33. package/lib-next/theme/DocSidebar/Desktop/styles.module.css +50 -0
  34. package/lib-next/theme/DocSidebar/Mobile/index.js +49 -0
  35. package/lib-next/theme/DocSidebar/index.js +6 -113
  36. package/lib-next/theme/DocSidebarItem/index.js +14 -13
  37. package/lib-next/theme/DocSidebarItem/styles.module.css +4 -0
  38. package/lib-next/theme/DocTagDocListPage/index.js +38 -31
  39. package/lib-next/theme/DocTagsListPage/index.js +21 -16
  40. package/lib-next/theme/Footer/Copyright/index.js +18 -0
  41. package/lib-next/theme/Footer/Layout/index.js +26 -0
  42. package/lib-next/theme/Footer/LinkItem/index.js +33 -0
  43. package/lib-next/theme/Footer/Links/MultiColumn/index.js +47 -0
  44. package/lib-next/theme/Footer/Links/Simple/index.js +41 -0
  45. package/lib-next/theme/Footer/Links/index.js +17 -0
  46. package/lib-next/theme/Footer/Logo/index.js +38 -0
  47. package/lib-next/theme/Footer/{styles.module.css → Logo/styles.module.css} +0 -0
  48. package/lib-next/theme/Footer/index.js +11 -163
  49. package/lib-next/theme/Heading/index.js +6 -4
  50. package/lib-next/theme/IconExternalLink/styles.module.css +0 -2
  51. package/lib-next/theme/Layout/index.js +15 -10
  52. package/lib-next/theme/LayoutProviders/index.js +5 -4
  53. package/lib-next/theme/MDXComponents/A.js +11 -0
  54. package/lib-next/theme/MDXComponents/Code.js +28 -0
  55. package/lib-next/theme/MDXComponents/Details.js +20 -0
  56. package/lib-next/theme/MDXComponents/Head.js +26 -0
  57. package/lib-next/theme/MDXComponents/Heading.js +11 -0
  58. package/lib-next/theme/MDXComponents/Img.js +24 -0
  59. package/lib-next/theme/MDXComponents/Img.module.css +10 -0
  60. package/lib-next/theme/MDXComponents/Pre.js +18 -0
  61. package/lib-next/theme/MDXComponents/Ul.js +23 -0
  62. package/{src/theme/MDXComponents/styles.css → lib-next/theme/MDXComponents/Ul.module.css} +1 -5
  63. package/lib-next/theme/MDXComponents/index.js +22 -71
  64. package/lib-next/theme/MDXContent/index.js +12 -0
  65. package/lib-next/theme/MDXPage/index.js +33 -28
  66. package/lib-next/theme/Navbar/ColorModeToggle/index.js +25 -0
  67. package/lib-next/theme/Navbar/Content/index.js +70 -0
  68. package/lib-next/theme/Navbar/Content/styles.module.css +15 -0
  69. package/lib-next/theme/Navbar/Layout/index.js +54 -0
  70. package/{src/theme/Navbar → lib-next/theme/Navbar/Layout}/styles.module.css +0 -13
  71. package/lib-next/theme/Navbar/Logo/index.js +17 -0
  72. package/lib-next/theme/Navbar/MobileSidebar/Header/index.js +33 -0
  73. package/lib-next/theme/Navbar/MobileSidebar/Layout/index.js +28 -0
  74. package/lib-next/theme/Navbar/MobileSidebar/PrimaryMenu/index.js +33 -0
  75. package/lib-next/theme/Navbar/MobileSidebar/SecondaryMenu/index.js +36 -0
  76. package/lib-next/theme/Navbar/MobileSidebar/Toggle/index.js +23 -0
  77. package/lib-next/theme/Navbar/MobileSidebar/index.js +31 -0
  78. package/lib-next/theme/Navbar/index.js +6 -271
  79. package/lib-next/theme/NavbarItem/DefaultNavbarItem.js +2 -6
  80. package/lib-next/theme/NavbarItem/DropdownNavbarItem.js +10 -2
  81. package/lib-next/theme/NavbarItem/NavbarNavLink.js +8 -12
  82. package/lib-next/theme/NotFound.js +38 -33
  83. package/lib-next/theme/{LayoutHead → SiteMetadata}/index.js +11 -26
  84. package/lib-next/theme/TOCCollapsible/index.js +1 -3
  85. package/lib-next/theme/Tabs/__tests__/index.test.js +5 -5
  86. package/lib-next/theme/Tabs/index.js +2 -2
  87. package/lib-next/theme/Tag/index.js +4 -4
  88. package/lib-next/theme/ThemedImage/index.js +3 -3
  89. package/package.json +17 -17
  90. package/src/getSwizzleConfig.ts +122 -1
  91. package/src/index.ts +10 -12
  92. package/src/theme/BackToTopButton/index.tsx +1 -3
  93. package/src/theme/BlogArchivePage/index.tsx +18 -17
  94. package/src/theme/BlogLayout/index.tsx +1 -1
  95. package/src/theme/BlogListPage/index.tsx +32 -13
  96. package/src/theme/BlogPostItem/index.tsx +6 -6
  97. package/src/theme/BlogPostPage/index.tsx +55 -48
  98. package/src/theme/BlogTagsListPage/index.tsx +16 -12
  99. package/src/theme/BlogTagsPostsPage/index.tsx +39 -32
  100. package/src/theme/CodeBlock/CopyButton/index.tsx +66 -0
  101. package/src/theme/CodeBlock/CopyButton/styles.module.css +66 -0
  102. package/src/theme/CodeBlock/index.tsx +6 -38
  103. package/src/theme/CodeBlock/styles.module.css +2 -22
  104. package/src/theme/ColorModeToggle/index.tsx +36 -61
  105. package/src/theme/ColorModeToggle/styles.module.css +8 -24
  106. package/src/theme/DocBreadcrumbs/index.tsx +29 -10
  107. package/src/theme/DocBreadcrumbs/styles.module.css +2 -17
  108. package/src/theme/DocCard/index.tsx +24 -17
  109. package/src/theme/DocCard/styles.module.css +8 -17
  110. package/src/theme/DocCardList/index.tsx +14 -3
  111. package/src/theme/DocCategoryGeneratedIndexPage/index.tsx +31 -4
  112. package/src/theme/DocItem/index.tsx +71 -55
  113. package/src/theme/DocPage/index.tsx +89 -90
  114. package/src/theme/DocPage/styles.module.css +0 -4
  115. package/src/theme/DocSidebar/Desktop/CollapseButton/index.tsx +38 -0
  116. package/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +44 -0
  117. package/src/theme/DocSidebar/Desktop/Content/index.tsx +55 -0
  118. package/src/theme/DocSidebar/Desktop/Content/styles.module.css +17 -0
  119. package/src/theme/DocSidebar/Desktop/index.tsx +38 -0
  120. package/src/theme/DocSidebar/Desktop/styles.module.css +50 -0
  121. package/src/theme/DocSidebar/Mobile/index.tsx +54 -0
  122. package/src/theme/DocSidebar/index.tsx +6 -121
  123. package/src/theme/DocSidebarItem/index.tsx +15 -16
  124. package/src/theme/DocSidebarItem/styles.module.css +4 -0
  125. package/src/theme/DocTagDocListPage/index.tsx +38 -30
  126. package/src/theme/DocTagsListPage/index.tsx +21 -16
  127. package/src/theme/DocVersionBanner/index.tsx +3 -4
  128. package/src/theme/Footer/Copyright/index.tsx +20 -0
  129. package/src/theme/Footer/Layout/index.tsx +34 -0
  130. package/src/theme/Footer/LinkItem/index.tsx +36 -0
  131. package/src/theme/Footer/Links/MultiColumn/index.tsx +51 -0
  132. package/src/theme/Footer/Links/Simple/index.tsx +42 -0
  133. package/src/theme/Footer/Links/index.tsx +21 -0
  134. package/src/theme/Footer/Logo/index.tsx +41 -0
  135. package/src/theme/Footer/{styles.module.css → Logo/styles.module.css} +0 -0
  136. package/src/theme/Footer/index.tsx +12 -186
  137. package/src/theme/Heading/index.tsx +6 -4
  138. package/src/theme/IconExternalLink/styles.module.css +0 -2
  139. package/src/theme/Layout/index.tsx +15 -10
  140. package/src/theme/LayoutProviders/index.tsx +5 -4
  141. package/src/theme/MDXComponents/A.tsx +14 -0
  142. package/src/theme/MDXComponents/Code.tsx +37 -0
  143. package/src/theme/MDXComponents/Details.tsx +26 -0
  144. package/src/theme/MDXComponents/Head.tsx +29 -0
  145. package/src/theme/MDXComponents/Heading.tsx +14 -0
  146. package/src/theme/MDXComponents/Img.module.css +10 -0
  147. package/src/theme/MDXComponents/Img.tsx +26 -0
  148. package/src/theme/MDXComponents/Pre.tsx +22 -0
  149. package/{lib-next/theme/MDXComponents/styles.css → src/theme/MDXComponents/Ul.module.css} +1 -5
  150. package/src/theme/MDXComponents/Ul.tsx +28 -0
  151. package/src/theme/MDXComponents/index.tsx +23 -80
  152. package/src/theme/MDXContent/index.tsx +15 -0
  153. package/src/theme/MDXPage/index.tsx +33 -28
  154. package/src/theme/Navbar/ColorModeToggle/index.tsx +30 -0
  155. package/src/theme/Navbar/Content/index.tsx +81 -0
  156. package/src/theme/Navbar/Content/styles.module.css +15 -0
  157. package/src/theme/Navbar/Layout/index.tsx +57 -0
  158. package/{lib-next/theme/Navbar → src/theme/Navbar/Layout}/styles.module.css +0 -13
  159. package/src/theme/Navbar/Logo/index.tsx +19 -0
  160. package/src/theme/Navbar/MobileSidebar/Header/index.tsx +34 -0
  161. package/src/theme/Navbar/MobileSidebar/Layout/index.tsx +31 -0
  162. package/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx +38 -0
  163. package/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx +38 -0
  164. package/src/theme/Navbar/MobileSidebar/Toggle/index.tsx +25 -0
  165. package/src/theme/Navbar/MobileSidebar/index.tsx +33 -0
  166. package/src/theme/Navbar/index.tsx +6 -286
  167. package/src/theme/NavbarItem/DefaultNavbarItem.tsx +2 -2
  168. package/src/theme/NavbarItem/DropdownNavbarItem.tsx +11 -2
  169. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx +1 -1
  170. package/src/theme/NavbarItem/NavbarNavLink.tsx +3 -7
  171. package/src/theme/NavbarItem/index.tsx +3 -4
  172. package/src/theme/NotFound.tsx +38 -33
  173. package/src/theme/{LayoutHead → SiteMetadata}/index.tsx +11 -25
  174. package/src/theme/TOCCollapsible/index.tsx +1 -3
  175. package/src/theme/Tabs/index.tsx +5 -6
  176. package/src/theme/Tag/index.tsx +4 -4
  177. package/src/theme/ThemedImage/index.tsx +4 -3
  178. package/src/theme-classic.d.ts +286 -60
  179. package/src/translations.ts +12 -6
  180. package/src/validateThemeConfig.ts +6 -6
  181. package/lib-next/theme/DocSidebar/styles.module.css +0 -107
  182. package/lib-next/theme/Seo/index.js +0 -40
  183. package/src/theme/DocSidebar/styles.module.css +0 -107
  184. package/src/theme/Seo/index.tsx +0 -49
@@ -7,7 +7,6 @@
7
7
 
8
8
  .codeBlockContainer {
9
9
  margin-bottom: var(--ifm-leading);
10
- border-radius: var(--ifm-global-radius);
11
10
  box-shadow: var(--ifm-global-shadow-lw);
12
11
  }
13
12
 
@@ -15,6 +14,7 @@
15
14
  position: relative;
16
15
  /* rtl:ignore */
17
16
  direction: ltr;
17
+ border-radius: var(--ifm-global-radius);
18
18
  }
19
19
 
20
20
  .codeBlockTitle {
@@ -29,7 +29,7 @@
29
29
  .codeBlock {
30
30
  margin: 0;
31
31
  padding: 0;
32
- border-radius: var(--ifm-global-radius);
32
+ background-color: inherit;
33
33
  }
34
34
 
35
35
  .codeBlockTitle + .codeBlockContent .codeBlock {
@@ -39,26 +39,6 @@
39
39
 
40
40
  .codeBlockStandalone {
41
41
  padding: 0;
42
- border-radius: var(--ifm-global-radius);
43
- }
44
-
45
- .copyButton {
46
- background: rgb(0 0 0 / 30%);
47
- border-radius: var(--ifm-global-radius);
48
- color: var(--ifm-color-white);
49
- opacity: 0;
50
- user-select: none;
51
- padding: 0.4rem 0.5rem;
52
- position: absolute;
53
- right: calc(var(--ifm-pre-padding) / 2);
54
- top: calc(var(--ifm-pre-padding) / 2);
55
- transition: opacity 200ms ease-in-out;
56
- }
57
-
58
- .copyButton:focus,
59
- .codeBlockContent:hover > .copyButton,
60
- .codeBlockTitle:hover + .codeBlockContent .copyButton {
61
- opacity: 1;
62
42
  }
63
43
 
64
44
  .codeBlockLines {
@@ -4,7 +4,7 @@
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, useRef, useEffect} from 'react';
7
+ import React from 'react';
8
8
  import useIsBrowser from '@docusaurus/useIsBrowser';
9
9
  import {translate} from '@docusaurus/Translate';
10
10
  import IconLightMode from '@theme/IconLightMode';
@@ -12,70 +12,49 @@ import IconDarkMode from '@theme/IconDarkMode';
12
12
  import clsx from 'clsx';
13
13
  import styles from './styles.module.css';
14
14
 
15
- function ColorModeToggle({className, checked: defaultChecked, onChange}) {
15
+ function ColorModeToggle({className, value, onChange}) {
16
16
  const isBrowser = useIsBrowser();
17
- const [checked, setChecked] = useState(defaultChecked);
18
- const [focused, setFocused] = useState(false);
19
- const inputRef = useRef(null);
20
- useEffect(() => {
21
- setChecked(defaultChecked);
22
- }, [defaultChecked]);
17
+ const title = translate(
18
+ {
19
+ message: 'Switch between dark and light mode (currently {mode})',
20
+ id: 'theme.colorToggle.ariaLabel',
21
+ description: 'The ARIA label for the navbar color mode toggle',
22
+ },
23
+ {
24
+ mode:
25
+ value === 'dark'
26
+ ? translate({
27
+ message: 'dark mode',
28
+ id: 'theme.colorToggle.ariaLabel.mode.dark',
29
+ description: 'The name for the dark color mode',
30
+ })
31
+ : translate({
32
+ message: 'light mode',
33
+ id: 'theme.colorToggle.ariaLabel.mode.light',
34
+ description: 'The name for the light color mode',
35
+ }),
36
+ },
37
+ );
23
38
  return (
24
- <div
25
- className={clsx(styles.toggle, className, {
26
- [styles.toggleChecked]: checked,
27
- [styles.toggleFocused]: focused,
28
- [styles.toggleDisabled]: !isBrowser,
29
- })}>
30
- {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
31
- <div
32
- className={styles.toggleButton}
33
- role="button"
34
- tabIndex={-1}
35
- onClick={() => inputRef.current?.click()}>
39
+ <div className={clsx(styles.toggle, className)}>
40
+ <button
41
+ className={clsx(
42
+ 'clean-btn',
43
+ styles.toggleButton,
44
+ !isBrowser && styles.toggleButtonDisabled,
45
+ )}
46
+ type="button"
47
+ onClick={() => onChange(value === 'dark' ? 'light' : 'dark')}
48
+ disabled={!isBrowser}
49
+ title={title}
50
+ aria-label={title}>
36
51
  <IconLightMode
37
52
  className={clsx(styles.toggleIcon, styles.lightToggleIcon)}
38
53
  />
39
54
  <IconDarkMode
40
55
  className={clsx(styles.toggleIcon, styles.darkToggleIcon)}
41
56
  />
42
- </div>
43
-
44
- <input
45
- ref={inputRef}
46
- checked={checked}
47
- type="checkbox"
48
- className={styles.toggleScreenReader}
49
- aria-label={translate(
50
- {
51
- message: 'Switch between dark and light mode (currently {mode})',
52
- id: 'theme.colorToggle.ariaLabel',
53
- description: 'The ARIA label for the navbar color mode toggle',
54
- },
55
- {
56
- mode: checked
57
- ? translate({
58
- message: 'dark mode',
59
- id: 'theme.colorToggle.ariaLabel.mode.dark',
60
- description: 'The name for the dark color mode',
61
- })
62
- : translate({
63
- message: 'light mode',
64
- id: 'theme.colorToggle.ariaLabel.mode.light',
65
- description: 'The name for the light color mode',
66
- }),
67
- },
68
- )}
69
- onChange={onChange}
70
- onClick={() => setChecked(!checked)}
71
- onFocus={() => setFocused(true)}
72
- onBlur={() => setFocused(false)}
73
- onKeyDown={(e) => {
74
- if (e.key === 'Enter') {
75
- inputRef.current?.click();
76
- }
77
- }}
78
- />
57
+ </button>
79
58
  </div>
80
59
  );
81
60
  }
@@ -6,28 +6,11 @@
6
6
  */
7
7
 
8
8
  .toggle {
9
- position: relative;
10
- width: 32px;
11
- height: 32px;
12
- }
13
-
14
- .toggleScreenReader {
15
- border: 0;
16
- clip: rect(0 0 0 0);
17
- height: 1px;
18
- margin: -1px;
19
- overflow: hidden;
20
- position: absolute;
21
- width: 1px;
22
- }
23
-
24
- .toggleDisabled {
25
- cursor: not-allowed;
9
+ width: 2rem;
10
+ height: 2rem;
26
11
  }
27
12
 
28
13
  .toggleButton {
29
- cursor: pointer;
30
- user-select: none;
31
14
  -webkit-tap-highlight-color: transparent;
32
15
  align-items: center;
33
16
  display: flex;
@@ -35,17 +18,18 @@
35
18
  width: 100%;
36
19
  height: 100%;
37
20
  border-radius: 50%;
21
+ transition: background var(--ifm-transition-fast);
38
22
  }
39
23
 
40
24
  .toggleButton:hover {
41
- background-color: #00000010;
42
- }
43
-
44
- [data-theme='dark'] .toggleButton:hover {
45
- background-color: #ffffff20;
25
+ background: var(--ifm-color-emphasis-200);
46
26
  }
47
27
 
48
28
  [data-theme='light'] .darkToggleIcon,
49
29
  [data-theme='dark'] .lightToggleIcon {
50
30
  display: none;
51
31
  }
32
+
33
+ .toggleButtonDisabled {
34
+ cursor: not-allowed;
35
+ }
@@ -16,23 +16,29 @@ import Link from '@docusaurus/Link';
16
16
  import useBaseUrl from '@docusaurus/useBaseUrl'; // TODO move to design system folder
17
17
 
18
18
  function BreadcrumbsItemLink({children, href}) {
19
- const className = clsx('breadcrumbs__link', styles.breadcrumbsItemLink);
19
+ const className = 'breadcrumbs__link';
20
20
  return href ? (
21
- <Link className={className} href={href}>
22
- {children}
21
+ <Link className={className} href={href} itemProp="item">
22
+ <span itemProp="name">{children}</span>
23
23
  </Link>
24
24
  ) : (
25
- <span className={className}>{children}</span>
25
+ <span className={className} itemProp="item name">
26
+ {children}
27
+ </span>
26
28
  );
27
29
  } // TODO move to design system folder
28
30
 
29
- function BreadcrumbsItem({children, active}) {
31
+ function BreadcrumbsItem({children, active, index}) {
30
32
  return (
31
33
  <li
34
+ itemScope
35
+ itemProp="itemListElement"
36
+ itemType="https://schema.org/ListItem"
32
37
  className={clsx('breadcrumbs__item', {
33
38
  'breadcrumbs__item--active': active,
34
39
  })}>
35
40
  {children}
41
+ <meta itemProp="position" content={String(index + 1)} />
36
42
  </li>
37
43
  );
38
44
  }
@@ -40,9 +46,13 @@ function BreadcrumbsItem({children, active}) {
40
46
  function HomeBreadcrumbItem() {
41
47
  const homeHref = useBaseUrl('/');
42
48
  return (
43
- <BreadcrumbsItem>
44
- <BreadcrumbsItemLink href={homeHref}>🏠</BreadcrumbsItemLink>
45
- </BreadcrumbsItem>
49
+ <li className="breadcrumbs__item">
50
+ <Link
51
+ className={clsx('breadcrumbs__link', styles.breadcrumbsItemLink)}
52
+ href={homeHref}>
53
+ 🏠
54
+ </Link>
55
+ </li>
46
56
  );
47
57
  }
48
58
 
@@ -61,11 +71,18 @@ export default function DocBreadcrumbs() {
61
71
  styles.breadcrumbsContainer,
62
72
  )}
63
73
  aria-label="breadcrumbs">
64
- <ul className="breadcrumbs">
74
+ <ul
75
+ className="breadcrumbs"
76
+ itemScope
77
+ itemType="https://schema.org/BreadcrumbList">
65
78
  {homePageRoute && <HomeBreadcrumbItem />}
66
79
  {breadcrumbs.map((item, idx) => (
67
- <BreadcrumbsItem key={idx} active={idx === breadcrumbs.length - 1}>
68
- <BreadcrumbsItemLink href={item.href}>
80
+ <BreadcrumbsItem
81
+ key={idx}
82
+ active={idx === breadcrumbs.length - 1}
83
+ index={idx}>
84
+ <BreadcrumbsItemLink
85
+ href={idx < breadcrumbs.length - 1 ? item.href : undefined}>
69
86
  {item.label}
70
87
  </BreadcrumbsItemLink>
71
88
  </BreadcrumbsItem>
@@ -6,21 +6,6 @@
6
6
  */
7
7
 
8
8
  .breadcrumbsContainer {
9
- margin-bottom: 0.4rem;
10
- }
11
-
12
- .breadcrumbsItemLink {
13
- --ifm-breadcrumb-size-multiplier: 0.7 !important;
14
- margin-bottom: 0.4rem;
15
- background: var(--ifm-color-gray-100);
16
- }
17
-
18
- html[data-theme='dark'] .breadcrumbsItemLink {
19
- background-color: var(--ifm-color-gray-900);
20
- }
21
-
22
- @media (min-width: 997px) {
23
- .breadcrumbsItemLink {
24
- --ifm-breadcrumb-size-multiplier: 0.8;
25
- }
9
+ --ifm-breadcrumb-size-multiplier: 0.8;
10
+ margin-bottom: 0.8rem;
26
11
  }
@@ -13,17 +13,12 @@ import isInternalUrl from '@docusaurus/isInternalUrl';
13
13
  import {translate} from '@docusaurus/Translate';
14
14
 
15
15
  function CardContainer({href, children}) {
16
- const className = clsx(
17
- 'card margin-bottom--lg padding--lg',
18
- styles.cardContainer,
19
- href && styles.cardContainerLink,
20
- );
21
- return href ? (
22
- <Link href={href} className={className}>
16
+ return (
17
+ <Link
18
+ href={href}
19
+ className={clsx('card padding--lg', styles.cardContainer)}>
23
20
  {children}
24
21
  </Link>
25
- ) : (
26
- <div className={className}>{children}</div>
27
22
  );
28
23
  }
29
24
 
@@ -33,17 +28,24 @@ function CardLayout({href, icon, title, description}) {
33
28
  <h2 className={clsx('text--truncate', styles.cardTitle)} title={title}>
34
29
  {icon} {title}
35
30
  </h2>
36
- <div
37
- className={clsx('text--truncate', styles.cardDescription)}
38
- title={description}>
39
- {description}
40
- </div>
31
+ {description && (
32
+ <p
33
+ className={clsx('text--truncate', styles.cardDescription)}
34
+ title={description}>
35
+ {description}
36
+ </p>
37
+ )}
41
38
  </CardContainer>
42
39
  );
43
40
  }
44
41
 
45
42
  function CardCategory({item}) {
46
- const href = findFirstCategoryLink(item);
43
+ const href = findFirstCategoryLink(item); // Unexpected: categories that don't have a link have been filtered upfront
44
+
45
+ if (!href) {
46
+ return null;
47
+ }
48
+
47
49
  return (
48
50
  <CardLayout
49
51
  href={href}
@@ -6,38 +6,29 @@
6
6
  */
7
7
 
8
8
  .cardContainer {
9
- height: 8rem;
10
- color: var(--ifm-color-emphasis-800);
11
9
  --ifm-link-color: var(--ifm-color-emphasis-800);
12
- --ifm-link-hover-color: var(--ifm-color-emphasis-800);
10
+ --ifm-link-hover-color: var(--ifm-color-emphasis-700);
13
11
  --ifm-link-hover-decoration: none;
14
12
 
15
- /* box-shadow: var(--ifm-global-shadow-lw); */
16
13
  box-shadow: 0 1.5px 3px 0 rgb(0 0 0 / 15%);
17
14
  border: 1px solid var(--ifm-color-emphasis-200);
18
- transition: box-shadow var(--ifm-transition-fast) ease,
19
- background-color var(--ifm-transition-fast) ease;
15
+ transition: all var(--ifm-transition-fast) ease;
16
+ transition-property: border, box-shadow;
20
17
  }
21
18
 
22
- .cardContainer.cardContainerLink:hover {
23
- /* box-shadow: var(--ifm-global-shadow-md); */
24
- box-shadow: 0 4px 8px 0 rgb(0 0 0 / 20%);
19
+ .cardContainer:hover {
20
+ border-color: var(--ifm-color-primary);
21
+ box-shadow: 0 3px 6px 0 rgb(0 0 0 / 20%);
25
22
  }
26
23
 
27
- [data-theme='dark'] .cardContainer.cardContainerLink:hover {
28
- --ifm-card-background-color: #2d2d2d; /* original, non-hovered color is #242526 */
29
- }
30
-
31
- .cardContainer:not(.cardContainerLink) {
32
- cursor: not-allowed;
24
+ .cardContainer *:last-child {
25
+ margin-bottom: 0;
33
26
  }
34
27
 
35
28
  .cardTitle {
36
29
  font-size: 1.2rem;
37
- min-height: 1.2rem;
38
30
  }
39
31
 
40
32
  .cardDescription {
41
33
  font-size: 0.8rem;
42
- min-height: 0.8rem;
43
34
  }
@@ -6,12 +6,24 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import DocCard from '@theme/DocCard';
9
+ import {findFirstCategoryLink} from '@docusaurus/theme-common'; // Filter categories that don't have a link.
10
+
11
+ function filterItems(items) {
12
+ return items.filter((item) => {
13
+ if (item.type === 'category') {
14
+ return !!findFirstCategoryLink(item);
15
+ }
16
+
17
+ return true;
18
+ });
19
+ }
20
+
9
21
  export default function DocCardList({items}) {
10
22
  return (
11
23
  <div className="row">
12
- {items.map((item, index) => (
13
- <article key={index} className="col col--6">
14
- <DocCard item={item} />
24
+ {filterItems(items).map((item, index) => (
25
+ <article key={index} className="col col--6 margin-bottom--lg">
26
+ <DocCard key={index} item={item} />
15
27
  </article>
16
28
  ))}
17
29
  </div>
@@ -5,23 +5,35 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import React from 'react';
8
- import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
8
+ import {
9
+ PageMetadata,
10
+ useCurrentSidebarCategory,
11
+ } from '@docusaurus/theme-common';
9
12
  import DocCardList from '@theme/DocCardList';
10
13
  import DocPaginator from '@theme/DocPaginator';
11
- import Seo from '@theme/Seo';
12
14
  import DocVersionBanner from '@theme/DocVersionBanner';
13
15
  import DocVersionBadge from '@theme/DocVersionBadge';
14
16
  import DocBreadcrumbs from '@theme/DocBreadcrumbs';
15
17
  import Heading from '@theme/Heading';
16
18
  import useBaseUrl from '@docusaurus/useBaseUrl';
17
19
  import styles from './styles.module.css';
18
- export default function DocCategoryGeneratedIndexPage({
19
- categoryGeneratedIndex,
20
- }) {
20
+
21
+ function DocCategoryGeneratedIndexPageMetadata({categoryGeneratedIndex}) {
22
+ return (
23
+ <PageMetadata
24
+ title={categoryGeneratedIndex.title}
25
+ description={categoryGeneratedIndex.description}
26
+ keywords={categoryGeneratedIndex.keywords} // TODO `require` this?
27
+ image={useBaseUrl(categoryGeneratedIndex.image)}
28
+ />
29
+ );
30
+ }
31
+
32
+ function DocCategoryGeneratedIndexPageContent({categoryGeneratedIndex}) {
21
33
  const category = useCurrentSidebarCategory();
22
34
  return (
23
35
  <>
24
- <Seo
36
+ <PageMetadata
25
37
  title={categoryGeneratedIndex.title}
26
38
  description={categoryGeneratedIndex.description}
27
39
  keywords={categoryGeneratedIndex.keywords} // TODO `require` this?
@@ -52,3 +64,12 @@ export default function DocCategoryGeneratedIndexPage({
52
64
  </>
53
65
  );
54
66
  }
67
+
68
+ export default function DocCategoryGeneratedIndexPage(props) {
69
+ return (
70
+ <>
71
+ <DocCategoryGeneratedIndexPageMetadata {...props} />
72
+ <DocCategoryGeneratedIndexPageContent {...props} />
73
+ </>
74
+ );
75
+ }
@@ -9,26 +9,48 @@ import clsx from 'clsx';
9
9
  import DocPaginator from '@theme/DocPaginator';
10
10
  import DocVersionBanner from '@theme/DocVersionBanner';
11
11
  import DocVersionBadge from '@theme/DocVersionBadge';
12
- import Seo from '@theme/Seo';
13
12
  import DocItemFooter from '@theme/DocItemFooter';
14
13
  import TOC from '@theme/TOC';
15
14
  import TOCCollapsible from '@theme/TOCCollapsible';
16
15
  import Heading from '@theme/Heading';
17
16
  import styles from './styles.module.css';
18
- import {ThemeClassNames, useWindowSize} from '@docusaurus/theme-common';
17
+ import {
18
+ PageMetadata,
19
+ HtmlClassNameProvider,
20
+ ThemeClassNames,
21
+ useWindowSize,
22
+ } from '@docusaurus/theme-common';
19
23
  import DocBreadcrumbs from '@theme/DocBreadcrumbs';
20
- export default function DocItem(props) {
24
+ import MDXContent from '@theme/MDXContent';
25
+
26
+ function DocItemMetadata(props) {
21
27
  const {content: DocContent} = props;
22
28
  const {metadata, frontMatter, assets} = DocContent;
29
+ const {keywords} = frontMatter;
30
+ const {description, title} = metadata;
31
+ const image = assets.image ?? frontMatter.image;
32
+ return (
33
+ <PageMetadata
34
+ {...{
35
+ title,
36
+ description,
37
+ keywords,
38
+ image,
39
+ }}
40
+ />
41
+ );
42
+ }
43
+
44
+ function DocItemContent(props) {
45
+ const {content: DocContent} = props;
46
+ const {metadata, frontMatter} = DocContent;
23
47
  const {
24
- keywords,
25
48
  hide_title: hideTitle,
26
49
  hide_table_of_contents: hideTableOfContents,
27
50
  toc_min_heading_level: tocMinHeadingLevel,
28
51
  toc_max_heading_level: tocMaxHeadingLevel,
29
52
  } = frontMatter;
30
- const {description, title} = metadata;
31
- const image = assets.image ?? frontMatter.image; // We only add a title if:
53
+ const {title} = metadata; // We only add a title if:
32
54
  // - user asks to hide it with front matter
33
55
  // - the markdown content does not already contain a top-level h1 heading
34
56
 
@@ -40,73 +62,69 @@ export default function DocItem(props) {
40
62
  const renderTocDesktop =
41
63
  canRenderTOC && (windowSize === 'desktop' || windowSize === 'ssr');
42
64
  return (
43
- <>
44
- <Seo
45
- {...{
46
- title,
47
- description,
48
- keywords,
49
- image,
50
- }}
51
- />
52
-
53
- <div className="row">
54
- <div
55
- className={clsx('col', {
56
- [styles.docItemCol]: !hideTableOfContents,
57
- })}>
58
- <DocVersionBanner />
59
- <div className={styles.docItemContainer}>
60
- <article>
61
- <DocBreadcrumbs />
62
- <DocVersionBadge />
65
+ <div className="row">
66
+ <div className={clsx('col', !hideTableOfContents && styles.docItemCol)}>
67
+ <DocVersionBanner />
68
+ <div className={styles.docItemContainer}>
69
+ <article>
70
+ <DocBreadcrumbs />
71
+ <DocVersionBadge />
63
72
 
64
- {canRenderTOC && (
65
- <TOCCollapsible
66
- toc={DocContent.toc}
67
- minHeadingLevel={tocMinHeadingLevel}
68
- maxHeadingLevel={tocMaxHeadingLevel}
69
- className={clsx(
70
- ThemeClassNames.docs.docTocMobile,
71
- styles.tocMobile,
72
- )}
73
- />
74
- )}
75
-
76
- <div
77
- className={clsx(ThemeClassNames.docs.docMarkdown, 'markdown')}>
78
- {/*
79
- Title can be declared inside md content or declared through
80
- front matter and added manually. To make both cases consistent,
81
- the added title is added under the same div.markdown block
82
- See https://github.com/facebook/docusaurus/pull/4882#issuecomment-853021120
83
- */}
84
- {shouldAddTitle && (
85
- <header>
86
- <Heading as="h1">{title}</Heading>
87
- </header>
73
+ {canRenderTOC && (
74
+ <TOCCollapsible
75
+ toc={DocContent.toc}
76
+ minHeadingLevel={tocMinHeadingLevel}
77
+ maxHeadingLevel={tocMaxHeadingLevel}
78
+ className={clsx(
79
+ ThemeClassNames.docs.docTocMobile,
80
+ styles.tocMobile,
88
81
  )}
82
+ />
83
+ )}
89
84
 
85
+ <div className={clsx(ThemeClassNames.docs.docMarkdown, 'markdown')}>
86
+ {/*
87
+ Title can be declared inside md content or declared through
88
+ front matter and added manually. To make both cases consistent,
89
+ the added title is added under the same div.markdown block
90
+ See https://github.com/facebook/docusaurus/pull/4882#issuecomment-853021120
91
+ */}
92
+ {shouldAddTitle && (
93
+ <header>
94
+ <Heading as="h1">{title}</Heading>
95
+ </header>
96
+ )}
97
+ <MDXContent>
90
98
  <DocContent />
91
- </div>
99
+ </MDXContent>
100
+ </div>
92
101
 
93
- <DocItemFooter {...props} />
94
- </article>
102
+ <DocItemFooter {...props} />
103
+ </article>
95
104
 
96
- <DocPaginator previous={metadata.previous} next={metadata.next} />
97
- </div>
105
+ <DocPaginator previous={metadata.previous} next={metadata.next} />
98
106
  </div>
99
- {renderTocDesktop && (
100
- <div className="col col--3">
101
- <TOC
102
- toc={DocContent.toc}
103
- minHeadingLevel={tocMinHeadingLevel}
104
- maxHeadingLevel={tocMaxHeadingLevel}
105
- className={ThemeClassNames.docs.docTocDesktop}
106
- />
107
- </div>
108
- )}
109
107
  </div>
110
- </>
108
+ {renderTocDesktop && (
109
+ <div className="col col--3">
110
+ <TOC
111
+ toc={DocContent.toc}
112
+ minHeadingLevel={tocMinHeadingLevel}
113
+ maxHeadingLevel={tocMaxHeadingLevel}
114
+ className={ThemeClassNames.docs.docTocDesktop}
115
+ />
116
+ </div>
117
+ )}
118
+ </div>
119
+ );
120
+ }
121
+
122
+ export default function DocItem(props) {
123
+ const docHtmlClassName = `docs-doc-id-${props.content.metadata.unversionedId}`;
124
+ return (
125
+ <HtmlClassNameProvider className={docHtmlClassName}>
126
+ <DocItemMetadata {...props} />
127
+ <DocItemContent {...props} />
128
+ </HtmlClassNameProvider>
111
129
  );
112
130
  }