@djangocfg/ui-tools 2.1.91

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 (174) hide show
  1. package/dist/LottiePlayer.client-LBEC2JKY.mjs +161 -0
  2. package/dist/LottiePlayer.client-LBEC2JKY.mjs.map +1 -0
  3. package/dist/LottiePlayer.client-WFMG2OOW.cjs +168 -0
  4. package/dist/LottiePlayer.client-WFMG2OOW.cjs.map +1 -0
  5. package/dist/Mermaid.client-4TU2TSH3.mjs +477 -0
  6. package/dist/Mermaid.client-4TU2TSH3.mjs.map +1 -0
  7. package/dist/Mermaid.client-SBYY364Q.cjs +483 -0
  8. package/dist/Mermaid.client-SBYY364Q.cjs.map +1 -0
  9. package/dist/PlaygroundLayout-3YVSAEAF.cjs +1003 -0
  10. package/dist/PlaygroundLayout-3YVSAEAF.cjs.map +1 -0
  11. package/dist/PlaygroundLayout-4DYBORAS.mjs +996 -0
  12. package/dist/PlaygroundLayout-4DYBORAS.mjs.map +1 -0
  13. package/dist/PrettyCode.client-LCBPPTIX.mjs +152 -0
  14. package/dist/PrettyCode.client-LCBPPTIX.mjs.map +1 -0
  15. package/dist/PrettyCode.client-PNPLXRH6.cjs +154 -0
  16. package/dist/PrettyCode.client-PNPLXRH6.cjs.map +1 -0
  17. package/dist/chunk-37ZI6VD4.mjs +12 -0
  18. package/dist/chunk-37ZI6VD4.mjs.map +1 -0
  19. package/dist/chunk-3HK2OE62.cjs +81 -0
  20. package/dist/chunk-3HK2OE62.cjs.map +1 -0
  21. package/dist/chunk-7DGDQVQW.cjs +591 -0
  22. package/dist/chunk-7DGDQVQW.cjs.map +1 -0
  23. package/dist/chunk-M6P2FU7L.mjs +572 -0
  24. package/dist/chunk-M6P2FU7L.mjs.map +1 -0
  25. package/dist/chunk-UQ3XI5MY.cjs +15 -0
  26. package/dist/chunk-UQ3XI5MY.cjs.map +1 -0
  27. package/dist/chunk-YFRNE2IR.mjs +79 -0
  28. package/dist/chunk-YFRNE2IR.mjs.map +1 -0
  29. package/dist/index.cjs +5042 -0
  30. package/dist/index.cjs.map +1 -0
  31. package/dist/index.d.cts +1591 -0
  32. package/dist/index.d.ts +1591 -0
  33. package/dist/index.mjs +4941 -0
  34. package/dist/index.mjs.map +1 -0
  35. package/package.json +86 -0
  36. package/src/components/markdown/MarkdownMessage.tsx +340 -0
  37. package/src/components/markdown/index.ts +5 -0
  38. package/src/index.ts +26 -0
  39. package/src/stores/index.ts +9 -0
  40. package/src/stores/mediaCache.ts +534 -0
  41. package/src/tools/AudioPlayer/README.md +206 -0
  42. package/src/tools/AudioPlayer/components/HybridAudioPlayer.tsx +216 -0
  43. package/src/tools/AudioPlayer/components/HybridSimplePlayer.tsx +280 -0
  44. package/src/tools/AudioPlayer/components/HybridWaveform.tsx +279 -0
  45. package/src/tools/AudioPlayer/components/ReactiveCover/AudioReactiveCover.tsx +149 -0
  46. package/src/tools/AudioPlayer/components/ReactiveCover/effects/GlowEffect.tsx +110 -0
  47. package/src/tools/AudioPlayer/components/ReactiveCover/effects/MeshEffect.tsx +58 -0
  48. package/src/tools/AudioPlayer/components/ReactiveCover/effects/OrbsEffect.tsx +45 -0
  49. package/src/tools/AudioPlayer/components/ReactiveCover/effects/SpotlightEffect.tsx +82 -0
  50. package/src/tools/AudioPlayer/components/ReactiveCover/effects/index.ts +8 -0
  51. package/src/tools/AudioPlayer/components/ReactiveCover/index.ts +6 -0
  52. package/src/tools/AudioPlayer/components/index.ts +22 -0
  53. package/src/tools/AudioPlayer/context/HybridAudioProvider.tsx +158 -0
  54. package/src/tools/AudioPlayer/context/index.ts +16 -0
  55. package/src/tools/AudioPlayer/effects/index.ts +412 -0
  56. package/src/tools/AudioPlayer/hooks/index.ts +35 -0
  57. package/src/tools/AudioPlayer/hooks/useHybridAudio.ts +387 -0
  58. package/src/tools/AudioPlayer/hooks/useHybridAudioAnalysis.ts +95 -0
  59. package/src/tools/AudioPlayer/hooks/useVisualization.tsx +207 -0
  60. package/src/tools/AudioPlayer/index.ts +133 -0
  61. package/src/tools/AudioPlayer/types/effects.ts +73 -0
  62. package/src/tools/AudioPlayer/types/index.ts +27 -0
  63. package/src/tools/AudioPlayer/utils/debug.ts +14 -0
  64. package/src/tools/AudioPlayer/utils/formatTime.ts +10 -0
  65. package/src/tools/AudioPlayer/utils/index.ts +6 -0
  66. package/src/tools/ImageViewer/@refactoring/00-PLAN.md +71 -0
  67. package/src/tools/ImageViewer/@refactoring/01-TYPES.md +121 -0
  68. package/src/tools/ImageViewer/@refactoring/02-UTILS.md +143 -0
  69. package/src/tools/ImageViewer/@refactoring/03-HOOKS.md +261 -0
  70. package/src/tools/ImageViewer/@refactoring/04-COMPONENTS.md +427 -0
  71. package/src/tools/ImageViewer/@refactoring/05-EXECUTION-CHECKLIST.md +126 -0
  72. package/src/tools/ImageViewer/README.md +200 -0
  73. package/src/tools/ImageViewer/components/ImageInfo.tsx +44 -0
  74. package/src/tools/ImageViewer/components/ImageToolbar.tsx +145 -0
  75. package/src/tools/ImageViewer/components/ImageViewer.tsx +241 -0
  76. package/src/tools/ImageViewer/components/index.ts +7 -0
  77. package/src/tools/ImageViewer/hooks/index.ts +9 -0
  78. package/src/tools/ImageViewer/hooks/useImageLoading.ts +204 -0
  79. package/src/tools/ImageViewer/hooks/useImageTransform.ts +101 -0
  80. package/src/tools/ImageViewer/index.ts +60 -0
  81. package/src/tools/ImageViewer/types.ts +81 -0
  82. package/src/tools/ImageViewer/utils/constants.ts +59 -0
  83. package/src/tools/ImageViewer/utils/debug.ts +14 -0
  84. package/src/tools/ImageViewer/utils/index.ts +17 -0
  85. package/src/tools/ImageViewer/utils/lqip.ts +47 -0
  86. package/src/tools/JsonForm/JsonSchemaForm.tsx +197 -0
  87. package/src/tools/JsonForm/examples/BotConfigExample.tsx +249 -0
  88. package/src/tools/JsonForm/examples/RealBotConfigExample.tsx +161 -0
  89. package/src/tools/JsonForm/index.ts +46 -0
  90. package/src/tools/JsonForm/templates/ArrayFieldItemTemplate.tsx +47 -0
  91. package/src/tools/JsonForm/templates/ArrayFieldTemplate.tsx +74 -0
  92. package/src/tools/JsonForm/templates/BaseInputTemplate.tsx +107 -0
  93. package/src/tools/JsonForm/templates/ErrorListTemplate.tsx +35 -0
  94. package/src/tools/JsonForm/templates/FieldTemplate.tsx +62 -0
  95. package/src/tools/JsonForm/templates/ObjectFieldTemplate.tsx +116 -0
  96. package/src/tools/JsonForm/templates/index.ts +12 -0
  97. package/src/tools/JsonForm/types.ts +83 -0
  98. package/src/tools/JsonForm/utils.ts +213 -0
  99. package/src/tools/JsonForm/widgets/CheckboxWidget.tsx +37 -0
  100. package/src/tools/JsonForm/widgets/ColorWidget.tsx +219 -0
  101. package/src/tools/JsonForm/widgets/NumberWidget.tsx +89 -0
  102. package/src/tools/JsonForm/widgets/SelectWidget.tsx +97 -0
  103. package/src/tools/JsonForm/widgets/SliderWidget.tsx +148 -0
  104. package/src/tools/JsonForm/widgets/SwitchWidget.tsx +35 -0
  105. package/src/tools/JsonForm/widgets/TextWidget.tsx +96 -0
  106. package/src/tools/JsonForm/widgets/index.ts +14 -0
  107. package/src/tools/JsonTree/index.tsx +243 -0
  108. package/src/tools/LottiePlayer/LottiePlayer.client.tsx +213 -0
  109. package/src/tools/LottiePlayer/index.tsx +56 -0
  110. package/src/tools/LottiePlayer/types.ts +108 -0
  111. package/src/tools/LottiePlayer/useLottie.ts +164 -0
  112. package/src/tools/Mermaid/Mermaid.client.tsx +82 -0
  113. package/src/tools/Mermaid/components/MermaidCodeViewer.tsx +95 -0
  114. package/src/tools/Mermaid/components/MermaidFullscreenModal.tsx +103 -0
  115. package/src/tools/Mermaid/hooks/index.ts +4 -0
  116. package/src/tools/Mermaid/hooks/useMermaidCleanup.ts +73 -0
  117. package/src/tools/Mermaid/hooks/useMermaidFullscreen.ts +46 -0
  118. package/src/tools/Mermaid/hooks/useMermaidRenderer.ts +226 -0
  119. package/src/tools/Mermaid/hooks/useMermaidValidation.ts +29 -0
  120. package/src/tools/Mermaid/index.tsx +44 -0
  121. package/src/tools/Mermaid/utils/mermaid-helpers.ts +33 -0
  122. package/src/tools/OpenapiViewer/components/EndpointInfo.tsx +149 -0
  123. package/src/tools/OpenapiViewer/components/EndpointsLibrary.tsx +263 -0
  124. package/src/tools/OpenapiViewer/components/PlaygroundLayout.tsx +125 -0
  125. package/src/tools/OpenapiViewer/components/PlaygroundStepper.tsx +100 -0
  126. package/src/tools/OpenapiViewer/components/RequestBuilder.tsx +157 -0
  127. package/src/tools/OpenapiViewer/components/RequestParametersForm.tsx +253 -0
  128. package/src/tools/OpenapiViewer/components/ResponseViewer.tsx +173 -0
  129. package/src/tools/OpenapiViewer/components/VersionSelector.tsx +68 -0
  130. package/src/tools/OpenapiViewer/components/index.ts +14 -0
  131. package/src/tools/OpenapiViewer/constants.ts +39 -0
  132. package/src/tools/OpenapiViewer/context/PlaygroundContext.tsx +337 -0
  133. package/src/tools/OpenapiViewer/hooks/index.ts +8 -0
  134. package/src/tools/OpenapiViewer/hooks/useMobile.ts +10 -0
  135. package/src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts +199 -0
  136. package/src/tools/OpenapiViewer/index.tsx +37 -0
  137. package/src/tools/OpenapiViewer/types.ts +151 -0
  138. package/src/tools/OpenapiViewer/utils/apiKeyManager.ts +149 -0
  139. package/src/tools/OpenapiViewer/utils/formatters.ts +71 -0
  140. package/src/tools/OpenapiViewer/utils/index.ts +9 -0
  141. package/src/tools/OpenapiViewer/utils/versionManager.ts +161 -0
  142. package/src/tools/PrettyCode/PrettyCode.client.tsx +208 -0
  143. package/src/tools/PrettyCode/index.tsx +47 -0
  144. package/src/tools/VideoPlayer/@refactoring/00-PLAN.md +91 -0
  145. package/src/tools/VideoPlayer/@refactoring/01-TYPES.md +284 -0
  146. package/src/tools/VideoPlayer/@refactoring/02-UTILS.md +141 -0
  147. package/src/tools/VideoPlayer/@refactoring/03-HOOKS.md +178 -0
  148. package/src/tools/VideoPlayer/@refactoring/04-COMPONENTS.md +95 -0
  149. package/src/tools/VideoPlayer/@refactoring/05-EXECUTION-CHECKLIST.md +139 -0
  150. package/src/tools/VideoPlayer/README.md +264 -0
  151. package/src/tools/VideoPlayer/components/VideoControls.tsx +138 -0
  152. package/src/tools/VideoPlayer/components/VideoErrorFallback.tsx +172 -0
  153. package/src/tools/VideoPlayer/components/VideoPlayer.tsx +201 -0
  154. package/src/tools/VideoPlayer/components/index.ts +14 -0
  155. package/src/tools/VideoPlayer/context/VideoPlayerContext.tsx +52 -0
  156. package/src/tools/VideoPlayer/context/index.ts +8 -0
  157. package/src/tools/VideoPlayer/hooks/index.ts +12 -0
  158. package/src/tools/VideoPlayer/hooks/useVideoPlayerSettings.ts +70 -0
  159. package/src/tools/VideoPlayer/hooks/useVideoPositionCache.ts +116 -0
  160. package/src/tools/VideoPlayer/index.ts +77 -0
  161. package/src/tools/VideoPlayer/providers/NativeProvider.tsx +284 -0
  162. package/src/tools/VideoPlayer/providers/StreamProvider.tsx +505 -0
  163. package/src/tools/VideoPlayer/providers/VidstackProvider.tsx +400 -0
  164. package/src/tools/VideoPlayer/providers/index.ts +8 -0
  165. package/src/tools/VideoPlayer/types/index.ts +38 -0
  166. package/src/tools/VideoPlayer/types/player.ts +116 -0
  167. package/src/tools/VideoPlayer/types/provider.ts +93 -0
  168. package/src/tools/VideoPlayer/types/sources.ts +97 -0
  169. package/src/tools/VideoPlayer/utils/debug.ts +14 -0
  170. package/src/tools/VideoPlayer/utils/fileSource.ts +78 -0
  171. package/src/tools/VideoPlayer/utils/index.ts +12 -0
  172. package/src/tools/VideoPlayer/utils/resolvers.ts +75 -0
  173. package/src/tools/_shared.ts +29 -0
  174. package/src/tools/index.ts +172 -0
@@ -0,0 +1,572 @@
1
+ import { __name } from './chunk-37ZI6VD4.mjs';
2
+ import { ChevronUp, ChevronDown, Download } from 'lucide-react';
3
+ import React3, { lazy, createContext, useState, Suspense, useContext, useEffect, useCallback } from 'react';
4
+ import { JSONTree } from 'react-json-tree';
5
+ import { Button, CopyButton } from '@djangocfg/ui-core/components';
6
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
+ import consola from 'consola';
8
+
9
+ var JsonTreeComponent = /* @__PURE__ */ __name(({ title, data, config = {}, jsonTreeProps = {} }) => {
10
+ const [expandAll, setExpandAll] = useState(null);
11
+ const [renderKey, setRenderKey] = useState(0);
12
+ const {
13
+ maxAutoExpandDepth = 2,
14
+ maxAutoExpandArrayItems = 10,
15
+ maxAutoExpandObjectKeys = 5,
16
+ maxStringLength = 200,
17
+ collectionLimit = 50,
18
+ showCollectionInfo = true,
19
+ showExpandControls = true,
20
+ showActionButtons = true,
21
+ className = "",
22
+ preserveKeyOrder = true
23
+ } = config;
24
+ const jsonTreeTheme = {
25
+ scheme: "djangocfg-dark",
26
+ base00: "transparent",
27
+ // Background
28
+ base01: "#1a1a1a",
29
+ // Lighter background
30
+ base02: "#2a2a2a",
31
+ // Selection background
32
+ base03: "#6b7280",
33
+ // Comments, invisibles
34
+ base04: "#9ca3af",
35
+ // Dark foreground
36
+ base05: "#e5e7eb",
37
+ // Default foreground
38
+ base06: "#f3f4f6",
39
+ // Light foreground
40
+ base07: "#ffffff",
41
+ // Lightest foreground
42
+ base08: "#ef4444",
43
+ // Red - for null, undefined
44
+ base09: "#f97316",
45
+ // Orange - for numbers
46
+ base0A: "#eab308",
47
+ // Yellow - for strings
48
+ base0B: "#22c55e",
49
+ // Green - for booleans (true)
50
+ base0C: "#06b6d4",
51
+ // Cyan - for dates, regex
52
+ base0D: "#3b82f6",
53
+ // Blue - for keys
54
+ base0E: "#a855f7",
55
+ // Purple - for functions
56
+ base0F: "#f43f5e"
57
+ // Pink - for deprecations
58
+ };
59
+ const shouldExpandNodeInitially = /* @__PURE__ */ __name((keyPath, nodeData, level) => {
60
+ if (expandAll === true) return true;
61
+ if (expandAll === false) return false;
62
+ if (level <= maxAutoExpandDepth) return true;
63
+ if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;
64
+ if (nodeData && typeof nodeData === "object" && !Array.isArray(nodeData)) {
65
+ const keys = Object.keys(nodeData);
66
+ return keys.length <= maxAutoExpandObjectKeys;
67
+ }
68
+ return false;
69
+ }, "shouldExpandNodeInitially");
70
+ const getItemString = showCollectionInfo ? (nodeType, nodeData) => {
71
+ if (nodeType === "Array") {
72
+ const length = Array.isArray(nodeData) ? nodeData.length : 0;
73
+ return length > 0 ? /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground text-sm", children: [
74
+ "(",
75
+ length,
76
+ " items)"
77
+ ] }) : null;
78
+ }
79
+ if (nodeType === "Object") {
80
+ const keys = nodeData && typeof nodeData === "object" ? Object.keys(nodeData) : [];
81
+ return keys.length > 0 ? /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground text-sm", children: [
82
+ "(",
83
+ keys.length,
84
+ " keys)"
85
+ ] }) : null;
86
+ }
87
+ return null;
88
+ } : () => null;
89
+ const postprocessValue = /* @__PURE__ */ __name((value) => {
90
+ if (typeof value === "string" && value.length > maxStringLength) {
91
+ return value.substring(0, maxStringLength) + "... (truncated)";
92
+ }
93
+ return value;
94
+ }, "postprocessValue");
95
+ const isCustomNode = /* @__PURE__ */ __name((value) => {
96
+ if (typeof value === "string" && (value.startsWith("http://") || value.startsWith("https://"))) {
97
+ return true;
98
+ }
99
+ return false;
100
+ }, "isCustomNode");
101
+ const jsonString = JSON.stringify(data, null, 2);
102
+ const handleDownload = /* @__PURE__ */ __name(() => {
103
+ const blob = new Blob([jsonString], { type: "application/json" });
104
+ const url = URL.createObjectURL(blob);
105
+ const a = document.createElement("a");
106
+ a.href = url;
107
+ a.download = "data.json";
108
+ document.body.appendChild(a);
109
+ a.click();
110
+ document.body.removeChild(a);
111
+ URL.revokeObjectURL(url);
112
+ }, "handleDownload");
113
+ return /* @__PURE__ */ jsxs("div", { className: `relative border border-border rounded-sm h-full overflow-hidden ${className}`, children: [
114
+ (title || showExpandControls || showActionButtons) && /* @__PURE__ */ jsx("div", { className: "p-4 border-b border-border bg-muted/50 rounded-t-sm", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
115
+ title && /* @__PURE__ */ jsx("h6", { className: "text-lg font-semibold text-foreground", children: title }),
116
+ (showExpandControls || showActionButtons) && /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
117
+ showExpandControls && /* @__PURE__ */ jsx(
118
+ Button,
119
+ {
120
+ variant: expandAll === true ? "default" : "outline",
121
+ size: "sm",
122
+ onClick: () => {
123
+ const newState = expandAll === true ? false : true;
124
+ setExpandAll(newState);
125
+ setRenderKey((prev) => prev + 1);
126
+ },
127
+ className: "h-8 px-2",
128
+ children: expandAll === true ? /* @__PURE__ */ jsxs(Fragment, { children: [
129
+ /* @__PURE__ */ jsx(ChevronUp, { className: "h-3 w-3" }),
130
+ /* @__PURE__ */ jsx("span", { className: "ml-1 text-xs", children: "Collapse All" })
131
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
132
+ /* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3" }),
133
+ /* @__PURE__ */ jsx("span", { className: "ml-1 text-xs", children: "Expand All" })
134
+ ] })
135
+ }
136
+ ),
137
+ showActionButtons && /* @__PURE__ */ jsxs(Fragment, { children: [
138
+ /* @__PURE__ */ jsx(
139
+ CopyButton,
140
+ {
141
+ value: jsonString,
142
+ variant: "outline",
143
+ size: "sm",
144
+ className: "h-8 px-2",
145
+ iconClassName: "h-3 w-3",
146
+ children: "Copy"
147
+ }
148
+ ),
149
+ /* @__PURE__ */ jsxs(
150
+ Button,
151
+ {
152
+ variant: "outline",
153
+ size: "sm",
154
+ onClick: handleDownload,
155
+ className: "h-8 px-2",
156
+ children: [
157
+ /* @__PURE__ */ jsx(Download, { className: "h-3 w-3" }),
158
+ /* @__PURE__ */ jsx("span", { className: "ml-1 text-xs hidden sm:inline", children: "Download" })
159
+ ]
160
+ }
161
+ )
162
+ ] })
163
+ ] })
164
+ ] }) }),
165
+ /* @__PURE__ */ jsx("div", { className: "h-full overflow-auto p-4", children: /* @__PURE__ */ jsx(
166
+ JSONTree,
167
+ {
168
+ data,
169
+ theme: jsonTreeTheme,
170
+ invertTheme: false,
171
+ hideRoot: true,
172
+ shouldExpandNodeInitially,
173
+ getItemString,
174
+ postprocessValue,
175
+ isCustomNode,
176
+ collectionLimit,
177
+ sortObjectKeys: !preserveKeyOrder,
178
+ ...jsonTreeProps
179
+ },
180
+ renderKey
181
+ ) })
182
+ ] });
183
+ }, "JsonTreeComponent");
184
+ var JsonTree_default = JsonTreeComponent;
185
+ var PrettyCodeClient = lazy(() => import('./PrettyCode.client-LCBPPTIX.mjs'));
186
+ var LoadingFallback = /* @__PURE__ */ __name(() => /* @__PURE__ */ jsx("div", { className: "relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900", children: /* @__PURE__ */ jsx("div", { className: "p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
187
+ /* @__PURE__ */ jsx("div", { className: "animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20" }),
188
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Loading code..." })
189
+ ] }) }) }), "LoadingFallback");
190
+ var PrettyCode = /* @__PURE__ */ __name((props) => {
191
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingFallback, {}), children: /* @__PURE__ */ jsx(PrettyCodeClient, { ...props }) });
192
+ }, "PrettyCode");
193
+ var PrettyCode_default = PrettyCode;
194
+
195
+ // src/tools/OpenapiViewer/utils/apiKeyManager.ts
196
+ function findApiKeyById(apiKeys, keyId) {
197
+ return apiKeys.find((key) => key.id === keyId) || null;
198
+ }
199
+ __name(findApiKeyById, "findApiKeyById");
200
+
201
+ // src/tools/OpenapiViewer/utils/versionManager.ts
202
+ var API_VERSIONS = [
203
+ {
204
+ id: "v1",
205
+ name: "v1",
206
+ description: "Current stable version",
207
+ isDefault: true
208
+ }
209
+ ];
210
+ var detectEndpointVersion = /* @__PURE__ */ __name((path) => {
211
+ const versionMatch = path.match(/\/api\/[^/]+\/(v\d+)\//);
212
+ if (versionMatch && versionMatch[1]) {
213
+ return versionMatch[1];
214
+ }
215
+ return "v1";
216
+ }, "detectEndpointVersion");
217
+ var isEndpointInVersion = /* @__PURE__ */ __name((endpoint, version) => {
218
+ const endpointVersion = detectEndpointVersion(endpoint.path);
219
+ return endpointVersion === version;
220
+ }, "isEndpointInVersion");
221
+ var filterEndpointsByVersion = /* @__PURE__ */ __name((endpoints, version) => {
222
+ return endpoints.filter((endpoint) => isEndpointInVersion(endpoint, version));
223
+ }, "filterEndpointsByVersion");
224
+ var deduplicateEndpoints = /* @__PURE__ */ __name((endpoints, preferredVersion) => {
225
+ const endpointMap = /* @__PURE__ */ new Map();
226
+ const groupedEndpoints = /* @__PURE__ */ new Map();
227
+ endpoints.forEach((endpoint) => {
228
+ const normalizedPath = normalizeEndpointPath(endpoint.path);
229
+ if (!groupedEndpoints.has(normalizedPath)) {
230
+ groupedEndpoints.set(normalizedPath, []);
231
+ }
232
+ groupedEndpoints.get(normalizedPath).push(endpoint);
233
+ });
234
+ groupedEndpoints.forEach((endpointGroup, normalizedPath) => {
235
+ let selectedEndpoint = null;
236
+ const versionEndpoint = endpointGroup.find((ep) => isEndpointInVersion(ep, preferredVersion));
237
+ if (versionEndpoint) {
238
+ selectedEndpoint = versionEndpoint;
239
+ } else if (endpointGroup.length > 0) {
240
+ selectedEndpoint = endpointGroup[0] || null;
241
+ }
242
+ if (selectedEndpoint) {
243
+ endpointMap.set(normalizedPath, selectedEndpoint);
244
+ }
245
+ });
246
+ return Array.from(endpointMap.values());
247
+ }, "deduplicateEndpoints");
248
+ var normalizeEndpointPath = /* @__PURE__ */ __name((path) => {
249
+ return path.replace(/\/v\d+\//, "/");
250
+ }, "normalizeEndpointPath");
251
+ var getVersionById = /* @__PURE__ */ __name((versionId) => {
252
+ return API_VERSIONS.find((v) => v.id === versionId);
253
+ }, "getVersionById");
254
+ var getDefaultVersion = /* @__PURE__ */ __name(() => {
255
+ const defaultVersion = API_VERSIONS.find((v) => v.isDefault);
256
+ if (defaultVersion) {
257
+ return defaultVersion;
258
+ }
259
+ if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {
260
+ return API_VERSIONS[0];
261
+ }
262
+ throw new Error("No API versions defined");
263
+ }, "getDefaultVersion");
264
+ var getVersionStats = /* @__PURE__ */ __name((endpoints) => {
265
+ const stats = {};
266
+ API_VERSIONS.forEach((version) => {
267
+ stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;
268
+ });
269
+ return stats;
270
+ }, "getVersionStats");
271
+
272
+ // src/tools/OpenapiViewer/constants.ts
273
+ var HTTP_METHOD_COLORS = {
274
+ GET: "success",
275
+ POST: "primary",
276
+ PUT: "warning",
277
+ DELETE: "error",
278
+ PATCH: "default"
279
+ };
280
+ var HTTP_STATUS_COLORS = {
281
+ "2": "success",
282
+ "3": "default",
283
+ "4": "warning",
284
+ "5": "error"
285
+ };
286
+
287
+ // src/tools/OpenapiViewer/utils/formatters.ts
288
+ var getMethodColor = /* @__PURE__ */ __name((method) => {
289
+ return HTTP_METHOD_COLORS[method.toUpperCase()] || "default";
290
+ }, "getMethodColor");
291
+ var getStatusColor = /* @__PURE__ */ __name((status) => {
292
+ const firstDigit = Math.floor(status / 100).toString();
293
+ return HTTP_STATUS_COLORS[firstDigit] || "default";
294
+ }, "getStatusColor");
295
+ var isValidJson = /* @__PURE__ */ __name((str) => {
296
+ if (!str || typeof str !== "string") return false;
297
+ try {
298
+ JSON.parse(str);
299
+ return true;
300
+ } catch {
301
+ return false;
302
+ }
303
+ }, "isValidJson");
304
+ var parseRequestHeaders = /* @__PURE__ */ __name((headersString) => {
305
+ if (!headersString || typeof headersString !== "string") {
306
+ return { "Content-Type": "application/json" };
307
+ }
308
+ try {
309
+ const parsed = JSON.parse(headersString);
310
+ return typeof parsed === "object" && parsed !== null ? parsed : { "Content-Type": "application/json" };
311
+ } catch {
312
+ return { "Content-Type": "application/json" };
313
+ }
314
+ }, "parseRequestHeaders");
315
+ var substituteUrlParameters = /* @__PURE__ */ __name((url, parameters) => {
316
+ let substitutedUrl = url;
317
+ Object.entries(parameters).forEach(([key, value]) => {
318
+ if (value && value.trim() !== "") {
319
+ const patterns = [
320
+ new RegExp(`\\{${key}\\}`, "g"),
321
+ new RegExp(`%7B${key}%7D`, "gi")
322
+ ];
323
+ patterns.forEach((pattern) => {
324
+ substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));
325
+ });
326
+ }
327
+ });
328
+ return substitutedUrl;
329
+ }, "substituteUrlParameters");
330
+ var createInitialState = /* @__PURE__ */ __name(() => ({
331
+ // Step management
332
+ currentStep: "endpoints",
333
+ steps: ["endpoints", "request", "response"],
334
+ // Endpoint selection
335
+ selectedEndpoint: null,
336
+ selectedCategory: "All",
337
+ searchTerm: "",
338
+ selectedVersion: getDefaultVersion().id,
339
+ // Request configuration
340
+ requestUrl: "",
341
+ requestMethod: "GET",
342
+ requestHeaders: '{\n "Content-Type": "application/json"\n}',
343
+ requestBody: "",
344
+ selectedApiKey: null,
345
+ manualApiToken: "",
346
+ parameters: {},
347
+ // Response
348
+ response: null,
349
+ loading: false,
350
+ // UI state
351
+ sidebarOpen: false
352
+ }), "createInitialState");
353
+ var PlaygroundContext = createContext(void 0);
354
+ var usePlaygroundContext = /* @__PURE__ */ __name(() => {
355
+ const context = useContext(PlaygroundContext);
356
+ if (!context) {
357
+ throw new Error("usePlaygroundContext must be used within a PlaygroundProvider");
358
+ }
359
+ return context;
360
+ }, "usePlaygroundContext");
361
+ var PlaygroundProvider = /* @__PURE__ */ __name(({ children, config }) => {
362
+ const [state, setState] = useState(() => createInitialState());
363
+ const apiKeys = React3.useMemo(() => [], []);
364
+ const isLoadingApiKeys = false;
365
+ const updateState = /* @__PURE__ */ __name((updates) => {
366
+ setState((prev) => ({ ...prev, ...updates }));
367
+ }, "updateState");
368
+ useEffect(() => {
369
+ if (apiKeys.length > 0 && !state.selectedApiKey) {
370
+ updateState({ selectedApiKey: apiKeys[0]?.id || null });
371
+ }
372
+ }, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);
373
+ useEffect(() => {
374
+ try {
375
+ setState((prev) => {
376
+ const headers = parseRequestHeaders(prev.requestHeaders);
377
+ let hasChanged = false;
378
+ if (prev.selectedApiKey) {
379
+ const apiKey = apiKeys.find((k) => k.id === prev.selectedApiKey);
380
+ if (apiKey) {
381
+ if (headers["X-API-Key"] !== apiKey.id) {
382
+ headers["X-API-Key"] = apiKey.id;
383
+ hasChanged = true;
384
+ }
385
+ } else {
386
+ return { ...prev, selectedApiKey: null };
387
+ }
388
+ } else {
389
+ if (headers["X-API-Key"]) {
390
+ delete headers["X-API-Key"];
391
+ hasChanged = true;
392
+ }
393
+ }
394
+ if (hasChanged) {
395
+ const updatedHeaders = JSON.stringify(headers, null, 2);
396
+ return { ...prev, requestHeaders: updatedHeaders };
397
+ }
398
+ return prev;
399
+ });
400
+ } catch (error) {
401
+ consola.error("Error updating headers:", error);
402
+ }
403
+ }, [state.selectedApiKey, apiKeys]);
404
+ useEffect(() => {
405
+ if (state.selectedEndpoint && state.parameters) {
406
+ const updatedUrl = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);
407
+ if (updatedUrl !== state.requestUrl) {
408
+ updateState({ requestUrl: updatedUrl });
409
+ }
410
+ }
411
+ }, [state.parameters, state.selectedEndpoint, state.requestUrl]);
412
+ const setCurrentStep = /* @__PURE__ */ __name((step) => {
413
+ updateState({ currentStep: step });
414
+ }, "setCurrentStep");
415
+ const goToNextStep = /* @__PURE__ */ __name(() => {
416
+ const currentIndex = state.steps.indexOf(state.currentStep);
417
+ if (currentIndex < state.steps.length - 1) {
418
+ updateState({ currentStep: state.steps[currentIndex + 1] });
419
+ }
420
+ }, "goToNextStep");
421
+ const goToPreviousStep = /* @__PURE__ */ __name(() => {
422
+ const currentIndex = state.steps.indexOf(state.currentStep);
423
+ if (currentIndex > 0) {
424
+ updateState({ currentStep: state.steps[currentIndex - 1] });
425
+ }
426
+ }, "goToPreviousStep");
427
+ const setSelectedEndpoint = /* @__PURE__ */ __name((endpoint) => {
428
+ if (endpoint) {
429
+ updateState({
430
+ selectedEndpoint: endpoint,
431
+ requestMethod: "GET",
432
+ requestUrl: endpoint.path,
433
+ parameters: {},
434
+ // Reset parameters when endpoint changes
435
+ currentStep: "request"
436
+ });
437
+ } else {
438
+ updateState({ selectedEndpoint: endpoint });
439
+ }
440
+ }, "setSelectedEndpoint");
441
+ const setSelectedCategory = /* @__PURE__ */ __name((category) => {
442
+ updateState({ selectedCategory: category });
443
+ }, "setSelectedCategory");
444
+ const setSearchTerm = /* @__PURE__ */ __name((term) => {
445
+ updateState({ searchTerm: term });
446
+ }, "setSearchTerm");
447
+ const setSelectedVersion = /* @__PURE__ */ __name((version) => {
448
+ updateState({ selectedVersion: version });
449
+ }, "setSelectedVersion");
450
+ const setRequestUrl = /* @__PURE__ */ __name((url) => {
451
+ updateState({ requestUrl: url });
452
+ }, "setRequestUrl");
453
+ const setRequestMethod = /* @__PURE__ */ __name((method) => {
454
+ updateState({ requestMethod: method });
455
+ }, "setRequestMethod");
456
+ const setRequestHeaders = /* @__PURE__ */ __name((headers) => {
457
+ updateState({ requestHeaders: headers });
458
+ }, "setRequestHeaders");
459
+ const setRequestBody = /* @__PURE__ */ __name((body) => {
460
+ updateState({ requestBody: body });
461
+ }, "setRequestBody");
462
+ const setSelectedApiKey = /* @__PURE__ */ __name((apiKeyId) => {
463
+ updateState({ selectedApiKey: apiKeyId });
464
+ }, "setSelectedApiKey");
465
+ const setManualApiToken = /* @__PURE__ */ __name((manualApiToken) => {
466
+ updateState({ manualApiToken });
467
+ }, "setManualApiToken");
468
+ const setParameters = /* @__PURE__ */ __name((parameters) => {
469
+ updateState({ parameters });
470
+ }, "setParameters");
471
+ const setResponse = /* @__PURE__ */ __name((response) => {
472
+ updateState({ response });
473
+ }, "setResponse");
474
+ const setLoading = /* @__PURE__ */ __name((loading) => {
475
+ updateState({ loading });
476
+ }, "setLoading");
477
+ const setSidebarOpen = /* @__PURE__ */ __name((sidebarOpen) => {
478
+ updateState({ sidebarOpen });
479
+ }, "setSidebarOpen");
480
+ const clearAll = useCallback(() => {
481
+ setState(createInitialState());
482
+ }, []);
483
+ const sendRequest = useCallback(async () => {
484
+ if (!state.requestUrl) {
485
+ consola.error("No URL provided");
486
+ return;
487
+ }
488
+ setLoading(true);
489
+ setResponse(null);
490
+ try {
491
+ const headers = parseRequestHeaders(state.requestHeaders);
492
+ let bearerToken = null;
493
+ if (state.manualApiToken) {
494
+ bearerToken = state.manualApiToken;
495
+ } else {
496
+ if (typeof window !== "undefined") {
497
+ bearerToken = window.localStorage.getItem("auth_token");
498
+ }
499
+ }
500
+ if (bearerToken) {
501
+ headers["Authorization"] = `Bearer ${bearerToken}`;
502
+ }
503
+ const requestOptions = {
504
+ method: state.requestMethod,
505
+ headers
506
+ };
507
+ if (state.requestBody && state.requestMethod !== "GET") {
508
+ requestOptions.body = state.requestBody;
509
+ }
510
+ const response = await fetch(state.requestUrl, requestOptions);
511
+ const responseText = await response.text();
512
+ let responseData;
513
+ try {
514
+ responseData = JSON.parse(responseText);
515
+ } catch {
516
+ responseData = responseText;
517
+ }
518
+ setResponse({
519
+ status: response.status,
520
+ statusText: response.statusText,
521
+ headers: Object.fromEntries(response.headers.entries()),
522
+ data: responseData
523
+ });
524
+ consola.success(`Request successful: ${state.requestMethod} ${state.requestUrl}`);
525
+ updateState({ currentStep: "response" });
526
+ } catch (error) {
527
+ consola.error("Request failed:", error);
528
+ setResponse({
529
+ error: error instanceof Error ? error.message : "Request failed"
530
+ });
531
+ } finally {
532
+ setLoading(false);
533
+ }
534
+ }, [state, setLoading, setResponse]);
535
+ const contextValue = {
536
+ // State
537
+ state,
538
+ config,
539
+ apiKeys,
540
+ apiKeysLoading: isLoadingApiKeys,
541
+ // Step management
542
+ setCurrentStep,
543
+ goToNextStep,
544
+ goToPreviousStep,
545
+ // Endpoint management
546
+ setSelectedEndpoint,
547
+ setSelectedCategory,
548
+ setSearchTerm,
549
+ setSelectedVersion,
550
+ // Request management
551
+ setRequestUrl,
552
+ setRequestMethod,
553
+ setRequestHeaders,
554
+ setRequestBody,
555
+ setSelectedApiKey,
556
+ setManualApiToken,
557
+ setParameters,
558
+ // Response management
559
+ setResponse,
560
+ setLoading,
561
+ // UI management
562
+ setSidebarOpen,
563
+ // Actions
564
+ clearAll,
565
+ sendRequest
566
+ };
567
+ return /* @__PURE__ */ jsx(PlaygroundContext.Provider, { value: contextValue, children });
568
+ }, "PlaygroundProvider");
569
+
570
+ export { API_VERSIONS, JsonTree_default, PlaygroundProvider, PrettyCode_default, deduplicateEndpoints, findApiKeyById, getMethodColor, getStatusColor, getVersionById, getVersionStats, isValidJson, parseRequestHeaders, usePlaygroundContext };
571
+ //# sourceMappingURL=chunk-M6P2FU7L.mjs.map
572
+ //# sourceMappingURL=chunk-M6P2FU7L.mjs.map