docusaurus-theme-openapi-docs 1.6.1 → 2.0.0-beta.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 (197) hide show
  1. package/lib/index.js +1 -1
  2. package/lib/theme/ApiDemoPanel/Body/index.js +10 -4
  3. package/lib/theme/ApiDemoPanel/CodeTabs/_CodeTabs.scss +216 -0
  4. package/lib/theme/ApiDemoPanel/CodeTabs/index.js +132 -137
  5. package/lib/theme/ApiDemoPanel/Curl/index.js +3 -5
  6. package/lib/theme/ApiDemoPanel/Execute/index.js +5 -1
  7. package/lib/theme/ApiDemoPanel/Execute/makeRequest.js +1 -1
  8. package/lib/theme/ApiDemoPanel/FloatingButton/_FloatingButton.scss +25 -0
  9. package/lib/theme/ApiDemoPanel/FloatingButton/index.js +1 -2
  10. package/lib/theme/ApiDemoPanel/FormFileUpload/{styles.module.css → _FormFileUpload.scss} +32 -35
  11. package/lib/theme/ApiDemoPanel/FormFileUpload/index.js +3 -4
  12. package/lib/theme/ApiDemoPanel/FormItem/_FormItem.scss +12 -0
  13. package/lib/theme/ApiDemoPanel/FormItem/index.js +2 -3
  14. package/lib/theme/ApiDemoPanel/FormMultiSelect/_FormMultiSelect.scss +26 -0
  15. package/lib/theme/ApiDemoPanel/FormMultiSelect/index.js +1 -2
  16. package/{lib-next/theme/ApiDemoPanel/FormSelect/styles.module.css → lib/theme/ApiDemoPanel/FormSelect/_FormSelect.scss} +14 -22
  17. package/lib/theme/ApiDemoPanel/FormSelect/index.js +1 -2
  18. package/{lib-next/theme/ApiDemoPanel/FormTextInput/styles.module.css → lib/theme/ApiDemoPanel/FormTextInput/_FormTextInput.scss} +4 -10
  19. package/lib/theme/ApiDemoPanel/FormTextInput/index.js +1 -2
  20. package/lib/theme/ApiDemoPanel/LiveEditor/_LiveEditor.scss +15 -0
  21. package/lib/theme/ApiDemoPanel/LiveEditor/index.js +2 -3
  22. package/lib/theme/ApiDemoPanel/MethodEndpoint/_MethodEndpoint.scss +6 -0
  23. package/lib/theme/ApiDemoPanel/MethodEndpoint/index.js +28 -9
  24. package/{lib-next/theme/ApiDemoPanel/ParamOptions/styles.module.css → lib/theme/ApiDemoPanel/ParamOptions/_ParamOptions.scss} +29 -64
  25. package/lib/theme/ApiDemoPanel/ParamOptions/index.js +5 -6
  26. package/lib/theme/ApiDemoPanel/Request/_Request.scss +48 -0
  27. package/lib/theme/ApiDemoPanel/Request/index.js +7 -8
  28. package/lib/theme/ApiDemoPanel/Response/_Response.scss +27 -0
  29. package/lib/theme/ApiDemoPanel/Response/index.js +43 -8
  30. package/lib/theme/ApiDemoPanel/Response/slice.js +22 -2
  31. package/lib/theme/ApiDemoPanel/SecuritySchemes/index.js +3 -3
  32. package/{src/theme/ApiDemoPanel/Request/styles.module.css → lib/theme/ApiDemoPanel/Server/_Server.scss} +5 -7
  33. package/lib/theme/ApiDemoPanel/Server/index.js +1 -2
  34. package/lib/theme/ApiDemoPanel/index.js +0 -6
  35. package/{src/theme/ApiTabs/styles.module.css → lib/theme/ApiTabs/_ApiTabs.scss} +54 -41
  36. package/lib/theme/ApiTabs/index.js +118 -195
  37. package/lib/theme/DiscriminatorTabs/_DiscriminatorTabs.scss +94 -0
  38. package/lib/theme/DiscriminatorTabs/index.js +116 -194
  39. package/lib/theme/Markdown/Details/_Details.scss +36 -0
  40. package/lib/theme/MimeTabs/_MimeTabs.scss +64 -0
  41. package/lib/theme/MimeTabs/index.js +137 -202
  42. package/lib/theme/ParamsItem/_ParamsItem.scss +39 -0
  43. package/lib/theme/ParamsItem/index.js +3 -5
  44. package/lib/theme/ResponseSamples/_ResponseSamples.scss +3 -0
  45. package/lib/theme/ResponseSamples/index.js +2 -7
  46. package/lib/theme/SchemaItem/_SchemaItem.scss +53 -0
  47. package/lib/theme/SchemaItem/index.js +18 -18
  48. package/lib/theme/SchemaTabs/_SchemaTabs.scss +58 -0
  49. package/lib/theme/SchemaTabs/index.js +102 -186
  50. package/lib/theme/styles.scss +117 -0
  51. package/lib/theme-openapi.d.ts +1 -1
  52. package/lib-next/index.js +1 -1
  53. package/lib-next/theme/ApiDemoPanel/Body/index.js +6 -2
  54. package/lib-next/theme/ApiDemoPanel/CodeTabs/_CodeTabs.scss +216 -0
  55. package/lib-next/theme/ApiDemoPanel/CodeTabs/index.js +100 -145
  56. package/lib-next/theme/ApiDemoPanel/Curl/index.js +6 -5
  57. package/lib-next/theme/ApiDemoPanel/Execute/index.js +13 -2
  58. package/lib-next/theme/ApiDemoPanel/Execute/makeRequest.js +1 -1
  59. package/lib-next/theme/ApiDemoPanel/FloatingButton/_FloatingButton.scss +25 -0
  60. package/lib-next/theme/ApiDemoPanel/FloatingButton/index.js +1 -2
  61. package/{src/theme/ApiDemoPanel/FormFileUpload/styles.module.css → lib-next/theme/ApiDemoPanel/FormFileUpload/_FormFileUpload.scss} +32 -35
  62. package/lib-next/theme/ApiDemoPanel/FormFileUpload/index.js +5 -4
  63. package/lib-next/theme/ApiDemoPanel/FormItem/_FormItem.scss +12 -0
  64. package/lib-next/theme/ApiDemoPanel/FormItem/index.js +2 -3
  65. package/lib-next/theme/ApiDemoPanel/FormMultiSelect/_FormMultiSelect.scss +26 -0
  66. package/lib-next/theme/ApiDemoPanel/FormMultiSelect/index.js +1 -2
  67. package/{src/theme/ApiDemoPanel/FormSelect/styles.module.css → lib-next/theme/ApiDemoPanel/FormSelect/_FormSelect.scss} +14 -22
  68. package/lib-next/theme/ApiDemoPanel/FormSelect/index.js +5 -2
  69. package/{src/theme/ApiDemoPanel/FormTextInput/styles.module.css → lib-next/theme/ApiDemoPanel/FormTextInput/_FormTextInput.scss} +4 -10
  70. package/lib-next/theme/ApiDemoPanel/FormTextInput/index.js +1 -2
  71. package/lib-next/theme/ApiDemoPanel/LiveEditor/_LiveEditor.scss +15 -0
  72. package/lib-next/theme/ApiDemoPanel/LiveEditor/index.js +2 -3
  73. package/lib-next/theme/ApiDemoPanel/MethodEndpoint/_MethodEndpoint.scss +6 -0
  74. package/lib-next/theme/ApiDemoPanel/MethodEndpoint/index.js +32 -14
  75. package/{src/theme/ApiDemoPanel/ParamOptions/styles.module.css → lib-next/theme/ApiDemoPanel/ParamOptions/_ParamOptions.scss} +29 -64
  76. package/lib-next/theme/ApiDemoPanel/ParamOptions/index.js +13 -6
  77. package/lib-next/theme/ApiDemoPanel/Request/_Request.scss +48 -0
  78. package/lib-next/theme/ApiDemoPanel/Request/index.js +7 -8
  79. package/lib-next/theme/ApiDemoPanel/Response/_Response.scss +27 -0
  80. package/lib-next/theme/ApiDemoPanel/Response/index.js +68 -9
  81. package/lib-next/theme/ApiDemoPanel/Response/slice.js +20 -1
  82. package/lib-next/theme/ApiDemoPanel/SecuritySchemes/index.js +3 -3
  83. package/{lib/theme/ApiDemoPanel/Request/styles.module.css → lib-next/theme/ApiDemoPanel/Server/_Server.scss} +5 -7
  84. package/lib-next/theme/ApiDemoPanel/Server/index.js +1 -2
  85. package/lib-next/theme/ApiDemoPanel/index.js +0 -3
  86. package/lib-next/theme/ApiTabs/{styles.module.css → _ApiTabs.scss} +54 -41
  87. package/lib-next/theme/ApiTabs/index.js +118 -195
  88. package/lib-next/theme/DiscriminatorTabs/_DiscriminatorTabs.scss +94 -0
  89. package/lib-next/theme/DiscriminatorTabs/index.js +116 -194
  90. package/lib-next/theme/Markdown/Details/_Details.scss +36 -0
  91. package/lib-next/theme/MimeTabs/_MimeTabs.scss +64 -0
  92. package/lib-next/theme/MimeTabs/index.js +137 -202
  93. package/lib-next/theme/ParamsItem/_ParamsItem.scss +39 -0
  94. package/lib-next/theme/ParamsItem/index.js +3 -5
  95. package/lib-next/theme/ResponseSamples/_ResponseSamples.scss +3 -0
  96. package/lib-next/theme/ResponseSamples/index.js +2 -7
  97. package/lib-next/theme/SchemaItem/_SchemaItem.scss +53 -0
  98. package/lib-next/theme/SchemaItem/index.js +18 -18
  99. package/lib-next/theme/SchemaTabs/_SchemaTabs.scss +58 -0
  100. package/lib-next/theme/SchemaTabs/index.js +102 -186
  101. package/lib-next/theme/styles.scss +117 -0
  102. package/lib-next/theme-openapi.d.ts +1 -1
  103. package/package.json +8 -6
  104. package/src/index.ts +1 -1
  105. package/src/theme/ApiDemoPanel/Body/index.tsx +6 -2
  106. package/src/theme/ApiDemoPanel/CodeTabs/_CodeTabs.scss +216 -0
  107. package/src/theme/ApiDemoPanel/CodeTabs/index.js +156 -0
  108. package/src/theme/ApiDemoPanel/Curl/index.tsx +8 -10
  109. package/src/theme/ApiDemoPanel/Execute/index.tsx +13 -2
  110. package/src/theme/ApiDemoPanel/Execute/makeRequest.ts +1 -1
  111. package/src/theme/ApiDemoPanel/FloatingButton/_FloatingButton.scss +25 -0
  112. package/src/theme/ApiDemoPanel/FloatingButton/index.tsx +1 -3
  113. package/{lib-next/theme/ApiDemoPanel/FormFileUpload/styles.module.css → src/theme/ApiDemoPanel/FormFileUpload/_FormFileUpload.scss} +32 -35
  114. package/src/theme/ApiDemoPanel/FormFileUpload/index.tsx +5 -5
  115. package/src/theme/ApiDemoPanel/FormItem/_FormItem.scss +12 -0
  116. package/src/theme/ApiDemoPanel/FormItem/index.tsx +2 -4
  117. package/src/theme/ApiDemoPanel/FormMultiSelect/_FormMultiSelect.scss +26 -0
  118. package/src/theme/ApiDemoPanel/FormMultiSelect/index.tsx +1 -3
  119. package/{lib/theme/ApiDemoPanel/FormSelect/styles.module.css → src/theme/ApiDemoPanel/FormSelect/_FormSelect.scss} +14 -22
  120. package/src/theme/ApiDemoPanel/FormSelect/index.tsx +5 -3
  121. package/{lib/theme/ApiDemoPanel/FormTextInput/styles.module.css → src/theme/ApiDemoPanel/FormTextInput/_FormTextInput.scss} +4 -10
  122. package/src/theme/ApiDemoPanel/FormTextInput/index.tsx +1 -3
  123. package/src/theme/ApiDemoPanel/LiveEditor/_LiveEditor.scss +15 -0
  124. package/src/theme/ApiDemoPanel/LiveEditor/index.tsx +2 -4
  125. package/src/theme/ApiDemoPanel/MethodEndpoint/_MethodEndpoint.scss +6 -0
  126. package/src/theme/ApiDemoPanel/MethodEndpoint/index.tsx +37 -14
  127. package/{lib/theme/ApiDemoPanel/ParamOptions/styles.module.css → src/theme/ApiDemoPanel/ParamOptions/_ParamOptions.scss} +29 -64
  128. package/src/theme/ApiDemoPanel/ParamOptions/index.tsx +13 -6
  129. package/src/theme/ApiDemoPanel/Request/_Request.scss +48 -0
  130. package/src/theme/ApiDemoPanel/Request/index.tsx +7 -9
  131. package/src/theme/ApiDemoPanel/Response/_Response.scss +27 -0
  132. package/src/theme/ApiDemoPanel/Response/index.tsx +68 -9
  133. package/src/theme/ApiDemoPanel/Response/slice.ts +22 -1
  134. package/src/theme/ApiDemoPanel/SecuritySchemes/index.tsx +3 -3
  135. package/{lib-next/theme/ApiDemoPanel/Request/styles.module.css → src/theme/ApiDemoPanel/Server/_Server.scss} +5 -7
  136. package/src/theme/ApiDemoPanel/Server/index.tsx +1 -2
  137. package/src/theme/ApiDemoPanel/index.tsx +0 -3
  138. package/{lib/theme/ApiTabs/styles.module.css → src/theme/ApiTabs/_ApiTabs.scss} +54 -41
  139. package/src/theme/ApiTabs/index.js +118 -195
  140. package/src/theme/DiscriminatorTabs/_DiscriminatorTabs.scss +94 -0
  141. package/src/theme/DiscriminatorTabs/index.js +116 -194
  142. package/src/theme/Markdown/Details/_Details.scss +36 -0
  143. package/src/theme/MimeTabs/_MimeTabs.scss +64 -0
  144. package/src/theme/MimeTabs/index.js +137 -202
  145. package/src/theme/ParamsItem/_ParamsItem.scss +39 -0
  146. package/src/theme/ParamsItem/index.js +3 -5
  147. package/src/theme/ResponseSamples/_ResponseSamples.scss +3 -0
  148. package/src/theme/ResponseSamples/index.js +2 -7
  149. package/src/theme/SchemaItem/_SchemaItem.scss +53 -0
  150. package/src/theme/SchemaItem/index.js +18 -18
  151. package/src/theme/SchemaTabs/_SchemaTabs.scss +58 -0
  152. package/src/theme/SchemaTabs/index.js +102 -186
  153. package/src/theme/styles.scss +117 -0
  154. package/src/theme-openapi.d.ts +1 -1
  155. package/lib/theme/ApiDemoPanel/CodeTabs/styles.module.css +0 -17
  156. package/lib/theme/ApiDemoPanel/Curl/styles.module.css +0 -89
  157. package/lib/theme/ApiDemoPanel/FloatingButton/styles.module.css +0 -26
  158. package/lib/theme/ApiDemoPanel/FormItem/styles.module.css +0 -12
  159. package/lib/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +0 -38
  160. package/lib/theme/ApiDemoPanel/LiveEditor/styles.module.css +0 -35
  161. package/lib/theme/ApiDemoPanel/Server/styles.module.css +0 -56
  162. package/lib/theme/DiscriminatorTabs/styles.module.css +0 -115
  163. package/lib/theme/MimeTabs/styles.module.css +0 -126
  164. package/lib/theme/ParamsItem/styles.module.css +0 -24
  165. package/lib/theme/ResponseSamples/styles.module.css +0 -7
  166. package/lib/theme/SchemaItem/styles.module.css +0 -38
  167. package/lib/theme/SchemaTabs/styles.module.css +0 -110
  168. package/lib/theme/styles.css +0 -485
  169. package/lib-next/theme/ApiDemoPanel/CodeTabs/styles.module.css +0 -17
  170. package/lib-next/theme/ApiDemoPanel/Curl/styles.module.css +0 -89
  171. package/lib-next/theme/ApiDemoPanel/FloatingButton/styles.module.css +0 -26
  172. package/lib-next/theme/ApiDemoPanel/FormItem/styles.module.css +0 -12
  173. package/lib-next/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +0 -38
  174. package/lib-next/theme/ApiDemoPanel/LiveEditor/styles.module.css +0 -35
  175. package/lib-next/theme/ApiDemoPanel/Server/styles.module.css +0 -56
  176. package/lib-next/theme/DiscriminatorTabs/styles.module.css +0 -115
  177. package/lib-next/theme/MimeTabs/styles.module.css +0 -126
  178. package/lib-next/theme/ParamsItem/styles.module.css +0 -24
  179. package/lib-next/theme/ResponseSamples/styles.module.css +0 -7
  180. package/lib-next/theme/SchemaItem/styles.module.css +0 -38
  181. package/lib-next/theme/SchemaTabs/styles.module.css +0 -110
  182. package/lib-next/theme/styles.css +0 -485
  183. package/src/theme/ApiDemoPanel/CodeTabs/index.tsx +0 -239
  184. package/src/theme/ApiDemoPanel/CodeTabs/styles.module.css +0 -17
  185. package/src/theme/ApiDemoPanel/Curl/styles.module.css +0 -89
  186. package/src/theme/ApiDemoPanel/FloatingButton/styles.module.css +0 -26
  187. package/src/theme/ApiDemoPanel/FormItem/styles.module.css +0 -12
  188. package/src/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +0 -38
  189. package/src/theme/ApiDemoPanel/LiveEditor/styles.module.css +0 -35
  190. package/src/theme/ApiDemoPanel/Server/styles.module.css +0 -56
  191. package/src/theme/DiscriminatorTabs/styles.module.css +0 -115
  192. package/src/theme/MimeTabs/styles.module.css +0 -126
  193. package/src/theme/ParamsItem/styles.module.css +0 -24
  194. package/src/theme/ResponseSamples/styles.module.css +0 -7
  195. package/src/theme/SchemaItem/styles.module.css +0 -38
  196. package/src/theme/SchemaTabs/styles.module.css +0 -110
  197. package/src/theme/styles.css +0 -485
@@ -5,133 +5,35 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  * ========================================================================== */
7
7
 
8
- import React, {
9
- Children,
10
- cloneElement,
11
- isValidElement,
12
- useEffect,
13
- useRef,
14
- useState,
15
- } from "react";
8
+ import React, { cloneElement, useEffect, useState, useRef } from "react";
16
9
 
17
- import { duplicates } from "@docusaurus/theme-common";
10
+ import {
11
+ useScrollPositionBlocker,
12
+ useTabs,
13
+ } from "@docusaurus/theme-common/internal";
18
14
  import useIsBrowser from "@docusaurus/useIsBrowser";
19
15
  import { setAccept } from "@theme/ApiDemoPanel/Accept/slice";
20
16
  import { setContentType } from "@theme/ApiDemoPanel/ContentType/slice";
21
17
  import { useTypedDispatch, useTypedSelector } from "@theme/ApiItem/hooks";
22
18
  import clsx from "clsx";
23
19
 
24
- import styles from "./styles.module.css";
25
-
26
- const {
27
- useScrollPositionBlocker,
28
- useTabGroupChoice,
29
- } = require("@docusaurus/theme-common/internal");
30
-
31
- function isTabItem(comp) {
32
- return typeof comp.props.value !== "undefined";
33
- }
34
-
35
- function MimeTabsComponent(props) {
36
- const {
37
- lazy,
38
- block,
39
- defaultValue: defaultValueProp,
40
- values: valuesProp,
41
- groupId,
42
- className,
43
- schemaType,
44
- } = props;
45
- const children = Children.map(props.children, (child) => {
46
- if (isValidElement(child) && isTabItem(child)) {
47
- return child;
48
- } // child.type.name will give non-sensical values in prod because of
49
- // minification, but we assume it won't throw in prod.
50
-
51
- throw new Error(
52
- `Docusaurus error: Bad <Tabs> child <${
53
- // @ts-expect-error: guarding against unexpected cases
54
- typeof child.type === "string" ? child.type : child.type.name
55
- }>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`
56
- );
57
- });
58
- const values =
59
- valuesProp ?? // We only pick keys that we recognize. MDX would inject some keys by default
60
- children.map(({ props: { value, label, attributes } }) => ({
61
- value,
62
- label,
63
- attributes,
64
- }));
65
- const dup = duplicates(values, (a, b) => a.value === b.value);
66
-
67
- if (dup.length > 0) {
68
- throw new Error(
69
- `Docusaurus error: Duplicate values "${dup
70
- .map((a) => a.value)
71
- .join(", ")}" found in <Tabs>. Every value needs to be unique.`
72
- );
73
- } // When defaultValueProp is null, don't show a default tab
74
-
75
- const defaultValue =
76
- defaultValueProp === null
77
- ? defaultValueProp
78
- : defaultValueProp ??
79
- children.find((child) => child.props.default)?.props.value ??
80
- children[0]?.props.value;
81
-
82
- if (defaultValue !== null && !values.some((a) => a.value === defaultValue)) {
83
- throw new Error(
84
- `Docusaurus error: The <Tabs> has a defaultValue "${defaultValue}" but none of its children has the corresponding value. Available values are: ${values
85
- .map((a) => a.value)
86
- .join(
87
- ", "
88
- )}. If you intend to show no default tab, use defaultValue={null} instead.`
89
- );
90
- }
91
-
92
- const { tabGroupChoices, setTabGroupChoices } = useTabGroupChoice();
93
- const [selectedValue, setSelectedValue] = useState(defaultValue);
20
+ function TabList({
21
+ className,
22
+ block,
23
+ selectedValue: selectedValueProp,
24
+ selectValue,
25
+ tabValues,
26
+ schemaType,
27
+ }) {
94
28
  const tabRefs = [];
95
29
  const { blockElementScrollPositionUntilNextRender } =
96
30
  useScrollPositionBlocker();
97
31
 
98
- if (groupId != null) {
99
- const relevantTabGroupChoice = tabGroupChoices[groupId];
100
-
101
- if (
102
- relevantTabGroupChoice != null &&
103
- relevantTabGroupChoice !== selectedValue &&
104
- values.some((value) => value.value === relevantTabGroupChoice)
105
- ) {
106
- setSelectedValue(relevantTabGroupChoice);
107
- }
108
- }
109
-
32
+ // custom
110
33
  const dispatch = useTypedDispatch();
111
34
  const isRequestSchema = schemaType?.toLowerCase() === "request";
112
35
 
113
- const handleTabChange = (event) => {
114
- event.preventDefault();
115
- const newTab = event.currentTarget;
116
- const newTabIndex = tabRefs.indexOf(newTab);
117
- const newTabValue = values[newTabIndex].value;
118
-
119
- if (newTabValue !== selectedValue) {
120
- if (isRequestSchema) {
121
- dispatch(setContentType(newTabValue));
122
- } else {
123
- dispatch(setAccept(newTabValue));
124
- }
125
-
126
- blockElementScrollPositionUntilNextRender(newTab);
127
- setSelectedValue(newTabValue);
128
-
129
- if (groupId != null) {
130
- setTabGroupChoices(groupId, newTabValue);
131
- }
132
- }
133
- };
134
-
36
+ const [selectedValue, setSelectedValue] = useState(selectedValueProp);
135
37
  const contentTypeVal = useTypedSelector((state) => state.contentType.value);
136
38
  const acceptTypeVal = useTypedSelector((state) => state.accept.value);
137
39
 
@@ -146,26 +48,43 @@ function MimeTabsComponent(props) {
146
48
  // eslint-disable-next-line react-hooks/exhaustive-deps
147
49
  }, [contentTypeVal, acceptTypeVal]);
148
50
 
51
+ const handleTabChange = (event) => {
52
+ event.preventDefault();
53
+ const newTab = event.currentTarget;
54
+ const newTabIndex = tabRefs.indexOf(newTab);
55
+ const newTabValue = tabValues[newTabIndex].value;
56
+ // custom
57
+ if (newTabValue !== selectedValue) {
58
+ if (isRequestSchema) {
59
+ dispatch(setContentType(newTabValue));
60
+ } else {
61
+ dispatch(setAccept(newTabValue));
62
+ }
63
+ blockElementScrollPositionUntilNextRender(newTab);
64
+ selectValue(newTabValue);
65
+ }
66
+ };
67
+
149
68
  const handleKeydown = (event) => {
150
69
  let focusElement = null;
151
-
152
70
  switch (event.key) {
71
+ case "Enter": {
72
+ handleTabChange(event);
73
+ break;
74
+ }
153
75
  case "ArrowRight": {
154
76
  const nextTab = tabRefs.indexOf(event.currentTarget) + 1;
155
- focusElement = tabRefs[nextTab] || tabRefs[0];
77
+ focusElement = tabRefs[nextTab] ?? tabRefs[0];
156
78
  break;
157
79
  }
158
-
159
80
  case "ArrowLeft": {
160
81
  const prevTab = tabRefs.indexOf(event.currentTarget) - 1;
161
- focusElement = tabRefs[prevTab] || tabRefs[tabRefs.length - 1];
82
+ focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1];
162
83
  break;
163
84
  }
164
-
165
85
  default:
166
86
  break;
167
87
  }
168
-
169
88
  focusElement?.focus();
170
89
  };
171
90
 
@@ -173,12 +92,21 @@ function MimeTabsComponent(props) {
173
92
  const [showTabArrows, setShowTabArrows] = useState(false);
174
93
 
175
94
  useEffect(() => {
176
- const tabOffsetWidth = tabItemListContainerRef.current.offsetWidth;
177
- const tabScrollWidth = tabItemListContainerRef.current.scrollWidth;
95
+ const resizeObserver = new ResizeObserver((entries) => {
96
+ for (let entry of entries) {
97
+ if (entry.target.offsetWidth < entry.target.scrollWidth) {
98
+ setShowTabArrows(true);
99
+ } else {
100
+ setShowTabArrows(false);
101
+ }
102
+ }
103
+ });
178
104
 
179
- if (tabOffsetWidth < tabScrollWidth) {
180
- setShowTabArrows(true);
181
- }
105
+ resizeObserver.observe(tabItemListContainerRef.current);
106
+
107
+ return () => {
108
+ resizeObserver.disconnect();
109
+ };
182
110
  }, []);
183
111
 
184
112
  const handleRightClick = () => {
@@ -191,93 +119,100 @@ function MimeTabsComponent(props) {
191
119
 
192
120
  return (
193
121
  <div className="tabs__container">
194
- <div className={styles.mimeTabsTopSection}>
195
- {/* <strong>MIME Type</strong> */}
196
- <div className={styles.mimeTabsContainer}>
197
- {showTabArrows && (
198
- <button
199
- className={clsx(styles.tabArrow, styles.tabArrowLeft)}
200
- onClick={handleLeftClick}
201
- />
202
- )}
203
- <ul
204
- ref={tabItemListContainerRef}
205
- role="tablist"
206
- aria-orientation="horizontal"
207
- className={clsx(
208
- styles.mimeTabsListContainer,
209
- "tabs",
210
- {
211
- "tabs--block": block,
212
- },
213
- className
214
- )}
215
- >
216
- {values.map(({ value, label, attributes }) => {
217
- return (
218
- <li
219
- role="tab"
220
- tabIndex={selectedValue === value ? 0 : -1}
221
- aria-selected={selectedValue === value}
222
- key={value}
223
- ref={(tabControl) => tabRefs.push(tabControl)}
224
- onKeyDown={handleKeydown}
225
- onFocus={handleTabChange}
226
- onClick={(e) => handleTabChange(e)}
227
- {...attributes}
228
- className={clsx(
229
- "tabs__item",
230
- styles.tabItem,
231
- attributes?.className,
232
- {
233
- [styles.mimeTabActive]: selectedValue === value,
234
- }
235
- )}
236
- >
237
- {/* <div
238
- className={clsx(styles.mimeTabDot, mimeTabDotStyle)}
239
- /> */}
240
- {label ?? value}
241
- </li>
242
- );
243
- })}
244
- </ul>
245
- {showTabArrows && (
246
- <button
247
- className={clsx(styles.tabArrow, styles.tabArrowRight)}
248
- onClick={handleRightClick}
249
- />
122
+ <div className="openapi-tabs__mime-container">
123
+ {showTabArrows && (
124
+ <button
125
+ className={clsx("openapi-tabs__arrow", "left")}
126
+ onClick={handleLeftClick}
127
+ />
128
+ )}
129
+ <ul
130
+ ref={tabItemListContainerRef}
131
+ role="tablist"
132
+ aria-orientation="horizontal"
133
+ className={clsx(
134
+ "openapi-tabs__mime-list-container",
135
+ "tabs",
136
+ {
137
+ "tabs--block": block,
138
+ },
139
+ className
250
140
  )}
251
- </div>
141
+ >
142
+ {tabValues.map(({ value, label, attributes }) => {
143
+ return (
144
+ <li
145
+ role="tab"
146
+ tabIndex={selectedValue === value ? 0 : -1}
147
+ aria-selected={selectedValue === value}
148
+ key={value}
149
+ ref={(tabControl) => tabRefs.push(tabControl)}
150
+ onKeyDown={handleKeydown}
151
+ onFocus={handleTabChange}
152
+ onClick={(e) => handleTabChange(e)}
153
+ {...attributes}
154
+ className={clsx(
155
+ "tabs__item",
156
+ "openapi-tabs__mime-item",
157
+ attributes?.className,
158
+ {
159
+ active: selectedValue === value,
160
+ }
161
+ )}
162
+ >
163
+ {label ?? value}
164
+ </li>
165
+ );
166
+ })}
167
+ </ul>
168
+ {showTabArrows && (
169
+ <button
170
+ className={clsx("openapi-tabs__arrow", "right")}
171
+ onClick={handleRightClick}
172
+ />
173
+ )}
252
174
  </div>
253
- {/* <hr /> */}
254
- {lazy ? (
255
- cloneElement(
256
- children.filter(
257
- (tabItem) => tabItem.props.value === selectedValue
258
- )[0],
259
- {
260
- className: clsx("margin-vert--md", styles.mimeSchemaContainer),
261
- }
262
- )
263
- ) : (
264
- <div className={clsx("margin-vert--md", styles.mimeSchemaContainer)}>
265
- {children.map((tabItem, i) =>
266
- cloneElement(tabItem, {
267
- key: i,
268
- hidden: tabItem.props.value !== selectedValue,
269
- })
270
- )}
271
- </div>
175
+ </div>
176
+ );
177
+ }
178
+ function TabContent({ lazy, children, selectedValue }) {
179
+ // eslint-disable-next-line no-param-reassign
180
+ children = Array.isArray(children) ? children : [children];
181
+ if (lazy) {
182
+ const selectedTabItem = children.find(
183
+ (tabItem) => tabItem.props.value === selectedValue
184
+ );
185
+ if (!selectedTabItem) {
186
+ // fail-safe or fail-fast? not sure what's best here
187
+ return null;
188
+ }
189
+ return cloneElement(selectedTabItem, { className: "margin-top--md" });
190
+ }
191
+ return (
192
+ <div className="margin-top--md">
193
+ {children.map((tabItem, i) =>
194
+ cloneElement(tabItem, {
195
+ key: i,
196
+ hidden: tabItem.props.value !== selectedValue,
197
+ })
272
198
  )}
273
199
  </div>
274
200
  );
275
201
  }
276
-
202
+ function TabsComponent(props) {
203
+ const tabs = useTabs(props);
204
+ return (
205
+ <div className="tabs-container">
206
+ <TabList {...props} {...tabs} />
207
+ <TabContent {...props} {...tabs} />
208
+ </div>
209
+ );
210
+ }
277
211
  export default function MimeTabs(props) {
278
212
  const isBrowser = useIsBrowser();
279
213
  return (
280
- <MimeTabsComponent // Remount tabs after hydration
214
+ <TabsComponent
215
+ // Remount tabs after hydration
281
216
  // Temporary fix for https://github.com/facebook/docusaurus/issues/5653
282
217
  key={String(isBrowser)}
283
218
  {...props}
@@ -0,0 +1,39 @@
1
+ .openapi-params__list-item {
2
+ margin: 0 0 0 1rem !important;
3
+ position: relative;
4
+ padding-left: 1rem;
5
+ border-left: thin solid var(--ifm-color-gray-500) !important;
6
+ margin-top: unset !important;
7
+
8
+ // Horizonal line styling for param attributes
9
+ &::before {
10
+ position: absolute;
11
+ top: 10px;
12
+ left: 0;
13
+ width: 0.7rem;
14
+ /* width of horizontal line */
15
+ height: 0.5rem;
16
+ /* vertical position of line */
17
+ vertical-align: top;
18
+ border-bottom: thin solid var(--ifm-color-gray-500);
19
+ content: "";
20
+ display: inline-block;
21
+ }
22
+ }
23
+
24
+ .openapi-params__list-item:hover {
25
+ background-color: var(--ifm-menu-color-background-active);
26
+ }
27
+
28
+ .openapi-params__list-item:focus {
29
+ background-color: var(--ifm-menu-color-background-active);
30
+ }
31
+
32
+ .openapi-schema__type {
33
+ opacity: 0.6;
34
+ }
35
+
36
+ .openapi-schema__required {
37
+ font-size: var(--ifm-code-font-size);
38
+ color: var(--openapi-required);
39
+ }
@@ -25,8 +25,6 @@ import {
25
25
  import ReactMarkdown from "react-markdown";
26
26
  import rehypeRaw from "rehype-raw";
27
27
 
28
- import styles from "./styles.module.css";
29
-
30
28
  function ParamsItem({
31
29
  param: { description, example, examples, name, required, schema },
32
30
  }) {
@@ -35,11 +33,11 @@ function ParamsItem({
35
33
  }
36
34
 
37
35
  const renderSchemaName = guard(schema, (schema) => (
38
- <span className={styles.schemaName}> {getSchemaName(schema)}</span>
36
+ <span className="openapi-schema__type"> {getSchemaName(schema)}</span>
39
37
  ));
40
38
 
41
39
  const renderSchemaRequired = guard(required, () => (
42
- <strong className={styles.paramsRequired}> required</strong>
40
+ <strong className="openapi-schema__required"> required</strong>
43
41
  ));
44
42
 
45
43
  const renderSchema = guard(getQualifierMessage(schema), (message) => (
@@ -119,7 +117,7 @@ function ParamsItem({
119
117
  });
120
118
 
121
119
  return (
122
- <li className={styles.paramsItem}>
120
+ <li className="openapi-params__list-item">
123
121
  <strong>{name}</strong>
124
122
  {renderSchemaName}
125
123
  {renderSchemaRequired}
@@ -0,0 +1,3 @@
1
+ .openapi-code__response-samples-container {
2
+ margin-top: 2rem;
3
+ }
@@ -9,15 +9,10 @@ import React from "react";
9
9
 
10
10
  import CodeBlock from "@theme/CodeBlock";
11
11
 
12
- import styles from "./styles.module.css";
13
-
14
12
  function ResponseSamples({ responseExample, language }) {
15
13
  return (
16
- <div className={styles.responseSamplesContainer}>
17
- <CodeBlock
18
- language={language ? language : "json"}
19
- className={styles.responseSamplesCodeBlock}
20
- >
14
+ <div className="openapi-code__response-samples-container">
15
+ <CodeBlock language={language ? language : "json"}>
21
16
  {responseExample}
22
17
  </CodeBlock>
23
18
  </div>
@@ -0,0 +1,53 @@
1
+ .openapi-schema__list-item {
2
+ list-style: none;
3
+ position: relative;
4
+ margin: 0 !important;
5
+ padding: 5px 0 5px 1rem;
6
+ border-left: thin solid var(--ifm-color-gray-500) !important;
7
+
8
+ // Horizontal line styling for schema properties
9
+ &::before {
10
+ position: absolute;
11
+ top: 10px;
12
+ left: 0;
13
+ width: 0.7rem;
14
+ /* width of horizontal line */
15
+ height: 0.5rem;
16
+ /* vertical position of line */
17
+ vertical-align: top;
18
+ border-bottom: thin solid var(--ifm-color-gray-500);
19
+ content: "";
20
+ display: inline-block;
21
+ }
22
+ }
23
+
24
+ .openapi-schema__list-item:hover {
25
+ background-color: var(--ifm-menu-color-background-active);
26
+ }
27
+
28
+ .openapi-schema__list-item:focus {
29
+ background-color: var(--ifm-menu-color-background-active);
30
+ }
31
+
32
+ .openapi-schema__name {
33
+ opacity: 0.6;
34
+ }
35
+
36
+ .openapi-schema__required {
37
+ font-size: var(--ifm-code-font-size);
38
+ color: var(--openapi-required);
39
+ }
40
+
41
+ .openapi-schema__deprecated {
42
+ font-size: var(--ifm-code-font-size);
43
+ color: var(--openapi-deprecated);
44
+ }
45
+
46
+ .openapi-schema__nullable {
47
+ font-size: var(--ifm-code-font-size);
48
+ color: var(--openapi-nullable);
49
+ }
50
+
51
+ .openapi-schema__strikethrough {
52
+ text-decoration: line-through;
53
+ }
@@ -11,15 +11,10 @@ import CodeBlock from "@theme/CodeBlock";
11
11
  /* eslint-disable import/no-extraneous-dependencies*/
12
12
  import { createDescription } from "docusaurus-theme-openapi-docs/lib/markdown/createDescription";
13
13
  /* eslint-disable import/no-extraneous-dependencies*/
14
- import {
15
- guard,
16
- toString,
17
- } from "docusaurus-theme-openapi-docs/lib/markdown/utils";
14
+ import { guard } from "docusaurus-theme-openapi-docs/lib/markdown/utils";
18
15
  import ReactMarkdown from "react-markdown";
19
16
  import rehypeRaw from "rehype-raw";
20
17
 
21
- import styles from "./styles.module.css";
22
-
23
18
  function SchemaItem({
24
19
  children: collapsibleSchemaContent,
25
20
  collapsible,
@@ -42,15 +37,15 @@ function SchemaItem({
42
37
 
43
38
  const renderRequired = guard(
44
39
  Array.isArray(required) ? required.includes(name) : required,
45
- () => <strong className={styles.required}> required</strong>
40
+ () => <strong className="openapi-schema__required"> required</strong>
46
41
  );
47
42
 
48
43
  const renderDeprecated = guard(deprecated, () => (
49
- <strong className={styles.deprecated}> deprecated</strong>
44
+ <strong className="openapi-schema__deprecated"> deprecated</strong>
50
45
  ));
51
46
 
52
47
  const renderNullable = guard(nullable, () => (
53
- <strong className={styles.nullable}> nullable</strong>
48
+ <strong className="openapi-schema__nullable"> nullable</strong>
54
49
  ));
55
50
 
56
51
  const renderSchemaDescription = guard(schemaDescription, (description) => (
@@ -75,7 +70,7 @@ function SchemaItem({
75
70
  ));
76
71
 
77
72
  const renderQualifierMessage = guard(qualifierMessage, (message) => (
78
- <div className={styles.schemaQualifierMessage}>
73
+ <div>
79
74
  <ReactMarkdown
80
75
  children={createDescription(message)}
81
76
  rehypePlugins={[rehypeRaw]}
@@ -83,16 +78,21 @@ function SchemaItem({
83
78
  </div>
84
79
  ));
85
80
 
86
- const renderDefaultValue = guard(toString(defaultValue), (value) => (
87
- <div className={styles.schemaQualifierMessage}>
88
- <ReactMarkdown children={`**Default value:** \`${value}\``} />
89
- </div>
90
- ));
81
+ const renderDefaultValue = guard(
82
+ typeof defaultValue === "boolean" ? defaultValue.toString() : defaultValue,
83
+ (value) => (
84
+ <div className="">
85
+ <ReactMarkdown children={`**Default value:** \`${value}\``} />
86
+ </div>
87
+ )
88
+ );
91
89
 
92
90
  const schemaContent = (
93
91
  <div>
94
- <strong className={deprecated && styles.strikethrough}>{name}</strong>
95
- <span className={styles.schemaName}> {schemaName}</span>
92
+ <strong className={deprecated && "openapi-schema__strikethrough"}>
93
+ {name}
94
+ </strong>
95
+ <span className="openapi-schema__name"> {schemaName}</span>
96
96
  {renderNullable}
97
97
  {!deprecated && renderRequired}
98
98
  {renderDeprecated}
@@ -103,7 +103,7 @@ function SchemaItem({
103
103
  );
104
104
 
105
105
  return (
106
- <li className={styles.schemaItem}>
106
+ <li className="openapi-schema__list-item">
107
107
  {collapsible ? collapsibleSchemaContent : schemaContent}
108
108
  </li>
109
109
  );
@@ -0,0 +1,58 @@
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
+ .openapi-tabs__schema-item {
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ height: 1.8rem;
13
+ margin-top: 0 !important;
14
+ margin-right: 0.5rem;
15
+ border: 1px solid var(--ifm-color-primary);
16
+ border-radius: var(--ifm-global-radius);
17
+ color: var(--ifm-color-primary);
18
+ font-size: 12px;
19
+ }
20
+
21
+ .openapi-tabs__schema-item:not(.active) {
22
+ opacity: 0.65;
23
+ }
24
+
25
+ .openapi-tabs__schema-item:hover {
26
+ opacity: 1;
27
+ background-color: var(--ifm-color-emphasis-100);
28
+ }
29
+
30
+ .openapi-tabs__schema-item:last-child {
31
+ margin-right: 0 !important;
32
+ }
33
+
34
+ .openapi-tabs__schema-list-container {
35
+ overflow-y: hidden;
36
+ overflow-x: scroll;
37
+ scroll-behavior: smooth;
38
+
39
+ &::-webkit-scrollbar {
40
+ display: none;
41
+ }
42
+
43
+ &.active {
44
+ background-color: var(--ifm-color-emphasis-100);
45
+ }
46
+ }
47
+
48
+ .openapi-tabs__schema-label {
49
+ white-space: nowrap;
50
+ }
51
+
52
+ .openapi-tabs__schema-container {
53
+ width: 100%;
54
+ margin-top: 1rem;
55
+ display: flex;
56
+ align-items: center;
57
+ overflow: hidden;
58
+ }