docusaurus-theme-openapi-docs 1.0.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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/babel.config.js +35 -0
  3. package/lib/index.js +48 -0
  4. package/lib/markdown/createDescription.js +20 -0
  5. package/lib/markdown/schema.js +121 -0
  6. package/lib/markdown/utils.js +45 -0
  7. package/lib/theme/ApiDemoPanel/Accept/index.js +41 -0
  8. package/lib/theme/ApiDemoPanel/Accept/slice.js +32 -0
  9. package/lib/theme/ApiDemoPanel/Authorization/auth-types.js +32 -0
  10. package/lib/theme/ApiDemoPanel/Authorization/index.js +174 -0
  11. package/lib/theme/ApiDemoPanel/Authorization/slice.js +137 -0
  12. package/lib/theme/ApiDemoPanel/Body/index.js +185 -0
  13. package/lib/theme/ApiDemoPanel/Body/slice.js +105 -0
  14. package/lib/theme/ApiDemoPanel/ContentType/index.js +41 -0
  15. package/lib/theme/ApiDemoPanel/ContentType/slice.js +32 -0
  16. package/lib/theme/ApiDemoPanel/Curl/index.js +236 -0
  17. package/lib/theme/ApiDemoPanel/Curl/styles.module.css +84 -0
  18. package/lib/theme/ApiDemoPanel/Execute/index.js +85 -0
  19. package/lib/theme/ApiDemoPanel/Execute/makeRequest.js +202 -0
  20. package/lib/theme/ApiDemoPanel/FloatingButton/index.js +32 -0
  21. package/lib/theme/ApiDemoPanel/FloatingButton/styles.module.css +26 -0
  22. package/lib/theme/ApiDemoPanel/FormFileUpload/index.js +97 -0
  23. package/lib/theme/ApiDemoPanel/FormFileUpload/styles.module.css +75 -0
  24. package/lib/theme/ApiDemoPanel/FormItem/index.js +35 -0
  25. package/lib/theme/ApiDemoPanel/FormItem/styles.module.css +7 -0
  26. package/lib/theme/ApiDemoPanel/FormMultiSelect/index.js +52 -0
  27. package/lib/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +38 -0
  28. package/lib/theme/ApiDemoPanel/FormSelect/index.js +39 -0
  29. package/lib/theme/ApiDemoPanel/FormSelect/styles.module.css +51 -0
  30. package/lib/theme/ApiDemoPanel/FormTextInput/index.js +30 -0
  31. package/lib/theme/ApiDemoPanel/FormTextInput/styles.module.css +21 -0
  32. package/lib/theme/ApiDemoPanel/MethodEndpoint/index.js +60 -0
  33. package/lib/theme/ApiDemoPanel/ParamOptions/index.js +248 -0
  34. package/lib/theme/ApiDemoPanel/ParamOptions/slice.js +35 -0
  35. package/lib/theme/ApiDemoPanel/ParamOptions/styles.module.css +180 -0
  36. package/lib/theme/ApiDemoPanel/Response/index.js +75 -0
  37. package/lib/theme/ApiDemoPanel/Response/slice.js +37 -0
  38. package/lib/theme/ApiDemoPanel/SecuritySchemes/index.js +51 -0
  39. package/lib/theme/ApiDemoPanel/Server/index.js +109 -0
  40. package/lib/theme/ApiDemoPanel/Server/slice.js +41 -0
  41. package/lib/theme/ApiDemoPanel/Server/styles.module.css +61 -0
  42. package/lib/theme/ApiDemoPanel/VSCode/index.js +252 -0
  43. package/lib/theme/ApiDemoPanel/VSCode/styles.module.css +19 -0
  44. package/lib/theme/ApiDemoPanel/buildPostmanRequest.js +329 -0
  45. package/lib/theme/ApiDemoPanel/hooks.js +20 -0
  46. package/lib/theme/ApiDemoPanel/index.js +134 -0
  47. package/lib/theme/ApiDemoPanel/persistanceMiddleware.js +44 -0
  48. package/lib/theme/ApiDemoPanel/postman-collection.d.ts +10 -0
  49. package/lib/theme/ApiDemoPanel/storage-utils.js +47 -0
  50. package/lib/theme/ApiDemoPanel/store.js +48 -0
  51. package/lib/theme/ApiDemoPanel/styles.module.css +44 -0
  52. package/lib/theme/ApiItem/index.js +160 -0
  53. package/lib/theme/ApiItem/styles.module.css +109 -0
  54. package/lib/theme/ParamsItem/index.js +68 -0
  55. package/lib/theme/ParamsItem/styles.module.css +24 -0
  56. package/lib/theme/SchemaItem/index.js +58 -0
  57. package/lib/theme/SchemaItem/styles.module.css +24 -0
  58. package/lib/theme/Tabs/index.js +258 -0
  59. package/lib/theme/Tabs/styles.module.css +118 -0
  60. package/lib/theme-classic.d.ts +8 -0
  61. package/lib/theme-openapi.d.ts +48 -0
  62. package/lib/theme-translations.d.ts +9 -0
  63. package/lib/types.js +1 -0
  64. package/lib-next/index.js +38 -0
  65. package/lib-next/markdown/createDescription.js +13 -0
  66. package/lib-next/markdown/schema.js +115 -0
  67. package/lib-next/markdown/utils.js +31 -0
  68. package/lib-next/theme/ApiDemoPanel/Accept/index.js +33 -0
  69. package/lib-next/theme/ApiDemoPanel/Accept/slice.js +19 -0
  70. package/lib-next/theme/ApiDemoPanel/Authorization/auth-types.js +22 -0
  71. package/lib-next/theme/ApiDemoPanel/Authorization/index.js +203 -0
  72. package/lib-next/theme/ApiDemoPanel/Authorization/slice.js +101 -0
  73. package/lib-next/theme/ApiDemoPanel/Body/index.js +210 -0
  74. package/lib-next/theme/ApiDemoPanel/Body/slice.js +89 -0
  75. package/lib-next/theme/ApiDemoPanel/ContentType/index.js +33 -0
  76. package/lib-next/theme/ApiDemoPanel/ContentType/slice.js +19 -0
  77. package/lib-next/theme/ApiDemoPanel/Curl/index.js +264 -0
  78. package/lib-next/theme/ApiDemoPanel/Curl/styles.module.css +84 -0
  79. package/lib-next/theme/ApiDemoPanel/Execute/index.js +74 -0
  80. package/lib-next/theme/ApiDemoPanel/Execute/makeRequest.js +183 -0
  81. package/lib-next/theme/ApiDemoPanel/FloatingButton/index.js +19 -0
  82. package/lib-next/theme/ApiDemoPanel/FloatingButton/styles.module.css +26 -0
  83. package/lib-next/theme/ApiDemoPanel/FormFileUpload/index.js +113 -0
  84. package/lib-next/theme/ApiDemoPanel/FormFileUpload/styles.module.css +75 -0
  85. package/lib-next/theme/ApiDemoPanel/FormItem/index.js +29 -0
  86. package/lib-next/theme/ApiDemoPanel/FormItem/styles.module.css +7 -0
  87. package/lib-next/theme/ApiDemoPanel/FormMultiSelect/index.js +49 -0
  88. package/lib-next/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +38 -0
  89. package/lib-next/theme/ApiDemoPanel/FormSelect/index.js +28 -0
  90. package/lib-next/theme/ApiDemoPanel/FormSelect/styles.module.css +51 -0
  91. package/lib-next/theme/ApiDemoPanel/FormTextInput/index.js +23 -0
  92. package/lib-next/theme/ApiDemoPanel/FormTextInput/styles.module.css +21 -0
  93. package/lib-next/theme/ApiDemoPanel/MethodEndpoint/index.js +53 -0
  94. package/lib-next/theme/ApiDemoPanel/ParamOptions/index.js +284 -0
  95. package/lib-next/theme/ApiDemoPanel/ParamOptions/slice.js +22 -0
  96. package/lib-next/theme/ApiDemoPanel/ParamOptions/styles.module.css +180 -0
  97. package/lib-next/theme/ApiDemoPanel/Response/index.js +65 -0
  98. package/lib-next/theme/ApiDemoPanel/Response/slice.js +22 -0
  99. package/lib-next/theme/ApiDemoPanel/SecuritySchemes/index.js +48 -0
  100. package/lib-next/theme/ApiDemoPanel/Server/index.js +114 -0
  101. package/lib-next/theme/ApiDemoPanel/Server/slice.js +25 -0
  102. package/lib-next/theme/ApiDemoPanel/Server/styles.module.css +61 -0
  103. package/lib-next/theme/ApiDemoPanel/VSCode/index.js +265 -0
  104. package/lib-next/theme/ApiDemoPanel/VSCode/styles.module.css +19 -0
  105. package/lib-next/theme/ApiDemoPanel/buildPostmanRequest.js +310 -0
  106. package/lib-next/theme/ApiDemoPanel/hooks.js +9 -0
  107. package/lib-next/theme/ApiDemoPanel/index.js +110 -0
  108. package/lib-next/theme/ApiDemoPanel/persistanceMiddleware.js +38 -0
  109. package/lib-next/theme/ApiDemoPanel/postman-collection.d.ts +10 -0
  110. package/lib-next/theme/ApiDemoPanel/storage-utils.js +35 -0
  111. package/lib-next/theme/ApiDemoPanel/store.js +30 -0
  112. package/lib-next/theme/ApiDemoPanel/styles.module.css +44 -0
  113. package/lib-next/theme/ApiItem/index.js +171 -0
  114. package/lib-next/theme/ApiItem/styles.module.css +109 -0
  115. package/lib-next/theme/ParamsItem/index.js +68 -0
  116. package/lib-next/theme/ParamsItem/styles.module.css +24 -0
  117. package/lib-next/theme/SchemaItem/index.js +58 -0
  118. package/lib-next/theme/SchemaItem/styles.module.css +24 -0
  119. package/lib-next/theme/Tabs/index.js +258 -0
  120. package/lib-next/theme/Tabs/styles.module.css +118 -0
  121. package/lib-next/theme-classic.d.ts +8 -0
  122. package/lib-next/theme-openapi.d.ts +48 -0
  123. package/lib-next/theme-translations.d.ts +9 -0
  124. package/lib-next/types.js +1 -0
  125. package/package.json +68 -0
  126. package/src/index.ts +42 -0
  127. package/src/markdown/createDescription.ts +13 -0
  128. package/src/markdown/schema.ts +115 -0
  129. package/src/markdown/utils.ts +39 -0
  130. package/src/theme/ApiDemoPanel/Accept/index.tsx +35 -0
  131. package/src/theme/ApiDemoPanel/Accept/slice.ts +29 -0
  132. package/src/theme/ApiDemoPanel/Authorization/auth-types.ts +26 -0
  133. package/src/theme/ApiDemoPanel/Authorization/index.tsx +211 -0
  134. package/src/theme/ApiDemoPanel/Authorization/slice.ts +145 -0
  135. package/src/theme/ApiDemoPanel/Body/index.tsx +218 -0
  136. package/src/theme/ApiDemoPanel/Body/slice.ts +133 -0
  137. package/src/theme/ApiDemoPanel/ContentType/index.tsx +35 -0
  138. package/src/theme/ApiDemoPanel/ContentType/slice.ts +29 -0
  139. package/src/theme/ApiDemoPanel/Curl/index.tsx +280 -0
  140. package/src/theme/ApiDemoPanel/Curl/styles.module.css +84 -0
  141. package/src/theme/ApiDemoPanel/Execute/index.tsx +88 -0
  142. package/src/theme/ApiDemoPanel/Execute/makeRequest.ts +184 -0
  143. package/src/theme/ApiDemoPanel/FloatingButton/index.tsx +27 -0
  144. package/src/theme/ApiDemoPanel/FloatingButton/styles.module.css +26 -0
  145. package/src/theme/ApiDemoPanel/FormFileUpload/index.tsx +116 -0
  146. package/src/theme/ApiDemoPanel/FormFileUpload/styles.module.css +75 -0
  147. package/src/theme/ApiDemoPanel/FormItem/index.tsx +28 -0
  148. package/src/theme/ApiDemoPanel/FormItem/styles.module.css +7 -0
  149. package/src/theme/ApiDemoPanel/FormMultiSelect/index.tsx +54 -0
  150. package/src/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +38 -0
  151. package/src/theme/ApiDemoPanel/FormSelect/index.tsx +36 -0
  152. package/src/theme/ApiDemoPanel/FormSelect/styles.module.css +51 -0
  153. package/src/theme/ApiDemoPanel/FormTextInput/index.tsx +32 -0
  154. package/src/theme/ApiDemoPanel/FormTextInput/styles.module.css +21 -0
  155. package/src/theme/ApiDemoPanel/MethodEndpoint/index.tsx +55 -0
  156. package/src/theme/ApiDemoPanel/ParamOptions/index.tsx +316 -0
  157. package/src/theme/ApiDemoPanel/ParamOptions/slice.ts +37 -0
  158. package/src/theme/ApiDemoPanel/ParamOptions/styles.module.css +180 -0
  159. package/src/theme/ApiDemoPanel/Response/index.tsx +66 -0
  160. package/src/theme/ApiDemoPanel/Response/slice.ts +31 -0
  161. package/src/theme/ApiDemoPanel/SecuritySchemes/index.tsx +49 -0
  162. package/src/theme/ApiDemoPanel/Server/index.tsx +103 -0
  163. package/src/theme/ApiDemoPanel/Server/slice.ts +40 -0
  164. package/src/theme/ApiDemoPanel/Server/styles.module.css +61 -0
  165. package/src/theme/ApiDemoPanel/VSCode/index.tsx +205 -0
  166. package/src/theme/ApiDemoPanel/VSCode/styles.module.css +19 -0
  167. package/src/theme/ApiDemoPanel/buildPostmanRequest.ts +307 -0
  168. package/src/theme/ApiDemoPanel/hooks.ts +13 -0
  169. package/src/theme/ApiDemoPanel/index.tsx +118 -0
  170. package/src/theme/ApiDemoPanel/persistanceMiddleware.ts +46 -0
  171. package/src/theme/ApiDemoPanel/postman-collection.d.ts +10 -0
  172. package/src/theme/ApiDemoPanel/storage-utils.ts +39 -0
  173. package/src/theme/ApiDemoPanel/store.ts +41 -0
  174. package/src/theme/ApiDemoPanel/styles.module.css +44 -0
  175. package/src/theme/ApiItem/index.tsx +171 -0
  176. package/src/theme/ApiItem/styles.module.css +109 -0
  177. package/src/theme/ParamsItem/index.js +68 -0
  178. package/src/theme/ParamsItem/styles.module.css +24 -0
  179. package/src/theme/SchemaItem/index.js +58 -0
  180. package/src/theme/SchemaItem/styles.module.css +24 -0
  181. package/src/theme/Tabs/index.js +258 -0
  182. package/src/theme/Tabs/styles.module.css +118 -0
  183. package/src/theme-classic.d.ts +8 -0
  184. package/src/theme-openapi.d.ts +48 -0
  185. package/src/theme-translations.d.ts +9 -0
  186. package/src/types.ts +70 -0
  187. package/tsconfig.json +10 -0
@@ -0,0 +1,49 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
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
+ import React from "react";
9
+
10
+ import { useTypedSelector } from "../hooks";
11
+
12
+ function SecuritySchemes() {
13
+ const options = useTypedSelector((state) => state.auth.options);
14
+ const selected = useTypedSelector((state) => state.auth.selected);
15
+
16
+ if (selected === undefined) return null;
17
+
18
+ const selectedAuth = options[selected];
19
+
20
+ return (
21
+ <div style={{ marginBottom: "var(--ifm-table-cell-padding)" }}>
22
+ {selectedAuth.map((auth) => {
23
+ if (auth.type === "apiKey") {
24
+ return (
25
+ <React.Fragment key={selected + "-apiKey"}>
26
+ <b>Authorization: {auth.name}</b>
27
+ <pre
28
+ style={{
29
+ display: "flex",
30
+ flexDirection: "column",
31
+ background: "var(--openapi-card-background-color)",
32
+ borderRadius: "var(--openapi-card-border-radius)",
33
+ }}
34
+ >
35
+ <span>name: {auth.name}</span>
36
+ <span>in: {auth.in}</span>
37
+ <span>type: {auth.type}</span>
38
+ </pre>
39
+ </React.Fragment>
40
+ );
41
+ }
42
+
43
+ return null;
44
+ })}
45
+ </div>
46
+ );
47
+ }
48
+
49
+ export default SecuritySchemes;
@@ -0,0 +1,103 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
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
+ import React, { useState } from "react";
9
+
10
+ import FloatingButton from "../FloatingButton";
11
+ import { useTypedDispatch, useTypedSelector } from "../hooks";
12
+ import FormItem from "./../FormItem";
13
+ import FormSelect from "./../FormSelect";
14
+ import FormTextInput from "./../FormTextInput";
15
+ import { setServer, setServerVariable } from "./slice";
16
+ import styles from "./styles.module.css";
17
+
18
+ function Server() {
19
+ const [isEditing, setIsEditing] = useState(false);
20
+ const value = useTypedSelector((state) => state.server.value);
21
+ const options = useTypedSelector((state) => state.server.options);
22
+
23
+ const dispatch = useTypedDispatch();
24
+
25
+ if (options.length <= 0) {
26
+ return null;
27
+ }
28
+
29
+ if (options.length <= 1 && value?.variables === undefined) {
30
+ return null;
31
+ }
32
+
33
+ if (!isEditing) {
34
+ let url = "";
35
+ if (value) {
36
+ url = value.url.replace(/\/$/, "");
37
+ if (value.variables) {
38
+ Object.keys(value.variables).forEach((variable) => {
39
+ url = url.replace(
40
+ `{${variable}}`,
41
+ value.variables?.[variable].default ?? ""
42
+ );
43
+ });
44
+ }
45
+ }
46
+ return (
47
+ <FloatingButton onClick={() => setIsEditing(true)} label="Edit">
48
+ <pre
49
+ style={{
50
+ background: "var(--openapi-card-background-color)",
51
+ paddingRight: "60px",
52
+ }}
53
+ >
54
+ <code>{url}</code>
55
+ </pre>
56
+ </FloatingButton>
57
+ );
58
+ }
59
+
60
+ return (
61
+ <div className={styles.optionsPanel}>
62
+ <button
63
+ className={styles.showMoreButton}
64
+ onClick={() => setIsEditing(false)}
65
+ >
66
+ Hide
67
+ </button>
68
+ <FormItem label="Endpoint">
69
+ <FormSelect
70
+ options={options.map((s) => s.url)}
71
+ onChange={(e) => dispatch(setServer(e.target.value))}
72
+ />
73
+ </FormItem>
74
+ {value?.variables &&
75
+ Object.keys(value.variables).map((key) => {
76
+ if (value.variables?.[key].enum !== undefined) {
77
+ return (
78
+ <FormItem label={key}>
79
+ <FormSelect
80
+ options={value.variables[key].enum}
81
+ onChange={(e) => {
82
+ dispatch(setServerVariable({ key, value: e.target.value }));
83
+ }}
84
+ />
85
+ </FormItem>
86
+ );
87
+ }
88
+ return (
89
+ <FormItem label={key}>
90
+ <FormTextInput
91
+ placeholder={value.variables?.[key].default}
92
+ onChange={(e) => {
93
+ dispatch(setServerVariable({ key, value: e.target.value }));
94
+ }}
95
+ />
96
+ </FormItem>
97
+ );
98
+ })}
99
+ </div>
100
+ );
101
+ }
102
+
103
+ export default Server;
@@ -0,0 +1,40 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
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
+ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
9
+ import { ServerObject } from "docusaurus-plugin-openapi-docs/src/openapi/types";
10
+ // TODO: we might want to export this
11
+
12
+ export interface State {
13
+ value?: ServerObject;
14
+ options: ServerObject[];
15
+ }
16
+
17
+ const initialState: State = {} as any;
18
+
19
+ export const slice = createSlice({
20
+ name: "server",
21
+ initialState,
22
+ reducers: {
23
+ setServer: (state, action: PayloadAction<string>) => {
24
+ state.value = state.options.find((s) => s.url === action.payload);
25
+ },
26
+ setServerVariable: (
27
+ state,
28
+ action: PayloadAction<{ key: string; value: string }>
29
+ ) => {
30
+ if (state.value?.variables) {
31
+ state.value.variables[action.payload.key].default =
32
+ action.payload.value;
33
+ }
34
+ },
35
+ },
36
+ });
37
+
38
+ export const { setServer, setServerVariable } = slice.actions;
39
+
40
+ export default slice.reducer;
@@ -0,0 +1,61 @@
1
+ .showMoreButton {
2
+ -webkit-appearance: none;
3
+ -moz-appearance: none;
4
+ appearance: none;
5
+
6
+ cursor: pointer;
7
+ font-size: var(--ifm-code-font-size);
8
+ /* font-weight: var(--ifm-button-font-weight); */
9
+ /* line-height: 1.5; */
10
+
11
+ padding: 0;
12
+
13
+ user-select: none;
14
+ white-space: nowrap;
15
+
16
+ border: 0px solid transparent;
17
+
18
+ display: block;
19
+ /* width: 100%; */
20
+
21
+ background-color: transparent;
22
+
23
+ color: var(--ifm-color-primary);
24
+ cursor: pointer;
25
+ margin-top: var(--ifm-pre-padding);
26
+ margin-bottom: 0;
27
+ text-align: left;
28
+ display: block;
29
+ }
30
+
31
+ .showMoreButton:focus {
32
+ outline: 0;
33
+ }
34
+
35
+ .showMoreButton:hover {
36
+ /* text-decoration: underline; */
37
+ /* background-color: red; */
38
+ color: var(--ifm-color-primary-hover);
39
+ }
40
+
41
+ .showMoreButton:first-child {
42
+ margin-top: 0;
43
+ }
44
+
45
+ .optionsPanel:empty {
46
+ display: none;
47
+ }
48
+
49
+ .optionsPanel {
50
+ background: var(--openapi-card-background-color);
51
+ border-radius: var(--openapi-card-border-radius);
52
+ color: var(--ifm-pre-color);
53
+ line-height: var(--ifm-pre-line-height);
54
+ margin-bottom: var(--ifm-spacing-vertical);
55
+ margin-top: 0;
56
+ overflow: auto;
57
+ padding: var(--ifm-pre-padding);
58
+
59
+ /* hack for view calculation when monaco is hidden */
60
+ position: relative;
61
+ }
@@ -0,0 +1,205 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
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
+ import React, { useState } from "react";
9
+
10
+ import { useColorMode } from "@docusaurus/theme-common";
11
+ import Editor, { Monaco } from "@monaco-editor/react";
12
+
13
+ import styles from "./styles.module.css";
14
+
15
+ interface Props {
16
+ value?: string;
17
+ language?: string;
18
+ onChange(value: string): any;
19
+ }
20
+
21
+ function VSCode({ value, language, onChange }: Props) {
22
+ const [focused, setFocused] = useState(false);
23
+ const isDarkTheme = useColorMode().colorMode === "dark" ?? false;
24
+
25
+ function handleEditorWillMount(monaco: Monaco) {
26
+ const styles = getComputedStyle(document.documentElement);
27
+
28
+ function getColor(property: string) {
29
+ // Weird chrome bug, returns " #ffffff " instead of "#ffffff", see: https://github.com/cloud-annotations/docusaurus-openapi/issues/144
30
+ const color = styles.getPropertyValue(property).trim();
31
+ const isColorRgb = color.includes("rgb");
32
+ const isColorHexShortened = color.length === 4;
33
+
34
+ // Convert "rgb(r, g, b)" to color hex code
35
+ const getColorHex = (color: string) => {
36
+ const rgbValues = color.substring(4).split(")")[0].split(",");
37
+ const [r, g, b] = rgbValues;
38
+
39
+ const colorToHex = (rgb: string) => {
40
+ const hexadecimal = parseInt(rgb).toString(16);
41
+ return hexadecimal.length === 1 ? "0" + hexadecimal : hexadecimal;
42
+ };
43
+
44
+ return "#" + colorToHex(r) + colorToHex(g) + colorToHex(b);
45
+ };
46
+
47
+ // Extend shortened hex codes ie. "#aaa" => "#aaaaaa" or "#xyz" => "#xxyyzz"
48
+ const getFullColorHex = (color: string) => {
49
+ let fullColorHex = "#";
50
+ const hexValues = color.slice(1);
51
+
52
+ for (let i = 0; i < hexValues.length; i++) {
53
+ for (let j = 0; j < 2; j++) {
54
+ fullColorHex += hexValues[i];
55
+ }
56
+ }
57
+
58
+ return fullColorHex.toLowerCase();
59
+ };
60
+
61
+ if (isColorRgb) {
62
+ return getColorHex(color);
63
+ } else if (isColorHexShortened) {
64
+ return getFullColorHex(color);
65
+ } else {
66
+ return color;
67
+ }
68
+ }
69
+
70
+ const LIGHT_BACKGROUND = getColor(
71
+ "--openapi-monaco-background-color-light"
72
+ );
73
+ const LIGHT_BRIGHT = getColor("--openapi-code-bright-light");
74
+ const LIGHT_DIM = getColor("--openapi-code-dim-light");
75
+ const LIGHT_BLUE = getColor("--openapi-code-blue-light");
76
+ const LIGHT_GREEN = getColor("--openapi-code-green-light");
77
+ const LIGHT_SELECT = getColor("--openapi-code-select-light");
78
+
79
+ const DARK_BACKGROUND = getColor("--openapi-monaco-background-color-dark");
80
+ const DARK_BRIGHT = getColor("--openapi-code-bright-dark");
81
+ const DARK_DIM = getColor("--openapi-code-dim-dark");
82
+ const DARK_BLUE = getColor("--openapi-code-blue-dark");
83
+ const DARK_GREEN = getColor("--openapi-code-green-dark");
84
+ const DARK_SELECT = getColor("--openapi-code-select-dark");
85
+
86
+ monaco.editor.defineTheme("OpenApiDark", {
87
+ base: "vs-dark",
88
+ inherit: true,
89
+ rules: [
90
+ { token: "", foreground: DARK_BRIGHT },
91
+ { token: "string.key.json", foreground: DARK_BRIGHT },
92
+ { token: "string.value.json", foreground: DARK_GREEN },
93
+ { token: "number", foreground: DARK_BLUE },
94
+ { token: "keyword.json", foreground: DARK_BLUE },
95
+ { token: "delimiter", foreground: DARK_DIM },
96
+ { token: "tag.xml", foreground: DARK_DIM },
97
+ { token: "metatag.xml", foreground: DARK_DIM },
98
+ { token: "attribute.name.xml", foreground: DARK_BRIGHT },
99
+ { token: "attribute.value.xml", foreground: DARK_GREEN },
100
+ { token: "metatag.xml", foreground: DARK_BLUE },
101
+ { token: "tag.xml", foreground: DARK_BLUE },
102
+ ],
103
+ colors: {
104
+ "editor.background": DARK_BACKGROUND,
105
+ "editor.lineHighlightBackground": DARK_BACKGROUND,
106
+ "editorBracketMatch.background": DARK_BACKGROUND,
107
+ "editorBracketMatch.border": DARK_BACKGROUND,
108
+ "editor.selectionBackground": DARK_SELECT,
109
+ },
110
+ });
111
+ monaco.editor.defineTheme("OpenApiLight", {
112
+ base: "vs",
113
+ inherit: true,
114
+ rules: [
115
+ { token: "", foreground: LIGHT_BRIGHT },
116
+ { token: "string.key.json", foreground: LIGHT_BRIGHT },
117
+ { token: "string.value.json", foreground: LIGHT_GREEN },
118
+ { token: "number", foreground: LIGHT_BLUE },
119
+ { token: "keyword.json", foreground: LIGHT_BLUE },
120
+ { token: "delimiter", foreground: LIGHT_DIM },
121
+ { token: "tag.xml", foreground: LIGHT_DIM },
122
+ { token: "metatag.xml", foreground: LIGHT_DIM },
123
+ { token: "attribute.name.xml", foreground: LIGHT_BRIGHT },
124
+ { token: "attribute.value.xml", foreground: LIGHT_GREEN },
125
+ { token: "metatag.xml", foreground: LIGHT_BLUE },
126
+ { token: "tag.xml", foreground: LIGHT_BLUE },
127
+ ],
128
+ colors: {
129
+ "editor.background": LIGHT_BACKGROUND,
130
+ "editor.lineHighlightBackground": LIGHT_BACKGROUND,
131
+ "editorBracketMatch.background": LIGHT_BACKGROUND,
132
+ "editorBracketMatch.border": LIGHT_BACKGROUND,
133
+ "editor.selectionBackground": LIGHT_SELECT,
134
+ },
135
+ });
136
+ }
137
+
138
+ return (
139
+ <div className={focused ? styles.monacoFocus : styles.monaco}>
140
+ <Editor
141
+ value={value}
142
+ language={language}
143
+ theme={isDarkTheme ? "OpenApiDark" : "OpenApiLight"}
144
+ beforeMount={handleEditorWillMount}
145
+ options={{
146
+ lineNumbers: "off",
147
+ scrollBeyondLastLine: false,
148
+ scrollBeyondLastColumn: 3,
149
+ readOnly: false,
150
+ minimap: { enabled: false },
151
+ fontFamily:
152
+ "SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace",
153
+ fontSize: 14.4,
154
+ overviewRulerLanes: 0,
155
+ folding: false,
156
+ lineDecorationsWidth: 0,
157
+ contextmenu: false,
158
+ scrollbar: {
159
+ horizontal: "hidden",
160
+ },
161
+ }}
162
+ onMount={(editor) => {
163
+ editor.onDidFocusEditorText(() => {
164
+ setFocused(true);
165
+ });
166
+ editor.onDidBlurEditorText(() => {
167
+ setFocused(false);
168
+ });
169
+ editor.onDidChangeModelDecorations(() => {
170
+ updateEditorHeight(); // typing
171
+ requestAnimationFrame(updateEditorHeight); // folding
172
+ });
173
+
174
+ let prevHeight = 0;
175
+
176
+ const updateEditorHeight = () => {
177
+ onChange(editor.getValue());
178
+ const editorElement = editor.getDomNode();
179
+
180
+ if (!editorElement) {
181
+ return;
182
+ }
183
+
184
+ const lineHeight = 22;
185
+ const lineCount = editor.getModel()?.getLineCount() || 1;
186
+ const height =
187
+ editor.getTopForLineNumber(lineCount + 1) + lineHeight;
188
+
189
+ const clippedHeight = Math.min(height, 500);
190
+
191
+ if (prevHeight !== clippedHeight) {
192
+ prevHeight = clippedHeight;
193
+ editorElement.style.height = `${clippedHeight}px`;
194
+ editor.layout();
195
+ }
196
+ };
197
+
198
+ updateEditorHeight();
199
+ }}
200
+ />
201
+ </div>
202
+ );
203
+ }
204
+
205
+ export default VSCode;
@@ -0,0 +1,19 @@
1
+ .monacoBase {
2
+ margin-top: calc(var(--ifm-pre-padding) / 2);
3
+ border-radius: 4px;
4
+ padding: var(--ifm-pre-padding);
5
+ background-color: var(--openapi-monaco-background-color);
6
+ }
7
+
8
+ .monaco {
9
+ composes: monacoBase;
10
+
11
+ box-shadow: 0 0 0 1px var(--openapi-monaco-border-color);
12
+ border: 2px solid transparent;
13
+ }
14
+
15
+ .monacoFocus {
16
+ composes: monacoBase;
17
+
18
+ border: 2px solid var(--openapi-input-border);
19
+ }