@scalar/api-client 2.38.2 → 2.38.4

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 (263) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{AddressBar-B4xnl66I.js → AddressBar-BOZGKSoz.js} +4 -4
  3. package/dist/{AddressBar-B4xnl66I.js.map → AddressBar-BOZGKSoz.js.map} +1 -1
  4. package/dist/{App-CvClwSlM.js → App-Ckirvnv1.js} +2 -2
  5. package/dist/{App-CvClwSlM.js.map → App-Ckirvnv1.js.map} +1 -1
  6. package/dist/{App-BVH4lIe8.js → App-DHBmpWJI.js} +4 -4
  7. package/dist/{App-BVH4lIe8.js.map → App-DHBmpWJI.js.map} +1 -1
  8. package/dist/{CodeInput-C-igR77V.js → CodeInput-BTN8cC5h.js} +2 -2
  9. package/dist/{CodeInput-C-igR77V.js.map → CodeInput-BTN8cC5h.js.map} +1 -1
  10. package/dist/{Collection-4MT9WmDD.js → Collection-BsAG7ms5.js} +2 -2
  11. package/dist/{Collection-4MT9WmDD.js.map → Collection-BsAG7ms5.js.map} +1 -1
  12. package/dist/{CollectionAuthentication-MHWQpw74.js → CollectionAuthentication-BMGhRnpo.js} +5 -5
  13. package/dist/{CollectionAuthentication-MHWQpw74.js.map → CollectionAuthentication-BMGhRnpo.js.map} +1 -1
  14. package/dist/{CollectionEnvironment-Dw35vIqo.js → CollectionEnvironment-BY9Gcnln.js} +4 -4
  15. package/dist/{CollectionEnvironment-Dw35vIqo.js.map → CollectionEnvironment-BY9Gcnln.js.map} +1 -1
  16. package/dist/{CollectionOverview-TUdDIu5f.js → CollectionOverview-C3GvN8GY.js} +3 -3
  17. package/dist/{CollectionOverview-TUdDIu5f.js.map → CollectionOverview-C3GvN8GY.js.map} +1 -1
  18. package/dist/{CollectionServers-BrjTCfDe.js → CollectionServers-DuOLysNB.js} +5 -5
  19. package/dist/{CollectionServers-BrjTCfDe.js.map → CollectionServers-DuOLysNB.js.map} +1 -1
  20. package/dist/{CollectionSettings-HVSlp2Gv.js → CollectionSettings-FtXNetOh.js} +2 -2
  21. package/dist/{CollectionSettings-HVSlp2Gv.js.map → CollectionSettings-FtXNetOh.js.map} +1 -1
  22. package/dist/{CommandPalette-CL8k4CoN.js → CommandPalette-BxoEK8TY.js} +2 -2
  23. package/dist/{CommandPalette-CL8k4CoN.js.map → CommandPalette-BxoEK8TY.js.map} +1 -1
  24. package/dist/{Cookies-DbOKTi1f.js → Cookies-BYTv1YIA.js} +8 -8
  25. package/dist/{Cookies-DbOKTi1f.js.map → Cookies-BYTv1YIA.js.map} +1 -1
  26. package/dist/{DataTableInput-yaU5g-kP.js → DataTableInput-RydMDjn2.js} +2 -2
  27. package/dist/{DataTableInput-yaU5g-kP.js.map → DataTableInput-RydMDjn2.js.map} +1 -1
  28. package/dist/{Environment-DJatRQIg.js → Environment-BIxG7DaO.js} +5 -5
  29. package/dist/{Environment-DJatRQIg.js.map → Environment-BIxG7DaO.js.map} +1 -1
  30. package/dist/{EnvironmentModal-DBEJ4Kzj.js → EnvironmentModal-C0lYytkh.js} +2 -2
  31. package/dist/{EnvironmentModal-DBEJ4Kzj.js.map → EnvironmentModal-C0lYytkh.js.map} +1 -1
  32. package/dist/{Form-CSKzyHGO.js → Form-KFcdRQp1.js} +3 -3
  33. package/dist/{Form-CSKzyHGO.js.map → Form-KFcdRQp1.js.map} +1 -1
  34. package/dist/{ImportCollection-DfX1UQ5u.js → ImportCollection-CGjySEzP.js} +2 -2
  35. package/dist/{ImportCollection-DfX1UQ5u.js.map → ImportCollection-CGjySEzP.js.map} +1 -1
  36. package/dist/{MainLayout-BEFMl1ud.js → MainLayout-BnLwst16.js} +3 -3
  37. package/dist/{MainLayout-BEFMl1ud.js.map → MainLayout-BnLwst16.js.map} +1 -1
  38. package/dist/{Modal-sQ9vH6MN.js → Modal-CTZ8UNds.js} +2 -2
  39. package/dist/{Modal-sQ9vH6MN.js.map → Modal-CTZ8UNds.js.map} +1 -1
  40. package/dist/{Request-gscRsGQ8.js → Request-d0RY0ZhC.js} +10 -10
  41. package/dist/{Request-gscRsGQ8.js.map → Request-d0RY0ZhC.js.map} +1 -1
  42. package/dist/{RequestAuth-BzBfIysT.js → RequestAuth-1cRH3DDn.js} +3 -3
  43. package/dist/{RequestAuth-BzBfIysT.js.map → RequestAuth-1cRH3DDn.js.map} +1 -1
  44. package/dist/{RequestRoot-3Bj8JZD-.js → RequestRoot-pW0yXesG.js} +7 -7
  45. package/dist/{RequestRoot-3Bj8JZD-.js.map → RequestRoot-pW0yXesG.js.map} +1 -1
  46. package/dist/{RequestSection-HhdJj9hW.js → RequestSection-D2BLvDTr.js} +4 -4
  47. package/dist/{RequestSection-HhdJj9hW.js.map → RequestSection-D2BLvDTr.js.map} +1 -1
  48. package/dist/{ResponseSection-DMJ0tw8E.js → ResponseSection-B_YF7l_E.js} +3 -3
  49. package/dist/{ResponseSection-DMJ0tw8E.js.map → ResponseSection-B_YF7l_E.js.map} +1 -1
  50. package/dist/{Server-DnA_BzPS.js → Server-CEKGIEfE.js} +2 -2
  51. package/dist/{Server-DnA_BzPS.js.map → Server-CEKGIEfE.js.map} +1 -1
  52. package/dist/{Settings-CYZzdJPO.js → Settings-BaPvhJ8Y.js} +2 -2
  53. package/dist/{Settings-CYZzdJPO.js.map → Settings-BaPvhJ8Y.js.map} +1 -1
  54. package/dist/{Sidebar-C6AdX6-N.js → Sidebar-CRxdl38Y.js} +2 -2
  55. package/dist/{Sidebar-C6AdX6-N.js.map → Sidebar-CRxdl38Y.js.map} +1 -1
  56. package/dist/components/AddressBar/AddressBar.vue.d.ts +1 -1
  57. package/dist/components/AddressBar/index.js +3 -3
  58. package/dist/components/CodeInput/CodeInput.vue.d.ts +1 -1
  59. package/dist/components/CodeInput/codeVariableWidget.d.ts +1 -1
  60. package/dist/components/CodeInput/index.js +1 -1
  61. package/dist/components/CommandPalette/index.js +1 -1
  62. package/dist/components/DataTable/DataTableInput.vue.d.ts +2 -2
  63. package/dist/components/DataTable/index.js +2 -2
  64. package/dist/components/Form/LabelInput.vue.d.ts +1 -1
  65. package/dist/components/ImportCollection/index.js +1 -1
  66. package/dist/components/ImportCollection/utils/import-collection.d.ts +1 -1
  67. package/dist/components/ImportCollection/utils/workspace-store-is-empty.d.ts +1 -1
  68. package/dist/components/Server/ServerVariablesForm.vue.d.ts +1 -1
  69. package/dist/components/Server/index.js +1 -1
  70. package/dist/components/Sidebar/index.js +1 -1
  71. package/dist/components/index.d.ts +2 -2
  72. package/dist/components/index.js +4 -4
  73. package/dist/{components-CSxJTn6F.js → components-B0BwUDFw.js} +2 -2
  74. package/dist/{components-CSxJTn6F.js.map → components-B0BwUDFw.js.map} +1 -1
  75. package/dist/get-resolved-url-SybDPV0U.js +85 -0
  76. package/dist/get-resolved-url-SybDPV0U.js.map +1 -0
  77. package/dist/{get-server-url-o3On8CEr.js → get-server-url-UVN-dx79.js} +1 -1
  78. package/dist/{get-server-url-o3On8CEr.js.map → get-server-url-UVN-dx79.js.map} +1 -1
  79. package/dist/hooks/useSidebar.d.ts +1 -1
  80. package/dist/index.d.ts +2 -2
  81. package/dist/index.js +5 -5
  82. package/dist/layouts/App/create-api-client-app.d.ts +9 -9
  83. package/dist/layouts/App/index.js +3 -3
  84. package/dist/layouts/Modal/create-api-client-modal.d.ts +1 -1
  85. package/dist/layouts/Modal/index.d.ts +1 -1
  86. package/dist/layouts/Modal/index.js +1 -1
  87. package/dist/layouts/Web/create-api-client-web.d.ts +9 -9
  88. package/dist/layouts/Web/index.js +4 -4
  89. package/dist/libs/create-client.d.ts +3 -3
  90. package/dist/libs/environment-parser.d.ts +1 -1
  91. package/dist/libs/get-request-uid-by-path-method.d.ts +1 -1
  92. package/dist/libs/hot-keys.d.ts +1 -1
  93. package/dist/libs/index.d.ts +1 -1
  94. package/dist/libs/index.js +1 -1
  95. package/dist/libs/local-storage.d.ts +1 -1
  96. package/dist/libs/send-request/create-request-operation.d.ts +3 -3
  97. package/dist/{operation-block-BnMIKAOh.js → operation-block-B1B3lJPx.js} +67 -17
  98. package/dist/operation-block-B1B3lJPx.js.map +1 -0
  99. package/dist/{operation-code-sample-ZUTueV3v.js → operation-code-sample-DOzAPxLQ.js} +22 -10
  100. package/dist/operation-code-sample-DOzAPxLQ.js.map +1 -0
  101. package/dist/plugins/hooks/usePluginManager.d.ts +1 -1
  102. package/dist/{request-block-DwsGy64Q.js → request-block-C1kLLMEd.js} +4 -4
  103. package/dist/{request-block-DwsGy64Q.js.map → request-block-C1kLLMEd.js.map} +1 -1
  104. package/dist/{scalar-address-bar-block--Vs6IBU1.js → scalar-address-bar-block-BbysOhkE.js} +2 -2
  105. package/dist/{scalar-address-bar-block--Vs6IBU1.js.map → scalar-address-bar-block-BbysOhkE.js.map} +1 -1
  106. package/dist/{scalar-auth-selector-block-DI3DLag9.js → scalar-auth-selector-block-Bs79QOMA.js} +12 -9
  107. package/dist/scalar-auth-selector-block-Bs79QOMA.js.map +1 -0
  108. package/dist/store/collections.d.ts +1 -1
  109. package/dist/store/environment.d.ts +1 -1
  110. package/dist/store/events.d.ts +8 -8
  111. package/dist/store/import-spec.d.ts +2 -2
  112. package/dist/store/index.js +1 -1
  113. package/dist/store/request-example.d.ts +1 -1
  114. package/dist/store/requests.d.ts +1 -1
  115. package/dist/store/security-schemes.d.ts +1 -1
  116. package/dist/store/servers.d.ts +1 -1
  117. package/dist/store/store.d.ts +7 -7
  118. package/dist/store/tags.d.ts +1 -1
  119. package/dist/store/workspace.d.ts +1 -1
  120. package/dist/{store-DpSUVhjp.js → store-DnlAQK5d.js} +15 -15
  121. package/dist/{store-DpSUVhjp.js.map → store-DnlAQK5d.js.map} +1 -1
  122. package/dist/style.css +1 -1
  123. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +3 -3
  124. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  125. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts +2 -2
  126. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts +6 -0
  127. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts.map +1 -0
  128. package/dist/v2/blocks/operation-block/helpers/build-request-body.d.ts.map +1 -1
  129. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts +1 -0
  130. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts.map +1 -1
  131. package/dist/v2/blocks/operation-block/helpers/build-request-security.d.ts +2 -2
  132. package/dist/v2/blocks/operation-block/helpers/build-request.d.ts +2 -2
  133. package/dist/v2/blocks/operation-block/helpers/build-request.d.ts.map +1 -1
  134. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts +2 -1
  135. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts.map +1 -1
  136. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.d.ts +1 -1
  137. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +1 -1
  138. package/dist/v2/blocks/operation-block/index.js +11 -11
  139. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts +2 -2
  140. package/dist/v2/blocks/operation-code-sample/helpers/find-client.d.ts +1 -1
  141. package/dist/v2/blocks/operation-code-sample/helpers/generate-client-options.d.ts +1 -1
  142. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.d.ts +1 -1
  143. package/dist/v2/blocks/operation-code-sample/helpers/get-clients.d.ts +2 -2
  144. package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.d.ts +1 -1
  145. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.d.ts +1 -1
  146. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.d.ts.map +1 -1
  147. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.d.ts +1 -1
  148. package/dist/v2/blocks/operation-code-sample/index.js +1 -1
  149. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts +4 -4
  150. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts +1 -1
  151. package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +1 -1
  152. package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.d.ts +1 -1
  153. package/dist/v2/blocks/request-block/helpers/get-default-headers.d.ts.map +1 -1
  154. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.d.ts +1 -1
  155. package/dist/v2/blocks/request-block/index.js +5 -5
  156. package/dist/v2/blocks/response-block/ResponseBlock.vue.d.ts +1 -1
  157. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.d.ts +1 -1
  158. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.d.ts +1 -1
  159. package/dist/v2/blocks/response-block/index.js +2 -2
  160. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts +1 -1
  161. package/dist/v2/blocks/scalar-address-bar-block/index.js +1 -1
  162. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts +3 -3
  163. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts +1 -1
  164. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts +2 -2
  165. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.d.ts +1 -1
  166. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts +1 -1
  167. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts.map +1 -1
  168. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.d.ts +1 -1
  169. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +2 -2
  170. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.d.ts.map +1 -1
  171. package/dist/v2/blocks/scalar-auth-selector-block/index.js +3 -3
  172. package/dist/v2/components/code-input/CodeInput.vue.d.ts +1 -1
  173. package/dist/v2/components/data-table/DataTableInput.vue.d.ts +1 -1
  174. package/dist/v2/components/data-table/DataTableInputSelect.vue.d.ts +1 -1
  175. package/dist/v2/components/server/ServerDropdown.vue.d.ts +1 -1
  176. package/dist/v2/components/sidebar/Sidebar.vue.d.ts +1 -1
  177. package/dist/v2/constants.d.ts +3 -0
  178. package/dist/v2/constants.d.ts.map +1 -0
  179. package/dist/v2/features/app/App.vue.d.ts +3 -3
  180. package/dist/v2/features/app/components/AppSidebar.vue.d.ts +1 -1
  181. package/dist/v2/features/app/components/index.js +4 -4
  182. package/dist/v2/features/app/helpers/create-api-client-app.d.ts +3 -3
  183. package/dist/v2/features/app/helpers/get-route-param.d.ts +1 -1
  184. package/dist/v2/features/app/helpers/routes.d.ts +3 -3
  185. package/dist/v2/features/app/index.d.ts +5 -5
  186. package/dist/v2/features/app/index.js +14 -14
  187. package/dist/v2/features/app/index.js.map +1 -1
  188. package/dist/v2/features/collection/DocumentCollection.vue.d.ts +1 -1
  189. package/dist/v2/features/collection/OperationCollection.vue.d.ts +1 -1
  190. package/dist/v2/features/collection/WorkspaceCollection.vue.d.ts +1 -1
  191. package/dist/v2/features/collection/components/Authentication.vue.d.ts +4 -4
  192. package/dist/v2/features/collection/components/Authentication.vue.d.ts.map +1 -1
  193. package/dist/v2/features/collection/components/Cookies.vue.d.ts +4 -4
  194. package/dist/v2/features/collection/components/Editor/Editor.vue.d.ts +4 -4
  195. package/dist/v2/features/collection/components/Environment.vue.d.ts +4 -4
  196. package/dist/v2/features/collection/components/Overview.vue.d.ts +4 -4
  197. package/dist/v2/features/collection/components/Servers.vue.d.ts +4 -4
  198. package/dist/v2/features/collection/components/Settings.vue.d.ts +4 -4
  199. package/dist/v2/features/collection/components/Tabs.vue.d.ts +1 -1
  200. package/dist/v2/features/command-palette/hooks/use-command-palette-state.d.ts +45 -10
  201. package/dist/v2/features/command-palette/hooks/use-command-palette-state.d.ts.map +1 -1
  202. package/dist/v2/features/editor/helpers/json/create-json-model.d.ts +1 -1
  203. package/dist/v2/features/editor/helpers/yaml/create-yaml-model.d.ts +1 -1
  204. package/dist/v2/features/editor/helpers/yaml/get-yaml-node-range-from-path.d.ts +1 -1
  205. package/dist/v2/features/editor/hooks/use-editor.d.ts +1 -1
  206. package/dist/v2/features/editor/hooks/use-json-pointer-link-support.d.ts +1 -1
  207. package/dist/v2/features/modal/Modal.vue.d.ts +1 -1
  208. package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts +2 -2
  209. package/dist/v2/features/modal/hooks/use-modal-sidebar.d.ts +1 -1
  210. package/dist/v2/features/modal/index.js +10 -10
  211. package/dist/v2/features/modal/modal-events.d.ts +1 -1
  212. package/dist/v2/features/operation/Operation.vue.d.ts +2 -2
  213. package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
  214. package/dist/v2/features/operation/helpers/get-selected-security.d.ts +6 -1
  215. package/dist/v2/features/operation/helpers/get-selected-security.d.ts.map +1 -1
  216. package/dist/v2/features/operation/index.js +10 -10
  217. package/dist/v2/features/search/helpers/create-fuse-instance.d.ts +1 -1
  218. package/dist/v2/features/search/helpers/create-search-index.d.ts +1 -1
  219. package/dist/v2/helpers/get-active-proxy-url.d.ts +1 -1
  220. package/dist/v2/helpers/get-tab-details.d.ts +1 -1
  221. package/dist/v2/helpers/handle-hotkeys.d.ts +1 -1
  222. package/dist/v2/hooks/use-global-hot-keys.d.ts +1 -1
  223. package/dist/views/Collection/components/EnvironmentForm.vue.d.ts +1 -1
  224. package/dist/views/Collection/components/MarkdownInput.vue.d.ts +1 -1
  225. package/dist/views/Components/CodeSnippet/CodeSnippet.vue.d.ts +1 -1
  226. package/dist/views/Components/CodeSnippet/helpers/get-har-request.d.ts +1 -1
  227. package/dist/views/Components/CodeSnippet/helpers/get-snippet.d.ts +1 -1
  228. package/dist/views/Environment/EnvironmentVariableDropdown.vue.d.ts +1 -1
  229. package/dist/views/Environment/handle-drag.d.ts +1 -1
  230. package/dist/views/Request/Request.vue.d.ts +1 -1
  231. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.d.ts +1 -1
  232. package/dist/views/Request/RequestSection/RequestAuth/OAuthScopesInput.vue.d.ts +1 -1
  233. package/dist/views/Request/RequestSection/RequestAuth/RequestAuth.vue.d.ts +1 -1
  234. package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTable.vue.d.ts +1 -1
  235. package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTableInput.vue.d.ts +2 -2
  236. package/dist/views/Request/RequestSection/RequestAuth/RequestAuthTab.vue.d.ts +1 -1
  237. package/dist/views/Request/RequestSection/RequestAuth/helpers/restore-auth-from-local-storage.d.ts +1 -1
  238. package/dist/views/Request/RequestSection/RequestAuth/index.js +3 -3
  239. package/dist/views/Request/RequestSection/RequestBody.vue.d.ts +1 -1
  240. package/dist/views/Request/RequestSection/RequestCodeExample.vue.d.ts +1 -1
  241. package/dist/views/Request/RequestSection/RequestParams.vue.d.ts +1 -1
  242. package/dist/views/Request/RequestSection/RequestPathParams.vue.d.ts +1 -1
  243. package/dist/views/Request/RequestSection/RequestSection.vue.d.ts +1 -1
  244. package/dist/views/Request/RequestSection/RequestTable.vue.d.ts +1 -1
  245. package/dist/views/Request/RequestSection/helpers/update-scheme.d.ts +1 -1
  246. package/dist/views/Request/RequestSection/index.js +4 -4
  247. package/dist/views/Request/RequestSidebarItem.vue.d.ts +1 -1
  248. package/dist/views/Request/RequestSidebarItemMenu.vue.d.ts +3 -3
  249. package/dist/views/Request/RequestSubpageHeader.vue.d.ts +1 -1
  250. package/dist/views/Request/ResponseSection/ResponseBodyPreview.vue.d.ts +1 -1
  251. package/dist/views/Request/ResponseSection/ResponseSection.vue.d.ts +1 -1
  252. package/dist/views/Request/ResponseSection/index.js +3 -3
  253. package/dist/views/Request/components/index.js +1 -1
  254. package/dist/views/Request/handle-drag.d.ts +2 -2
  255. package/dist/views/Request/libs/auth.d.ts +1 -1
  256. package/dist/views/Request/libs/oauth2.d.ts +1 -1
  257. package/dist/views/Request/libs/watch-mode.d.ts +2 -2
  258. package/package.json +12 -12
  259. package/dist/get-resolved-url-BUCwrBzc.js +0 -30
  260. package/dist/get-resolved-url-BUCwrBzc.js.map +0 -1
  261. package/dist/operation-block-BnMIKAOh.js.map +0 -1
  262. package/dist/operation-code-sample-ZUTueV3v.js.map +0 -1
  263. package/dist/scalar-auth-selector-block-DI3DLag9.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CommandPalette-CL8k4CoN.js","names":[],"sources":["../src/constants.ts","../src/components/CommandPalette/CommandPaletteCollection.vue","../src/components/CommandPalette/CommandPaletteCollection.vue","../src/components/CommandPalette/CommandPaletteExample.vue","../src/components/CommandPalette/CommandPaletteExample.vue","../src/components/CommandPalette/CommandPaletteImport.vue","../src/components/CommandPalette/CommandPaletteImport.vue","../src/components/CommandPalette/CommandPaletteImportCurl.vue","../src/components/CommandPalette/CommandPaletteImportCurl.vue","../src/components/CommandPalette/CommandPaletteServer.vue","../src/components/CommandPalette/CommandPaletteServer.vue","../src/components/CommandPalette/CommandPaletteTag.vue","../src/components/CommandPalette/CommandPaletteTag.vue","../src/components/CommandPalette/CommandPaletteWorkspace.vue","../src/components/CommandPalette/CommandPaletteWorkspace.vue","../src/components/CommandPalette/TheCommandPalette.vue","../src/components/CommandPalette/TheCommandPalette.vue"],"sourcesContent":["export const ROUTES = [\n {\n displayName: 'Request',\n to: {\n name: 'request.root',\n },\n icon: 'ExternalLink',\n },\n {\n displayName: 'Cookies',\n to: {\n name: 'cookies.default',\n },\n icon: 'Cookie',\n },\n {\n displayName: 'Environment',\n to: {\n name: 'environment.default',\n },\n icon: 'Brackets',\n },\n {\n displayName: 'Settings',\n to: {\n name: 'settings.default',\n },\n icon: 'Settings',\n },\n // {\n // displayName: 'Servers',\n // to: {\n // name: 'servers.default',\n // },\n // icon: 'Server',\n // },\n] as const\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\n\nimport IconSelector from '@/components/IconSelector.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspace } = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst collectionName = ref('')\nconst collectionIcon = ref('interface-content-folder')\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!collectionName.value) {\n toast('Please enter a name before creating a collection.', 'error')\n return\n }\n if (!activeWorkspace.value?.uid) {\n toast('No active workspace found.', 'error')\n return\n }\n\n collectionMutators.add(\n {\n 'openapi': '3.1.0',\n 'info': {\n title: collectionName.value,\n version: '0.0.1',\n },\n 'x-scalar-icon': collectionIcon.value,\n },\n activeWorkspace.value?.uid,\n )\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!collectionName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"collectionName\"\n label=\"Collection Name\"\n placeholder=\"Collection Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <IconSelector\n v-model=\"collectionIcon\"\n placement=\"bottom-start\">\n <ScalarButton\n class=\"aspect-square h-auto px-0\"\n variant=\"outlined\">\n <LibraryIcon\n class=\"text-c-2 size-4 stroke-[1.75]\"\n :src=\"collectionIcon\" />\n </ScalarButton>\n </IconSelector>\n </template>\n <template #submit> Create Collection </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\n\nimport IconSelector from '@/components/IconSelector.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspace } = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst collectionName = ref('')\nconst collectionIcon = ref('interface-content-folder')\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!collectionName.value) {\n toast('Please enter a name before creating a collection.', 'error')\n return\n }\n if (!activeWorkspace.value?.uid) {\n toast('No active workspace found.', 'error')\n return\n }\n\n collectionMutators.add(\n {\n 'openapi': '3.1.0',\n 'info': {\n title: collectionName.value,\n version: '0.0.1',\n },\n 'x-scalar-icon': collectionIcon.value,\n },\n activeWorkspace.value?.uid,\n )\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!collectionName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"collectionName\"\n label=\"Collection Name\"\n placeholder=\"Collection Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <IconSelector\n v-model=\"collectionIcon\"\n placement=\"bottom-start\">\n <ScalarButton\n class=\"aspect-square h-auto px-0\"\n variant=\"outlined\">\n <LibraryIcon\n class=\"text-c-2 size-4 stroke-[1.75]\"\n :src=\"collectionIcon\" />\n </ScalarButton>\n </IconSelector>\n </template>\n <template #submit> Create Collection </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n} from '@scalar/components'\nimport type { Request } from '@scalar/oas-utils/entities/spec'\nimport { isDefined } from '@scalar/oas-utils/helpers'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n /** The request uid to pre-select */\n metaData?: { itemUid: string }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { activeRequest, activeWorkspace, activeWorkspaceRequests } =\n useActiveEntities()\nconst { requests, requestExampleMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst exampleName = ref('')\nconst selectedRequest = ref<Request | undefined>(\n // Ensure we pre-select the correct request\n requests[props.metaData?.itemUid ?? ''] ?? activeRequest.value,\n)\n\n/** Select request in dropdown */\nconst handleSelect = (request: Request) => (selectedRequest.value = request)\n\n/** Add a new request example */\nconst handleSubmit = () => {\n if (!exampleName.value) {\n toast('Please enter a name before creating an example.', 'error')\n return\n }\n\n if (!selectedRequest.value) {\n toast('Please select a request before creating an example.', 'error')\n return\n }\n\n const example = requestExampleMutators.add(\n selectedRequest.value,\n exampleName.value,\n )\n\n if (!example) {\n return\n }\n\n // Go to new request example\n push({\n name: 'request.examples',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Request]: selectedRequest.value.uid,\n [PathId.Examples]: example.uid,\n },\n })\n\n emits('close')\n}\n\n/** Requests for the active workspace */\nconst visibleRequests = computed<Request[]>(() =>\n activeWorkspaceRequests.value.map((uid) => requests?.[uid]).filter(isDefined),\n)\n</script>\n<template>\n <CommandActionForm\n v-if=\"selectedRequest\"\n :disabled=\"!exampleName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"exampleName\"\n label=\"Example Name\"\n placeholder=\"Example Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarDropdown\n placement=\"bottom\"\n resize>\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"handleSelect(selectedRequest)\">\n {{ selectedRequest.summary }}\n <div class=\"flex items-center gap-2\">\n <HttpMethod :method=\"selectedRequest.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"request in visibleRequests\"\n :key=\"request.uid\"\n class=\"flex h-7 w-full items-center justify-between px-1 pr-[26px]\"\n @click=\"handleSelect(request)\">\n {{ request.summary }}\n <HttpMethod :method=\"request.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </template>\n <template #submit>Create Example</template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n} from '@scalar/components'\nimport type { Request } from '@scalar/oas-utils/entities/spec'\nimport { isDefined } from '@scalar/oas-utils/helpers'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n /** The request uid to pre-select */\n metaData?: { itemUid: string }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { activeRequest, activeWorkspace, activeWorkspaceRequests } =\n useActiveEntities()\nconst { requests, requestExampleMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst exampleName = ref('')\nconst selectedRequest = ref<Request | undefined>(\n // Ensure we pre-select the correct request\n requests[props.metaData?.itemUid ?? ''] ?? activeRequest.value,\n)\n\n/** Select request in dropdown */\nconst handleSelect = (request: Request) => (selectedRequest.value = request)\n\n/** Add a new request example */\nconst handleSubmit = () => {\n if (!exampleName.value) {\n toast('Please enter a name before creating an example.', 'error')\n return\n }\n\n if (!selectedRequest.value) {\n toast('Please select a request before creating an example.', 'error')\n return\n }\n\n const example = requestExampleMutators.add(\n selectedRequest.value,\n exampleName.value,\n )\n\n if (!example) {\n return\n }\n\n // Go to new request example\n push({\n name: 'request.examples',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Request]: selectedRequest.value.uid,\n [PathId.Examples]: example.uid,\n },\n })\n\n emits('close')\n}\n\n/** Requests for the active workspace */\nconst visibleRequests = computed<Request[]>(() =>\n activeWorkspaceRequests.value.map((uid) => requests?.[uid]).filter(isDefined),\n)\n</script>\n<template>\n <CommandActionForm\n v-if=\"selectedRequest\"\n :disabled=\"!exampleName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"exampleName\"\n label=\"Example Name\"\n placeholder=\"Example Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarDropdown\n placement=\"bottom\"\n resize>\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"handleSelect(selectedRequest)\">\n {{ selectedRequest.summary }}\n <div class=\"flex items-center gap-2\">\n <HttpMethod :method=\"selectedRequest.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"request in visibleRequests\"\n :key=\"request.uid\"\n class=\"flex h-7 w-full items-center justify-between px-1 pr-[26px]\"\n @click=\"handleSelect(request)\">\n {{ request.summary }}\n <HttpMethod :method=\"request.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </template>\n <template #submit>Create Example</template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarCodeBlock,\n ScalarIcon,\n ScalarTooltip,\n useLoadingState,\n} from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useFileDialog } from '@/hooks'\nimport {\n convertPostmanToOpenApi,\n getOpenApiDocumentDetails,\n getPostmanDocumentDetails,\n isPostmanCollection,\n isUrl,\n} from '@/libs'\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\nimport WatchModeToggle from './WatchModeToggle.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { activeWorkspace, activeCollection } = useActiveEntities()\nconst { importSpecFile, importSpecFromUrl, events } = useWorkspace()\nconst { toast } = useToasts()\nconst loader = useLoadingState()\n\nconst inputContent = ref('')\nconst watchMode = ref(true)\n\nconst documentDetails = computed(() => {\n if (isPostmanCollection(inputContent.value)) {\n return getPostmanDocumentDetails(inputContent.value)\n }\n return getOpenApiDocumentDetails(inputContent.value)\n})\n\nconst documentType = computed(() =>\n documentDetails.value ? documentDetails.value.type : 'json',\n)\n\nfunction navigateToCollectionPage(collection?: { uid: string }) {\n if (!collection) {\n return\n }\n\n router.push({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collection.uid,\n },\n })\n}\n\nconst isInputUrl = computed(() => isUrl(inputContent.value))\nconst isInputDocument = computed(() => !!documentDetails.value)\n\nconst { open: openSpecFileDialog } = useFileDialog({\n onChange: (files) => {\n const file = files?.[0]\n if (file) {\n const reader = new FileReader()\n reader.onload = async (e) => {\n const text = e.target?.result as string\n try {\n if (isPostmanCollection(text)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(text),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n } else {\n const workspace = await importSpecFile(\n text,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n toast('Import successful', 'info')\n emits('close')\n } catch (error) {\n console.error(error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n }\n reader.readAsText(file)\n }\n },\n multiple: false,\n accept: '.json,.yaml,.yml',\n})\n\n// Enable watch mode if the input is a URL\nwatch(isInputUrl, (newVal) => {\n if (!newVal) {\n watchMode.value = false\n }\n})\n\n// Disable watch mode if the input is not a URL\nwatch(inputContent, (newVal) => {\n if (!isUrl(newVal)) {\n watchMode.value = false\n }\n})\n\nasync function importCollection() {\n if (!inputContent.value || loader.isLoading) {\n return\n }\n\n loader.start()\n try {\n if (isInputUrl.value) {\n const [error, workspace] = await importSpecFromUrl(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n {\n proxyUrl: activeWorkspace.value?.proxyUrl,\n watchMode: watchMode.value,\n },\n )\n\n navigateToCollectionPage(workspace?.collection)\n\n if (error) {\n toast(\n 'There was a possible CORS error while importing your spec, please make sure this server is allowed in the CORS policy of your OpenAPI document.',\n 'error',\n { timeout: 5_000 },\n )\n await loader.invalidate()\n return\n }\n } else if (isInputDocument.value) {\n if (isPostmanCollection(inputContent.value)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(inputContent.value),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n toast('Successfully converted Postman collection', 'info')\n } else {\n const workspace = await importSpecFile(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n } else {\n toast('Import failed: Invalid URL or OpenAPI document', 'error')\n await loader.invalidate()\n return\n }\n\n await loader.clear()\n\n emits('close')\n toast('Import successful', 'info')\n } catch (error) {\n console.error('[importCollection]', error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n await loader.invalidate()\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n inputContent.value = value\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!inputContent.trim()\"\n :loader\n @submit=\"importCollection\">\n <template v-if=\"!documentDetails || isUrl(inputContent)\">\n <CommandActionInput\n :modelValue=\"inputContent\"\n placeholder=\"OpenAPI/Swagger/Postman URL or cURL\"\n @onDelete=\"emits('back', $event)\"\n @update:modelValue=\"handleInput\" />\n </template>\n <template v-else>\n <!-- OpenAPI document preview -->\n <div class=\"flex justify-between\">\n <div class=\"text-c-2 min-h-8 w-full py-2 pl-12 text-center text-xs\">\n Preview\n </div>\n <ScalarButton\n class=\"hover:bg-b-2 relative ml-auto max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"ghost\"\n @click=\"inputContent = ''\">\n Clear\n </ScalarButton>\n </div>\n <ScalarCodeBlock\n v-if=\"documentDetails && !isUrl(inputContent)\"\n class=\"bg-b-2 mt-1 max-h-[40dvh] rounded border px-2 py-1 text-sm\"\n :content=\"inputContent\"\n :copy=\"false\"\n :lang=\"documentType\" />\n </template>\n <template #options>\n <div class=\"flex w-full flex-row items-center justify-between gap-3\">\n <!-- Upload -->\n <ScalarButton\n class=\"hover:bg-b-2 relative max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"openSpecFileDialog\">\n JSON, or YAML File\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"Upload\"\n size=\"md\" />\n </ScalarButton>\n\n <!-- Watch -->\n <ScalarTooltip\n :content=\"\n isInputUrl\n ? 'Watch mode automatically updates the API client when the OpenAPI URL content changes, ensuring your client remains up-to-date.'\n : 'Watch mode is only available for URL imports. When enabled it automatically updates the API client when the OpenAPI URL content changes.'\n \"\n placement=\"bottom\">\n <WatchModeToggle\n v-model=\"watchMode\"\n :disabled=\"!isInputUrl\" />\n </ScalarTooltip>\n </div>\n </template>\n <template #submit>\n Import\n <template v-if=\"isInputUrl\"> from URL </template>\n <template v-else-if=\"documentDetails && documentType\">\n <template v-if=\"documentDetails.title\">\n \"{{ documentDetails.title }}\"\n </template>\n <template v-else>\n {{ documentDetails.version }}\n </template>\n </template>\n <template v-else> Collection </template>\n </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarCodeBlock,\n ScalarIcon,\n ScalarTooltip,\n useLoadingState,\n} from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useFileDialog } from '@/hooks'\nimport {\n convertPostmanToOpenApi,\n getOpenApiDocumentDetails,\n getPostmanDocumentDetails,\n isPostmanCollection,\n isUrl,\n} from '@/libs'\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\nimport WatchModeToggle from './WatchModeToggle.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { activeWorkspace, activeCollection } = useActiveEntities()\nconst { importSpecFile, importSpecFromUrl, events } = useWorkspace()\nconst { toast } = useToasts()\nconst loader = useLoadingState()\n\nconst inputContent = ref('')\nconst watchMode = ref(true)\n\nconst documentDetails = computed(() => {\n if (isPostmanCollection(inputContent.value)) {\n return getPostmanDocumentDetails(inputContent.value)\n }\n return getOpenApiDocumentDetails(inputContent.value)\n})\n\nconst documentType = computed(() =>\n documentDetails.value ? documentDetails.value.type : 'json',\n)\n\nfunction navigateToCollectionPage(collection?: { uid: string }) {\n if (!collection) {\n return\n }\n\n router.push({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collection.uid,\n },\n })\n}\n\nconst isInputUrl = computed(() => isUrl(inputContent.value))\nconst isInputDocument = computed(() => !!documentDetails.value)\n\nconst { open: openSpecFileDialog } = useFileDialog({\n onChange: (files) => {\n const file = files?.[0]\n if (file) {\n const reader = new FileReader()\n reader.onload = async (e) => {\n const text = e.target?.result as string\n try {\n if (isPostmanCollection(text)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(text),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n } else {\n const workspace = await importSpecFile(\n text,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n toast('Import successful', 'info')\n emits('close')\n } catch (error) {\n console.error(error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n }\n reader.readAsText(file)\n }\n },\n multiple: false,\n accept: '.json,.yaml,.yml',\n})\n\n// Enable watch mode if the input is a URL\nwatch(isInputUrl, (newVal) => {\n if (!newVal) {\n watchMode.value = false\n }\n})\n\n// Disable watch mode if the input is not a URL\nwatch(inputContent, (newVal) => {\n if (!isUrl(newVal)) {\n watchMode.value = false\n }\n})\n\nasync function importCollection() {\n if (!inputContent.value || loader.isLoading) {\n return\n }\n\n loader.start()\n try {\n if (isInputUrl.value) {\n const [error, workspace] = await importSpecFromUrl(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n {\n proxyUrl: activeWorkspace.value?.proxyUrl,\n watchMode: watchMode.value,\n },\n )\n\n navigateToCollectionPage(workspace?.collection)\n\n if (error) {\n toast(\n 'There was a possible CORS error while importing your spec, please make sure this server is allowed in the CORS policy of your OpenAPI document.',\n 'error',\n { timeout: 5_000 },\n )\n await loader.invalidate()\n return\n }\n } else if (isInputDocument.value) {\n if (isPostmanCollection(inputContent.value)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(inputContent.value),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n toast('Successfully converted Postman collection', 'info')\n } else {\n const workspace = await importSpecFile(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n } else {\n toast('Import failed: Invalid URL or OpenAPI document', 'error')\n await loader.invalidate()\n return\n }\n\n await loader.clear()\n\n emits('close')\n toast('Import successful', 'info')\n } catch (error) {\n console.error('[importCollection]', error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n await loader.invalidate()\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n inputContent.value = value\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!inputContent.trim()\"\n :loader\n @submit=\"importCollection\">\n <template v-if=\"!documentDetails || isUrl(inputContent)\">\n <CommandActionInput\n :modelValue=\"inputContent\"\n placeholder=\"OpenAPI/Swagger/Postman URL or cURL\"\n @onDelete=\"emits('back', $event)\"\n @update:modelValue=\"handleInput\" />\n </template>\n <template v-else>\n <!-- OpenAPI document preview -->\n <div class=\"flex justify-between\">\n <div class=\"text-c-2 min-h-8 w-full py-2 pl-12 text-center text-xs\">\n Preview\n </div>\n <ScalarButton\n class=\"hover:bg-b-2 relative ml-auto max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"ghost\"\n @click=\"inputContent = ''\">\n Clear\n </ScalarButton>\n </div>\n <ScalarCodeBlock\n v-if=\"documentDetails && !isUrl(inputContent)\"\n class=\"bg-b-2 mt-1 max-h-[40dvh] rounded border px-2 py-1 text-sm\"\n :content=\"inputContent\"\n :copy=\"false\"\n :lang=\"documentType\" />\n </template>\n <template #options>\n <div class=\"flex w-full flex-row items-center justify-between gap-3\">\n <!-- Upload -->\n <ScalarButton\n class=\"hover:bg-b-2 relative max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"openSpecFileDialog\">\n JSON, or YAML File\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"Upload\"\n size=\"md\" />\n </ScalarButton>\n\n <!-- Watch -->\n <ScalarTooltip\n :content=\"\n isInputUrl\n ? 'Watch mode automatically updates the API client when the OpenAPI URL content changes, ensuring your client remains up-to-date.'\n : 'Watch mode is only available for URL imports. When enabled it automatically updates the API client when the OpenAPI URL content changes.'\n \"\n placement=\"bottom\">\n <WatchModeToggle\n v-model=\"watchMode\"\n :disabled=\"!isInputUrl\" />\n </ScalarTooltip>\n </div>\n </template>\n <template #submit>\n Import\n <template v-if=\"isInputUrl\"> from URL </template>\n <template v-else-if=\"documentDetails && documentType\">\n <template v-if=\"documentDetails.title\">\n \"{{ documentDetails.title }}\"\n </template>\n <template v-else>\n {{ documentDetails.version }}\n </template>\n </template>\n <template v-else> Collection </template>\n </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarListbox,\n type ScalarComboboxOption,\n} from '@scalar/components'\nimport type {\n RequestMethod,\n RequestPayload,\n} from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\ntype ExtendedRequestPayload = RequestPayload & {\n url?: string\n}\n\nconst { metaData } = defineProps<{\n metaData: {\n parsedCurl: ExtendedRequestPayload\n collectionUid: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst workspaceContext = useWorkspace()\n\nconst { activeWorkspaceCollections, activeCollection, activeWorkspace } =\n useActiveEntities()\nconst { requestMutators, serverMutators, servers } = workspaceContext\n\nconst selectedServerUid = ref('')\nconst router = useRouter()\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n })),\n)\n\nconst selectedCollection = ref<ScalarComboboxOption | undefined>(\n metaData.collectionUid\n ? collections.value.find(\n (collection) => collection.id === metaData.collectionUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nfunction createRequestFromCurl({ collectionUid }: { collectionUid: string }) {\n if (!metaData.parsedCurl) {\n return\n }\n\n const collection = activeWorkspaceCollections.value.find(\n (c) => c.uid === collectionUid,\n )\n\n if (!collection) {\n return\n }\n\n const isDrafts = collection?.info?.title === 'Drafts'\n\n // Prevent adding servers to drafts\n if (!isDrafts && metaData.parsedCurl.servers) {\n // Find existing server to avoid duplication\n const existingServer = Object.values(servers).find(\n (s) => s.url === metaData.parsedCurl?.servers?.[0],\n )\n if (existingServer) {\n selectedServerUid.value = existingServer.uid\n } else {\n selectedServerUid.value = serverMutators.add(\n { url: metaData.parsedCurl.servers[0] ?? '/' },\n collection.uid,\n ).uid\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: metaData.parsedCurl.servers[0] ?? '/' },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n }\n }\n\n // Add the request and use the url if it's a draft as a path\n const newRequest = requestMutators.add(\n {\n summary: isDrafts\n ? metaData.parsedCurl?.url?.replace(REGEX.PROTOCOL, '')\n : metaData.parsedCurl?.path,\n path: isDrafts ? metaData.parsedCurl?.url : metaData.parsedCurl?.path,\n method: metaData.parsedCurl?.method,\n parameters: metaData.parsedCurl?.parameters,\n selectedServerUid: isDrafts ? undefined : selectedServerUid.value,\n requestBody: metaData.parsedCurl?.requestBody,\n },\n collection.uid,\n )\n\n if (newRequest && activeWorkspace.value?.uid) {\n router.push({\n name: 'request',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: collection.uid,\n [PathId.Request]: newRequest.uid,\n },\n })\n }\n\n emits('close')\n}\n\nconst handleImportClick = () => {\n createRequestFromCurl({\n collectionUid: selectedCollection.value?.id ?? '',\n })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <div class=\"text-c-2 flex-center py-1.5 text-sm\">Import cURL</div>\n <CommandActionForm\n ref=\"wrapper-ref\"\n class=\"mt-1.5 min-h-fit\"\n @submit=\"handleImportClick\">\n <div\n class=\"flex h-9 flex-row items-center gap-2 rounded border p-[3px] text-sm\">\n <div class=\"flex h-full\">\n <HttpMethod\n :isEditable=\"false\"\n isSquare\n :method=\"(metaData.parsedCurl?.method as RequestMethod) || 'get'\" />\n </div>\n <span class=\"scroll-timeline-x whitespace-nowrap\">\n {{ metaData.parsedCurl?.servers?.[0] || ''\n }}{{ metaData.parsedCurl?.path || '' }}\n </span>\n </div>\n\n <template #options>\n <div class=\"flex\">\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span\n class=\"whitespace-nowrap\"\n :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedCollection\n ? selectedCollection.label\n : 'Select Collection'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </div>\n </template>\n\n <template #submit>\n <span @click=\"handleImportClick\">Import Request</span>\n </template>\n </CommandActionForm>\n</template>\n<style scoped>\n.scroll-timeline-x {\n overflow: auto;\n scroll-timeline: --scroll-timeline x;\n /* Firefox supports */\n scroll-timeline: --scroll-timeline horizontal;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarListbox,\n type ScalarComboboxOption,\n} from '@scalar/components'\nimport type {\n RequestMethod,\n RequestPayload,\n} from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\ntype ExtendedRequestPayload = RequestPayload & {\n url?: string\n}\n\nconst { metaData } = defineProps<{\n metaData: {\n parsedCurl: ExtendedRequestPayload\n collectionUid: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst workspaceContext = useWorkspace()\n\nconst { activeWorkspaceCollections, activeCollection, activeWorkspace } =\n useActiveEntities()\nconst { requestMutators, serverMutators, servers } = workspaceContext\n\nconst selectedServerUid = ref('')\nconst router = useRouter()\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n })),\n)\n\nconst selectedCollection = ref<ScalarComboboxOption | undefined>(\n metaData.collectionUid\n ? collections.value.find(\n (collection) => collection.id === metaData.collectionUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nfunction createRequestFromCurl({ collectionUid }: { collectionUid: string }) {\n if (!metaData.parsedCurl) {\n return\n }\n\n const collection = activeWorkspaceCollections.value.find(\n (c) => c.uid === collectionUid,\n )\n\n if (!collection) {\n return\n }\n\n const isDrafts = collection?.info?.title === 'Drafts'\n\n // Prevent adding servers to drafts\n if (!isDrafts && metaData.parsedCurl.servers) {\n // Find existing server to avoid duplication\n const existingServer = Object.values(servers).find(\n (s) => s.url === metaData.parsedCurl?.servers?.[0],\n )\n if (existingServer) {\n selectedServerUid.value = existingServer.uid\n } else {\n selectedServerUid.value = serverMutators.add(\n { url: metaData.parsedCurl.servers[0] ?? '/' },\n collection.uid,\n ).uid\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: metaData.parsedCurl.servers[0] ?? '/' },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n }\n }\n\n // Add the request and use the url if it's a draft as a path\n const newRequest = requestMutators.add(\n {\n summary: isDrafts\n ? metaData.parsedCurl?.url?.replace(REGEX.PROTOCOL, '')\n : metaData.parsedCurl?.path,\n path: isDrafts ? metaData.parsedCurl?.url : metaData.parsedCurl?.path,\n method: metaData.parsedCurl?.method,\n parameters: metaData.parsedCurl?.parameters,\n selectedServerUid: isDrafts ? undefined : selectedServerUid.value,\n requestBody: metaData.parsedCurl?.requestBody,\n },\n collection.uid,\n )\n\n if (newRequest && activeWorkspace.value?.uid) {\n router.push({\n name: 'request',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: collection.uid,\n [PathId.Request]: newRequest.uid,\n },\n })\n }\n\n emits('close')\n}\n\nconst handleImportClick = () => {\n createRequestFromCurl({\n collectionUid: selectedCollection.value?.id ?? '',\n })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <div class=\"text-c-2 flex-center py-1.5 text-sm\">Import cURL</div>\n <CommandActionForm\n ref=\"wrapper-ref\"\n class=\"mt-1.5 min-h-fit\"\n @submit=\"handleImportClick\">\n <div\n class=\"flex h-9 flex-row items-center gap-2 rounded border p-[3px] text-sm\">\n <div class=\"flex h-full\">\n <HttpMethod\n :isEditable=\"false\"\n isSquare\n :method=\"(metaData.parsedCurl?.method as RequestMethod) || 'get'\" />\n </div>\n <span class=\"scroll-timeline-x whitespace-nowrap\">\n {{ metaData.parsedCurl?.servers?.[0] || ''\n }}{{ metaData.parsedCurl?.path || '' }}\n </span>\n </div>\n\n <template #options>\n <div class=\"flex\">\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span\n class=\"whitespace-nowrap\"\n :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedCollection\n ? selectedCollection.label\n : 'Select Collection'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </div>\n </template>\n\n <template #submit>\n <span @click=\"handleImportClick\">Import Request</span>\n </template>\n </CommandActionForm>\n</template>\n<style scoped>\n.scroll-timeline-x {\n overflow: auto;\n scroll-timeline: --scroll-timeline x;\n /* Firefox supports */\n scroll-timeline: --scroll-timeline horizontal;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n metaData?: {\n itemUid?: string\n parentUid?: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { toast } = useToasts()\n\nconst { activeCollection, activeWorkspaceCollections } = useActiveEntities()\nconst {\n collectionMutators,\n serverMutators,\n events,\n collections: _collections,\n} = useWorkspace()\n\nconst url = ref('')\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.flatMap((collection) =>\n collection.info?.title === 'Drafts'\n ? []\n : {\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n },\n ),\n)\n\n/** Currently selected collection with a reasonable default */\nconst selectedCollection = ref(\n props.metaData\n ? collections.value.find(\n (collection) =>\n collection.id === props.metaData?.itemUid ||\n collection.id === props.metaData?.parentUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!url.value.trim()) {\n toast('Please enter a valid url before creating a server.', 'error')\n return\n }\n const collection = _collections[selectedCollection.value?.id ?? '']\n if (!collection) {\n toast('Please select a collection before creating a server.', 'error')\n return\n }\n\n const server = serverMutators.add({ url: url.value }, collection.uid)\n\n // Select the server\n collectionMutators.edit(collection.uid, 'selectedServerUid', server.uid)\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: url.value },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n\n // Redirect to the server\n router.push({\n name: 'collection.servers.edit',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Servers]: server.uid,\n },\n })\n\n emits('close')\n}\n\nconst redirectToCreateCollection = () => {\n events.commandPalette.emit({ commandName: 'Create Collection' })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <CommandActionForm\n ref=\"wrapper-ref\"\n :disabled=\"!url.trim() || !selectedCollection\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"url\"\n label=\"Server URL\"\n placeholder=\"https://void.scalar.com\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n v-if=\"collections.length > 0\"\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n <ScalarButton\n v-else\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"redirectToCreateCollection\">\n <span class=\"text-c-1\">Create Collection</span>\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Server </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n metaData?: {\n itemUid?: string\n parentUid?: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { toast } = useToasts()\n\nconst { activeCollection, activeWorkspaceCollections } = useActiveEntities()\nconst {\n collectionMutators,\n serverMutators,\n events,\n collections: _collections,\n} = useWorkspace()\n\nconst url = ref('')\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.flatMap((collection) =>\n collection.info?.title === 'Drafts'\n ? []\n : {\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n },\n ),\n)\n\n/** Currently selected collection with a reasonable default */\nconst selectedCollection = ref(\n props.metaData\n ? collections.value.find(\n (collection) =>\n collection.id === props.metaData?.itemUid ||\n collection.id === props.metaData?.parentUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!url.value.trim()) {\n toast('Please enter a valid url before creating a server.', 'error')\n return\n }\n const collection = _collections[selectedCollection.value?.id ?? '']\n if (!collection) {\n toast('Please select a collection before creating a server.', 'error')\n return\n }\n\n const server = serverMutators.add({ url: url.value }, collection.uid)\n\n // Select the server\n collectionMutators.edit(collection.uid, 'selectedServerUid', server.uid)\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: url.value },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n\n // Redirect to the server\n router.push({\n name: 'collection.servers.edit',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Servers]: server.uid,\n },\n })\n\n emits('close')\n}\n\nconst redirectToCreateCollection = () => {\n events.commandPalette.emit({ commandName: 'Create Collection' })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <CommandActionForm\n ref=\"wrapper-ref\"\n :disabled=\"!url.trim() || !selectedCollection\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"url\"\n label=\"Server URL\"\n placeholder=\"https://void.scalar.com\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n v-if=\"collections.length > 0\"\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n <ScalarButton\n v-else\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"redirectToCreateCollection\">\n <span class=\"text-c-1\">Create Collection</span>\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Server </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\n\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspaceCollections, activeCollection } = useActiveEntities()\nconst { tagMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst availableCollections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? '',\n })),\n)\n\nconst name = ref('')\nconst selectedCollection = ref(\n availableCollections.value.find(\n (option) => option.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!name.value) {\n toast('Please enter a name before creating a tag.', 'error')\n return\n }\n if (!name.value || !selectedCollection.value) {\n return\n }\n\n const tag = tagMutators.add(\n {\n name: name.value,\n },\n selectedCollection.value.id,\n )\n if (tag) {\n emits('close')\n }\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!name.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"name\"\n label=\"Tag Name\"\n placeholder=\"Tag Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"availableCollections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Tag </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\n\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspaceCollections, activeCollection } = useActiveEntities()\nconst { tagMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst availableCollections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? '',\n })),\n)\n\nconst name = ref('')\nconst selectedCollection = ref(\n availableCollections.value.find(\n (option) => option.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!name.value) {\n toast('Please enter a name before creating a tag.', 'error')\n return\n }\n if (!name.value || !selectedCollection.value) {\n return\n }\n\n const tag = tagMutators.add(\n {\n name: name.value,\n },\n selectedCollection.value.id,\n )\n if (tag) {\n emits('close')\n }\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!name.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"name\"\n label=\"Tag Name\"\n placeholder=\"Tag Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"availableCollections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Tag </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useWorkspace } from '@/store'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { toast } = useToasts()\nconst { workspaceMutators } = useWorkspace()\nconst workspaceName = ref('')\n\nconst handleSubmit = () => {\n if (!workspaceName.value.trim()) {\n toast('Please enter a name before creating a workspace.', 'error')\n return\n }\n\n const workspace = workspaceMutators.add({\n name: workspaceName.value,\n })\n\n push({\n name: 'workspace',\n params: {\n workspace: workspace.uid,\n },\n })\n\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!workspaceName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"workspaceName\"\n label=\"Workspace Name\"\n placeholder=\"Workspace Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #submit>Create Workspace</template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useWorkspace } from '@/store'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { toast } = useToasts()\nconst { workspaceMutators } = useWorkspace()\nconst workspaceName = ref('')\n\nconst handleSubmit = () => {\n if (!workspaceName.value.trim()) {\n toast('Please enter a name before creating a workspace.', 'error')\n return\n }\n\n const workspace = workspaceMutators.add({\n name: workspaceName.value,\n })\n\n push({\n name: 'workspace',\n params: {\n workspace: workspace.uid,\n },\n })\n\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!workspaceName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"workspaceName\"\n label=\"Workspace Name\"\n placeholder=\"Workspace Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #submit>Create Workspace</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\n\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandPaletteCollection from './CommandPaletteCollection.vue'\nimport CommandPaletteExample from './CommandPaletteExample.vue'\nimport CommandPaletteImport from './CommandPaletteImport.vue'\nimport CommandPaletteImportCurl from './CommandPaletteImportCurl.vue'\nimport CommandPaletteServer from './CommandPaletteServer.vue'\nimport CommandPaletteTag from './CommandPaletteTag.vue'\nimport CommandPaletteWorkspace from './CommandPaletteWorkspace.vue'\n\n/**\n * The Command Palette\n *\n * This component is a singleton so should only exist in our app once we will use the event bus to trigger it\n */\nexport default {\n name: 'TheCommandPalette',\n}\n\nconst PaletteComponents = {\n 'Import from OpenAPI/Swagger/Postman/cURL': CommandPaletteImport,\n 'Create Request': '',\n 'Create Workspace': CommandPaletteWorkspace,\n 'Add Tag': CommandPaletteTag,\n 'Add Server': CommandPaletteServer,\n 'Create Collection': CommandPaletteCollection,\n 'Add Example': CommandPaletteExample,\n 'Import from cURL': CommandPaletteImportCurl,\n} as const\n\n/** Infer the types from the commands */\ntype CommandNames = keyof typeof PaletteComponents\n\nexport type CommandPaletteEvent = {\n /** The command name which matches with the command palette */\n commandName?: CommandNames\n /** Any extra metadata we want to pass to the command palettes */\n metaData?: Record<string, any>\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { Dialog, DialogPanel, DialogTitle } from '@headlessui/vue'\nimport { ScalarIcon, useModal } from '@scalar/components'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { ROUTES } from '@/constants'\nimport type { HotKeyEvent } from '@/libs'\n\nconst modalState = useModal()\nconst router = useRouter()\nconst { activeWorkspace, activeWorkspaceCollections, activeCollection } =\n useActiveEntities()\nconst { events, requestMutators } = useWorkspace()\n\n/** Available Commands for the Command Palette */\nconst availableCommands = [\n {\n label: '',\n commands: [\n {\n name: 'Import from OpenAPI/Swagger/Postman/cURL',\n icon: 'Import',\n },\n {\n name: 'Create Request',\n icon: 'ExternalLink',\n },\n {\n name: 'Create Collection',\n icon: 'Collection',\n },\n {\n name: 'Add Tag',\n icon: 'Folder',\n },\n {\n name: 'Add Example',\n icon: 'Example',\n },\n {\n name: 'Add Server',\n icon: 'Server',\n },\n ],\n },\n {\n label: 'More Actions',\n commands: [\n {\n name: 'Create Workspace',\n icon: 'Workspace',\n },\n {\n name: 'Add Environment',\n icon: 'Brackets',\n path: {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openEnvironmentModal: 'true' },\n },\n },\n {\n name: 'Add Cookie',\n icon: 'Cookie',\n path: {\n name: 'cookies.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openCookieModal: 'true' },\n },\n },\n ],\n },\n {\n label: 'Pages',\n commands: ROUTES.map((route) => ({\n name: route.displayName,\n icon: route.icon,\n path: router.resolve({\n ...route.to,\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n }).href,\n })),\n },\n] as const\n\ntype Command = (typeof availableCommands)[number]['commands'][number]\n\n/** Additional metadata for the command palettes */\nconst metaData = ref<Record<string, any> | undefined>()\nconst commandQuery = ref('')\nconst activeCommand = ref<keyof typeof PaletteComponents | null>(null)\nconst selectedSearchResult = ref<number>(-1)\nconst commandRefs = ref<HTMLElement[]>([])\n\nconst searchResultsWithPlaceholderResults = computed(() =>\n availableCommands.reduce((acc, group) => {\n const filteredGroupCommands = group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.value.toLowerCase()),\n )\n return [...acc, ...filteredGroupCommands]\n }, [] as Command[]),\n)\n\n/** Reset state on close */\nconst closeHandler = () => {\n modalState.hide()\n commandQuery.value = ''\n activeCommand.value = null\n selectedSearchResult.value = -1\n}\n\n/** Reset state on back */\nconst backHandler = (event: KeyboardEvent) => {\n // Prevent delete event from removing query command character\n if (commandQuery.value !== '') {\n event?.preventDefault()\n }\n activeCommand.value = null\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Handle execution of the command, some have routes while others show another palette */\nconst executeCommand = (\n command: (typeof availableCommands)[number]['commands'][number],\n) => {\n if ('path' in command) {\n router.push(command.path)\n closeHandler()\n } else if (command.name === 'Create Request') {\n const draftsCollection = activeWorkspaceCollections.value.find(\n (collection: Collection) => collection.info?.title === 'Drafts',\n )\n\n if (draftsCollection) {\n const newRequest = requestMutators.add({}, draftsCollection.uid)\n\n if (newRequest) {\n router.push({\n name: 'request',\n params: {\n workspace: activeWorkspace.value?.uid,\n request: newRequest.uid,\n },\n })\n\n closeHandler()\n\n nextTick(() => {\n events.hotKeys.emit({\n focusAddressBar: new KeyboardEvent('keydown', { key: 'l' }),\n })\n })\n }\n } else {\n closeHandler()\n }\n } else {\n activeCommand.value = command.name\n }\n}\n\nconst commandInputRef = ref<HTMLInputElement | null>()\n\n/** Handles opening the command pallete to the correct palette */\nconst openCommandPalette = ({\n commandName,\n metaData: _metaData,\n}: CommandPaletteEvent = {}) => {\n activeCommand.value = commandName ?? null\n metaData.value = _metaData\n modalState.show()\n\n // Need nextTick to focus after a click since focus goes to the button\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Focus on first result when conducting a search */\nwatch(commandQuery, (newQuery) => {\n if (newQuery && searchResultsWithPlaceholderResults.value.length > 0) {\n selectedSearchResult.value = 0\n }\n})\n\n/** Handle up and down arrow keys in the menu */\nconst handleArrowKey = (direction: 'up' | 'down', ev: KeyboardEvent) => {\n if (!modalState.open) return\n ev.preventDefault()\n\n const offset = direction === 'up' ? -1 : 1\n const length = searchResultsWithPlaceholderResults.value.length\n\n // Ensures we loop around the array by using the remainder\n selectedSearchResult.value =\n (selectedSearchResult.value + offset + length) % length\n\n nextTick(() => {\n const container = commandInputRef.value?.closest('.custom-scroll')\n if (!container) return\n\n // Scroll to the top if the first command is selected\n if (selectedSearchResult.value === 0) {\n container.scrollTop = 0\n return\n }\n\n // Scroll to the selected command\n const commandElement = commandRefs.value[selectedSearchResult.value]\n if (!commandElement) return\n\n // Set the height of the sticky header and the bottom margin\n const stickyHeaderHeight =\n (container.querySelector('.sticky')?.clientHeight || 0) + 16\n const bottomMargin = 6\n\n // Get the top and bottom of the command element\n const elementTop = commandElement.offsetTop\n const elementBottom = elementTop + commandElement.clientHeight\n\n // Get the top and bottom of the viewport\n const viewportTop = container.scrollTop + stickyHeaderHeight\n const viewportBottom =\n container.scrollTop + container.clientHeight - bottomMargin\n\n // Scroll to the command if it's not in the viewport\n if (elementTop < viewportTop) {\n container.scrollTop = elementTop - stickyHeaderHeight\n } else if (elementBottom > viewportBottom) {\n container.scrollTop =\n elementBottom - container.clientHeight + bottomMargin\n }\n })\n}\n\n/** The currently selected command */\nconst selectedCommand = computed(\n () => searchResultsWithPlaceholderResults.value[selectedSearchResult.value],\n)\n\n/** Handle enter keydown in the menu */\nconst handleSelect = (ev: KeyboardEvent) => {\n if (!selectedCommand.value || activeCommand.value) return\n ev.preventDefault()\n ev.stopPropagation()\n executeCommand(selectedCommand.value)\n}\n\n/** Handle hotkeys */\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (!modalState.open) return\n if (event?.closeModal) closeHandler()\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n commandQuery.value = value\n}\n\nonMounted(() => {\n events.commandPalette.on(openCommandPalette)\n events.hotKeys.on(handleHotKey)\n})\nonBeforeUnmount(() => {\n events.commandPalette.off(openCommandPalette)\n events.hotKeys.off(handleHotKey)\n})\n</script>\n<template>\n <Dialog\n :open=\"modalState.open\"\n @close=\"closeHandler()\">\n <div class=\"commandmenu-overlay z-overlay\" />\n <DialogPanel class=\"commandmenu z-overlay flex flex-col\">\n <DialogTitle class=\"sr-only\">API Client Command Menu</DialogTitle>\n <!-- Default palette (command list) -->\n <div\n v-if=\"!activeCommand\"\n class=\"custom-scroll max-h-[50dvh] min-h-0 flex-1 rounded-lg p-1.5\">\n <div\n class=\"bg-b-2 focus-within:bg-b-1 sticky top-0 flex items-center rounded-md border border-transparent pl-2 shadow-[0_-8px_0_8px_var(--scalar-background-1),0_0_8px_8px_var(--scalar-background-1)] focus-within:border-(--scalar-background-3)\">\n <label for=\"commandmenu\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n icon=\"Search\"\n size=\"md\"\n thickness=\"1.5\" />\n </label>\n <input\n id=\"commandmenu\"\n ref=\"commandInputRef\"\n autocomplete=\"off\"\n autofocus\n class=\"w-full rounded border-none bg-none py-1.5 text-sm focus:outline-none\"\n placeholder=\"Search commands...\"\n type=\"text\"\n :value=\"commandQuery\"\n @input=\"handleInput(($event.target as HTMLInputElement).value)\"\n @keydown.down.stop=\"handleArrowKey('down', $event)\"\n @keydown.enter.stop=\"handleSelect\"\n @keydown.up.stop=\"handleArrowKey('up', $event)\" />\n </div>\n <template\n v-for=\"group in availableCommands\"\n :key=\"group.label\">\n <div\n v-show=\"\n group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n ).length > 0\n \"\n class=\"text-c-3 mt-2 mb-1 px-2 text-xs font-medium\">\n {{ group.label }}\n </div>\n <div\n v-for=\"command in group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n )\"\n :key=\"command.name\"\n :ref=\"\n (el) => {\n if (el) {\n const index = searchResultsWithPlaceholderResults.findIndex(\n (c) => c.name === command.name,\n )\n if (index !== -1) commandRefs[index] = el as HTMLElement\n }\n }\n \"\n class=\"commandmenu-item hover:bg-b-2 flex cursor-pointer items-center rounded px-2 py-1.5 text-sm\"\n :class=\"{\n 'bg-b-2': command.name === selectedCommand?.name,\n }\"\n @click=\"executeCommand(command)\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n :icon=\"command.icon\"\n size=\"md\"\n thickness=\"1.5\" />\n {{ command.name }}\n </div>\n </template>\n <div\n v-if=\"!searchResultsWithPlaceholderResults.length\"\n class=\"text-c-3 p-2 pt-3 text-center text-sm\">\n No commands found\n </div>\n </div>\n <!-- Specific command palette -->\n <div\n v-else\n class=\"flex-1 p-1.5\">\n <button\n class=\"hover:bg-b-3 text-c-3 active:text-c-1 absolute z-1 mt-[0.5px] rounded p-1.5\"\n type=\"button\"\n @click=\"activeCommand = null\">\n <ScalarIcon\n icon=\"ChevronLeft\"\n size=\"md\"\n thickness=\"1.5\" />\n </button>\n <component\n :is=\"PaletteComponents[activeCommand]\"\n v-bind=\"metaData ? { metaData: metaData } : {}\"\n @back=\"backHandler($event)\"\n @close=\"closeHandler\" />\n </div>\n </DialogPanel>\n </Dialog>\n</template>\n<style scoped>\n/* command menu */\n.commandmenu {\n box-shadow: var(--scalar-shadow-2);\n border-radius: var(--scalar-radius-lg);\n background-color: var(--scalar-background-1);\n max-height: 60dvh;\n width: 100%;\n max-width: 580px;\n margin: 12px;\n position: fixed;\n left: 50%;\n top: 150px;\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n animation: fadeincommandmenu ease-in-out 0.3s forwards;\n animation-delay: 0.1s;\n}\n.commandmenu-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.2);\n animation: fadeincommand ease-in-out 0.3s forwards;\n cursor: pointer;\n}\n@keyframes fadeincommand {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes fadeincommandmenu {\n 0% {\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n }\n 100% {\n opacity: 1;\n transform: translate3d(-50%, 0, 0);\n }\n}\n</style>\n","<script lang=\"ts\">\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\n\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandPaletteCollection from './CommandPaletteCollection.vue'\nimport CommandPaletteExample from './CommandPaletteExample.vue'\nimport CommandPaletteImport from './CommandPaletteImport.vue'\nimport CommandPaletteImportCurl from './CommandPaletteImportCurl.vue'\nimport CommandPaletteServer from './CommandPaletteServer.vue'\nimport CommandPaletteTag from './CommandPaletteTag.vue'\nimport CommandPaletteWorkspace from './CommandPaletteWorkspace.vue'\n\n/**\n * The Command Palette\n *\n * This component is a singleton so should only exist in our app once we will use the event bus to trigger it\n */\nexport default {\n name: 'TheCommandPalette',\n}\n\nconst PaletteComponents = {\n 'Import from OpenAPI/Swagger/Postman/cURL': CommandPaletteImport,\n 'Create Request': '',\n 'Create Workspace': CommandPaletteWorkspace,\n 'Add Tag': CommandPaletteTag,\n 'Add Server': CommandPaletteServer,\n 'Create Collection': CommandPaletteCollection,\n 'Add Example': CommandPaletteExample,\n 'Import from cURL': CommandPaletteImportCurl,\n} as const\n\n/** Infer the types from the commands */\ntype CommandNames = keyof typeof PaletteComponents\n\nexport type CommandPaletteEvent = {\n /** The command name which matches with the command palette */\n commandName?: CommandNames\n /** Any extra metadata we want to pass to the command palettes */\n metaData?: Record<string, any>\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { Dialog, DialogPanel, DialogTitle } from '@headlessui/vue'\nimport { ScalarIcon, useModal } from '@scalar/components'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { ROUTES } from '@/constants'\nimport type { HotKeyEvent } from '@/libs'\n\nconst modalState = useModal()\nconst router = useRouter()\nconst { activeWorkspace, activeWorkspaceCollections, activeCollection } =\n useActiveEntities()\nconst { events, requestMutators } = useWorkspace()\n\n/** Available Commands for the Command Palette */\nconst availableCommands = [\n {\n label: '',\n commands: [\n {\n name: 'Import from OpenAPI/Swagger/Postman/cURL',\n icon: 'Import',\n },\n {\n name: 'Create Request',\n icon: 'ExternalLink',\n },\n {\n name: 'Create Collection',\n icon: 'Collection',\n },\n {\n name: 'Add Tag',\n icon: 'Folder',\n },\n {\n name: 'Add Example',\n icon: 'Example',\n },\n {\n name: 'Add Server',\n icon: 'Server',\n },\n ],\n },\n {\n label: 'More Actions',\n commands: [\n {\n name: 'Create Workspace',\n icon: 'Workspace',\n },\n {\n name: 'Add Environment',\n icon: 'Brackets',\n path: {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openEnvironmentModal: 'true' },\n },\n },\n {\n name: 'Add Cookie',\n icon: 'Cookie',\n path: {\n name: 'cookies.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openCookieModal: 'true' },\n },\n },\n ],\n },\n {\n label: 'Pages',\n commands: ROUTES.map((route) => ({\n name: route.displayName,\n icon: route.icon,\n path: router.resolve({\n ...route.to,\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n }).href,\n })),\n },\n] as const\n\ntype Command = (typeof availableCommands)[number]['commands'][number]\n\n/** Additional metadata for the command palettes */\nconst metaData = ref<Record<string, any> | undefined>()\nconst commandQuery = ref('')\nconst activeCommand = ref<keyof typeof PaletteComponents | null>(null)\nconst selectedSearchResult = ref<number>(-1)\nconst commandRefs = ref<HTMLElement[]>([])\n\nconst searchResultsWithPlaceholderResults = computed(() =>\n availableCommands.reduce((acc, group) => {\n const filteredGroupCommands = group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.value.toLowerCase()),\n )\n return [...acc, ...filteredGroupCommands]\n }, [] as Command[]),\n)\n\n/** Reset state on close */\nconst closeHandler = () => {\n modalState.hide()\n commandQuery.value = ''\n activeCommand.value = null\n selectedSearchResult.value = -1\n}\n\n/** Reset state on back */\nconst backHandler = (event: KeyboardEvent) => {\n // Prevent delete event from removing query command character\n if (commandQuery.value !== '') {\n event?.preventDefault()\n }\n activeCommand.value = null\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Handle execution of the command, some have routes while others show another palette */\nconst executeCommand = (\n command: (typeof availableCommands)[number]['commands'][number],\n) => {\n if ('path' in command) {\n router.push(command.path)\n closeHandler()\n } else if (command.name === 'Create Request') {\n const draftsCollection = activeWorkspaceCollections.value.find(\n (collection: Collection) => collection.info?.title === 'Drafts',\n )\n\n if (draftsCollection) {\n const newRequest = requestMutators.add({}, draftsCollection.uid)\n\n if (newRequest) {\n router.push({\n name: 'request',\n params: {\n workspace: activeWorkspace.value?.uid,\n request: newRequest.uid,\n },\n })\n\n closeHandler()\n\n nextTick(() => {\n events.hotKeys.emit({\n focusAddressBar: new KeyboardEvent('keydown', { key: 'l' }),\n })\n })\n }\n } else {\n closeHandler()\n }\n } else {\n activeCommand.value = command.name\n }\n}\n\nconst commandInputRef = ref<HTMLInputElement | null>()\n\n/** Handles opening the command pallete to the correct palette */\nconst openCommandPalette = ({\n commandName,\n metaData: _metaData,\n}: CommandPaletteEvent = {}) => {\n activeCommand.value = commandName ?? null\n metaData.value = _metaData\n modalState.show()\n\n // Need nextTick to focus after a click since focus goes to the button\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Focus on first result when conducting a search */\nwatch(commandQuery, (newQuery) => {\n if (newQuery && searchResultsWithPlaceholderResults.value.length > 0) {\n selectedSearchResult.value = 0\n }\n})\n\n/** Handle up and down arrow keys in the menu */\nconst handleArrowKey = (direction: 'up' | 'down', ev: KeyboardEvent) => {\n if (!modalState.open) return\n ev.preventDefault()\n\n const offset = direction === 'up' ? -1 : 1\n const length = searchResultsWithPlaceholderResults.value.length\n\n // Ensures we loop around the array by using the remainder\n selectedSearchResult.value =\n (selectedSearchResult.value + offset + length) % length\n\n nextTick(() => {\n const container = commandInputRef.value?.closest('.custom-scroll')\n if (!container) return\n\n // Scroll to the top if the first command is selected\n if (selectedSearchResult.value === 0) {\n container.scrollTop = 0\n return\n }\n\n // Scroll to the selected command\n const commandElement = commandRefs.value[selectedSearchResult.value]\n if (!commandElement) return\n\n // Set the height of the sticky header and the bottom margin\n const stickyHeaderHeight =\n (container.querySelector('.sticky')?.clientHeight || 0) + 16\n const bottomMargin = 6\n\n // Get the top and bottom of the command element\n const elementTop = commandElement.offsetTop\n const elementBottom = elementTop + commandElement.clientHeight\n\n // Get the top and bottom of the viewport\n const viewportTop = container.scrollTop + stickyHeaderHeight\n const viewportBottom =\n container.scrollTop + container.clientHeight - bottomMargin\n\n // Scroll to the command if it's not in the viewport\n if (elementTop < viewportTop) {\n container.scrollTop = elementTop - stickyHeaderHeight\n } else if (elementBottom > viewportBottom) {\n container.scrollTop =\n elementBottom - container.clientHeight + bottomMargin\n }\n })\n}\n\n/** The currently selected command */\nconst selectedCommand = computed(\n () => searchResultsWithPlaceholderResults.value[selectedSearchResult.value],\n)\n\n/** Handle enter keydown in the menu */\nconst handleSelect = (ev: KeyboardEvent) => {\n if (!selectedCommand.value || activeCommand.value) return\n ev.preventDefault()\n ev.stopPropagation()\n executeCommand(selectedCommand.value)\n}\n\n/** Handle hotkeys */\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (!modalState.open) return\n if (event?.closeModal) closeHandler()\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n commandQuery.value = value\n}\n\nonMounted(() => {\n events.commandPalette.on(openCommandPalette)\n events.hotKeys.on(handleHotKey)\n})\nonBeforeUnmount(() => {\n events.commandPalette.off(openCommandPalette)\n events.hotKeys.off(handleHotKey)\n})\n</script>\n<template>\n <Dialog\n :open=\"modalState.open\"\n @close=\"closeHandler()\">\n <div class=\"commandmenu-overlay z-overlay\" />\n <DialogPanel class=\"commandmenu z-overlay flex flex-col\">\n <DialogTitle class=\"sr-only\">API Client Command Menu</DialogTitle>\n <!-- Default palette (command list) -->\n <div\n v-if=\"!activeCommand\"\n class=\"custom-scroll max-h-[50dvh] min-h-0 flex-1 rounded-lg p-1.5\">\n <div\n class=\"bg-b-2 focus-within:bg-b-1 sticky top-0 flex items-center rounded-md border border-transparent pl-2 shadow-[0_-8px_0_8px_var(--scalar-background-1),0_0_8px_8px_var(--scalar-background-1)] focus-within:border-(--scalar-background-3)\">\n <label for=\"commandmenu\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n icon=\"Search\"\n size=\"md\"\n thickness=\"1.5\" />\n </label>\n <input\n id=\"commandmenu\"\n ref=\"commandInputRef\"\n autocomplete=\"off\"\n autofocus\n class=\"w-full rounded border-none bg-none py-1.5 text-sm focus:outline-none\"\n placeholder=\"Search commands...\"\n type=\"text\"\n :value=\"commandQuery\"\n @input=\"handleInput(($event.target as HTMLInputElement).value)\"\n @keydown.down.stop=\"handleArrowKey('down', $event)\"\n @keydown.enter.stop=\"handleSelect\"\n @keydown.up.stop=\"handleArrowKey('up', $event)\" />\n </div>\n <template\n v-for=\"group in availableCommands\"\n :key=\"group.label\">\n <div\n v-show=\"\n group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n ).length > 0\n \"\n class=\"text-c-3 mt-2 mb-1 px-2 text-xs font-medium\">\n {{ group.label }}\n </div>\n <div\n v-for=\"command in group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n )\"\n :key=\"command.name\"\n :ref=\"\n (el) => {\n if (el) {\n const index = searchResultsWithPlaceholderResults.findIndex(\n (c) => c.name === command.name,\n )\n if (index !== -1) commandRefs[index] = el as HTMLElement\n }\n }\n \"\n class=\"commandmenu-item hover:bg-b-2 flex cursor-pointer items-center rounded px-2 py-1.5 text-sm\"\n :class=\"{\n 'bg-b-2': command.name === selectedCommand?.name,\n }\"\n @click=\"executeCommand(command)\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n :icon=\"command.icon\"\n size=\"md\"\n thickness=\"1.5\" />\n {{ command.name }}\n </div>\n </template>\n <div\n v-if=\"!searchResultsWithPlaceholderResults.length\"\n class=\"text-c-3 p-2 pt-3 text-center text-sm\">\n No commands found\n </div>\n </div>\n <!-- Specific command palette -->\n <div\n v-else\n class=\"flex-1 p-1.5\">\n <button\n class=\"hover:bg-b-3 text-c-3 active:text-c-1 absolute z-1 mt-[0.5px] rounded p-1.5\"\n type=\"button\"\n @click=\"activeCommand = null\">\n <ScalarIcon\n icon=\"ChevronLeft\"\n size=\"md\"\n thickness=\"1.5\" />\n </button>\n <component\n :is=\"PaletteComponents[activeCommand]\"\n v-bind=\"metaData ? { metaData: metaData } : {}\"\n @back=\"backHandler($event)\"\n @close=\"closeHandler\" />\n </div>\n </DialogPanel>\n </Dialog>\n</template>\n<style scoped>\n/* command menu */\n.commandmenu {\n box-shadow: var(--scalar-shadow-2);\n border-radius: var(--scalar-radius-lg);\n background-color: var(--scalar-background-1);\n max-height: 60dvh;\n width: 100%;\n max-width: 580px;\n margin: 12px;\n position: fixed;\n left: 50%;\n top: 150px;\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n animation: fadeincommandmenu ease-in-out 0.3s forwards;\n animation-delay: 0.1s;\n}\n.commandmenu-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.2);\n animation: fadeincommand ease-in-out 0.3s forwards;\n cursor: pointer;\n}\n@keyframes fadeincommand {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes fadeincommandmenu {\n 0% {\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n }\n 100% {\n opacity: 1;\n transform: translate3d(-50%, 0, 0);\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommandPalette-BxoEK8TY.js","names":[],"sources":["../src/constants.ts","../src/components/CommandPalette/CommandPaletteCollection.vue","../src/components/CommandPalette/CommandPaletteCollection.vue","../src/components/CommandPalette/CommandPaletteExample.vue","../src/components/CommandPalette/CommandPaletteExample.vue","../src/components/CommandPalette/CommandPaletteImport.vue","../src/components/CommandPalette/CommandPaletteImport.vue","../src/components/CommandPalette/CommandPaletteImportCurl.vue","../src/components/CommandPalette/CommandPaletteImportCurl.vue","../src/components/CommandPalette/CommandPaletteServer.vue","../src/components/CommandPalette/CommandPaletteServer.vue","../src/components/CommandPalette/CommandPaletteTag.vue","../src/components/CommandPalette/CommandPaletteTag.vue","../src/components/CommandPalette/CommandPaletteWorkspace.vue","../src/components/CommandPalette/CommandPaletteWorkspace.vue","../src/components/CommandPalette/TheCommandPalette.vue","../src/components/CommandPalette/TheCommandPalette.vue"],"sourcesContent":["export const ROUTES = [\n {\n displayName: 'Request',\n to: {\n name: 'request.root',\n },\n icon: 'ExternalLink',\n },\n {\n displayName: 'Cookies',\n to: {\n name: 'cookies.default',\n },\n icon: 'Cookie',\n },\n {\n displayName: 'Environment',\n to: {\n name: 'environment.default',\n },\n icon: 'Brackets',\n },\n {\n displayName: 'Settings',\n to: {\n name: 'settings.default',\n },\n icon: 'Settings',\n },\n // {\n // displayName: 'Servers',\n // to: {\n // name: 'servers.default',\n // },\n // icon: 'Server',\n // },\n] as const\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\n\nimport IconSelector from '@/components/IconSelector.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspace } = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst collectionName = ref('')\nconst collectionIcon = ref('interface-content-folder')\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!collectionName.value) {\n toast('Please enter a name before creating a collection.', 'error')\n return\n }\n if (!activeWorkspace.value?.uid) {\n toast('No active workspace found.', 'error')\n return\n }\n\n collectionMutators.add(\n {\n 'openapi': '3.1.0',\n 'info': {\n title: collectionName.value,\n version: '0.0.1',\n },\n 'x-scalar-icon': collectionIcon.value,\n },\n activeWorkspace.value?.uid,\n )\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!collectionName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"collectionName\"\n label=\"Collection Name\"\n placeholder=\"Collection Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <IconSelector\n v-model=\"collectionIcon\"\n placement=\"bottom-start\">\n <ScalarButton\n class=\"aspect-square h-auto px-0\"\n variant=\"outlined\">\n <LibraryIcon\n class=\"text-c-2 size-4 stroke-[1.75]\"\n :src=\"collectionIcon\" />\n </ScalarButton>\n </IconSelector>\n </template>\n <template #submit> Create Collection </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\n\nimport IconSelector from '@/components/IconSelector.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspace } = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst collectionName = ref('')\nconst collectionIcon = ref('interface-content-folder')\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!collectionName.value) {\n toast('Please enter a name before creating a collection.', 'error')\n return\n }\n if (!activeWorkspace.value?.uid) {\n toast('No active workspace found.', 'error')\n return\n }\n\n collectionMutators.add(\n {\n 'openapi': '3.1.0',\n 'info': {\n title: collectionName.value,\n version: '0.0.1',\n },\n 'x-scalar-icon': collectionIcon.value,\n },\n activeWorkspace.value?.uid,\n )\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!collectionName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"collectionName\"\n label=\"Collection Name\"\n placeholder=\"Collection Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <IconSelector\n v-model=\"collectionIcon\"\n placement=\"bottom-start\">\n <ScalarButton\n class=\"aspect-square h-auto px-0\"\n variant=\"outlined\">\n <LibraryIcon\n class=\"text-c-2 size-4 stroke-[1.75]\"\n :src=\"collectionIcon\" />\n </ScalarButton>\n </IconSelector>\n </template>\n <template #submit> Create Collection </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n} from '@scalar/components'\nimport type { Request } from '@scalar/oas-utils/entities/spec'\nimport { isDefined } from '@scalar/oas-utils/helpers'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n /** The request uid to pre-select */\n metaData?: { itemUid: string }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { activeRequest, activeWorkspace, activeWorkspaceRequests } =\n useActiveEntities()\nconst { requests, requestExampleMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst exampleName = ref('')\nconst selectedRequest = ref<Request | undefined>(\n // Ensure we pre-select the correct request\n requests[props.metaData?.itemUid ?? ''] ?? activeRequest.value,\n)\n\n/** Select request in dropdown */\nconst handleSelect = (request: Request) => (selectedRequest.value = request)\n\n/** Add a new request example */\nconst handleSubmit = () => {\n if (!exampleName.value) {\n toast('Please enter a name before creating an example.', 'error')\n return\n }\n\n if (!selectedRequest.value) {\n toast('Please select a request before creating an example.', 'error')\n return\n }\n\n const example = requestExampleMutators.add(\n selectedRequest.value,\n exampleName.value,\n )\n\n if (!example) {\n return\n }\n\n // Go to new request example\n push({\n name: 'request.examples',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Request]: selectedRequest.value.uid,\n [PathId.Examples]: example.uid,\n },\n })\n\n emits('close')\n}\n\n/** Requests for the active workspace */\nconst visibleRequests = computed<Request[]>(() =>\n activeWorkspaceRequests.value.map((uid) => requests?.[uid]).filter(isDefined),\n)\n</script>\n<template>\n <CommandActionForm\n v-if=\"selectedRequest\"\n :disabled=\"!exampleName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"exampleName\"\n label=\"Example Name\"\n placeholder=\"Example Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarDropdown\n placement=\"bottom\"\n resize>\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"handleSelect(selectedRequest)\">\n {{ selectedRequest.summary }}\n <div class=\"flex items-center gap-2\">\n <HttpMethod :method=\"selectedRequest.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"request in visibleRequests\"\n :key=\"request.uid\"\n class=\"flex h-7 w-full items-center justify-between px-1 pr-[26px]\"\n @click=\"handleSelect(request)\">\n {{ request.summary }}\n <HttpMethod :method=\"request.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </template>\n <template #submit>Create Example</template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n} from '@scalar/components'\nimport type { Request } from '@scalar/oas-utils/entities/spec'\nimport { isDefined } from '@scalar/oas-utils/helpers'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n /** The request uid to pre-select */\n metaData?: { itemUid: string }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { activeRequest, activeWorkspace, activeWorkspaceRequests } =\n useActiveEntities()\nconst { requests, requestExampleMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst exampleName = ref('')\nconst selectedRequest = ref<Request | undefined>(\n // Ensure we pre-select the correct request\n requests[props.metaData?.itemUid ?? ''] ?? activeRequest.value,\n)\n\n/** Select request in dropdown */\nconst handleSelect = (request: Request) => (selectedRequest.value = request)\n\n/** Add a new request example */\nconst handleSubmit = () => {\n if (!exampleName.value) {\n toast('Please enter a name before creating an example.', 'error')\n return\n }\n\n if (!selectedRequest.value) {\n toast('Please select a request before creating an example.', 'error')\n return\n }\n\n const example = requestExampleMutators.add(\n selectedRequest.value,\n exampleName.value,\n )\n\n if (!example) {\n return\n }\n\n // Go to new request example\n push({\n name: 'request.examples',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Request]: selectedRequest.value.uid,\n [PathId.Examples]: example.uid,\n },\n })\n\n emits('close')\n}\n\n/** Requests for the active workspace */\nconst visibleRequests = computed<Request[]>(() =>\n activeWorkspaceRequests.value.map((uid) => requests?.[uid]).filter(isDefined),\n)\n</script>\n<template>\n <CommandActionForm\n v-if=\"selectedRequest\"\n :disabled=\"!exampleName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"exampleName\"\n label=\"Example Name\"\n placeholder=\"Example Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarDropdown\n placement=\"bottom\"\n resize>\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"handleSelect(selectedRequest)\">\n {{ selectedRequest.summary }}\n <div class=\"flex items-center gap-2\">\n <HttpMethod :method=\"selectedRequest.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"request in visibleRequests\"\n :key=\"request.uid\"\n class=\"flex h-7 w-full items-center justify-between px-1 pr-[26px]\"\n @click=\"handleSelect(request)\">\n {{ request.summary }}\n <HttpMethod :method=\"request.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </template>\n <template #submit>Create Example</template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarCodeBlock,\n ScalarIcon,\n ScalarTooltip,\n useLoadingState,\n} from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useFileDialog } from '@/hooks'\nimport {\n convertPostmanToOpenApi,\n getOpenApiDocumentDetails,\n getPostmanDocumentDetails,\n isPostmanCollection,\n isUrl,\n} from '@/libs'\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\nimport WatchModeToggle from './WatchModeToggle.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { activeWorkspace, activeCollection } = useActiveEntities()\nconst { importSpecFile, importSpecFromUrl, events } = useWorkspace()\nconst { toast } = useToasts()\nconst loader = useLoadingState()\n\nconst inputContent = ref('')\nconst watchMode = ref(true)\n\nconst documentDetails = computed(() => {\n if (isPostmanCollection(inputContent.value)) {\n return getPostmanDocumentDetails(inputContent.value)\n }\n return getOpenApiDocumentDetails(inputContent.value)\n})\n\nconst documentType = computed(() =>\n documentDetails.value ? documentDetails.value.type : 'json',\n)\n\nfunction navigateToCollectionPage(collection?: { uid: string }) {\n if (!collection) {\n return\n }\n\n router.push({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collection.uid,\n },\n })\n}\n\nconst isInputUrl = computed(() => isUrl(inputContent.value))\nconst isInputDocument = computed(() => !!documentDetails.value)\n\nconst { open: openSpecFileDialog } = useFileDialog({\n onChange: (files) => {\n const file = files?.[0]\n if (file) {\n const reader = new FileReader()\n reader.onload = async (e) => {\n const text = e.target?.result as string\n try {\n if (isPostmanCollection(text)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(text),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n } else {\n const workspace = await importSpecFile(\n text,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n toast('Import successful', 'info')\n emits('close')\n } catch (error) {\n console.error(error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n }\n reader.readAsText(file)\n }\n },\n multiple: false,\n accept: '.json,.yaml,.yml',\n})\n\n// Enable watch mode if the input is a URL\nwatch(isInputUrl, (newVal) => {\n if (!newVal) {\n watchMode.value = false\n }\n})\n\n// Disable watch mode if the input is not a URL\nwatch(inputContent, (newVal) => {\n if (!isUrl(newVal)) {\n watchMode.value = false\n }\n})\n\nasync function importCollection() {\n if (!inputContent.value || loader.isLoading) {\n return\n }\n\n loader.start()\n try {\n if (isInputUrl.value) {\n const [error, workspace] = await importSpecFromUrl(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n {\n proxyUrl: activeWorkspace.value?.proxyUrl,\n watchMode: watchMode.value,\n },\n )\n\n navigateToCollectionPage(workspace?.collection)\n\n if (error) {\n toast(\n 'There was a possible CORS error while importing your spec, please make sure this server is allowed in the CORS policy of your OpenAPI document.',\n 'error',\n { timeout: 5_000 },\n )\n await loader.invalidate()\n return\n }\n } else if (isInputDocument.value) {\n if (isPostmanCollection(inputContent.value)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(inputContent.value),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n toast('Successfully converted Postman collection', 'info')\n } else {\n const workspace = await importSpecFile(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n } else {\n toast('Import failed: Invalid URL or OpenAPI document', 'error')\n await loader.invalidate()\n return\n }\n\n await loader.clear()\n\n emits('close')\n toast('Import successful', 'info')\n } catch (error) {\n console.error('[importCollection]', error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n await loader.invalidate()\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n inputContent.value = value\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!inputContent.trim()\"\n :loader\n @submit=\"importCollection\">\n <template v-if=\"!documentDetails || isUrl(inputContent)\">\n <CommandActionInput\n :modelValue=\"inputContent\"\n placeholder=\"OpenAPI/Swagger/Postman URL or cURL\"\n @onDelete=\"emits('back', $event)\"\n @update:modelValue=\"handleInput\" />\n </template>\n <template v-else>\n <!-- OpenAPI document preview -->\n <div class=\"flex justify-between\">\n <div class=\"text-c-2 min-h-8 w-full py-2 pl-12 text-center text-xs\">\n Preview\n </div>\n <ScalarButton\n class=\"hover:bg-b-2 relative ml-auto max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"ghost\"\n @click=\"inputContent = ''\">\n Clear\n </ScalarButton>\n </div>\n <ScalarCodeBlock\n v-if=\"documentDetails && !isUrl(inputContent)\"\n class=\"bg-b-2 mt-1 max-h-[40dvh] rounded border px-2 py-1 text-sm\"\n :content=\"inputContent\"\n :copy=\"false\"\n :lang=\"documentType\" />\n </template>\n <template #options>\n <div class=\"flex w-full flex-row items-center justify-between gap-3\">\n <!-- Upload -->\n <ScalarButton\n class=\"hover:bg-b-2 relative max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"openSpecFileDialog\">\n JSON, or YAML File\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"Upload\"\n size=\"md\" />\n </ScalarButton>\n\n <!-- Watch -->\n <ScalarTooltip\n :content=\"\n isInputUrl\n ? 'Watch mode automatically updates the API client when the OpenAPI URL content changes, ensuring your client remains up-to-date.'\n : 'Watch mode is only available for URL imports. When enabled it automatically updates the API client when the OpenAPI URL content changes.'\n \"\n placement=\"bottom\">\n <WatchModeToggle\n v-model=\"watchMode\"\n :disabled=\"!isInputUrl\" />\n </ScalarTooltip>\n </div>\n </template>\n <template #submit>\n Import\n <template v-if=\"isInputUrl\"> from URL </template>\n <template v-else-if=\"documentDetails && documentType\">\n <template v-if=\"documentDetails.title\">\n \"{{ documentDetails.title }}\"\n </template>\n <template v-else>\n {{ documentDetails.version }}\n </template>\n </template>\n <template v-else> Collection </template>\n </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarCodeBlock,\n ScalarIcon,\n ScalarTooltip,\n useLoadingState,\n} from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useFileDialog } from '@/hooks'\nimport {\n convertPostmanToOpenApi,\n getOpenApiDocumentDetails,\n getPostmanDocumentDetails,\n isPostmanCollection,\n isUrl,\n} from '@/libs'\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\nimport WatchModeToggle from './WatchModeToggle.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { activeWorkspace, activeCollection } = useActiveEntities()\nconst { importSpecFile, importSpecFromUrl, events } = useWorkspace()\nconst { toast } = useToasts()\nconst loader = useLoadingState()\n\nconst inputContent = ref('')\nconst watchMode = ref(true)\n\nconst documentDetails = computed(() => {\n if (isPostmanCollection(inputContent.value)) {\n return getPostmanDocumentDetails(inputContent.value)\n }\n return getOpenApiDocumentDetails(inputContent.value)\n})\n\nconst documentType = computed(() =>\n documentDetails.value ? documentDetails.value.type : 'json',\n)\n\nfunction navigateToCollectionPage(collection?: { uid: string }) {\n if (!collection) {\n return\n }\n\n router.push({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collection.uid,\n },\n })\n}\n\nconst isInputUrl = computed(() => isUrl(inputContent.value))\nconst isInputDocument = computed(() => !!documentDetails.value)\n\nconst { open: openSpecFileDialog } = useFileDialog({\n onChange: (files) => {\n const file = files?.[0]\n if (file) {\n const reader = new FileReader()\n reader.onload = async (e) => {\n const text = e.target?.result as string\n try {\n if (isPostmanCollection(text)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(text),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n } else {\n const workspace = await importSpecFile(\n text,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n toast('Import successful', 'info')\n emits('close')\n } catch (error) {\n console.error(error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n }\n reader.readAsText(file)\n }\n },\n multiple: false,\n accept: '.json,.yaml,.yml',\n})\n\n// Enable watch mode if the input is a URL\nwatch(isInputUrl, (newVal) => {\n if (!newVal) {\n watchMode.value = false\n }\n})\n\n// Disable watch mode if the input is not a URL\nwatch(inputContent, (newVal) => {\n if (!isUrl(newVal)) {\n watchMode.value = false\n }\n})\n\nasync function importCollection() {\n if (!inputContent.value || loader.isLoading) {\n return\n }\n\n loader.start()\n try {\n if (isInputUrl.value) {\n const [error, workspace] = await importSpecFromUrl(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n {\n proxyUrl: activeWorkspace.value?.proxyUrl,\n watchMode: watchMode.value,\n },\n )\n\n navigateToCollectionPage(workspace?.collection)\n\n if (error) {\n toast(\n 'There was a possible CORS error while importing your spec, please make sure this server is allowed in the CORS policy of your OpenAPI document.',\n 'error',\n { timeout: 5_000 },\n )\n await loader.invalidate()\n return\n }\n } else if (isInputDocument.value) {\n if (isPostmanCollection(inputContent.value)) {\n const workspace = await importSpecFile(\n convertPostmanToOpenApi(inputContent.value),\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n toast('Successfully converted Postman collection', 'info')\n } else {\n const workspace = await importSpecFile(\n inputContent.value,\n activeWorkspace.value?.uid ?? '',\n )\n navigateToCollectionPage(workspace?.collection)\n }\n } else {\n toast('Import failed: Invalid URL or OpenAPI document', 'error')\n await loader.invalidate()\n return\n }\n\n await loader.clear()\n\n emits('close')\n toast('Import successful', 'info')\n } catch (error) {\n console.error('[importCollection]', error)\n const errorMessage = (error as Error)?.message || 'Unknown error'\n await loader.invalidate()\n toast(`Import failed: ${errorMessage}`, 'error')\n }\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n inputContent.value = value\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!inputContent.trim()\"\n :loader\n @submit=\"importCollection\">\n <template v-if=\"!documentDetails || isUrl(inputContent)\">\n <CommandActionInput\n :modelValue=\"inputContent\"\n placeholder=\"OpenAPI/Swagger/Postman URL or cURL\"\n @onDelete=\"emits('back', $event)\"\n @update:modelValue=\"handleInput\" />\n </template>\n <template v-else>\n <!-- OpenAPI document preview -->\n <div class=\"flex justify-between\">\n <div class=\"text-c-2 min-h-8 w-full py-2 pl-12 text-center text-xs\">\n Preview\n </div>\n <ScalarButton\n class=\"hover:bg-b-2 relative ml-auto max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"ghost\"\n @click=\"inputContent = ''\">\n Clear\n </ScalarButton>\n </div>\n <ScalarCodeBlock\n v-if=\"documentDetails && !isUrl(inputContent)\"\n class=\"bg-b-2 mt-1 max-h-[40dvh] rounded border px-2 py-1 text-sm\"\n :content=\"inputContent\"\n :copy=\"false\"\n :lang=\"documentType\" />\n </template>\n <template #options>\n <div class=\"flex w-full flex-row items-center justify-between gap-3\">\n <!-- Upload -->\n <ScalarButton\n class=\"hover:bg-b-2 relative max-h-8 gap-1.5 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"openSpecFileDialog\">\n JSON, or YAML File\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"Upload\"\n size=\"md\" />\n </ScalarButton>\n\n <!-- Watch -->\n <ScalarTooltip\n :content=\"\n isInputUrl\n ? 'Watch mode automatically updates the API client when the OpenAPI URL content changes, ensuring your client remains up-to-date.'\n : 'Watch mode is only available for URL imports. When enabled it automatically updates the API client when the OpenAPI URL content changes.'\n \"\n placement=\"bottom\">\n <WatchModeToggle\n v-model=\"watchMode\"\n :disabled=\"!isInputUrl\" />\n </ScalarTooltip>\n </div>\n </template>\n <template #submit>\n Import\n <template v-if=\"isInputUrl\"> from URL </template>\n <template v-else-if=\"documentDetails && documentType\">\n <template v-if=\"documentDetails.title\">\n \"{{ documentDetails.title }}\"\n </template>\n <template v-else>\n {{ documentDetails.version }}\n </template>\n </template>\n <template v-else> Collection </template>\n </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarListbox,\n type ScalarComboboxOption,\n} from '@scalar/components'\nimport type {\n RequestMethod,\n RequestPayload,\n} from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\ntype ExtendedRequestPayload = RequestPayload & {\n url?: string\n}\n\nconst { metaData } = defineProps<{\n metaData: {\n parsedCurl: ExtendedRequestPayload\n collectionUid: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst workspaceContext = useWorkspace()\n\nconst { activeWorkspaceCollections, activeCollection, activeWorkspace } =\n useActiveEntities()\nconst { requestMutators, serverMutators, servers } = workspaceContext\n\nconst selectedServerUid = ref('')\nconst router = useRouter()\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n })),\n)\n\nconst selectedCollection = ref<ScalarComboboxOption | undefined>(\n metaData.collectionUid\n ? collections.value.find(\n (collection) => collection.id === metaData.collectionUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nfunction createRequestFromCurl({ collectionUid }: { collectionUid: string }) {\n if (!metaData.parsedCurl) {\n return\n }\n\n const collection = activeWorkspaceCollections.value.find(\n (c) => c.uid === collectionUid,\n )\n\n if (!collection) {\n return\n }\n\n const isDrafts = collection?.info?.title === 'Drafts'\n\n // Prevent adding servers to drafts\n if (!isDrafts && metaData.parsedCurl.servers) {\n // Find existing server to avoid duplication\n const existingServer = Object.values(servers).find(\n (s) => s.url === metaData.parsedCurl?.servers?.[0],\n )\n if (existingServer) {\n selectedServerUid.value = existingServer.uid\n } else {\n selectedServerUid.value = serverMutators.add(\n { url: metaData.parsedCurl.servers[0] ?? '/' },\n collection.uid,\n ).uid\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: metaData.parsedCurl.servers[0] ?? '/' },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n }\n }\n\n // Add the request and use the url if it's a draft as a path\n const newRequest = requestMutators.add(\n {\n summary: isDrafts\n ? metaData.parsedCurl?.url?.replace(REGEX.PROTOCOL, '')\n : metaData.parsedCurl?.path,\n path: isDrafts ? metaData.parsedCurl?.url : metaData.parsedCurl?.path,\n method: metaData.parsedCurl?.method,\n parameters: metaData.parsedCurl?.parameters,\n selectedServerUid: isDrafts ? undefined : selectedServerUid.value,\n requestBody: metaData.parsedCurl?.requestBody,\n },\n collection.uid,\n )\n\n if (newRequest && activeWorkspace.value?.uid) {\n router.push({\n name: 'request',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: collection.uid,\n [PathId.Request]: newRequest.uid,\n },\n })\n }\n\n emits('close')\n}\n\nconst handleImportClick = () => {\n createRequestFromCurl({\n collectionUid: selectedCollection.value?.id ?? '',\n })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <div class=\"text-c-2 flex-center py-1.5 text-sm\">Import cURL</div>\n <CommandActionForm\n ref=\"wrapper-ref\"\n class=\"mt-1.5 min-h-fit\"\n @submit=\"handleImportClick\">\n <div\n class=\"flex h-9 flex-row items-center gap-2 rounded border p-[3px] text-sm\">\n <div class=\"flex h-full\">\n <HttpMethod\n :isEditable=\"false\"\n isSquare\n :method=\"(metaData.parsedCurl?.method as RequestMethod) || 'get'\" />\n </div>\n <span class=\"scroll-timeline-x whitespace-nowrap\">\n {{ metaData.parsedCurl?.servers?.[0] || ''\n }}{{ metaData.parsedCurl?.path || '' }}\n </span>\n </div>\n\n <template #options>\n <div class=\"flex\">\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span\n class=\"whitespace-nowrap\"\n :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedCollection\n ? selectedCollection.label\n : 'Select Collection'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </div>\n </template>\n\n <template #submit>\n <span @click=\"handleImportClick\">Import Request</span>\n </template>\n </CommandActionForm>\n</template>\n<style scoped>\n.scroll-timeline-x {\n overflow: auto;\n scroll-timeline: --scroll-timeline x;\n /* Firefox supports */\n scroll-timeline: --scroll-timeline horizontal;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarListbox,\n type ScalarComboboxOption,\n} from '@scalar/components'\nimport type {\n RequestMethod,\n RequestPayload,\n} from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport HttpMethod from '@/components/HttpMethod/HttpMethod.vue'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\ntype ExtendedRequestPayload = RequestPayload & {\n url?: string\n}\n\nconst { metaData } = defineProps<{\n metaData: {\n parsedCurl: ExtendedRequestPayload\n collectionUid: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst workspaceContext = useWorkspace()\n\nconst { activeWorkspaceCollections, activeCollection, activeWorkspace } =\n useActiveEntities()\nconst { requestMutators, serverMutators, servers } = workspaceContext\n\nconst selectedServerUid = ref('')\nconst router = useRouter()\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n })),\n)\n\nconst selectedCollection = ref<ScalarComboboxOption | undefined>(\n metaData.collectionUid\n ? collections.value.find(\n (collection) => collection.id === metaData.collectionUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nfunction createRequestFromCurl({ collectionUid }: { collectionUid: string }) {\n if (!metaData.parsedCurl) {\n return\n }\n\n const collection = activeWorkspaceCollections.value.find(\n (c) => c.uid === collectionUid,\n )\n\n if (!collection) {\n return\n }\n\n const isDrafts = collection?.info?.title === 'Drafts'\n\n // Prevent adding servers to drafts\n if (!isDrafts && metaData.parsedCurl.servers) {\n // Find existing server to avoid duplication\n const existingServer = Object.values(servers).find(\n (s) => s.url === metaData.parsedCurl?.servers?.[0],\n )\n if (existingServer) {\n selectedServerUid.value = existingServer.uid\n } else {\n selectedServerUid.value = serverMutators.add(\n { url: metaData.parsedCurl.servers[0] ?? '/' },\n collection.uid,\n ).uid\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: metaData.parsedCurl.servers[0] ?? '/' },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n }\n }\n\n // Add the request and use the url if it's a draft as a path\n const newRequest = requestMutators.add(\n {\n summary: isDrafts\n ? metaData.parsedCurl?.url?.replace(REGEX.PROTOCOL, '')\n : metaData.parsedCurl?.path,\n path: isDrafts ? metaData.parsedCurl?.url : metaData.parsedCurl?.path,\n method: metaData.parsedCurl?.method,\n parameters: metaData.parsedCurl?.parameters,\n selectedServerUid: isDrafts ? undefined : selectedServerUid.value,\n requestBody: metaData.parsedCurl?.requestBody,\n },\n collection.uid,\n )\n\n if (newRequest && activeWorkspace.value?.uid) {\n router.push({\n name: 'request',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: collection.uid,\n [PathId.Request]: newRequest.uid,\n },\n })\n }\n\n emits('close')\n}\n\nconst handleImportClick = () => {\n createRequestFromCurl({\n collectionUid: selectedCollection.value?.id ?? '',\n })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <div class=\"text-c-2 flex-center py-1.5 text-sm\">Import cURL</div>\n <CommandActionForm\n ref=\"wrapper-ref\"\n class=\"mt-1.5 min-h-fit\"\n @submit=\"handleImportClick\">\n <div\n class=\"flex h-9 flex-row items-center gap-2 rounded border p-[3px] text-sm\">\n <div class=\"flex h-full\">\n <HttpMethod\n :isEditable=\"false\"\n isSquare\n :method=\"(metaData.parsedCurl?.method as RequestMethod) || 'get'\" />\n </div>\n <span class=\"scroll-timeline-x whitespace-nowrap\">\n {{ metaData.parsedCurl?.servers?.[0] || ''\n }}{{ metaData.parsedCurl?.path || '' }}\n </span>\n </div>\n\n <template #options>\n <div class=\"flex\">\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-full justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span\n class=\"whitespace-nowrap\"\n :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedCollection\n ? selectedCollection.label\n : 'Select Collection'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </div>\n </template>\n\n <template #submit>\n <span @click=\"handleImportClick\">Import Request</span>\n </template>\n </CommandActionForm>\n</template>\n<style scoped>\n.scroll-timeline-x {\n overflow: auto;\n scroll-timeline: --scroll-timeline x;\n /* Firefox supports */\n scroll-timeline: --scroll-timeline horizontal;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n metaData?: {\n itemUid?: string\n parentUid?: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { toast } = useToasts()\n\nconst { activeCollection, activeWorkspaceCollections } = useActiveEntities()\nconst {\n collectionMutators,\n serverMutators,\n events,\n collections: _collections,\n} = useWorkspace()\n\nconst url = ref('')\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.flatMap((collection) =>\n collection.info?.title === 'Drafts'\n ? []\n : {\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n },\n ),\n)\n\n/** Currently selected collection with a reasonable default */\nconst selectedCollection = ref(\n props.metaData\n ? collections.value.find(\n (collection) =>\n collection.id === props.metaData?.itemUid ||\n collection.id === props.metaData?.parentUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!url.value.trim()) {\n toast('Please enter a valid url before creating a server.', 'error')\n return\n }\n const collection = _collections[selectedCollection.value?.id ?? '']\n if (!collection) {\n toast('Please select a collection before creating a server.', 'error')\n return\n }\n\n const server = serverMutators.add({ url: url.value }, collection.uid)\n\n // Select the server\n collectionMutators.edit(collection.uid, 'selectedServerUid', server.uid)\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: url.value },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n\n // Redirect to the server\n router.push({\n name: 'collection.servers.edit',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Servers]: server.uid,\n },\n })\n\n emits('close')\n}\n\nconst redirectToCreateCollection = () => {\n events.commandPalette.emit({ commandName: 'Create Collection' })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <CommandActionForm\n ref=\"wrapper-ref\"\n :disabled=\"!url.trim() || !selectedCollection\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"url\"\n label=\"Server URL\"\n placeholder=\"https://void.scalar.com\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n v-if=\"collections.length > 0\"\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n <ScalarButton\n v-else\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"redirectToCreateCollection\">\n <span class=\"text-c-1\">Create Collection</span>\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Server </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { emitCustomEvent } from '@scalar/workspace-store/events'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst props = defineProps<{\n metaData?: {\n itemUid?: string\n parentUid?: string\n }\n}>()\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst { toast } = useToasts()\n\nconst { activeCollection, activeWorkspaceCollections } = useActiveEntities()\nconst {\n collectionMutators,\n serverMutators,\n events,\n collections: _collections,\n} = useWorkspace()\n\nconst url = ref('')\n\nconst collections = computed(() =>\n activeWorkspaceCollections.value.flatMap((collection) =>\n collection.info?.title === 'Drafts'\n ? []\n : {\n id: collection.uid,\n label: collection.info?.title ?? 'Unititled Collection',\n },\n ),\n)\n\n/** Currently selected collection with a reasonable default */\nconst selectedCollection = ref(\n props.metaData\n ? collections.value.find(\n (collection) =>\n collection.id === props.metaData?.itemUid ||\n collection.id === props.metaData?.parentUid,\n )\n : collections.value.find(\n (collection) => collection.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!url.value.trim()) {\n toast('Please enter a valid url before creating a server.', 'error')\n return\n }\n const collection = _collections[selectedCollection.value?.id ?? '']\n if (!collection) {\n toast('Please select a collection before creating a server.', 'error')\n return\n }\n\n const server = serverMutators.add({ url: url.value }, collection.uid)\n\n // Select the server\n collectionMutators.edit(collection.uid, 'selectedServerUid', server.uid)\n\n emitCustomEvent(wrapper.value?.$el, 'scalar-add-server', {\n server: { url: url.value },\n options: {\n disableOldStoreUpdate: true,\n },\n })\n\n // Redirect to the server\n router.push({\n name: 'collection.servers.edit',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Servers]: server.uid,\n },\n })\n\n emits('close')\n}\n\nconst redirectToCreateCollection = () => {\n events.commandPalette.emit({ commandName: 'Create Collection' })\n}\n\nconst wrapper = useTemplateRef('wrapper-ref')\n</script>\n<template>\n <CommandActionForm\n ref=\"wrapper-ref\"\n :disabled=\"!url.trim() || !selectedCollection\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"url\"\n label=\"Server URL\"\n placeholder=\"https://void.scalar.com\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"collections\">\n <ScalarButton\n v-if=\"collections.length > 0\"\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n <ScalarButton\n v-else\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\"\n @click=\"redirectToCreateCollection\">\n <span class=\"text-c-1\">Create Collection</span>\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Server </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\n\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspaceCollections, activeCollection } = useActiveEntities()\nconst { tagMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst availableCollections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? '',\n })),\n)\n\nconst name = ref('')\nconst selectedCollection = ref(\n availableCollections.value.find(\n (option) => option.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!name.value) {\n toast('Please enter a name before creating a tag.', 'error')\n return\n }\n if (!name.value || !selectedCollection.value) {\n return\n }\n\n const tag = tagMutators.add(\n {\n name: name.value,\n },\n selectedCollection.value.id,\n )\n if (tag) {\n emits('close')\n }\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!name.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"name\"\n label=\"Tag Name\"\n placeholder=\"Tag Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"availableCollections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Tag </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref } from 'vue'\n\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { activeWorkspaceCollections, activeCollection } = useActiveEntities()\nconst { tagMutators } = useWorkspace()\nconst { toast } = useToasts()\n\nconst availableCollections = computed(() =>\n activeWorkspaceCollections.value.map((collection) => ({\n id: collection.uid,\n label: collection.info?.title ?? '',\n })),\n)\n\nconst name = ref('')\nconst selectedCollection = ref(\n availableCollections.value.find(\n (option) => option.id === activeCollection.value?.uid,\n ),\n)\n\nconst handleSubmit = () => {\n if (!name.value) {\n toast('Please enter a name before creating a tag.', 'error')\n return\n }\n if (!name.value || !selectedCollection.value) {\n return\n }\n\n const tag = tagMutators.add(\n {\n name: name.value,\n },\n selectedCollection.value.id,\n )\n if (tag) {\n emits('close')\n }\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!name.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"name\"\n label=\"Tag Name\"\n placeholder=\"Tag Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #options>\n <ScalarListbox\n v-model=\"selectedCollection\"\n :options=\"availableCollections\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-fit justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedCollection ? 'text-c-1' : 'text-c-3'\">{{\n selectedCollection ? selectedCollection.label : 'Select Collection'\n }}</span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n </template>\n <template #submit> Create Tag </template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useWorkspace } from '@/store'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { toast } = useToasts()\nconst { workspaceMutators } = useWorkspace()\nconst workspaceName = ref('')\n\nconst handleSubmit = () => {\n if (!workspaceName.value.trim()) {\n toast('Please enter a name before creating a workspace.', 'error')\n return\n }\n\n const workspace = workspaceMutators.add({\n name: workspaceName.value,\n })\n\n push({\n name: 'workspace',\n params: {\n workspace: workspace.uid,\n },\n })\n\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!workspaceName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"workspaceName\"\n label=\"Workspace Name\"\n placeholder=\"Workspace Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #submit>Create Workspace</template>\n </CommandActionForm>\n</template>\n","<script setup lang=\"ts\">\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { useWorkspace } from '@/store'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst emits = defineEmits<{\n (event: 'close'): void\n (event: 'back', e: KeyboardEvent): void\n}>()\n\nconst { push } = useRouter()\nconst { toast } = useToasts()\nconst { workspaceMutators } = useWorkspace()\nconst workspaceName = ref('')\n\nconst handleSubmit = () => {\n if (!workspaceName.value.trim()) {\n toast('Please enter a name before creating a workspace.', 'error')\n return\n }\n\n const workspace = workspaceMutators.add({\n name: workspaceName.value,\n })\n\n push({\n name: 'workspace',\n params: {\n workspace: workspace.uid,\n },\n })\n\n emits('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"!workspaceName.trim()\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"workspaceName\"\n label=\"Workspace Name\"\n placeholder=\"Workspace Name\"\n @onDelete=\"emits('back', $event)\" />\n <template #submit>Create Workspace</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\n\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandPaletteCollection from './CommandPaletteCollection.vue'\nimport CommandPaletteExample from './CommandPaletteExample.vue'\nimport CommandPaletteImport from './CommandPaletteImport.vue'\nimport CommandPaletteImportCurl from './CommandPaletteImportCurl.vue'\nimport CommandPaletteServer from './CommandPaletteServer.vue'\nimport CommandPaletteTag from './CommandPaletteTag.vue'\nimport CommandPaletteWorkspace from './CommandPaletteWorkspace.vue'\n\n/**\n * The Command Palette\n *\n * This component is a singleton so should only exist in our app once we will use the event bus to trigger it\n */\nexport default {\n name: 'TheCommandPalette',\n}\n\nconst PaletteComponents = {\n 'Import from OpenAPI/Swagger/Postman/cURL': CommandPaletteImport,\n 'Create Request': '',\n 'Create Workspace': CommandPaletteWorkspace,\n 'Add Tag': CommandPaletteTag,\n 'Add Server': CommandPaletteServer,\n 'Create Collection': CommandPaletteCollection,\n 'Add Example': CommandPaletteExample,\n 'Import from cURL': CommandPaletteImportCurl,\n} as const\n\n/** Infer the types from the commands */\ntype CommandNames = keyof typeof PaletteComponents\n\nexport type CommandPaletteEvent = {\n /** The command name which matches with the command palette */\n commandName?: CommandNames\n /** Any extra metadata we want to pass to the command palettes */\n metaData?: Record<string, any>\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { Dialog, DialogPanel, DialogTitle } from '@headlessui/vue'\nimport { ScalarIcon, useModal } from '@scalar/components'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { ROUTES } from '@/constants'\nimport type { HotKeyEvent } from '@/libs'\n\nconst modalState = useModal()\nconst router = useRouter()\nconst { activeWorkspace, activeWorkspaceCollections, activeCollection } =\n useActiveEntities()\nconst { events, requestMutators } = useWorkspace()\n\n/** Available Commands for the Command Palette */\nconst availableCommands = [\n {\n label: '',\n commands: [\n {\n name: 'Import from OpenAPI/Swagger/Postman/cURL',\n icon: 'Import',\n },\n {\n name: 'Create Request',\n icon: 'ExternalLink',\n },\n {\n name: 'Create Collection',\n icon: 'Collection',\n },\n {\n name: 'Add Tag',\n icon: 'Folder',\n },\n {\n name: 'Add Example',\n icon: 'Example',\n },\n {\n name: 'Add Server',\n icon: 'Server',\n },\n ],\n },\n {\n label: 'More Actions',\n commands: [\n {\n name: 'Create Workspace',\n icon: 'Workspace',\n },\n {\n name: 'Add Environment',\n icon: 'Brackets',\n path: {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openEnvironmentModal: 'true' },\n },\n },\n {\n name: 'Add Cookie',\n icon: 'Cookie',\n path: {\n name: 'cookies.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openCookieModal: 'true' },\n },\n },\n ],\n },\n {\n label: 'Pages',\n commands: ROUTES.map((route) => ({\n name: route.displayName,\n icon: route.icon,\n path: router.resolve({\n ...route.to,\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n }).href,\n })),\n },\n] as const\n\ntype Command = (typeof availableCommands)[number]['commands'][number]\n\n/** Additional metadata for the command palettes */\nconst metaData = ref<Record<string, any> | undefined>()\nconst commandQuery = ref('')\nconst activeCommand = ref<keyof typeof PaletteComponents | null>(null)\nconst selectedSearchResult = ref<number>(-1)\nconst commandRefs = ref<HTMLElement[]>([])\n\nconst searchResultsWithPlaceholderResults = computed(() =>\n availableCommands.reduce((acc, group) => {\n const filteredGroupCommands = group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.value.toLowerCase()),\n )\n return [...acc, ...filteredGroupCommands]\n }, [] as Command[]),\n)\n\n/** Reset state on close */\nconst closeHandler = () => {\n modalState.hide()\n commandQuery.value = ''\n activeCommand.value = null\n selectedSearchResult.value = -1\n}\n\n/** Reset state on back */\nconst backHandler = (event: KeyboardEvent) => {\n // Prevent delete event from removing query command character\n if (commandQuery.value !== '') {\n event?.preventDefault()\n }\n activeCommand.value = null\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Handle execution of the command, some have routes while others show another palette */\nconst executeCommand = (\n command: (typeof availableCommands)[number]['commands'][number],\n) => {\n if ('path' in command) {\n router.push(command.path)\n closeHandler()\n } else if (command.name === 'Create Request') {\n const draftsCollection = activeWorkspaceCollections.value.find(\n (collection: Collection) => collection.info?.title === 'Drafts',\n )\n\n if (draftsCollection) {\n const newRequest = requestMutators.add({}, draftsCollection.uid)\n\n if (newRequest) {\n router.push({\n name: 'request',\n params: {\n workspace: activeWorkspace.value?.uid,\n request: newRequest.uid,\n },\n })\n\n closeHandler()\n\n nextTick(() => {\n events.hotKeys.emit({\n focusAddressBar: new KeyboardEvent('keydown', { key: 'l' }),\n })\n })\n }\n } else {\n closeHandler()\n }\n } else {\n activeCommand.value = command.name\n }\n}\n\nconst commandInputRef = ref<HTMLInputElement | null>()\n\n/** Handles opening the command pallete to the correct palette */\nconst openCommandPalette = ({\n commandName,\n metaData: _metaData,\n}: CommandPaletteEvent = {}) => {\n activeCommand.value = commandName ?? null\n metaData.value = _metaData\n modalState.show()\n\n // Need nextTick to focus after a click since focus goes to the button\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Focus on first result when conducting a search */\nwatch(commandQuery, (newQuery) => {\n if (newQuery && searchResultsWithPlaceholderResults.value.length > 0) {\n selectedSearchResult.value = 0\n }\n})\n\n/** Handle up and down arrow keys in the menu */\nconst handleArrowKey = (direction: 'up' | 'down', ev: KeyboardEvent) => {\n if (!modalState.open) return\n ev.preventDefault()\n\n const offset = direction === 'up' ? -1 : 1\n const length = searchResultsWithPlaceholderResults.value.length\n\n // Ensures we loop around the array by using the remainder\n selectedSearchResult.value =\n (selectedSearchResult.value + offset + length) % length\n\n nextTick(() => {\n const container = commandInputRef.value?.closest('.custom-scroll')\n if (!container) return\n\n // Scroll to the top if the first command is selected\n if (selectedSearchResult.value === 0) {\n container.scrollTop = 0\n return\n }\n\n // Scroll to the selected command\n const commandElement = commandRefs.value[selectedSearchResult.value]\n if (!commandElement) return\n\n // Set the height of the sticky header and the bottom margin\n const stickyHeaderHeight =\n (container.querySelector('.sticky')?.clientHeight || 0) + 16\n const bottomMargin = 6\n\n // Get the top and bottom of the command element\n const elementTop = commandElement.offsetTop\n const elementBottom = elementTop + commandElement.clientHeight\n\n // Get the top and bottom of the viewport\n const viewportTop = container.scrollTop + stickyHeaderHeight\n const viewportBottom =\n container.scrollTop + container.clientHeight - bottomMargin\n\n // Scroll to the command if it's not in the viewport\n if (elementTop < viewportTop) {\n container.scrollTop = elementTop - stickyHeaderHeight\n } else if (elementBottom > viewportBottom) {\n container.scrollTop =\n elementBottom - container.clientHeight + bottomMargin\n }\n })\n}\n\n/** The currently selected command */\nconst selectedCommand = computed(\n () => searchResultsWithPlaceholderResults.value[selectedSearchResult.value],\n)\n\n/** Handle enter keydown in the menu */\nconst handleSelect = (ev: KeyboardEvent) => {\n if (!selectedCommand.value || activeCommand.value) return\n ev.preventDefault()\n ev.stopPropagation()\n executeCommand(selectedCommand.value)\n}\n\n/** Handle hotkeys */\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (!modalState.open) return\n if (event?.closeModal) closeHandler()\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n commandQuery.value = value\n}\n\nonMounted(() => {\n events.commandPalette.on(openCommandPalette)\n events.hotKeys.on(handleHotKey)\n})\nonBeforeUnmount(() => {\n events.commandPalette.off(openCommandPalette)\n events.hotKeys.off(handleHotKey)\n})\n</script>\n<template>\n <Dialog\n :open=\"modalState.open\"\n @close=\"closeHandler()\">\n <div class=\"commandmenu-overlay z-overlay\" />\n <DialogPanel class=\"commandmenu z-overlay flex flex-col\">\n <DialogTitle class=\"sr-only\">API Client Command Menu</DialogTitle>\n <!-- Default palette (command list) -->\n <div\n v-if=\"!activeCommand\"\n class=\"custom-scroll max-h-[50dvh] min-h-0 flex-1 rounded-lg p-1.5\">\n <div\n class=\"bg-b-2 focus-within:bg-b-1 sticky top-0 flex items-center rounded-md border border-transparent pl-2 shadow-[0_-8px_0_8px_var(--scalar-background-1),0_0_8px_8px_var(--scalar-background-1)] focus-within:border-(--scalar-background-3)\">\n <label for=\"commandmenu\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n icon=\"Search\"\n size=\"md\"\n thickness=\"1.5\" />\n </label>\n <input\n id=\"commandmenu\"\n ref=\"commandInputRef\"\n autocomplete=\"off\"\n autofocus\n class=\"w-full rounded border-none bg-none py-1.5 text-sm focus:outline-none\"\n placeholder=\"Search commands...\"\n type=\"text\"\n :value=\"commandQuery\"\n @input=\"handleInput(($event.target as HTMLInputElement).value)\"\n @keydown.down.stop=\"handleArrowKey('down', $event)\"\n @keydown.enter.stop=\"handleSelect\"\n @keydown.up.stop=\"handleArrowKey('up', $event)\" />\n </div>\n <template\n v-for=\"group in availableCommands\"\n :key=\"group.label\">\n <div\n v-show=\"\n group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n ).length > 0\n \"\n class=\"text-c-3 mt-2 mb-1 px-2 text-xs font-medium\">\n {{ group.label }}\n </div>\n <div\n v-for=\"command in group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n )\"\n :key=\"command.name\"\n :ref=\"\n (el) => {\n if (el) {\n const index = searchResultsWithPlaceholderResults.findIndex(\n (c) => c.name === command.name,\n )\n if (index !== -1) commandRefs[index] = el as HTMLElement\n }\n }\n \"\n class=\"commandmenu-item hover:bg-b-2 flex cursor-pointer items-center rounded px-2 py-1.5 text-sm\"\n :class=\"{\n 'bg-b-2': command.name === selectedCommand?.name,\n }\"\n @click=\"executeCommand(command)\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n :icon=\"command.icon\"\n size=\"md\"\n thickness=\"1.5\" />\n {{ command.name }}\n </div>\n </template>\n <div\n v-if=\"!searchResultsWithPlaceholderResults.length\"\n class=\"text-c-3 p-2 pt-3 text-center text-sm\">\n No commands found\n </div>\n </div>\n <!-- Specific command palette -->\n <div\n v-else\n class=\"flex-1 p-1.5\">\n <button\n class=\"hover:bg-b-3 text-c-3 active:text-c-1 absolute z-1 mt-[0.5px] rounded p-1.5\"\n type=\"button\"\n @click=\"activeCommand = null\">\n <ScalarIcon\n icon=\"ChevronLeft\"\n size=\"md\"\n thickness=\"1.5\" />\n </button>\n <component\n :is=\"PaletteComponents[activeCommand]\"\n v-bind=\"metaData ? { metaData: metaData } : {}\"\n @back=\"backHandler($event)\"\n @close=\"closeHandler\" />\n </div>\n </DialogPanel>\n </Dialog>\n</template>\n<style scoped>\n/* command menu */\n.commandmenu {\n box-shadow: var(--scalar-shadow-2);\n border-radius: var(--scalar-radius-lg);\n background-color: var(--scalar-background-1);\n max-height: 60dvh;\n width: 100%;\n max-width: 580px;\n margin: 12px;\n position: fixed;\n left: 50%;\n top: 150px;\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n animation: fadeincommandmenu ease-in-out 0.3s forwards;\n animation-delay: 0.1s;\n}\n.commandmenu-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.2);\n animation: fadeincommand ease-in-out 0.3s forwards;\n cursor: pointer;\n}\n@keyframes fadeincommand {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes fadeincommandmenu {\n 0% {\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n }\n 100% {\n opacity: 1;\n transform: translate3d(-50%, 0, 0);\n }\n}\n</style>\n","<script lang=\"ts\">\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\n\nimport { importCurlCommand } from '@/libs/importers/curl'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CommandPaletteCollection from './CommandPaletteCollection.vue'\nimport CommandPaletteExample from './CommandPaletteExample.vue'\nimport CommandPaletteImport from './CommandPaletteImport.vue'\nimport CommandPaletteImportCurl from './CommandPaletteImportCurl.vue'\nimport CommandPaletteServer from './CommandPaletteServer.vue'\nimport CommandPaletteTag from './CommandPaletteTag.vue'\nimport CommandPaletteWorkspace from './CommandPaletteWorkspace.vue'\n\n/**\n * The Command Palette\n *\n * This component is a singleton so should only exist in our app once we will use the event bus to trigger it\n */\nexport default {\n name: 'TheCommandPalette',\n}\n\nconst PaletteComponents = {\n 'Import from OpenAPI/Swagger/Postman/cURL': CommandPaletteImport,\n 'Create Request': '',\n 'Create Workspace': CommandPaletteWorkspace,\n 'Add Tag': CommandPaletteTag,\n 'Add Server': CommandPaletteServer,\n 'Create Collection': CommandPaletteCollection,\n 'Add Example': CommandPaletteExample,\n 'Import from cURL': CommandPaletteImportCurl,\n} as const\n\n/** Infer the types from the commands */\ntype CommandNames = keyof typeof PaletteComponents\n\nexport type CommandPaletteEvent = {\n /** The command name which matches with the command palette */\n commandName?: CommandNames\n /** Any extra metadata we want to pass to the command palettes */\n metaData?: Record<string, any>\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { Dialog, DialogPanel, DialogTitle } from '@headlessui/vue'\nimport { ScalarIcon, useModal } from '@scalar/components'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport { ROUTES } from '@/constants'\nimport type { HotKeyEvent } from '@/libs'\n\nconst modalState = useModal()\nconst router = useRouter()\nconst { activeWorkspace, activeWorkspaceCollections, activeCollection } =\n useActiveEntities()\nconst { events, requestMutators } = useWorkspace()\n\n/** Available Commands for the Command Palette */\nconst availableCommands = [\n {\n label: '',\n commands: [\n {\n name: 'Import from OpenAPI/Swagger/Postman/cURL',\n icon: 'Import',\n },\n {\n name: 'Create Request',\n icon: 'ExternalLink',\n },\n {\n name: 'Create Collection',\n icon: 'Collection',\n },\n {\n name: 'Add Tag',\n icon: 'Folder',\n },\n {\n name: 'Add Example',\n icon: 'Example',\n },\n {\n name: 'Add Server',\n icon: 'Server',\n },\n ],\n },\n {\n label: 'More Actions',\n commands: [\n {\n name: 'Create Workspace',\n icon: 'Workspace',\n },\n {\n name: 'Add Environment',\n icon: 'Brackets',\n path: {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openEnvironmentModal: 'true' },\n },\n },\n {\n name: 'Add Cookie',\n icon: 'Cookie',\n path: {\n name: 'cookies.default',\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n query: { openCookieModal: 'true' },\n },\n },\n ],\n },\n {\n label: 'Pages',\n commands: ROUTES.map((route) => ({\n name: route.displayName,\n icon: route.icon,\n path: router.resolve({\n ...route.to,\n params: {\n [PathId.Workspace]: activeWorkspace?.value?.uid ?? 'default',\n },\n }).href,\n })),\n },\n] as const\n\ntype Command = (typeof availableCommands)[number]['commands'][number]\n\n/** Additional metadata for the command palettes */\nconst metaData = ref<Record<string, any> | undefined>()\nconst commandQuery = ref('')\nconst activeCommand = ref<keyof typeof PaletteComponents | null>(null)\nconst selectedSearchResult = ref<number>(-1)\nconst commandRefs = ref<HTMLElement[]>([])\n\nconst searchResultsWithPlaceholderResults = computed(() =>\n availableCommands.reduce((acc, group) => {\n const filteredGroupCommands = group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.value.toLowerCase()),\n )\n return [...acc, ...filteredGroupCommands]\n }, [] as Command[]),\n)\n\n/** Reset state on close */\nconst closeHandler = () => {\n modalState.hide()\n commandQuery.value = ''\n activeCommand.value = null\n selectedSearchResult.value = -1\n}\n\n/** Reset state on back */\nconst backHandler = (event: KeyboardEvent) => {\n // Prevent delete event from removing query command character\n if (commandQuery.value !== '') {\n event?.preventDefault()\n }\n activeCommand.value = null\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Handle execution of the command, some have routes while others show another palette */\nconst executeCommand = (\n command: (typeof availableCommands)[number]['commands'][number],\n) => {\n if ('path' in command) {\n router.push(command.path)\n closeHandler()\n } else if (command.name === 'Create Request') {\n const draftsCollection = activeWorkspaceCollections.value.find(\n (collection: Collection) => collection.info?.title === 'Drafts',\n )\n\n if (draftsCollection) {\n const newRequest = requestMutators.add({}, draftsCollection.uid)\n\n if (newRequest) {\n router.push({\n name: 'request',\n params: {\n workspace: activeWorkspace.value?.uid,\n request: newRequest.uid,\n },\n })\n\n closeHandler()\n\n nextTick(() => {\n events.hotKeys.emit({\n focusAddressBar: new KeyboardEvent('keydown', { key: 'l' }),\n })\n })\n }\n } else {\n closeHandler()\n }\n } else {\n activeCommand.value = command.name\n }\n}\n\nconst commandInputRef = ref<HTMLInputElement | null>()\n\n/** Handles opening the command pallete to the correct palette */\nconst openCommandPalette = ({\n commandName,\n metaData: _metaData,\n}: CommandPaletteEvent = {}) => {\n activeCommand.value = commandName ?? null\n metaData.value = _metaData\n modalState.show()\n\n // Need nextTick to focus after a click since focus goes to the button\n nextTick(() => commandInputRef.value?.focus())\n}\n\n/** Focus on first result when conducting a search */\nwatch(commandQuery, (newQuery) => {\n if (newQuery && searchResultsWithPlaceholderResults.value.length > 0) {\n selectedSearchResult.value = 0\n }\n})\n\n/** Handle up and down arrow keys in the menu */\nconst handleArrowKey = (direction: 'up' | 'down', ev: KeyboardEvent) => {\n if (!modalState.open) return\n ev.preventDefault()\n\n const offset = direction === 'up' ? -1 : 1\n const length = searchResultsWithPlaceholderResults.value.length\n\n // Ensures we loop around the array by using the remainder\n selectedSearchResult.value =\n (selectedSearchResult.value + offset + length) % length\n\n nextTick(() => {\n const container = commandInputRef.value?.closest('.custom-scroll')\n if (!container) return\n\n // Scroll to the top if the first command is selected\n if (selectedSearchResult.value === 0) {\n container.scrollTop = 0\n return\n }\n\n // Scroll to the selected command\n const commandElement = commandRefs.value[selectedSearchResult.value]\n if (!commandElement) return\n\n // Set the height of the sticky header and the bottom margin\n const stickyHeaderHeight =\n (container.querySelector('.sticky')?.clientHeight || 0) + 16\n const bottomMargin = 6\n\n // Get the top and bottom of the command element\n const elementTop = commandElement.offsetTop\n const elementBottom = elementTop + commandElement.clientHeight\n\n // Get the top and bottom of the viewport\n const viewportTop = container.scrollTop + stickyHeaderHeight\n const viewportBottom =\n container.scrollTop + container.clientHeight - bottomMargin\n\n // Scroll to the command if it's not in the viewport\n if (elementTop < viewportTop) {\n container.scrollTop = elementTop - stickyHeaderHeight\n } else if (elementBottom > viewportBottom) {\n container.scrollTop =\n elementBottom - container.clientHeight + bottomMargin\n }\n })\n}\n\n/** The currently selected command */\nconst selectedCommand = computed(\n () => searchResultsWithPlaceholderResults.value[selectedSearchResult.value],\n)\n\n/** Handle enter keydown in the menu */\nconst handleSelect = (ev: KeyboardEvent) => {\n if (!selectedCommand.value || activeCommand.value) return\n ev.preventDefault()\n ev.stopPropagation()\n executeCommand(selectedCommand.value)\n}\n\n/** Handle hotkeys */\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (!modalState.open) return\n if (event?.closeModal) closeHandler()\n}\n\nconst handleInput = (value: string) => {\n if (value.trim().toLowerCase().startsWith('curl')) {\n events.commandPalette.emit({\n commandName: 'Import from cURL',\n metaData: {\n parsedCurl: importCurlCommand(value),\n collectionUid: activeCollection.value?.uid,\n },\n })\n return\n }\n commandQuery.value = value\n}\n\nonMounted(() => {\n events.commandPalette.on(openCommandPalette)\n events.hotKeys.on(handleHotKey)\n})\nonBeforeUnmount(() => {\n events.commandPalette.off(openCommandPalette)\n events.hotKeys.off(handleHotKey)\n})\n</script>\n<template>\n <Dialog\n :open=\"modalState.open\"\n @close=\"closeHandler()\">\n <div class=\"commandmenu-overlay z-overlay\" />\n <DialogPanel class=\"commandmenu z-overlay flex flex-col\">\n <DialogTitle class=\"sr-only\">API Client Command Menu</DialogTitle>\n <!-- Default palette (command list) -->\n <div\n v-if=\"!activeCommand\"\n class=\"custom-scroll max-h-[50dvh] min-h-0 flex-1 rounded-lg p-1.5\">\n <div\n class=\"bg-b-2 focus-within:bg-b-1 sticky top-0 flex items-center rounded-md border border-transparent pl-2 shadow-[0_-8px_0_8px_var(--scalar-background-1),0_0_8px_8px_var(--scalar-background-1)] focus-within:border-(--scalar-background-3)\">\n <label for=\"commandmenu\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n icon=\"Search\"\n size=\"md\"\n thickness=\"1.5\" />\n </label>\n <input\n id=\"commandmenu\"\n ref=\"commandInputRef\"\n autocomplete=\"off\"\n autofocus\n class=\"w-full rounded border-none bg-none py-1.5 text-sm focus:outline-none\"\n placeholder=\"Search commands...\"\n type=\"text\"\n :value=\"commandQuery\"\n @input=\"handleInput(($event.target as HTMLInputElement).value)\"\n @keydown.down.stop=\"handleArrowKey('down', $event)\"\n @keydown.enter.stop=\"handleSelect\"\n @keydown.up.stop=\"handleArrowKey('up', $event)\" />\n </div>\n <template\n v-for=\"group in availableCommands\"\n :key=\"group.label\">\n <div\n v-show=\"\n group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n ).length > 0\n \"\n class=\"text-c-3 mt-2 mb-1 px-2 text-xs font-medium\">\n {{ group.label }}\n </div>\n <div\n v-for=\"command in group.commands.filter((command) =>\n command.name.toLowerCase().includes(commandQuery.toLowerCase()),\n )\"\n :key=\"command.name\"\n :ref=\"\n (el) => {\n if (el) {\n const index = searchResultsWithPlaceholderResults.findIndex(\n (c) => c.name === command.name,\n )\n if (index !== -1) commandRefs[index] = el as HTMLElement\n }\n }\n \"\n class=\"commandmenu-item hover:bg-b-2 flex cursor-pointer items-center rounded px-2 py-1.5 text-sm\"\n :class=\"{\n 'bg-b-2': command.name === selectedCommand?.name,\n }\"\n @click=\"executeCommand(command)\">\n <ScalarIcon\n class=\"text-c-2 mr-2.5\"\n :icon=\"command.icon\"\n size=\"md\"\n thickness=\"1.5\" />\n {{ command.name }}\n </div>\n </template>\n <div\n v-if=\"!searchResultsWithPlaceholderResults.length\"\n class=\"text-c-3 p-2 pt-3 text-center text-sm\">\n No commands found\n </div>\n </div>\n <!-- Specific command palette -->\n <div\n v-else\n class=\"flex-1 p-1.5\">\n <button\n class=\"hover:bg-b-3 text-c-3 active:text-c-1 absolute z-1 mt-[0.5px] rounded p-1.5\"\n type=\"button\"\n @click=\"activeCommand = null\">\n <ScalarIcon\n icon=\"ChevronLeft\"\n size=\"md\"\n thickness=\"1.5\" />\n </button>\n <component\n :is=\"PaletteComponents[activeCommand]\"\n v-bind=\"metaData ? { metaData: metaData } : {}\"\n @back=\"backHandler($event)\"\n @close=\"closeHandler\" />\n </div>\n </DialogPanel>\n </Dialog>\n</template>\n<style scoped>\n/* command menu */\n.commandmenu {\n box-shadow: var(--scalar-shadow-2);\n border-radius: var(--scalar-radius-lg);\n background-color: var(--scalar-background-1);\n max-height: 60dvh;\n width: 100%;\n max-width: 580px;\n margin: 12px;\n position: fixed;\n left: 50%;\n top: 150px;\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n animation: fadeincommandmenu ease-in-out 0.3s forwards;\n animation-delay: 0.1s;\n}\n.commandmenu-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.2);\n animation: fadeincommand ease-in-out 0.3s forwards;\n cursor: pointer;\n}\n@keyframes fadeincommand {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes fadeincommandmenu {\n 0% {\n opacity: 0;\n transform: translate3d(-50%, 10px, 0);\n }\n 100% {\n opacity: 1;\n transform: translate3d(-50%, 0, 0);\n }\n}\n</style>\n"],"mappings":"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"}
@@ -1,19 +1,19 @@
1
- import { T as PathId, r as useWorkspace, w as useActiveEntities } from "./store-DpSUVhjp.js";
1
+ import { T as PathId, r as useWorkspace, w as useActiveEntities } from "./store-DnlAQK5d.js";
2
2
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BmmBcIzD.js";
3
3
  import { n as CommandActionForm_default, t as CommandActionInput_default } from "./CommandActionInput-TkcAx6E8.js";
4
4
  import "./HttpMethod-rnWEgC3T.js";
5
- import "./CodeInput-C-igR77V.js";
6
- import "./Server-DnA_BzPS.js";
7
- import "./AddressBar-B4xnl66I.js";
5
+ import "./CodeInput-BTN8cC5h.js";
6
+ import "./Server-CEKGIEfE.js";
7
+ import "./AddressBar-BOZGKSoz.js";
8
8
  import "./components-ChixwQhN.js";
9
- import { t as Sidebar_default } from "./Sidebar-C6AdX6-N.js";
10
- import "./DataTableInput-yaU5g-kP.js";
9
+ import { t as Sidebar_default } from "./Sidebar-CRxdl38Y.js";
10
+ import "./DataTableInput-RydMDjn2.js";
11
11
  import { t as ViewLayout_default } from "./ViewLayout-BOXN0IYo.js";
12
12
  import { t as ViewLayoutContent_default } from "./ViewLayoutContent-CvMoJYPF.js";
13
13
  import { t as ViewLayoutSection_default } from "./ViewLayoutSection-mUqKbQry.js";
14
14
  import "./ScalarAsciiArt-BjuSnj8e.js";
15
15
  import { t as EmptyState_default } from "./EmptyState-Cnm7hGW5.js";
16
- import { t as Form_default } from "./Form-CSKzyHGO.js";
16
+ import { t as Form_default } from "./Form-KFcdRQp1.js";
17
17
  import { t as SidebarButton_default } from "./SidebarButton-BAagdMDe.js";
18
18
  import { n as SidebarList_default, t as SidebarListElement_default } from "./SidebarListElement-BfTPiihc.js";
19
19
  import { Fragment, computed, createBlock, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, onBeforeUnmount, onMounted, openBlock, ref, renderList, unref, watch, withCtx, withModifiers } from "vue";
@@ -281,4 +281,4 @@ var Cookies_default = /* @__PURE__ */ defineComponent({
281
281
  //#endregion
282
282
  export { Cookies_default as default };
283
283
 
284
- //# sourceMappingURL=Cookies-DbOKTi1f.js.map
284
+ //# sourceMappingURL=Cookies-BYTv1YIA.js.map