@docusaurus/theme-classic 2.4.1 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/lib/getSwizzleConfig.js +99 -7
  2. package/lib/index.js +20 -6
  3. package/lib/nprogress.d.ts +1 -1
  4. package/lib/options.js +1 -0
  5. package/lib/theme/Admonition/Icon/Caution.d.ts +9 -0
  6. package/lib/theme/Admonition/Icon/Caution.js +17 -0
  7. package/lib/theme/Admonition/Icon/Danger.d.ts +9 -0
  8. package/lib/theme/Admonition/Icon/Danger.js +17 -0
  9. package/lib/theme/Admonition/Icon/Info.d.ts +9 -0
  10. package/lib/theme/Admonition/Icon/Info.js +17 -0
  11. package/lib/theme/Admonition/Icon/Note.d.ts +9 -0
  12. package/lib/theme/Admonition/Icon/Note.js +17 -0
  13. package/lib/theme/Admonition/Icon/Tip.d.ts +9 -0
  14. package/lib/theme/Admonition/Icon/Tip.js +17 -0
  15. package/lib/theme/Admonition/Layout/index.d.ts +9 -0
  16. package/lib/theme/Admonition/Layout/index.js +45 -0
  17. package/lib/theme/Admonition/{styles.module.css → Layout/styles.module.css} +4 -0
  18. package/lib/theme/Admonition/Type/Caution.d.ts +9 -0
  19. package/lib/theme/Admonition/Type/Caution.js +32 -0
  20. package/lib/theme/Admonition/Type/Danger.d.ts +9 -0
  21. package/lib/theme/Admonition/Type/Danger.js +32 -0
  22. package/lib/theme/Admonition/Type/Info.d.ts +9 -0
  23. package/lib/theme/Admonition/Type/Info.js +32 -0
  24. package/lib/theme/Admonition/Type/Note.d.ts +9 -0
  25. package/lib/theme/Admonition/Type/Note.js +32 -0
  26. package/lib/theme/Admonition/Type/Tip.d.ts +9 -0
  27. package/lib/theme/Admonition/Type/Tip.js +32 -0
  28. package/lib/theme/Admonition/Types.d.ts +12 -0
  29. package/lib/theme/Admonition/Types.js +33 -0
  30. package/lib/theme/Admonition/index.d.ts +1 -1
  31. package/lib/theme/Admonition/index.js +12 -171
  32. package/lib/theme/BlogArchivePage/index.js +7 -2
  33. package/lib/theme/BlogPostPage/index.js +3 -1
  34. package/lib/theme/BlogSidebar/Desktop/index.js +3 -1
  35. package/lib/theme/BlogSidebar/Mobile/index.js +3 -1
  36. package/lib/theme/BlogTagsListPage/index.js +2 -1
  37. package/lib/theme/BlogTagsPostsPage/index.js +4 -2
  38. package/lib/theme/DocBreadcrumbs/index.js +6 -2
  39. package/lib/theme/DocCard/index.js +8 -4
  40. package/lib/theme/DocItem/Layout/index.js +5 -0
  41. package/lib/theme/{DocPage → DocRoot}/Layout/Main/index.d.ts +2 -2
  42. package/lib/theme/{DocPage → DocRoot}/Layout/Main/index.js +1 -1
  43. package/lib/theme/{DocPage → DocRoot}/Layout/Sidebar/ExpandButton/index.d.ts +2 -2
  44. package/lib/theme/{DocPage → DocRoot}/Layout/Sidebar/ExpandButton/index.js +1 -1
  45. package/lib/theme/{DocPage → DocRoot}/Layout/Sidebar/index.d.ts +2 -2
  46. package/lib/theme/{DocPage → DocRoot}/Layout/Sidebar/index.js +2 -2
  47. package/lib/theme/{DocPage → DocRoot}/Layout/index.d.ts +2 -2
  48. package/lib/theme/{DocPage → DocRoot}/Layout/index.js +9 -10
  49. package/lib/theme/{DocPage → DocRoot}/Layout/styles.module.css +1 -2
  50. package/lib/theme/{DocPage → DocRoot}/index.d.ts +2 -2
  51. package/lib/theme/DocRoot/index.js +31 -0
  52. package/lib/theme/DocSidebarItem/Category/index.js +3 -3
  53. package/lib/theme/DocSidebarItems/index.js +6 -4
  54. package/lib/theme/DocTagDocListPage/index.d.ts +1 -1
  55. package/lib/theme/DocTagDocListPage/index.js +53 -39
  56. package/lib/theme/DocTagsListPage/index.d.ts +1 -1
  57. package/lib/theme/DocTagsListPage/index.js +26 -17
  58. package/lib/theme/DocVersionRoot/index.d.ts +10 -0
  59. package/lib/theme/DocVersionRoot/index.js +46 -0
  60. package/lib/theme/DocsRoot/index.d.ts +10 -0
  61. package/lib/theme/DocsRoot/index.js +18 -0
  62. package/lib/theme/EditThisPage/index.js +3 -6
  63. package/lib/theme/ErrorPageContent.js +3 -2
  64. package/lib/theme/MDXComponents/Code.js +2 -36
  65. package/lib/theme/MDXComponents/Details.js +1 -1
  66. package/lib/theme/MDXComponents/Pre.d.ts +2 -2
  67. package/lib/theme/MDXComponents/Pre.js +4 -11
  68. package/lib/theme/MDXComponents/index.js +3 -3
  69. package/lib/theme/MDXContent/index.js +1 -0
  70. package/lib/theme/MDXPage/index.js +16 -4
  71. package/lib/theme/NavbarItem/DocNavbarItem.js +4 -3
  72. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/index.d.ts +1 -1
  73. package/lib/theme/NavbarItem/LocaleDropdownNavbarItem/index.js +2 -1
  74. package/lib/theme/NotFound/Content/index.d.ts +9 -0
  75. package/lib/theme/NotFound/Content/index.js +42 -0
  76. package/lib/theme/{NotFound.d.ts → NotFound/index.d.ts} +1 -1
  77. package/lib/theme/NotFound/index.js +25 -0
  78. package/lib/theme/TOCItems/Tree.js +3 -4
  79. package/lib/theme/Tabs/index.js +4 -2
  80. package/lib/theme/TagsListByLetter/index.js +4 -1
  81. package/lib/theme/ThemedImage/index.js +8 -24
  82. package/lib/theme/{MDXComponents/Head.d.ts → Unlisted/index.d.ts} +2 -2
  83. package/lib/theme/Unlisted/index.js +38 -0
  84. package/package.json +24 -24
  85. package/src/getSwizzleConfig.ts +107 -8
  86. package/src/index.ts +21 -6
  87. package/src/nprogress.ts +2 -1
  88. package/src/options.ts +1 -0
  89. package/src/theme/Admonition/Icon/Caution.tsx +20 -0
  90. package/src/theme/Admonition/Icon/Danger.tsx +20 -0
  91. package/src/theme/Admonition/Icon/Info.tsx +20 -0
  92. package/src/theme/Admonition/Icon/Note.tsx +20 -0
  93. package/src/theme/Admonition/Icon/Tip.tsx +20 -0
  94. package/src/theme/Admonition/Layout/index.tsx +57 -0
  95. package/src/theme/Admonition/{styles.module.css → Layout/styles.module.css} +4 -0
  96. package/src/theme/Admonition/Type/Caution.tsx +37 -0
  97. package/src/theme/Admonition/Type/Danger.tsx +37 -0
  98. package/src/theme/Admonition/Type/Info.tsx +37 -0
  99. package/src/theme/Admonition/Type/Note.tsx +37 -0
  100. package/src/theme/Admonition/Type/Tip.tsx +37 -0
  101. package/src/theme/Admonition/Types.tsx +38 -0
  102. package/src/theme/Admonition/index.tsx +13 -194
  103. package/src/theme/BlogArchivePage/index.tsx +7 -2
  104. package/src/theme/BlogPostPage/index.tsx +3 -1
  105. package/src/theme/BlogSidebar/Desktop/index.tsx +3 -1
  106. package/src/theme/BlogSidebar/Mobile/index.tsx +3 -1
  107. package/src/theme/BlogTagsListPage/index.tsx +2 -1
  108. package/src/theme/BlogTagsPostsPage/index.tsx +4 -2
  109. package/src/theme/DocBreadcrumbs/index.tsx +6 -2
  110. package/src/theme/DocCard/index.tsx +11 -6
  111. package/src/theme/DocItem/Layout/index.tsx +5 -0
  112. package/src/theme/{DocPage → DocRoot}/Layout/Main/index.tsx +2 -2
  113. package/src/theme/{DocPage → DocRoot}/Layout/Sidebar/ExpandButton/index.tsx +2 -2
  114. package/src/theme/{DocPage → DocRoot}/Layout/Sidebar/index.tsx +3 -3
  115. package/src/theme/{DocPage → DocRoot}/Layout/index.tsx +10 -11
  116. package/src/theme/{DocPage → DocRoot}/Layout/styles.module.css +1 -2
  117. package/src/theme/DocRoot/index.tsx +34 -0
  118. package/src/theme/DocSidebarItem/Category/index.tsx +3 -3
  119. package/src/theme/DocSidebarItems/index.tsx +6 -4
  120. package/src/theme/DocTagDocListPage/index.tsx +60 -39
  121. package/src/theme/DocTagsListPage/index.tsx +33 -17
  122. package/src/theme/DocVersionRoot/index.tsx +51 -0
  123. package/src/theme/DocsRoot/index.tsx +22 -0
  124. package/src/theme/EditThisPage/index.tsx +3 -6
  125. package/src/theme/ErrorPageContent.tsx +3 -2
  126. package/src/theme/MDXComponents/Code.tsx +2 -39
  127. package/src/theme/MDXComponents/Details.tsx +1 -2
  128. package/src/theme/MDXComponents/Pre.tsx +5 -13
  129. package/src/theme/MDXComponents/index.tsx +3 -3
  130. package/src/theme/MDXContent/index.tsx +1 -0
  131. package/src/theme/MDXPage/index.tsx +16 -4
  132. package/src/theme/NavbarItem/DocNavbarItem.tsx +4 -3
  133. package/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx +2 -1
  134. package/src/theme/NotFound/Content/index.tsx +45 -0
  135. package/src/theme/NotFound/index.tsx +27 -0
  136. package/src/theme/SkipToContent/index.tsx +0 -1
  137. package/src/theme/TOCItems/Tree.tsx +3 -4
  138. package/src/theme/Tabs/index.tsx +4 -2
  139. package/src/theme/TagsListByLetter/index.tsx +4 -2
  140. package/src/theme/ThemedImage/index.tsx +8 -31
  141. package/src/theme/Unlisted/index.tsx +42 -0
  142. package/src/theme/prism-include-languages.ts +2 -1
  143. package/src/theme-classic.d.ts +130 -20
  144. package/lib/theme/DocPage/index.js +0 -67
  145. package/lib/theme/MDXComponents/Head.js +0 -23
  146. package/lib/theme/NotFound.js +0 -52
  147. package/src/theme/DocPage/index.tsx +0 -71
  148. package/src/theme/MDXComponents/Head.tsx +0 -29
  149. package/src/theme/NotFound.tsx +0 -54
  150. /package/lib/theme/{DocPage → DocRoot}/Layout/Main/styles.module.css +0 -0
  151. /package/lib/theme/{DocPage → DocRoot}/Layout/Sidebar/ExpandButton/styles.module.css +0 -0
  152. /package/lib/theme/{DocPage → DocRoot}/Layout/Sidebar/styles.module.css +0 -0
  153. /package/src/theme/{DocPage → DocRoot}/Layout/Main/styles.module.css +0 -0
  154. /package/src/theme/{DocPage → DocRoot}/Layout/Sidebar/ExpandButton/styles.module.css +0 -0
  155. /package/src/theme/{DocPage → DocRoot}/Layout/Sidebar/styles.module.css +0 -0
@@ -0,0 +1,33 @@
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 from 'react';
8
+ import AdmonitionTypeNote from '@theme/Admonition/Type/Note';
9
+ import AdmonitionTypeTip from '@theme/Admonition/Type/Tip';
10
+ import AdmonitionTypeInfo from '@theme/Admonition/Type/Info';
11
+ import AdmonitionTypeCaution from '@theme/Admonition/Type/Caution';
12
+ import AdmonitionTypeDanger from '@theme/Admonition/Type/Danger';
13
+ const admonitionTypes = {
14
+ note: AdmonitionTypeNote,
15
+ tip: AdmonitionTypeTip,
16
+ info: AdmonitionTypeInfo,
17
+ caution: AdmonitionTypeCaution,
18
+ danger: AdmonitionTypeDanger,
19
+ };
20
+ // Undocumented legacy admonition type aliases
21
+ // Provide hardcoded/untranslated retrocompatible label
22
+ // See also https://github.com/facebook/docusaurus/issues/7767
23
+ const admonitionAliases = {
24
+ secondary: (props) => <AdmonitionTypeNote title="secondary" {...props} />,
25
+ important: (props) => <AdmonitionTypeInfo title="important" {...props} />,
26
+ success: (props) => <AdmonitionTypeTip title="success" {...props} />,
27
+ // TODO bad legacy mapping, warning is usually yellow, not red...
28
+ warning: (props) => <AdmonitionTypeDanger title="warning" {...props} />,
29
+ };
30
+ export default {
31
+ ...admonitionTypes,
32
+ ...admonitionAliases,
33
+ };
@@ -6,4 +6,4 @@
6
6
  */
7
7
  /// <reference types="react" />
8
8
  import type { Props } from '@theme/Admonition';
9
- export default function Admonition(props: Props): JSX.Element;
9
+ export default function Admonition(unprocessedProps: Props): JSX.Element;
@@ -5,179 +5,20 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import React from 'react';
8
- import clsx from 'clsx';
9
- import {ThemeClassNames} from '@docusaurus/theme-common';
10
- import Translate from '@docusaurus/Translate';
11
- import styles from './styles.module.css';
12
- function NoteIcon() {
13
- return (
14
- <svg viewBox="0 0 14 16">
15
- <path
16
- fillRule="evenodd"
17
- d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"
18
- />
19
- </svg>
20
- );
21
- }
22
- function TipIcon() {
23
- return (
24
- <svg viewBox="0 0 12 16">
25
- <path
26
- fillRule="evenodd"
27
- d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"
28
- />
29
- </svg>
30
- );
31
- }
32
- function DangerIcon() {
33
- return (
34
- <svg viewBox="0 0 12 16">
35
- <path
36
- fillRule="evenodd"
37
- d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"
38
- />
39
- </svg>
40
- );
41
- }
42
- function InfoIcon() {
43
- return (
44
- <svg viewBox="0 0 14 16">
45
- <path
46
- fillRule="evenodd"
47
- d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"
48
- />
49
- </svg>
50
- );
51
- }
52
- function CautionIcon() {
53
- return (
54
- <svg viewBox="0 0 16 16">
55
- <path
56
- fillRule="evenodd"
57
- d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"
58
- />
59
- </svg>
60
- );
61
- }
62
- // eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style
63
- const AdmonitionConfigs = {
64
- note: {
65
- infimaClassName: 'secondary',
66
- iconComponent: NoteIcon,
67
- label: (
68
- <Translate
69
- id="theme.admonition.note"
70
- description="The default label used for the Note admonition (:::note)">
71
- note
72
- </Translate>
73
- ),
74
- },
75
- tip: {
76
- infimaClassName: 'success',
77
- iconComponent: TipIcon,
78
- label: (
79
- <Translate
80
- id="theme.admonition.tip"
81
- description="The default label used for the Tip admonition (:::tip)">
82
- tip
83
- </Translate>
84
- ),
85
- },
86
- danger: {
87
- infimaClassName: 'danger',
88
- iconComponent: DangerIcon,
89
- label: (
90
- <Translate
91
- id="theme.admonition.danger"
92
- description="The default label used for the Danger admonition (:::danger)">
93
- danger
94
- </Translate>
95
- ),
96
- },
97
- info: {
98
- infimaClassName: 'info',
99
- iconComponent: InfoIcon,
100
- label: (
101
- <Translate
102
- id="theme.admonition.info"
103
- description="The default label used for the Info admonition (:::info)">
104
- info
105
- </Translate>
106
- ),
107
- },
108
- caution: {
109
- infimaClassName: 'warning',
110
- iconComponent: CautionIcon,
111
- label: (
112
- <Translate
113
- id="theme.admonition.caution"
114
- description="The default label used for the Caution admonition (:::caution)">
115
- caution
116
- </Translate>
117
- ),
118
- },
119
- };
120
- // Legacy aliases, undocumented but kept for retro-compatibility
121
- const aliases = {
122
- secondary: 'note',
123
- important: 'info',
124
- success: 'tip',
125
- warning: 'danger',
126
- };
127
- function getAdmonitionConfig(unsafeType) {
128
- const type = aliases[unsafeType] ?? unsafeType;
129
- const config = AdmonitionConfigs[type];
130
- if (config) {
131
- return config;
8
+ import {processAdmonitionProps} from '@docusaurus/theme-common';
9
+ import AdmonitionTypes from '@theme/Admonition/Types';
10
+ function getAdmonitionTypeComponent(type) {
11
+ const component = AdmonitionTypes[type];
12
+ if (component) {
13
+ return component;
132
14
  }
133
15
  console.warn(
134
- `No admonition config found for admonition type "${type}". Using Info as fallback.`,
16
+ `No admonition component found for admonition type "${type}". Using Info as fallback.`,
135
17
  );
136
- return AdmonitionConfigs.info;
18
+ return AdmonitionTypes.info;
137
19
  }
138
- // Workaround because it's difficult in MDX v1 to provide a MDX title as props
139
- // See https://github.com/facebook/docusaurus/pull/7152#issuecomment-1145779682
140
- function extractMDXAdmonitionTitle(children) {
141
- const items = React.Children.toArray(children);
142
- const mdxAdmonitionTitle = items.find(
143
- (item) =>
144
- React.isValidElement(item) &&
145
- item.props?.mdxType === 'mdxAdmonitionTitle',
146
- );
147
- const rest = <>{items.filter((item) => item !== mdxAdmonitionTitle)}</>;
148
- return {
149
- mdxAdmonitionTitle,
150
- rest,
151
- };
152
- }
153
- function processAdmonitionProps(props) {
154
- const {mdxAdmonitionTitle, rest} = extractMDXAdmonitionTitle(props.children);
155
- return {
156
- ...props,
157
- title: props.title ?? mdxAdmonitionTitle,
158
- children: rest,
159
- };
160
- }
161
- export default function Admonition(props) {
162
- const {children, type, title, icon: iconProp} = processAdmonitionProps(props);
163
- const typeConfig = getAdmonitionConfig(type);
164
- const titleLabel = title ?? typeConfig.label;
165
- const {iconComponent: IconComponent} = typeConfig;
166
- const icon = iconProp ?? <IconComponent />;
167
- return (
168
- <div
169
- className={clsx(
170
- ThemeClassNames.common.admonition,
171
- ThemeClassNames.common.admonitionType(props.type),
172
- 'alert',
173
- `alert--${typeConfig.infimaClassName}`,
174
- styles.admonition,
175
- )}>
176
- <div className={styles.admonitionHeading}>
177
- <span className={styles.admonitionIcon}>{icon}</span>
178
- {titleLabel}
179
- </div>
180
- <div className={styles.admonitionContent}>{children}</div>
181
- </div>
182
- );
20
+ export default function Admonition(unprocessedProps) {
21
+ const props = processAdmonitionProps(unprocessedProps);
22
+ const AdmonitionTypeComponent = getAdmonitionTypeComponent(props.type);
23
+ return <AdmonitionTypeComponent {...props} />;
183
24
  }
@@ -9,10 +9,13 @@ import Link from '@docusaurus/Link';
9
9
  import {translate} from '@docusaurus/Translate';
10
10
  import {PageMetadata} from '@docusaurus/theme-common';
11
11
  import Layout from '@theme/Layout';
12
+ import Heading from '@theme/Heading';
12
13
  function Year({year, posts}) {
13
14
  return (
14
15
  <>
15
- <h3>{year}</h3>
16
+ <Heading as="h3" id={year}>
17
+ {year}
18
+ </Heading>
16
19
  <ul>
17
20
  {posts.map((post) => (
18
21
  <li key={post.metadata.date}>
@@ -69,7 +72,9 @@ export default function BlogArchive({archive}) {
69
72
  <Layout>
70
73
  <header className="hero hero--primary">
71
74
  <div className="container">
72
- <h1 className="hero__title">{title}</h1>
75
+ <Heading as="h1" className="hero__title">
76
+ {title}
77
+ </Heading>
73
78
  <p className="hero__subtitle">{description}</p>
74
79
  </div>
75
80
  </header>
@@ -13,9 +13,10 @@ import BlogPostItem from '@theme/BlogPostItem';
13
13
  import BlogPostPaginator from '@theme/BlogPostPaginator';
14
14
  import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata';
15
15
  import TOC from '@theme/TOC';
16
+ import Unlisted from '@theme/Unlisted';
16
17
  function BlogPostPageContent({sidebar, children}) {
17
18
  const {metadata, toc} = useBlogPost();
18
- const {nextItem, prevItem, frontMatter} = metadata;
19
+ const {nextItem, prevItem, frontMatter, unlisted} = metadata;
19
20
  const {
20
21
  hide_table_of_contents: hideTableOfContents,
21
22
  toc_min_heading_level: tocMinHeadingLevel,
@@ -33,6 +34,7 @@ function BlogPostPageContent({sidebar, children}) {
33
34
  />
34
35
  ) : undefined
35
36
  }>
37
+ {unlisted && <Unlisted />}
36
38
  <BlogPostItem>{children}</BlogPostItem>
37
39
 
38
40
  {(nextItem || prevItem) && (
@@ -8,8 +8,10 @@ import React from 'react';
8
8
  import clsx from 'clsx';
9
9
  import Link from '@docusaurus/Link';
10
10
  import {translate} from '@docusaurus/Translate';
11
+ import {useVisibleBlogSidebarItems} from '@docusaurus/theme-common/internal';
11
12
  import styles from './styles.module.css';
12
13
  export default function BlogSidebarDesktop({sidebar}) {
14
+ const items = useVisibleBlogSidebarItems(sidebar.items);
13
15
  return (
14
16
  <aside className="col col--3">
15
17
  <nav
@@ -23,7 +25,7 @@ export default function BlogSidebarDesktop({sidebar}) {
23
25
  {sidebar.title}
24
26
  </div>
25
27
  <ul className={clsx(styles.sidebarItemList, 'clean-list')}>
26
- {sidebar.items.map((item) => (
28
+ {items.map((item) => (
27
29
  <li key={item.permalink} className={styles.sidebarItem}>
28
30
  <Link
29
31
  isNavLink
@@ -6,11 +6,13 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import Link from '@docusaurus/Link';
9
+ import {useVisibleBlogSidebarItems} from '@docusaurus/theme-common/internal';
9
10
  import {NavbarSecondaryMenuFiller} from '@docusaurus/theme-common';
10
11
  function BlogSidebarMobileSecondaryMenu({sidebar}) {
12
+ const items = useVisibleBlogSidebarItems(sidebar.items);
11
13
  return (
12
14
  <ul className="menu__list">
13
- {sidebar.items.map((item) => (
15
+ {items.map((item) => (
14
16
  <li key={item.permalink} className="menu__list-item">
15
17
  <Link
16
18
  isNavLink
@@ -15,6 +15,7 @@ import {
15
15
  import BlogLayout from '@theme/BlogLayout';
16
16
  import TagsListByLetter from '@theme/TagsListByLetter';
17
17
  import SearchMetadata from '@theme/SearchMetadata';
18
+ import Heading from '@theme/Heading';
18
19
  export default function BlogTagsListPage({tags, sidebar}) {
19
20
  const title = translateTagsPageTitle();
20
21
  return (
@@ -26,7 +27,7 @@ export default function BlogTagsListPage({tags, sidebar}) {
26
27
  <PageMetadata title={title} />
27
28
  <SearchMetadata tag="blog_tags_list" />
28
29
  <BlogLayout sidebar={sidebar}>
29
- <h1>{title}</h1>
30
+ <Heading as="h1">{title}</Heading>
30
31
  <TagsListByLetter tags={tags} />
31
32
  </BlogLayout>
32
33
  </HtmlClassNameProvider>
@@ -18,6 +18,8 @@ import BlogLayout from '@theme/BlogLayout';
18
18
  import BlogListPaginator from '@theme/BlogListPaginator';
19
19
  import SearchMetadata from '@theme/SearchMetadata';
20
20
  import BlogPostItems from '@theme/BlogPostItems';
21
+ import Unlisted from '@theme/Unlisted';
22
+ import Heading from '@theme/Heading';
21
23
  // Very simple pluralization: probably good enough for now
22
24
  function useBlogPostsPlural() {
23
25
  const {selectMessage} = usePluralForm();
@@ -59,9 +61,9 @@ function BlogTagsPostsPageContent({tag, items, sidebar, listMetadata}) {
59
61
  const title = useBlogTagsPostsPageTitle(tag);
60
62
  return (
61
63
  <BlogLayout sidebar={sidebar}>
64
+ {tag.unlisted && <Unlisted />}
62
65
  <header className="margin-bottom--xl">
63
- <h1>{title}</h1>
64
-
66
+ <Heading as="h1">{title}</Heading>
65
67
  <Link href={tag.allTagsPath}>
66
68
  <Translate
67
69
  id="theme.tags.tagsPageLink"
@@ -79,13 +79,17 @@ export default function DocBreadcrumbs() {
79
79
  {homePageRoute && <HomeBreadcrumbItem />}
80
80
  {breadcrumbs.map((item, idx) => {
81
81
  const isLast = idx === breadcrumbs.length - 1;
82
+ const href =
83
+ item.type === 'category' && item.linkUnlisted
84
+ ? undefined
85
+ : item.href;
82
86
  return (
83
87
  <BreadcrumbsItem
84
88
  key={idx}
85
89
  active={isLast}
86
90
  index={idx}
87
- addMicrodata={!!item.href}>
88
- <BreadcrumbsItemLink href={item.href} isLast={isLast}>
91
+ addMicrodata={!!href}>
92
+ <BreadcrumbsItemLink href={href} isLast={isLast}>
89
93
  {item.label}
90
94
  </BreadcrumbsItemLink>
91
95
  </BreadcrumbsItem>
@@ -8,11 +8,12 @@ import React from 'react';
8
8
  import clsx from 'clsx';
9
9
  import Link from '@docusaurus/Link';
10
10
  import {
11
- findFirstCategoryLink,
11
+ findFirstSidebarItemLink,
12
12
  useDocById,
13
13
  } from '@docusaurus/theme-common/internal';
14
14
  import isInternalUrl from '@docusaurus/isInternalUrl';
15
15
  import {translate} from '@docusaurus/Translate';
16
+ import Heading from '@theme/Heading';
16
17
  import styles from './styles.module.css';
17
18
  function CardContainer({href, children}) {
18
19
  return (
@@ -26,9 +27,12 @@ function CardContainer({href, children}) {
26
27
  function CardLayout({href, icon, title, description}) {
27
28
  return (
28
29
  <CardContainer href={href}>
29
- <h2 className={clsx('text--truncate', styles.cardTitle)} title={title}>
30
+ <Heading
31
+ as="h2"
32
+ className={clsx('text--truncate', styles.cardTitle)}
33
+ title={title}>
30
34
  {icon} {title}
31
- </h2>
35
+ </Heading>
32
36
  {description && (
33
37
  <p
34
38
  className={clsx('text--truncate', styles.cardDescription)}
@@ -40,7 +44,7 @@ function CardLayout({href, icon, title, description}) {
40
44
  );
41
45
  }
42
46
  function CardCategory({item}) {
43
- const href = findFirstCategoryLink(item);
47
+ const href = findFirstSidebarItemLink(item);
44
48
  // Unexpected: categories that don't have a link have been filtered upfront
45
49
  if (!href) {
46
50
  return null;
@@ -16,6 +16,7 @@ import DocItemTOCMobile from '@theme/DocItem/TOC/Mobile';
16
16
  import DocItemTOCDesktop from '@theme/DocItem/TOC/Desktop';
17
17
  import DocItemContent from '@theme/DocItem/Content';
18
18
  import DocBreadcrumbs from '@theme/DocBreadcrumbs';
19
+ import Unlisted from '@theme/Unlisted';
19
20
  import styles from './styles.module.css';
20
21
  /**
21
22
  * Decide if the toc should be rendered, on mobile or desktop viewports
@@ -38,9 +39,13 @@ function useDocTOC() {
38
39
  }
39
40
  export default function DocItemLayout({children}) {
40
41
  const docTOC = useDocTOC();
42
+ const {
43
+ metadata: {unlisted},
44
+ } = useDoc();
41
45
  return (
42
46
  <div className="row">
43
47
  <div className={clsx('col', !docTOC.hidden && styles.docItemCol)}>
48
+ {unlisted && <Unlisted />}
44
49
  <DocVersionBanner />
45
50
  <div className={styles.docItemContainer}>
46
51
  <article>
@@ -5,5 +5,5 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  /// <reference types="react" />
8
- import type { Props } from '@theme/DocPage/Layout/Main';
9
- export default function DocPageLayoutMain({ hiddenSidebarContainer, children, }: Props): JSX.Element;
8
+ import type { Props } from '@theme/DocRoot/Layout/Main';
9
+ export default function DocRootLayoutMain({ hiddenSidebarContainer, children, }: Props): JSX.Element;
@@ -8,7 +8,7 @@ import React from 'react';
8
8
  import clsx from 'clsx';
9
9
  import {useDocsSidebar} from '@docusaurus/theme-common/internal';
10
10
  import styles from './styles.module.css';
11
- export default function DocPageLayoutMain({hiddenSidebarContainer, children}) {
11
+ export default function DocRootLayoutMain({hiddenSidebarContainer, children}) {
12
12
  const sidebar = useDocsSidebar();
13
13
  return (
14
14
  <main
@@ -5,5 +5,5 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  /// <reference types="react" />
8
- import type { Props } from '@theme/DocPage/Layout/Sidebar/ExpandButton';
9
- export default function DocPageLayoutSidebarExpandButton({ toggleSidebar, }: Props): JSX.Element;
8
+ import type { Props } from '@theme/DocRoot/Layout/Sidebar/ExpandButton';
9
+ export default function DocRootLayoutSidebarExpandButton({ toggleSidebar, }: Props): JSX.Element;
@@ -8,7 +8,7 @@ import React from 'react';
8
8
  import {translate} from '@docusaurus/Translate';
9
9
  import IconArrow from '@theme/Icon/Arrow';
10
10
  import styles from './styles.module.css';
11
- export default function DocPageLayoutSidebarExpandButton({toggleSidebar}) {
11
+ export default function DocRootLayoutSidebarExpandButton({toggleSidebar}) {
12
12
  return (
13
13
  <div
14
14
  className={styles.expandButton}
@@ -5,5 +5,5 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  /// <reference types="react" />
8
- import type { Props } from '@theme/DocPage/Layout/Sidebar';
9
- export default function DocPageLayoutSidebar({ sidebar, hiddenSidebarContainer, setHiddenSidebarContainer, }: Props): JSX.Element;
8
+ import type { Props } from '@theme/DocRoot/Layout/Sidebar';
9
+ export default function DocRootLayoutSidebar({ sidebar, hiddenSidebarContainer, setHiddenSidebarContainer, }: Props): JSX.Element;
@@ -10,7 +10,7 @@ import {prefersReducedMotion, ThemeClassNames} from '@docusaurus/theme-common';
10
10
  import {useDocsSidebar} from '@docusaurus/theme-common/internal';
11
11
  import {useLocation} from '@docusaurus/router';
12
12
  import DocSidebar from '@theme/DocSidebar';
13
- import ExpandButton from '@theme/DocPage/Layout/Sidebar/ExpandButton';
13
+ import ExpandButton from '@theme/DocRoot/Layout/Sidebar/ExpandButton';
14
14
  import styles from './styles.module.css';
15
15
  // Reset sidebar state when sidebar changes
16
16
  // Use React key to unmount/remount the children
@@ -23,7 +23,7 @@ function ResetOnSidebarChange({children}) {
23
23
  </React.Fragment>
24
24
  );
25
25
  }
26
- export default function DocPageLayoutSidebar({
26
+ export default function DocRootLayoutSidebar({
27
27
  sidebar,
28
28
  hiddenSidebarContainer,
29
29
  setHiddenSidebarContainer,
@@ -5,5 +5,5 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  /// <reference types="react" />
8
- import type { Props } from '@theme/DocPage/Layout';
9
- export default function DocPageLayout({ children }: Props): JSX.Element;
8
+ import type { Props } from '@theme/DocRoot/Layout';
9
+ export default function DocRootLayout({ children }: Props): JSX.Element;
@@ -6,29 +6,28 @@
6
6
  */
7
7
  import React, {useState} from 'react';
8
8
  import {useDocsSidebar} from '@docusaurus/theme-common/internal';
9
- import Layout from '@theme/Layout';
10
9
  import BackToTopButton from '@theme/BackToTopButton';
11
- import DocPageLayoutSidebar from '@theme/DocPage/Layout/Sidebar';
12
- import DocPageLayoutMain from '@theme/DocPage/Layout/Main';
10
+ import DocRootLayoutSidebar from '@theme/DocRoot/Layout/Sidebar';
11
+ import DocRootLayoutMain from '@theme/DocRoot/Layout/Main';
13
12
  import styles from './styles.module.css';
14
- export default function DocPageLayout({children}) {
13
+ export default function DocRootLayout({children}) {
15
14
  const sidebar = useDocsSidebar();
16
15
  const [hiddenSidebarContainer, setHiddenSidebarContainer] = useState(false);
17
16
  return (
18
- <Layout wrapperClassName={styles.docsWrapper}>
17
+ <div className={styles.docsWrapper}>
19
18
  <BackToTopButton />
20
- <div className={styles.docPage}>
19
+ <div className={styles.docRoot}>
21
20
  {sidebar && (
22
- <DocPageLayoutSidebar
21
+ <DocRootLayoutSidebar
23
22
  sidebar={sidebar.items}
24
23
  hiddenSidebarContainer={hiddenSidebarContainer}
25
24
  setHiddenSidebarContainer={setHiddenSidebarContainer}
26
25
  />
27
26
  )}
28
- <DocPageLayoutMain hiddenSidebarContainer={hiddenSidebarContainer}>
27
+ <DocRootLayoutMain hiddenSidebarContainer={hiddenSidebarContainer}>
29
28
  {children}
30
- </DocPageLayoutMain>
29
+ </DocRootLayoutMain>
31
30
  </div>
32
- </Layout>
31
+ </div>
33
32
  );
34
33
  }
@@ -5,10 +5,9 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- .docPage {
8
+ .docRoot {
9
9
  display: flex;
10
10
  width: 100%;
11
- flex: 1 0;
12
11
  }
13
12
 
14
13
  .docsWrapper {
@@ -6,5 +6,5 @@
6
6
  */
7
7
  /// <reference types="@docusaurus/plugin-content-docs" />
8
8
  /// <reference types="react" />
9
- import type { Props } from '@theme/DocPage';
10
- export default function DocPage(props: Props): JSX.Element;
9
+ import type { Props } from '@theme/DocRoot';
10
+ export default function DocRoot(props: Props): JSX.Element;
@@ -0,0 +1,31 @@
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 from 'react';
8
+ import clsx from 'clsx';
9
+ import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
10
+ import {
11
+ DocsSidebarProvider,
12
+ useDocRootMetadata,
13
+ } from '@docusaurus/theme-common/internal';
14
+ import DocRootLayout from '@theme/DocRoot/Layout';
15
+ import NotFoundContent from '@theme/NotFound/Content';
16
+ export default function DocRoot(props) {
17
+ const currentDocRouteMetadata = useDocRootMetadata(props);
18
+ if (!currentDocRouteMetadata) {
19
+ // We only render the not found content to avoid a double layout
20
+ // see https://github.com/facebook/docusaurus/pull/7966#pullrequestreview-1077276692
21
+ return <NotFoundContent />;
22
+ }
23
+ const {docElement, sidebarName, sidebarItems} = currentDocRouteMetadata;
24
+ return (
25
+ <HtmlClassNameProvider className={clsx(ThemeClassNames.page.docsDocPage)}>
26
+ <DocsSidebarProvider name={sidebarName} items={sidebarItems}>
27
+ <DocRootLayout>{docElement}</DocRootLayout>
28
+ </DocsSidebarProvider>
29
+ </HtmlClassNameProvider>
30
+ );
31
+ }
@@ -15,7 +15,7 @@ import {
15
15
  } from '@docusaurus/theme-common';
16
16
  import {
17
17
  isActiveSidebarItem,
18
- findFirstCategoryLink,
18
+ findFirstSidebarItemLink,
19
19
  useDocSidebarItemsExpandedState,
20
20
  isSamePath,
21
21
  } from '@docusaurus/theme-common/internal';
@@ -45,7 +45,7 @@ function useAutoExpandActiveCategory({isActive, collapsed, updateCollapsed}) {
45
45
  function useCategoryHrefWithSSRFallback(item) {
46
46
  const isBrowser = useIsBrowser();
47
47
  return useMemo(() => {
48
- if (item.href) {
48
+ if (item.href && !item.linkUnlisted) {
49
49
  return item.href;
50
50
  }
51
51
  // In these cases, it's not necessary to render a fallback
@@ -53,7 +53,7 @@ function useCategoryHrefWithSSRFallback(item) {
53
53
  if (isBrowser || !item.collapsible) {
54
54
  return undefined;
55
55
  }
56
- return findFirstCategoryLink(item);
56
+ return findFirstSidebarItemLink(item);
57
57
  }, [item, isBrowser]);
58
58
  }
59
59
  function CollapseButton({categoryLabel, onClick}) {
@@ -5,14 +5,16 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import React, {memo} from 'react';
8
- import {DocSidebarItemsExpandedStateProvider} from '@docusaurus/theme-common/internal';
8
+ import {
9
+ DocSidebarItemsExpandedStateProvider,
10
+ useVisibleSidebarItems,
11
+ } from '@docusaurus/theme-common/internal';
9
12
  import DocSidebarItem from '@theme/DocSidebarItem';
10
- // TODO this item should probably not receive the "activePath" props
11
- // TODO this triggers whole sidebar re-renders on navigation
12
13
  function DocSidebarItems({items, ...props}) {
14
+ const visibleItems = useVisibleSidebarItems(items, props.activePath);
13
15
  return (
14
16
  <DocSidebarItemsExpandedStateProvider>
15
- {items.map((item, index) => (
17
+ {visibleItems.map((item, index) => (
16
18
  <DocSidebarItem key={index} item={item} index={index} {...props} />
17
19
  ))}
18
20
  </DocSidebarItemsExpandedStateProvider>