zudoku 0.51.0 → 0.52.1

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 (322) hide show
  1. package/dist/config/validators/InputNavigationSchema.d.ts +152 -0
  2. package/dist/config/validators/NavigationSchema.js +1 -1
  3. package/dist/config/validators/NavigationSchema.js.map +1 -1
  4. package/dist/config/validators/icon-types.d.ts +1 -1
  5. package/dist/config/validators/icon-types.js +38 -0
  6. package/dist/config/validators/icon-types.js.map +1 -1
  7. package/dist/config/validators/validate.d.ts +10 -0
  8. package/dist/config/validators/validate.js +7 -0
  9. package/dist/config/validators/validate.js.map +1 -1
  10. package/dist/lib/components/Autocomplete.js +1 -1
  11. package/dist/lib/components/Autocomplete.js.map +1 -1
  12. package/dist/lib/components/ErrorPage.js +2 -2
  13. package/dist/lib/components/ErrorPage.js.map +1 -1
  14. package/dist/lib/components/Markdown.d.ts +0 -1
  15. package/dist/lib/components/Markdown.js +2 -3
  16. package/dist/lib/components/Markdown.js.map +1 -1
  17. package/dist/lib/components/NotFoundPage.js +2 -2
  18. package/dist/lib/components/NotFoundPage.js.map +1 -1
  19. package/dist/lib/components/Pagination.js +1 -1
  20. package/dist/lib/components/Pagination.js.map +1 -1
  21. package/dist/lib/components/Typography.d.ts +5 -0
  22. package/dist/lib/components/Typography.js +8 -0
  23. package/dist/lib/components/Typography.js.map +1 -0
  24. package/dist/lib/components/index.d.ts +4 -0
  25. package/dist/lib/components/index.js +2 -0
  26. package/dist/lib/components/index.js.map +1 -1
  27. package/dist/lib/errors/ErrorAlert.js +2 -3
  28. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  29. package/dist/lib/hooks/useHotkey.d.ts +4 -0
  30. package/dist/lib/hooks/useHotkey.js +58 -0
  31. package/dist/lib/hooks/useHotkey.js.map +1 -0
  32. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +4 -8
  33. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  34. package/dist/lib/plugins/custom-pages/index.d.ts +1 -4
  35. package/dist/lib/plugins/custom-pages/index.js +1 -3
  36. package/dist/lib/plugins/custom-pages/index.js.map +1 -1
  37. package/dist/lib/plugins/markdown/MdxPage.d.ts +1 -2
  38. package/dist/lib/plugins/markdown/MdxPage.js +22 -6
  39. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  40. package/dist/lib/plugins/markdown/index.d.ts +8 -1
  41. package/dist/lib/plugins/markdown/index.js +1 -1
  42. package/dist/lib/plugins/markdown/index.js.map +1 -1
  43. package/dist/lib/plugins/openapi/OperationList.js +2 -3
  44. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  45. package/dist/lib/plugins/openapi/OperationListItem.js +2 -2
  46. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  47. package/dist/lib/plugins/openapi/ParameterListItem.js +1 -1
  48. package/dist/lib/plugins/openapi/ParameterListItem.js.map +1 -1
  49. package/dist/lib/plugins/openapi/SchemaList.js +2 -3
  50. package/dist/lib/plugins/openapi/SchemaList.js.map +1 -1
  51. package/dist/lib/plugins/openapi/SidecarExamples.js +1 -1
  52. package/dist/lib/plugins/openapi/SidecarExamples.js.map +1 -1
  53. package/dist/lib/plugins/openapi/playground/BodyPanel.js +14 -11
  54. package/dist/lib/plugins/openapi/playground/BodyPanel.js.map +1 -1
  55. package/dist/lib/plugins/openapi/playground/CollapsibleHeader.d.ts +8 -0
  56. package/dist/lib/plugins/openapi/playground/CollapsibleHeader.js +11 -0
  57. package/dist/lib/plugins/openapi/playground/CollapsibleHeader.js.map +1 -0
  58. package/dist/lib/plugins/openapi/playground/ExamplesDropdown.js +2 -2
  59. package/dist/lib/plugins/openapi/playground/ExamplesDropdown.js.map +1 -1
  60. package/dist/lib/plugins/openapi/playground/Headers.d.ts +3 -2
  61. package/dist/lib/plugins/openapi/playground/Headers.js +52 -30
  62. package/dist/lib/plugins/openapi/playground/Headers.js.map +1 -1
  63. package/dist/lib/plugins/openapi/playground/IdentityDialog.js +2 -1
  64. package/dist/lib/plugins/openapi/playground/IdentityDialog.js.map +1 -1
  65. package/dist/lib/plugins/openapi/playground/IdentitySelector.js +1 -2
  66. package/dist/lib/plugins/openapi/playground/IdentitySelector.js.map +1 -1
  67. package/dist/lib/plugins/openapi/playground/InlineInput.js +1 -1
  68. package/dist/lib/plugins/openapi/playground/InlineInput.js.map +1 -1
  69. package/dist/lib/plugins/openapi/playground/ParamsGrid.js +2 -2
  70. package/dist/lib/plugins/openapi/playground/ParamsGrid.js.map +1 -1
  71. package/dist/lib/plugins/openapi/playground/PathParams.js +1 -2
  72. package/dist/lib/plugins/openapi/playground/PathParams.js.map +1 -1
  73. package/dist/lib/plugins/openapi/playground/Playground.js +52 -34
  74. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  75. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js +1 -1
  76. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js.map +1 -1
  77. package/dist/lib/plugins/openapi/playground/QueryParams.d.ts +2 -2
  78. package/dist/lib/plugins/openapi/playground/QueryParams.js +38 -23
  79. package/dist/lib/plugins/openapi/playground/QueryParams.js.map +1 -1
  80. package/dist/lib/plugins/openapi/playground/Spinner.d.ts +2 -0
  81. package/dist/lib/plugins/openapi/playground/Spinner.js +63 -0
  82. package/dist/lib/plugins/openapi/playground/Spinner.js.map +1 -0
  83. package/dist/lib/plugins/openapi/playground/request-panel/UrlPath.d.ts +3 -0
  84. package/dist/lib/plugins/openapi/playground/request-panel/UrlPath.js +13 -0
  85. package/dist/lib/plugins/openapi/playground/request-panel/UrlPath.js.map +1 -0
  86. package/dist/lib/plugins/openapi/playground/request-panel/UrlQueryParams.d.ts +1 -0
  87. package/dist/lib/plugins/openapi/playground/request-panel/UrlQueryParams.js +12 -0
  88. package/dist/lib/plugins/openapi/playground/request-panel/UrlQueryParams.js.map +1 -0
  89. package/dist/lib/plugins/openapi/playground/result-panel/Highlight.d.ts +12 -0
  90. package/dist/lib/plugins/openapi/playground/result-panel/Highlight.js +11 -0
  91. package/dist/lib/plugins/openapi/playground/result-panel/Highlight.js.map +1 -0
  92. package/dist/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.d.ts +6 -0
  93. package/dist/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.js +66 -0
  94. package/dist/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.js.map +1 -0
  95. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.d.ts +7 -4
  96. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js +23 -32
  97. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js.map +1 -1
  98. package/dist/lib/plugins/openapi/playground/result-panel/ResultPanel.d.ts +2 -2
  99. package/dist/lib/plugins/openapi/playground/result-panel/ResultPanel.js +8 -10
  100. package/dist/lib/plugins/openapi/playground/result-panel/ResultPanel.js.map +1 -1
  101. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js +3 -3
  102. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js.map +1 -1
  103. package/dist/lib/plugins/openapi/schema/SchemaPropertyItem.js +2 -3
  104. package/dist/lib/plugins/openapi/schema/SchemaPropertyItem.js.map +1 -1
  105. package/dist/lib/plugins/openapi/schema/SchemaView.js +4 -4
  106. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  107. package/dist/lib/plugins/openapi/schema/utils.js +3 -2
  108. package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
  109. package/dist/lib/ui/CodeBlock.js +5 -6
  110. package/dist/lib/ui/CodeBlock.js.map +1 -1
  111. package/dist/lib/ui/Dialog.js +1 -1
  112. package/dist/lib/ui/Dialog.js.map +1 -1
  113. package/dist/lib/ui/EmbeddedCodeBlock.js +1 -1
  114. package/dist/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  115. package/dist/lib/ui/Select.js +1 -1
  116. package/dist/lib/util/os.d.ts +2 -0
  117. package/dist/lib/util/os.js +21 -0
  118. package/dist/lib/util/os.js.map +1 -0
  119. package/dist/lib/util/useCopyToClipboard.d.ts +1 -0
  120. package/dist/lib/util/useCopyToClipboard.js +11 -0
  121. package/dist/lib/util/useCopyToClipboard.js.map +1 -0
  122. package/dist/vite/api/SchemaManager.js +6 -2
  123. package/dist/vite/api/SchemaManager.js.map +1 -1
  124. package/dist/vite/api/schema-codegen.js +42 -11
  125. package/dist/vite/api/schema-codegen.js.map +1 -1
  126. package/dist/vite/api/schema-codegen.test.js +82 -0
  127. package/dist/vite/api/schema-codegen.test.js.map +1 -1
  128. package/dist/vite/mdx/remark-last-modified.d.ts +3 -0
  129. package/dist/vite/mdx/remark-last-modified.js +56 -0
  130. package/dist/vite/mdx/remark-last-modified.js.map +1 -0
  131. package/dist/vite/mdx/utils.d.ts +2 -0
  132. package/dist/vite/mdx/utils.js +31 -0
  133. package/dist/vite/mdx/utils.js.map +1 -0
  134. package/dist/vite/plugin-frontmatter.js +4 -2
  135. package/dist/vite/plugin-frontmatter.js.map +1 -1
  136. package/dist/vite/plugin-mdx.js +11 -33
  137. package/dist/vite/plugin-mdx.js.map +1 -1
  138. package/dist/vite/plugin-theme.js +21 -9
  139. package/dist/vite/plugin-theme.js.map +1 -1
  140. package/dist/vite/plugin-theme.test.js +22 -1
  141. package/dist/vite/plugin-theme.test.js.map +1 -1
  142. package/lib/Alert-CT_ViLrJ.js +161 -0
  143. package/lib/Alert-CT_ViLrJ.js.map +1 -0
  144. package/lib/CodeBlock-DAKxs_Tu.js +85 -0
  145. package/lib/CodeBlock-DAKxs_Tu.js.map +1 -0
  146. package/lib/Command-CPtGTZAL.js +140 -0
  147. package/lib/Command-CPtGTZAL.js.map +1 -0
  148. package/lib/{Dialog-BxpuVLh9.js → Dialog-DGlrUTCS.js} +4 -4
  149. package/lib/Dialog-DGlrUTCS.js.map +1 -0
  150. package/lib/MdxPage-D-QSUlMf.js +110 -0
  151. package/lib/MdxPage-D-QSUlMf.js.map +1 -0
  152. package/lib/{OasProvider-BC0q5m3u.js → OasProvider-DKB2uJU-.js} +3 -3
  153. package/lib/{OasProvider-BC0q5m3u.js.map → OasProvider-DKB2uJU-.js.map} +1 -1
  154. package/lib/{OperationList-Dpip6ozi.js → OperationList-CccIt45w.js} +579 -567
  155. package/lib/OperationList-CccIt45w.js.map +1 -0
  156. package/lib/Pagination-ClHXydm9.js +36 -0
  157. package/lib/Pagination-ClHXydm9.js.map +1 -0
  158. package/lib/RouteGuard-Bd-ppFbi.js +737 -0
  159. package/lib/RouteGuard-Bd-ppFbi.js.map +1 -0
  160. package/lib/{SchemaList-t4BIfh6Z.js → SchemaList-DY3FBF2U.js} +26 -37
  161. package/lib/SchemaList-DY3FBF2U.js.map +1 -0
  162. package/lib/{SchemaView-CLxthVcA.js → SchemaView-matL2maR.js} +94 -103
  163. package/lib/SchemaView-matL2maR.js.map +1 -0
  164. package/lib/{SignUp-B6w5AwHM.js → SignUp-CfojO4Pb.js} +13 -13
  165. package/lib/{SignUp-B6w5AwHM.js.map → SignUp-CfojO4Pb.js.map} +1 -1
  166. package/lib/{Markdown-BQ8YqLsz.js → Slot-DwZlQ-vX.js} +3347 -3001
  167. package/lib/Slot-DwZlQ-vX.js.map +1 -0
  168. package/lib/{SyntaxHighlight-C5ja40ix.js → SyntaxHighlight-CrjhGEwT.js} +3 -3
  169. package/lib/{SyntaxHighlight-C5ja40ix.js.map → SyntaxHighlight-CrjhGEwT.js.map} +1 -1
  170. package/lib/{Toc-BS0f4GTe.js → Toc-WCmwFkX-.js} +2 -2
  171. package/lib/{Toc-BS0f4GTe.js.map → Toc-WCmwFkX-.js.map} +1 -1
  172. package/lib/{chunk-DQRVZFIR-BblmKnHy.js → chunk-DQRVZFIR-DHK7_Ilc.js} +7 -7
  173. package/lib/{chunk-DQRVZFIR-BblmKnHy.js.map → chunk-DQRVZFIR-DHK7_Ilc.js.map} +1 -1
  174. package/lib/{circular-DfOaDE_x.js → circular-CqHpo7-e.js} +2 -2
  175. package/lib/{circular-DfOaDE_x.js.map → circular-CqHpo7-e.js.map} +1 -1
  176. package/lib/clerk-BDZ31hjU.js +25190 -0
  177. package/lib/clerk-BDZ31hjU.js.map +1 -0
  178. package/lib/{createServer-DjOMygls.js → createServer-ByKo3XCG.js} +4 -4
  179. package/lib/{createServer-DjOMygls.js.map → createServer-ByKo3XCG.js.map} +1 -1
  180. package/lib/{errors-D_5vKvUq.js → errors-BsabiSKg.js} +5 -5
  181. package/lib/{errors-D_5vKvUq.js.map → errors-BsabiSKg.js.map} +1 -1
  182. package/lib/{hook-CHXroBFt.js → hook-Bd0yS8M0.js} +36 -36
  183. package/lib/{hook-CHXroBFt.js.map → hook-Bd0yS8M0.js.map} +1 -1
  184. package/lib/index-BIbCx5Fh.js +3919 -0
  185. package/lib/index-BIbCx5Fh.js.map +1 -0
  186. package/lib/index-CEfpz8vY.js +3458 -0
  187. package/lib/index-CEfpz8vY.js.map +1 -0
  188. package/lib/{index-BvvmIczU.js → index-CcV90rin.js} +2 -2
  189. package/lib/{index-BvvmIczU.js.map → index-CcV90rin.js.map} +1 -1
  190. package/lib/index-ClhS5TxS.js +107 -0
  191. package/lib/index-ClhS5TxS.js.map +1 -0
  192. package/lib/ui/CodeBlock.js +6 -73
  193. package/lib/ui/CodeBlock.js.map +1 -1
  194. package/lib/ui/Command.js +1 -1
  195. package/lib/ui/Dialog.js +1 -1
  196. package/lib/ui/Dialog.js.map +1 -1
  197. package/lib/ui/EmbeddedCodeBlock.js +1 -1
  198. package/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  199. package/lib/ui/Select.js +1 -1
  200. package/lib/ui/Select.js.map +1 -1
  201. package/lib/ui/SyntaxHighlight.js +3 -3
  202. package/lib/{useExposedProps-BZQkZneR.js → useExposedProps-BIYjecPD.js} +2 -2
  203. package/lib/{useExposedProps-BZQkZneR.js.map → useExposedProps-BIYjecPD.js.map} +1 -1
  204. package/lib/zudoku.auth-auth0.js +1 -1
  205. package/lib/zudoku.auth-azureb2c.js +2 -2
  206. package/lib/zudoku.auth-clerk.js +3 -3
  207. package/lib/zudoku.auth-openid.js +2 -2
  208. package/lib/zudoku.components.js +33 -3534
  209. package/lib/zudoku.components.js.map +1 -1
  210. package/lib/zudoku.hooks.js +10 -11
  211. package/lib/zudoku.hooks.js.map +1 -1
  212. package/lib/zudoku.plugin-api-catalog.js +6 -6
  213. package/lib/zudoku.plugin-api-keys.js +268 -321
  214. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  215. package/lib/zudoku.plugin-custom-pages.js +8 -20
  216. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  217. package/lib/zudoku.plugin-markdown.js +4 -5
  218. package/lib/zudoku.plugin-markdown.js.map +1 -1
  219. package/lib/zudoku.plugin-openapi.js +3 -3
  220. package/lib/zudoku.plugin-redirect.js +1 -1
  221. package/lib/zudoku.plugin-search-pagefind.js +201 -111
  222. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  223. package/package.json +5 -4
  224. package/src/lib/components/Autocomplete.tsx +1 -0
  225. package/src/lib/components/ErrorPage.tsx +3 -3
  226. package/src/lib/components/Markdown.tsx +3 -5
  227. package/src/lib/components/NotFoundPage.tsx +3 -3
  228. package/src/lib/components/Pagination.tsx +4 -4
  229. package/src/lib/components/Typography.tsx +14 -0
  230. package/src/lib/components/index.ts +2 -0
  231. package/src/lib/errors/ErrorAlert.tsx +3 -9
  232. package/src/lib/hooks/useHotkey.ts +70 -0
  233. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +5 -9
  234. package/src/lib/plugins/custom-pages/index.tsx +2 -6
  235. package/src/lib/plugins/markdown/MdxPage.tsx +66 -15
  236. package/src/lib/plugins/markdown/index.tsx +10 -2
  237. package/src/lib/plugins/openapi/OperationList.tsx +7 -17
  238. package/src/lib/plugins/openapi/OperationListItem.tsx +2 -2
  239. package/src/lib/plugins/openapi/ParameterListItem.tsx +6 -0
  240. package/src/lib/plugins/openapi/SchemaList.tsx +3 -9
  241. package/src/lib/plugins/openapi/SidecarExamples.tsx +1 -0
  242. package/src/lib/plugins/openapi/playground/BodyPanel.tsx +36 -28
  243. package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +47 -0
  244. package/src/lib/plugins/openapi/playground/ExamplesDropdown.tsx +7 -3
  245. package/src/lib/plugins/openapi/playground/Headers.tsx +187 -89
  246. package/src/lib/plugins/openapi/playground/IdentityDialog.tsx +3 -2
  247. package/src/lib/plugins/openapi/playground/IdentitySelector.tsx +7 -12
  248. package/src/lib/plugins/openapi/playground/InlineInput.tsx +1 -1
  249. package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +2 -2
  250. package/src/lib/plugins/openapi/playground/PathParams.tsx +3 -4
  251. package/src/lib/plugins/openapi/playground/Playground.tsx +196 -136
  252. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +1 -1
  253. package/src/lib/plugins/openapi/playground/QueryParams.tsx +102 -58
  254. package/src/lib/plugins/openapi/playground/Spinner.tsx +87 -0
  255. package/src/lib/plugins/openapi/playground/request-panel/UrlPath.tsx +31 -0
  256. package/src/lib/plugins/openapi/playground/request-panel/UrlQueryParams.tsx +25 -0
  257. package/src/lib/plugins/openapi/playground/result-panel/Highlight.tsx +26 -0
  258. package/src/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.tsx +104 -0
  259. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +98 -97
  260. package/src/lib/plugins/openapi/playground/result-panel/ResultPanel.tsx +62 -92
  261. package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +3 -3
  262. package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +2 -3
  263. package/src/lib/plugins/openapi/schema/SchemaView.tsx +5 -10
  264. package/src/lib/plugins/openapi/schema/utils.ts +3 -2
  265. package/src/lib/ui/CodeBlock.tsx +5 -6
  266. package/src/lib/ui/Dialog.tsx +1 -1
  267. package/src/lib/ui/EmbeddedCodeBlock.tsx +1 -1
  268. package/src/lib/ui/Select.tsx +1 -1
  269. package/src/lib/util/os.ts +18 -0
  270. package/src/lib/util/useCopyToClipboard.ts +17 -0
  271. package/dist/flat-config.d.ts +0 -320
  272. package/dist/lib/plugins/custom-pages/CustomPage.d.ts +0 -2
  273. package/dist/lib/plugins/custom-pages/CustomPage.js +0 -11
  274. package/dist/lib/plugins/custom-pages/CustomPage.js.map +0 -1
  275. package/dist/lib/plugins/openapi/playground/UrlDisplay.d.ts +0 -4
  276. package/dist/lib/plugins/openapi/playground/UrlDisplay.js +0 -22
  277. package/dist/lib/plugins/openapi/playground/UrlDisplay.js.map +0 -1
  278. package/dist/lib/plugins/openapi/playground/result-panel/RequestTab.d.ts +0 -7
  279. package/dist/lib/plugins/openapi/playground/result-panel/RequestTab.js +0 -11
  280. package/dist/lib/plugins/openapi/playground/result-panel/RequestTab.js.map +0 -1
  281. package/lib/Callout-CoVxYafP.js +0 -231
  282. package/lib/Callout-CoVxYafP.js.map +0 -1
  283. package/lib/CategoryHeading-Cu2RwgjC.js +0 -10
  284. package/lib/CategoryHeading-Cu2RwgjC.js.map +0 -1
  285. package/lib/Dialog-BxpuVLh9.js.map +0 -1
  286. package/lib/Markdown-BQ8YqLsz.js.map +0 -1
  287. package/lib/MdxPage-DJvKmI-r.js +0 -84
  288. package/lib/MdxPage-DJvKmI-r.js.map +0 -1
  289. package/lib/OperationList-Dpip6ozi.js.map +0 -1
  290. package/lib/Pagination-CCxhL836.js +0 -36
  291. package/lib/Pagination-CCxhL836.js.map +0 -1
  292. package/lib/RouteGuard-gV7nvzi7.js +0 -55
  293. package/lib/RouteGuard-gV7nvzi7.js.map +0 -1
  294. package/lib/SchemaList-t4BIfh6Z.js.map +0 -1
  295. package/lib/SchemaView-CLxthVcA.js.map +0 -1
  296. package/lib/Slot-CSEIvwwO.js +0 -161
  297. package/lib/Slot-CSEIvwwO.js.map +0 -1
  298. package/lib/clerk-yAKDC3Qz.js +0 -24812
  299. package/lib/clerk-yAKDC3Qz.js.map +0 -1
  300. package/lib/index--oeBayMa.js +0 -86
  301. package/lib/index--oeBayMa.js.map +0 -1
  302. package/lib/index-Bn6Lc9tq.js +0 -9
  303. package/lib/index-Bn6Lc9tq.js.map +0 -1
  304. package/lib/index-DW2qmCJa.js +0 -3227
  305. package/lib/index-DW2qmCJa.js.map +0 -1
  306. package/lib/index-QzXzw_ra.js +0 -24
  307. package/lib/index-QzXzw_ra.js.map +0 -1
  308. package/lib/index.esm-BFcSKCe-.js +0 -683
  309. package/lib/index.esm-BFcSKCe-.js.map +0 -1
  310. package/lib/mutation-BpcyTgWI.js +0 -196
  311. package/lib/mutation-BpcyTgWI.js.map +0 -1
  312. package/lib/objectEntries-yMIkr2mI.js +0 -5
  313. package/lib/objectEntries-yMIkr2mI.js.map +0 -1
  314. package/lib/react-nprogress.esm-C2MPXjiJ.js +0 -389
  315. package/lib/react-nprogress.esm-C2MPXjiJ.js.map +0 -1
  316. package/lib/useLatest-hmRS46UF.js +0 -11
  317. package/lib/useLatest-hmRS46UF.js.map +0 -1
  318. package/lib/useMutation-N4ockVKi.js +0 -97
  319. package/lib/useMutation-N4ockVKi.js.map +0 -1
  320. package/src/lib/plugins/custom-pages/CustomPage.tsx +0 -18
  321. package/src/lib/plugins/openapi/playground/UrlDisplay.tsx +0 -32
  322. package/src/lib/plugins/openapi/playground/result-panel/RequestTab.tsx +0 -73
@@ -1,8 +1,15 @@
1
1
  import { useNProgress } from "@tanem/react-nprogress";
2
2
  import { useMutation } from "@tanstack/react-query";
3
- import { Fragment, useEffect, useRef, useState, useTransition } from "react";
3
+ import {
4
+ CheckIcon,
5
+ CopyIcon,
6
+ IdCardLanyardIcon,
7
+ ShapesIcon,
8
+ } from "lucide-react";
9
+ import { useEffect, useMemo, useRef, useState, useTransition } from "react";
4
10
  import { FormProvider, useForm } from "react-hook-form";
5
11
  import { Button } from "zudoku/ui/Button.js";
12
+ import { Collapsible, CollapsibleContent } from "zudoku/ui/Collapsible.js";
6
13
  import {
7
14
  Select,
8
15
  SelectContent,
@@ -10,13 +17,19 @@ import {
10
17
  SelectTrigger,
11
18
  SelectValue,
12
19
  } from "zudoku/ui/Select.js";
20
+ import { TooltipProvider } from "zudoku/ui/Tooltip.js";
13
21
  import { useApiIdentities } from "../../../components/context/ZudokuContext.js";
14
- import { PathRenderer } from "../../../components/PathRenderer.js";
22
+ import { useHotkey } from "../../../hooks/useHotkey.js";
23
+ import { cn } from "../../../util/cn.js";
24
+ import { useCopyToClipboard } from "../../../util/useCopyToClipboard.js";
15
25
  import { useLatest } from "../../../util/useLatest.js";
16
- import { ColorizedParam } from "../ColorizedParam.js";
17
26
  import { type Content } from "../SidecarExamples.js";
18
27
  import { useSelectedServer } from "../state.js";
19
28
  import BodyPanel from "./BodyPanel.js";
29
+ import {
30
+ CollapsibleHeader,
31
+ CollapsibleHeaderTrigger,
32
+ } from "./CollapsibleHeader.js";
20
33
  import { createUrl } from "./createUrl.js";
21
34
  import { extractFileName, isBinaryContentType } from "./fileUtils.js";
22
35
  import { Headers } from "./Headers.js";
@@ -25,6 +38,8 @@ import IdentitySelector from "./IdentitySelector.js";
25
38
  import { PathParams } from "./PathParams.js";
26
39
  import { QueryParams } from "./QueryParams.js";
27
40
  import { useIdentityStore } from "./rememberedIdentity.js";
41
+ import { UrlPath } from "./request-panel/UrlPath.js";
42
+ import { UrlQueryParams } from "./request-panel/UrlQueryParams.js";
28
43
  import RequestLoginDialog from "./RequestLoginDialog.js";
29
44
  import { ResultPanel } from "./result-panel/ResultPanel.js";
30
45
  import { useRememberSkipLoginDialog } from "./useRememberSkipLoginDialog.js";
@@ -133,6 +148,11 @@ export const Playground = ({
133
148
  const [showLongRunningWarning, setShowLongRunningWarning] = useState(false);
134
149
  const abortControllerRef = useRef<AbortController | undefined>(undefined);
135
150
  const latestSetRememberedIdentity = useLatest(setRememberedIdentity);
151
+ const formRef = useRef<HTMLFormElement>(null);
152
+
153
+ const { label: hotkeyLabel } = useHotkey("meta+enter", () => {
154
+ formRef.current?.requestSubmit();
155
+ });
136
156
 
137
157
  const { register, control, handleSubmit, watch, setValue, ...form } =
138
158
  useForm<PlaygroundForm>({
@@ -178,13 +198,18 @@ export const Playground = ({
178
198
  ]),
179
199
  },
180
200
  });
181
- const formState = watch();
201
+ const identity = watch("identity");
202
+
203
+ const authorizationFields = useMemo(
204
+ () => identities.data?.find((i) => i.id === identity)?.authorizationFields,
205
+ [identities.data, identity],
206
+ );
182
207
 
183
208
  useEffect(() => {
184
- if (formState.identity) {
185
- latestSetRememberedIdentity.current(formState.identity);
209
+ if (identity) {
210
+ latestSetRememberedIdentity.current(identity);
186
211
  }
187
- }, [latestSetRememberedIdentity, formState.identity]);
212
+ }, [latestSetRememberedIdentity, identity]);
188
213
 
189
214
  const queryMutation = useMutation({
190
215
  gcTime: 0,
@@ -218,6 +243,10 @@ export const Playground = ({
218
243
  );
219
244
  abortControllerRef.current = new AbortController();
220
245
 
246
+ abortControllerRef.current.signal.addEventListener("abort", () => {
247
+ clearTimeout(warningTimeout);
248
+ });
249
+
221
250
  try {
222
251
  const response = await fetch(request, {
223
252
  cache: "no-store",
@@ -297,38 +326,6 @@ export const Playground = ({
297
326
  };
298
327
  }, []);
299
328
 
300
- const path = (
301
- <PathRenderer
302
- path={url}
303
- renderParam={({ name, originalValue, index }) => {
304
- const formValue = formState.pathParams.find(
305
- (param) => param.name === name,
306
- )?.value;
307
-
308
- return (
309
- <ColorizedParam
310
- name={name}
311
- backgroundOpacity="0"
312
- slug={name}
313
- onClick={() => form.setFocus(`pathParams.${index}.value`)}
314
- >
315
- {formValue || originalValue}
316
- </ColorizedParam>
317
- );
318
- }}
319
- />
320
- );
321
-
322
- const urlQueryParams = formState.queryParams
323
- .filter((p) => p.active)
324
- .map((p, i, arr) => (
325
- <Fragment key={p.name}>
326
- {p.name}={encodeURIComponent(p.value).replaceAll("%20", "+")}
327
- {i < arr.length - 1 && "&"}
328
- <wbr />
329
- </Fragment>
330
- ));
331
-
332
329
  const serverSelect = (
333
330
  <div className="inline-block opacity-50 hover:opacity-100 transition">
334
331
  {server ? (
@@ -362,117 +359,180 @@ export const Playground = ({
362
359
  const isBodySupported = ["POST", "PUT", "PATCH", "DELETE"].includes(
363
360
  method.toUpperCase(),
364
361
  );
362
+ const [isCopied, copyToClipboard] = useCopyToClipboard();
365
363
 
366
364
  return (
367
365
  <FormProvider
368
366
  {...{ register, control, handleSubmit, watch, setValue, ...form }}
369
367
  >
370
- <form
371
- onSubmit={handleSubmit((data) => {
372
- if (identities.data?.length === 0 || data.identity) {
373
- queryMutation.mutate(data);
374
- } else {
375
- setShowSelectIdentity(true);
376
- }
377
- })}
378
- className="relative"
379
- >
380
- <IdentityDialog
381
- identities={identities.data ?? []}
382
- open={showSelectIdentity}
383
- onOpenChange={setShowSelectIdentity}
384
- onSubmit={({ rememberedIdentity, identity }) => {
385
- if (rememberedIdentity) {
386
- setValue("identity", identity ?? NO_IDENTITY);
368
+ <TooltipProvider delayDuration={150}>
369
+ <form
370
+ ref={formRef}
371
+ onSubmit={handleSubmit((data) => {
372
+ if (identities.data?.length === 0 || data.identity) {
373
+ queryMutation.mutate(data);
374
+ } else {
375
+ setShowSelectIdentity(true);
387
376
  }
388
- setShowSelectIdentity(false);
389
- queryMutation.mutate({ ...formState, identity });
390
- }}
391
- />
392
- <RequestLoginDialog
393
- open={showLogin}
394
- setOpen={(open) => setSkipLogin(!open)}
395
- onSignUp={onSignUp}
396
- onLogin={onLogin}
397
- />
398
-
399
- <div className="grid grid-cols-[1fr_min-content_1fr] text-sm">
400
- <div className="col-span-3 p-4 border-b">
401
- <div className="flex gap-2 items-stretch">
402
- <div className="flex flex-1 items-center w-full border rounded-md relative overflow-hidden">
403
- <div className="border-r p-2 bg-muted rounded-l-md self-stretch font-semibold font-mono flex items-center">
404
- {method.toUpperCase()}
405
- </div>
406
- <div className="items-center px-2 font-mono text-xs break-all leading-6 relative h-full w-full">
407
- <div className="h-full py-1.5">
408
- {serverSelect}
409
- {path}
410
- {urlQueryParams.length > 0 ? "?" : ""}
411
- {urlQueryParams}
377
+ })}
378
+ className="relative"
379
+ >
380
+ <IdentityDialog
381
+ identities={identities.data ?? []}
382
+ open={showSelectIdentity}
383
+ onOpenChange={setShowSelectIdentity}
384
+ onSubmit={({ rememberedIdentity, identity }) => {
385
+ if (rememberedIdentity) {
386
+ setValue("identity", identity ?? NO_IDENTITY);
387
+ }
388
+ setShowSelectIdentity(false);
389
+ queryMutation.mutate({ ...form.getValues(), identity });
390
+ }}
391
+ />
392
+ <RequestLoginDialog
393
+ open={showLogin}
394
+ setOpen={(open) => setSkipLogin(!open)}
395
+ onSignUp={onSignUp}
396
+ onLogin={onLogin}
397
+ />
398
+
399
+ <div className="grid grid-cols-[1fr_1px_1fr] text-sm">
400
+ <div className="col-span-3 p-4 border-b">
401
+ <div className="flex gap-2 items-stretch">
402
+ <div className="flex flex-1 items-center w-full border rounded-md relative overflow-hidden">
403
+ <div className="border-r p-2 bg-muted rounded-l-md self-stretch font-semibold font-mono flex items-center">
404
+ {method.toUpperCase()}
405
+ </div>
406
+ <div className="items-center px-2 font-mono text-xs break-all leading-6 relative h-full w-full">
407
+ <div className="h-full py-1.5">
408
+ {serverSelect}
409
+ <UrlPath url={url} />
410
+ <UrlQueryParams />
411
+ </div>
412
+ <div
413
+ className="h-full bg-primary/25 absolute left-0 -bottom-0 z-10 transition-all duration-300 ease-in-out"
414
+ style={{
415
+ opacity: isFinished ? 0 : 1,
416
+ width: isFinished ? 0 : `${progress * 100}%`,
417
+ }}
418
+ />
419
+ </div>
420
+ <div className="px-1">
421
+ <Button
422
+ type="button"
423
+ onClick={() => {
424
+ copyToClipboard(
425
+ createUrl(
426
+ server ?? selectedServer,
427
+ url,
428
+ form.getValues(),
429
+ ).toString(),
430
+ );
431
+ }}
432
+ variant="ghost"
433
+ size="icon-xs"
434
+ className={cn(
435
+ "hover:opacity-100 transition",
436
+ isCopied
437
+ ? "text-emerald-600 opacity-100"
438
+ : "opacity-50",
439
+ )}
440
+ >
441
+ {isCopied ? (
442
+ <CheckIcon className="text-green-500" size={14} />
443
+ ) : (
444
+ <CopyIcon size={14} />
445
+ )}
446
+ </Button>
412
447
  </div>
413
- <div
414
- className="h-[1px] bg-primary absolute left-0 -bottom-0 z-10 transition-all duration-300 ease-in-out"
415
- style={{
416
- opacity: isFinished ? 0 : 1,
417
- width: isFinished ? 0 : `${progress * 100}%`,
418
- }}
419
- />
420
448
  </div>
421
- </div>
422
449
 
423
- <Button
424
- type="submit"
425
- disabled={identities.isLoading || form.formState.isSubmitting}
426
- >
427
- Send
428
- </Button>
450
+ <Button
451
+ type="submit"
452
+ variant={queryMutation.isPending ? "destructive" : "default"}
453
+ onClick={(e) => {
454
+ if (queryMutation.isPending) {
455
+ abortControllerRef.current?.abort(
456
+ "Request cancelled by user",
457
+ );
458
+ e.preventDefault();
459
+ }
460
+ }}
461
+ className="w-18"
462
+ >
463
+ {queryMutation.isPending ? "Cancel" : "Send"}
464
+ </Button>
465
+ </div>
429
466
  </div>
430
- </div>
431
- <div className="flex flex-col gap-5 p-4 after:bg-muted-foreground/20 relative overflow-y-auto h-[80vh]">
432
- {identities.data?.length !== 0 && (
433
- <div className="flex flex-col gap-2">
467
+ <div className="relative overflow-y-auto h-[80vh]">
468
+ {identities.data?.length !== 0 && (
434
469
  <div className="flex flex-col gap-2">
435
- <span className="font-semibold">Authentication</span>
436
- <IdentitySelector
437
- value={formState.identity}
438
- identities={identities.data ?? []}
439
- setValue={(value) => setValue("identity", value)}
440
- />
470
+ <div className="flex flex-col gap-2">
471
+ <Collapsible defaultOpen>
472
+ <CollapsibleHeaderTrigger>
473
+ <IdCardLanyardIcon size={16} />
474
+ <CollapsibleHeader className="col-span-2">
475
+ Authentication
476
+ </CollapsibleHeader>
477
+ </CollapsibleHeaderTrigger>
478
+ <CollapsibleContent className="CollapsibleContent">
479
+ <IdentitySelector
480
+ value={identity}
481
+ identities={identities.data ?? []}
482
+ setValue={(value) => setValue("identity", value)}
483
+ />
484
+ </CollapsibleContent>
485
+ </Collapsible>
486
+ </div>
441
487
  </div>
442
- </div>
443
- )}
444
-
445
- {pathParams.length > 0 && (
446
- <div className="flex flex-col gap-2">
447
- <span className="font-semibold">Path Parameters</span>
448
- <PathParams url={url} control={control} />
449
- </div>
450
- )}
451
-
452
- <div className="flex flex-col gap-2">
453
- <span className="font-semibold">Query Parameters</span>
454
- <QueryParams control={control} queryParams={queryParams} />
488
+ )}
489
+
490
+ {pathParams.length > 0 && (
491
+ <Collapsible defaultOpen>
492
+ <CollapsibleHeaderTrigger className="border-t">
493
+ <ShapesIcon size={16} />
494
+ <CollapsibleHeader>Path Parameters</CollapsibleHeader>
495
+ </CollapsibleHeaderTrigger>
496
+ <CollapsibleContent className="CollapsibleContent">
497
+ <PathParams url={url} control={control} />
498
+ </CollapsibleContent>
499
+ </Collapsible>
500
+ )}
501
+
502
+ <QueryParams control={control} schemaQueryParams={queryParams} />
503
+
504
+ <Headers
505
+ control={control}
506
+ schemaHeaders={headers}
507
+ lockedHeaders={authorizationFields?.headers}
508
+ />
509
+ {isBodySupported && <BodyPanel examples={examples} />}
455
510
  </div>
456
-
457
- <Headers control={control} headers={headers} />
458
- {isBodySupported && <BodyPanel examples={examples} />}
511
+ <div className="w-full bg-muted-foreground/20" />
512
+ <ResultPanel
513
+ queryMutation={queryMutation}
514
+ showLongRunningWarning={showLongRunningWarning}
515
+ tip={
516
+ <div className="text-xs w-full">
517
+ <span className="text-muted-foreground">
518
+ Press{" "}
519
+ <kbd className="text-foreground border rounded m-0.5 px-1 py-0.5 capitalize">
520
+ {hotkeyLabel.join(" + ")}
521
+ </kbd>{" "}
522
+ to send a request
523
+ </span>
524
+ </div>
525
+ }
526
+ onCancel={() => {
527
+ abortControllerRef.current?.abort(
528
+ "Request cancelled by the user",
529
+ );
530
+ setShowLongRunningWarning(false);
531
+ }}
532
+ />
459
533
  </div>
460
- <div className="w-px bg-muted-foreground/20" />
461
- <ResultPanel
462
- queryMutation={queryMutation}
463
- showPathParamsWarning={formState.pathParams.some(
464
- (p) => p.value === "",
465
- )}
466
- showLongRunningWarning={showLongRunningWarning}
467
- onCancel={() => {
468
- abortControllerRef.current?.abort(
469
- "Request cancelled by the user",
470
- );
471
- setShowLongRunningWarning(false);
472
- }}
473
- />
474
- </div>
475
- </form>
534
+ </form>
535
+ </TooltipProvider>
476
536
  </FormProvider>
477
537
  );
478
538
  };
@@ -52,7 +52,7 @@ const PlaygroundDialog = (props: PlaygroundDialogProps) => {
52
52
  <DialogContent
53
53
  className="max-w-screen-xl w-full overflow-hidden p-0"
54
54
  aria-describedby={undefined}
55
- showCloseButton={false}
55
+ showCloseButton={true}
56
56
  >
57
57
  <VisuallyHidden>
58
58
  <DialogTitle>Playground</DialogTitle>
@@ -1,50 +1,85 @@
1
+ import { PlusCircleIcon, Unlink2Icon, XIcon } from "lucide-react";
2
+ import { useEffect } from "react";
1
3
  import {
2
4
  type Control,
3
5
  Controller,
4
6
  useFieldArray,
5
7
  useFormContext,
6
8
  } from "react-hook-form";
7
- import { Card } from "zudoku/ui/Card.js";
9
+ import { Button } from "zudoku/ui/Button.js";
8
10
  import { Checkbox } from "zudoku/ui/Checkbox.js";
11
+ import { Collapsible, CollapsibleContent } from "zudoku/ui/Collapsible.js";
9
12
  import { Autocomplete } from "../../../components/Autocomplete.js";
10
13
  import { Input } from "../../../ui/Input.js";
14
+ import {
15
+ CollapsibleHeader,
16
+ CollapsibleHeaderTrigger,
17
+ } from "./CollapsibleHeader.js";
11
18
  import { InlineInput } from "./InlineInput.js";
12
19
  import ParamsGrid, { ParamsGridItem } from "./ParamsGrid.js";
13
20
  import { type PlaygroundForm, type QueryParam } from "./Playground.js";
14
21
 
15
22
  export const QueryParams = ({
16
23
  control,
17
- queryParams,
24
+ schemaQueryParams,
18
25
  }: {
19
26
  control: Control<PlaygroundForm>;
20
- queryParams: QueryParam[];
27
+ schemaQueryParams: QueryParam[];
21
28
  }) => {
22
- const { fields } = useFieldArray<PlaygroundForm, "queryParams">({
29
+ const { fields, remove, append } = useFieldArray<
30
+ PlaygroundForm,
31
+ "queryParams"
32
+ >({
23
33
  control,
24
34
  name: "queryParams",
25
35
  });
26
- const form = useFormContext<PlaygroundForm>();
36
+ const { setValue, getValues, watch } = useFormContext<PlaygroundForm>();
37
+ const watchedQueryParams = watch("queryParams");
38
+ useEffect(() => {
39
+ if (watchedQueryParams.length === 0) {
40
+ append({ name: "", value: "", active: false }, { shouldFocus: true });
41
+ }
42
+ }, [watchedQueryParams, append]);
27
43
 
28
- const requiredFields = queryParams.map((param) => Boolean(param.isRequired));
44
+ const requiredFields = schemaQueryParams.map((param) =>
45
+ Boolean(param.isRequired),
46
+ );
29
47
 
30
48
  return (
31
- <Card className="rounded-lg overflow-hidden">
32
- <div className="w-full ">
33
- <ParamsGrid>
34
- {fields.map((field, i) => {
35
- const currentParam = queryParams.find(
36
- (param) => param.name === form.watch(`queryParams.${i}.name`),
37
- );
38
- return (
39
- <ParamsGridItem key={field.id}>
40
- <div key={field.id} className="flex items-center gap-2">
49
+ <Collapsible defaultOpen>
50
+ <CollapsibleHeaderTrigger>
51
+ <Unlink2Icon size={16} />
52
+ <CollapsibleHeader>Query Parameters</CollapsibleHeader>
53
+ <Button
54
+ onClick={() => {
55
+ setValue("queryParams", [
56
+ ...getValues("queryParams"),
57
+ { name: "", value: "", active: false },
58
+ ]);
59
+ }}
60
+ type="button"
61
+ size="sm"
62
+ variant="ghost"
63
+ className="hover:bg-accent hover:brightness-95 flex gap-2"
64
+ >
65
+ Add parameter <PlusCircleIcon size={16} />
66
+ </Button>
67
+ </CollapsibleHeaderTrigger>
68
+ <CollapsibleContent className="CollapsibleContent">
69
+ <div className="overflow-hidden w-full">
70
+ <ParamsGrid>
71
+ {fields.map((field, i) => {
72
+ const currentParam = schemaQueryParams.find(
73
+ (param) => param.name === watchedQueryParams.at(i)?.name,
74
+ );
75
+ return (
76
+ <ParamsGridItem key={field.id}>
41
77
  <Controller
42
78
  control={control}
43
79
  name={`queryParams.${i}.active`}
44
80
  render={({ field }) => (
45
81
  <Checkbox
46
82
  id={`queryParams.${i}.active`}
47
- className="me-2"
48
83
  checked={field.value}
49
84
  onCheckedChange={field.onChange}
50
85
  />
@@ -56,11 +91,11 @@ export const QueryParams = ({
56
91
  !requiredFields[i] ? (
57
92
  <Autocomplete
58
93
  value={field.value}
59
- options={queryParams.map((param) => param.name)}
94
+ options={schemaQueryParams.map((param) => param.name)}
60
95
  onChange={(e) => {
61
96
  field.onChange(e);
62
97
  }}
63
- className="border-0 shadow-none focus-visible:ring-0 bg-transparent hover:bg-transparent text-xs font-mono"
98
+ className="border-0 p-0 m-0 shadow-none focus-visible:ring-0 bg-transparent hover:bg-transparent text-xs font-mono"
64
99
  />
65
100
  ) : (
66
101
  <InlineInput asChild>
@@ -79,50 +114,59 @@ export const QueryParams = ({
79
114
  }
80
115
  name={`queryParams.${i}.name`}
81
116
  />
82
- </div>
83
- <div className="flex justify-between items-center">
84
- <Controller
85
- control={control}
86
- render={({ field }) => {
87
- const hasEnum =
88
- currentParam?.enum && currentParam.enum.length > 0;
117
+ <div className="flex justify-between items-center">
118
+ <Controller
119
+ control={control}
120
+ render={({ field }) => {
121
+ const hasEnum =
122
+ currentParam?.enum && currentParam.enum.length > 0;
123
+
124
+ if (!hasEnum) {
125
+ return (
126
+ <Input
127
+ {...field}
128
+ onChange={(e) => {
129
+ field.onChange(e.target.value);
130
+ if (e.target.value.length > 0) {
131
+ setValue(`queryParams.${i}.active`, true);
132
+ }
133
+ }}
134
+ placeholder="Enter value"
135
+ className="w-full border-0 p-0 m-0 shadow-none focus-visible:ring-0 text-xs font-mono"
136
+ />
137
+ );
138
+ }
89
139
 
90
- if (!hasEnum) {
91
140
  return (
92
- <Input
93
- {...field}
141
+ <Autocomplete
142
+ value={field.value}
143
+ options={currentParam.enum ?? []}
94
144
  onChange={(e) => {
95
- field.onChange(e.target.value);
96
- if (e.target.value.length > 0) {
97
- form.setValue(`queryParams.${i}.active`, true);
98
- }
145
+ field.onChange(e);
146
+ setValue(`queryParams.${i}.active`, true);
99
147
  }}
100
- placeholder="Enter value"
101
- className="w-full border-0 shadow-none focus-visible:ring-0 text-xs font-mono"
148
+ className="border-0 shadow-none focus-visible:ring-0 bg-transparent hover:bg-transparent text-xs font-mono"
102
149
  />
103
150
  );
104
- }
105
-
106
- return (
107
- <Autocomplete
108
- value={field.value}
109
- options={currentParam.enum ?? []}
110
- onChange={(e) => {
111
- field.onChange(e);
112
- form.setValue(`queryParams.${i}.active`, true);
113
- }}
114
- className="border-0 shadow-none focus-visible:ring-0 bg-transparent hover:bg-transparent text-xs font-mono"
115
- />
116
- );
117
- }}
118
- name={`queryParams.${i}.value`}
119
- />
120
- </div>
121
- </ParamsGridItem>
122
- );
123
- })}
124
- </ParamsGrid>
125
- </div>
126
- </Card>
151
+ }}
152
+ name={`queryParams.${i}.value`}
153
+ />
154
+ <Button
155
+ size="icon-xs"
156
+ variant="ghost"
157
+ className="text-muted-foreground opacity-0 group-hover:brightness-95 group-hover:opacity-100"
158
+ onClick={() => remove(i)}
159
+ type="button"
160
+ >
161
+ <XIcon size={16} />
162
+ </Button>
163
+ </div>
164
+ </ParamsGridItem>
165
+ );
166
+ })}
167
+ </ParamsGrid>
168
+ </div>
169
+ </CollapsibleContent>
170
+ </Collapsible>
127
171
  );
128
172
  };