@scalar/api-client 2.38.4 → 2.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/_virtual/_plugin-vue_export-helper.js +8 -0
- package/dist/assets/computer.ascii.virtual.js +6 -0
- package/dist/assets/computer.ascii.virtual.js.map +1 -0
- package/dist/assets/keycap.ascii.virtual.js +6 -0
- package/dist/assets/keycap.ascii.virtual.js.map +1 -0
- package/dist/assets/rabbit.ascii.virtual.js +6 -0
- package/dist/assets/rabbit.ascii.virtual.js.map +1 -0
- package/dist/assets/rabbitjump.ascii.virtual.js +6 -0
- package/dist/assets/rabbitjump.ascii.virtual.js.map +1 -0
- package/dist/components/AddressBar/AddressBar.vue.d.ts +1 -1
- package/dist/components/AddressBar/AddressBar.vue.js +9 -0
- package/dist/components/AddressBar/AddressBar.vue.js.map +1 -0
- package/dist/components/AddressBar/AddressBar.vue.script.js +204 -0
- package/dist/components/AddressBar/AddressBar.vue.script.js.map +1 -0
- package/dist/components/AddressBar/AddressBarHistory.vue.js +9 -0
- package/dist/components/AddressBar/AddressBarHistory.vue.js.map +1 -0
- package/dist/components/AddressBar/AddressBarHistory.vue.script.js +85 -0
- package/dist/components/AddressBar/AddressBarHistory.vue.script.js.map +1 -0
- package/dist/components/AddressBar/httpStatusCodeColors.js +20 -0
- package/dist/components/AddressBar/httpStatusCodeColors.js.map +1 -0
- package/dist/components/AddressBar/index.d.ts +1 -1
- package/dist/components/AddressBar/index.js +1 -4
- package/dist/components/CodeInput/CodeInput.vue.d.ts +1 -1
- package/dist/components/CodeInput/CodeInput.vue.js +10 -0
- package/dist/components/CodeInput/CodeInput.vue.js.map +1 -0
- package/dist/components/CodeInput/CodeInput.vue.script.js +294 -0
- package/dist/components/CodeInput/CodeInput.vue.script.js.map +1 -0
- package/dist/components/CodeInput/codeVariableWidget.d.ts +1 -1
- package/dist/components/CodeInput/codeVariableWidget.js +135 -0
- package/dist/components/CodeInput/codeVariableWidget.js.map +1 -0
- package/dist/components/CodeInput/index.d.ts +1 -1
- package/dist/components/CodeInput/index.js +1 -1
- package/dist/components/CommandPalette/CommandActionForm.vue.js +7 -0
- package/dist/components/CommandPalette/CommandActionForm.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandActionForm.vue.script.js +42 -0
- package/dist/components/CommandPalette/CommandActionForm.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandActionInput.vue.js +7 -0
- package/dist/components/CommandPalette/CommandActionInput.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandActionInput.vue.script.js +55 -0
- package/dist/components/CommandPalette/CommandActionInput.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteCollection.vue.js +7 -0
- package/dist/components/CommandPalette/CommandPaletteCollection.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteCollection.vue.script.js +78 -0
- package/dist/components/CommandPalette/CommandPaletteCollection.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteExample.vue.js +7 -0
- package/dist/components/CommandPalette/CommandPaletteExample.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteExample.vue.script.js +104 -0
- package/dist/components/CommandPalette/CommandPaletteExample.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteImport.vue.js +7 -0
- package/dist/components/CommandPalette/CommandPaletteImport.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteImport.vue.script.js +181 -0
- package/dist/components/CommandPalette/CommandPaletteImport.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteImportCurl.vue.js +9 -0
- package/dist/components/CommandPalette/CommandPaletteImportCurl.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteImportCurl.vue.script.js +108 -0
- package/dist/components/CommandPalette/CommandPaletteImportCurl.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteServer.vue.js +7 -0
- package/dist/components/CommandPalette/CommandPaletteServer.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteServer.vue.script.js +108 -0
- package/dist/components/CommandPalette/CommandPaletteServer.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteTag.vue.js +7 -0
- package/dist/components/CommandPalette/CommandPaletteTag.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteTag.vue.script.js +70 -0
- package/dist/components/CommandPalette/CommandPaletteTag.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteWorkspace.vue.js +7 -0
- package/dist/components/CommandPalette/CommandPaletteWorkspace.vue.js.map +1 -0
- package/dist/components/CommandPalette/CommandPaletteWorkspace.vue.script.js +49 -0
- package/dist/components/CommandPalette/CommandPaletteWorkspace.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/TheCommandPalette.vue.js +9 -0
- package/dist/components/CommandPalette/TheCommandPalette.vue.js.map +1 -0
- package/dist/components/CommandPalette/TheCommandPalette.vue.script.js +323 -0
- package/dist/components/CommandPalette/TheCommandPalette.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/WatchModeToggle.vue.js +7 -0
- package/dist/components/CommandPalette/WatchModeToggle.vue.js.map +1 -0
- package/dist/components/CommandPalette/WatchModeToggle.vue.script.js +40 -0
- package/dist/components/CommandPalette/WatchModeToggle.vue.script.js.map +1 -0
- package/dist/components/CommandPalette/index.d.ts +1 -1
- package/dist/components/CommandPalette/index.js +1 -2
- package/dist/components/DataTable/DataTable.vue.js +7 -0
- package/dist/components/DataTable/DataTable.vue.js.map +1 -0
- package/dist/components/DataTable/DataTable.vue.script.js +30 -0
- package/dist/components/DataTable/DataTable.vue.script.js.map +1 -0
- package/dist/components/DataTable/DataTableCell.vue.js +7 -0
- package/dist/components/DataTable/DataTableCell.vue.js.map +1 -0
- package/dist/components/DataTable/DataTableCell.vue.script.js +21 -0
- package/dist/components/DataTable/DataTableCell.vue.script.js.map +1 -0
- package/dist/components/DataTable/DataTableCheckbox.vue.js +7 -0
- package/dist/components/DataTable/DataTableCheckbox.vue.js.map +1 -0
- package/dist/components/DataTable/DataTableCheckbox.vue.script.js +43 -0
- package/dist/components/DataTable/DataTableCheckbox.vue.script.js.map +1 -0
- package/dist/components/DataTable/DataTableHeader.vue.js +7 -0
- package/dist/components/DataTable/DataTableHeader.vue.js.map +1 -0
- package/dist/components/DataTable/DataTableHeader.vue.script.js +20 -0
- package/dist/components/DataTable/DataTableHeader.vue.script.js.map +1 -0
- package/dist/components/DataTable/DataTableInput.vue.d.ts +1 -1
- package/dist/components/DataTable/DataTableInput.vue.js +9 -0
- package/dist/components/DataTable/DataTableInput.vue.js.map +1 -0
- package/dist/components/DataTable/DataTableInput.vue.script.js +164 -0
- package/dist/components/DataTable/DataTableInput.vue.script.js.map +1 -0
- package/dist/components/DataTable/DataTableInputSelect.vue.js +7 -0
- package/dist/components/DataTable/DataTableInputSelect.vue.js.map +1 -0
- package/dist/components/DataTable/DataTableInputSelect.vue.script.js +150 -0
- package/dist/components/DataTable/DataTableInputSelect.vue.script.js.map +1 -0
- package/dist/components/DataTable/DataTableRow.vue.js +13 -0
- package/dist/components/DataTable/DataTableRow.vue.js.map +1 -0
- package/dist/components/DataTable/DataTableText.vue.js +7 -0
- package/dist/components/DataTable/DataTableText.vue.js.map +1 -0
- package/dist/components/DataTable/DataTableText.vue.script.js +20 -0
- package/dist/components/DataTable/DataTableText.vue.script.js.map +1 -0
- package/dist/components/DataTable/index.d.ts +8 -8
- package/dist/components/DataTable/index.js +8 -5
- package/dist/components/EmptyState.vue.js +9 -0
- package/dist/components/EmptyState.vue.js.map +1 -0
- package/dist/components/EmptyState.vue.script.js +41 -0
- package/dist/components/EmptyState.vue.script.js.map +1 -0
- package/dist/components/EnvironmentSelector/EnvironmentSelector.vue.js +7 -0
- package/dist/components/EnvironmentSelector/EnvironmentSelector.vue.js.map +1 -0
- package/dist/components/EnvironmentSelector/EnvironmentSelector.vue.script.js +111 -0
- package/dist/components/EnvironmentSelector/EnvironmentSelector.vue.script.js.map +1 -0
- package/dist/components/Form/Form.vue.js +7 -0
- package/dist/components/Form/Form.vue.js.map +1 -0
- package/dist/components/Form/Form.vue.script.js +82 -0
- package/dist/components/Form/Form.vue.script.js.map +1 -0
- package/dist/components/Form/LabelInput.vue.d.ts +1 -1
- package/dist/components/Form/LabelInput.vue.js +9 -0
- package/dist/components/Form/LabelInput.vue.js.map +1 -0
- package/dist/components/Form/LabelInput.vue.script.js +39 -0
- package/dist/components/Form/LabelInput.vue.script.js.map +1 -0
- package/dist/components/HelpfulLink.vue.js +7 -0
- package/dist/components/HelpfulLink.vue.js.map +1 -0
- package/dist/components/HelpfulLink.vue.script.js +21 -0
- package/dist/components/HelpfulLink.vue.script.js.map +1 -0
- package/dist/components/HttpMethod/HttpMethod.vue.js +9 -0
- package/dist/components/HttpMethod/HttpMethod.vue.js.map +1 -0
- package/dist/components/HttpMethod/HttpMethod.vue.script.js +76 -0
- package/dist/components/HttpMethod/HttpMethod.vue.script.js.map +1 -0
- package/dist/components/HttpMethod/index.d.ts +1 -1
- package/dist/components/HttpMethod/index.js +1 -1
- package/dist/components/IconSelector.vue.js +7 -0
- package/dist/components/IconSelector.vue.js.map +1 -0
- package/dist/components/IconSelector.vue.script.js +65 -0
- package/dist/components/IconSelector.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/DropEventListener.vue.js +7 -0
- package/dist/components/ImportCollection/DropEventListener.vue.js.map +1 -0
- package/dist/components/ImportCollection/DropEventListener.vue.script.js +91 -0
- package/dist/components/ImportCollection/DropEventListener.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/ImportCollectionListener.vue.js +7 -0
- package/dist/components/ImportCollection/ImportCollectionListener.vue.js.map +1 -0
- package/dist/components/ImportCollection/ImportCollectionListener.vue.script.js +102 -0
- package/dist/components/ImportCollection/ImportCollectionListener.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/ImportCollectionModal.vue.d.ts.map +1 -1
- package/dist/components/ImportCollection/ImportCollectionModal.vue.js +8 -0
- package/dist/components/ImportCollection/ImportCollectionModal.vue.js.map +1 -0
- package/dist/components/ImportCollection/ImportCollectionModal.vue.script.js +206 -0
- package/dist/components/ImportCollection/ImportCollectionModal.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/ImportNowButton.vue.js +7 -0
- package/dist/components/ImportCollection/ImportNowButton.vue.js.map +1 -0
- package/dist/components/ImportCollection/ImportNowButton.vue.script.js +82 -0
- package/dist/components/ImportCollection/ImportNowButton.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/IntegrationLogo.vue.js +7 -0
- package/dist/components/ImportCollection/IntegrationLogo.vue.js.map +1 -0
- package/dist/components/ImportCollection/IntegrationLogo.vue.script.js +50 -0
- package/dist/components/ImportCollection/IntegrationLogo.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/PasteEventListener.vue.js +7 -0
- package/dist/components/ImportCollection/PasteEventListener.vue.js.map +1 -0
- package/dist/components/ImportCollection/PasteEventListener.vue.script.js +31 -0
- package/dist/components/ImportCollection/PasteEventListener.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/PrefetchError.vue.js +7 -0
- package/dist/components/ImportCollection/PrefetchError.vue.js.map +1 -0
- package/dist/components/ImportCollection/PrefetchError.vue.script.js +32 -0
- package/dist/components/ImportCollection/PrefetchError.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/UrlQueryParameterChecker.vue.js +7 -0
- package/dist/components/ImportCollection/UrlQueryParameterChecker.vue.js.map +1 -0
- package/dist/components/ImportCollection/UrlQueryParameterChecker.vue.script.js +21 -0
- package/dist/components/ImportCollection/UrlQueryParameterChecker.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/WorkspaceSelector.vue.js +7 -0
- package/dist/components/ImportCollection/WorkspaceSelector.vue.js.map +1 -0
- package/dist/components/ImportCollection/WorkspaceSelector.vue.script.js +114 -0
- package/dist/components/ImportCollection/WorkspaceSelector.vue.script.js.map +1 -0
- package/dist/components/ImportCollection/hooks/useUrlPrefetcher.js +109 -0
- package/dist/components/ImportCollection/hooks/useUrlPrefetcher.js.map +1 -0
- package/dist/components/ImportCollection/index.d.ts +1 -1
- package/dist/components/ImportCollection/index.js +1 -1
- package/dist/components/ImportCollection/utils/get-openapi-version.js +26 -0
- package/dist/components/ImportCollection/utils/get-openapi-version.js.map +1 -0
- package/dist/components/ImportCollection/utils/import-collection.js +23 -0
- package/dist/components/ImportCollection/utils/import-collection.js.map +1 -0
- package/dist/components/ImportCollection/utils/is-document.js +12 -0
- package/dist/components/ImportCollection/utils/is-document.js.map +1 -0
- package/dist/components/ImportCollection/utils/is-url.js +14 -0
- package/dist/components/ImportCollection/utils/is-url.js.map +1 -0
- package/dist/components/ImportCollection/utils/workspace-store-is-empty.js +13 -0
- package/dist/components/ImportCollection/utils/workspace-store-is-empty.js.map +1 -0
- package/dist/components/OpenApiClientButton.vue.js +9 -0
- package/dist/components/OpenApiClientButton.vue.js.map +1 -0
- package/dist/components/OpenApiClientButton.vue.script.js +58 -0
- package/dist/components/OpenApiClientButton.vue.script.js.map +1 -0
- package/dist/components/ScalarAsciiArt.vue.js +9 -0
- package/dist/components/ScalarAsciiArt.vue.js.map +1 -0
- package/dist/components/ScalarAsciiArt.vue.script.js +42 -0
- package/dist/components/ScalarAsciiArt.vue.script.js.map +1 -0
- package/dist/components/Search/useSearch.js +110 -0
- package/dist/components/Search/useSearch.js.map +1 -0
- package/dist/components/SectionFilter.vue.js +9 -0
- package/dist/components/SectionFilter.vue.js.map +1 -0
- package/dist/components/SectionFilter.vue.script.js +69 -0
- package/dist/components/SectionFilter.vue.script.js.map +1 -0
- package/dist/components/SectionFilterButton.vue.js +7 -0
- package/dist/components/SectionFilterButton.vue.js.map +1 -0
- package/dist/components/SectionFilterButton.vue.script.js +30 -0
- package/dist/components/SectionFilterButton.vue.script.js.map +1 -0
- package/dist/components/Server/ServerDropdown.vue.js +7 -0
- package/dist/components/Server/ServerDropdown.vue.js.map +1 -0
- package/dist/components/Server/ServerDropdown.vue.script.js +133 -0
- package/dist/components/Server/ServerDropdown.vue.script.js.map +1 -0
- package/dist/components/Server/ServerDropdownItem.vue.js +9 -0
- package/dist/components/Server/ServerDropdownItem.vue.js.map +1 -0
- package/dist/components/Server/ServerDropdownItem.vue.script.js +90 -0
- package/dist/components/Server/ServerDropdownItem.vue.script.js.map +1 -0
- package/dist/components/Server/ServerSelector.vue.js +7 -0
- package/dist/components/Server/ServerSelector.vue.js.map +1 -0
- package/dist/components/Server/ServerSelector.vue.script.js +87 -0
- package/dist/components/Server/ServerSelector.vue.script.js.map +1 -0
- package/dist/components/Server/ServerVariablesForm.vue.js +7 -0
- package/dist/components/Server/ServerVariablesForm.vue.js.map +1 -0
- package/dist/components/Server/ServerVariablesForm.vue.script.js +64 -0
- package/dist/components/Server/ServerVariablesForm.vue.script.js.map +1 -0
- package/dist/components/Server/ServerVariablesSelect.vue.js +7 -0
- package/dist/components/Server/ServerVariablesSelect.vue.js.map +1 -0
- package/dist/components/Server/ServerVariablesSelect.vue.script.js +53 -0
- package/dist/components/Server/ServerVariablesSelect.vue.script.js.map +1 -0
- package/dist/components/Server/ServerVariablesTextbox.vue.js +7 -0
- package/dist/components/Server/ServerVariablesTextbox.vue.js.map +1 -0
- package/dist/components/Server/ServerVariablesTextbox.vue.script.js +34 -0
- package/dist/components/Server/ServerVariablesTextbox.vue.script.js.map +1 -0
- package/dist/components/Server/index.d.ts +3 -3
- package/dist/components/Server/index.js +3 -2
- package/dist/components/SideNav/DownloadAppButton.vue.js +9 -0
- package/dist/components/SideNav/DownloadAppButton.vue.js.map +1 -0
- package/dist/components/SideNav/DownloadAppButton.vue.script.js +31 -0
- package/dist/components/SideNav/DownloadAppButton.vue.script.js.map +1 -0
- package/dist/components/SideNav/SideHelp.vue.js +7 -0
- package/dist/components/SideNav/SideHelp.vue.js.map +1 -0
- package/dist/components/SideNav/SideHelp.vue.script.js +102 -0
- package/dist/components/SideNav/SideHelp.vue.script.js.map +1 -0
- package/dist/components/SideNav/SideNav.vue.js +7 -0
- package/dist/components/SideNav/SideNav.vue.js.map +1 -0
- package/dist/components/SideNav/SideNav.vue.script.js +80 -0
- package/dist/components/SideNav/SideNav.vue.script.js.map +1 -0
- package/dist/components/SideNav/SideNavGroup.vue.js +7 -0
- package/dist/components/SideNav/SideNavGroup.vue.js.map +1 -0
- package/dist/components/SideNav/SideNavGroup.vue.script.js +16 -0
- package/dist/components/SideNav/SideNavGroup.vue.script.js.map +1 -0
- package/dist/components/SideNav/SideNavLink.vue.js +7 -0
- package/dist/components/SideNav/SideNavLink.vue.js.map +1 -0
- package/dist/components/SideNav/SideNavLink.vue.script.js +32 -0
- package/dist/components/SideNav/SideNavLink.vue.script.js.map +1 -0
- package/dist/components/SideNav/SideNavRouterLink.vue.js +7 -0
- package/dist/components/SideNav/SideNavRouterLink.vue.js.map +1 -0
- package/dist/components/SideNav/SideNavRouterLink.vue.script.js +34 -0
- package/dist/components/SideNav/SideNavRouterLink.vue.script.js.map +1 -0
- package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.js +7 -0
- package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.js.map +1 -0
- package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.script.js +38 -0
- package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.script.js.map +1 -0
- package/dist/components/Sidebar/Actions/EditSidebarListCollection.vue.js +7 -0
- package/dist/components/Sidebar/Actions/EditSidebarListCollection.vue.js.map +1 -0
- package/dist/components/Sidebar/Actions/EditSidebarListCollection.vue.script.js +56 -0
- package/dist/components/Sidebar/Actions/EditSidebarListCollection.vue.script.js.map +1 -0
- package/dist/components/Sidebar/Actions/EditSidebarListElement.vue.js +7 -0
- package/dist/components/Sidebar/Actions/EditSidebarListElement.vue.js.map +1 -0
- package/dist/components/Sidebar/Actions/EditSidebarListElement.vue.script.js +31 -0
- package/dist/components/Sidebar/Actions/EditSidebarListElement.vue.script.js.map +1 -0
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.js +7 -0
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.js.map +1 -0
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js +41 -0
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js.map +1 -0
- package/dist/components/Sidebar/Sidebar.vue.js +9 -0
- package/dist/components/Sidebar/Sidebar.vue.js.map +1 -0
- package/dist/components/Sidebar/Sidebar.vue.script.js +71 -0
- package/dist/components/Sidebar/Sidebar.vue.script.js.map +1 -0
- package/dist/components/Sidebar/SidebarButton.vue.js +7 -0
- package/dist/components/Sidebar/SidebarButton.vue.js.map +1 -0
- package/dist/components/Sidebar/SidebarButton.vue.script.js +36 -0
- package/dist/components/Sidebar/SidebarButton.vue.script.js.map +1 -0
- package/dist/components/Sidebar/SidebarList.vue.js +13 -0
- package/dist/components/Sidebar/SidebarList.vue.js.map +1 -0
- package/dist/components/Sidebar/SidebarListElement.vue.js +10 -0
- package/dist/components/Sidebar/SidebarListElement.vue.js.map +1 -0
- package/dist/components/Sidebar/SidebarListElement.vue.script.js +128 -0
- package/dist/components/Sidebar/SidebarListElement.vue.script.js.map +1 -0
- package/dist/components/Sidebar/SidebarListElementActions.vue.js +7 -0
- package/dist/components/Sidebar/SidebarListElementActions.vue.js.map +1 -0
- package/dist/components/Sidebar/SidebarListElementActions.vue.script.js +97 -0
- package/dist/components/Sidebar/SidebarListElementActions.vue.script.js.map +1 -0
- package/dist/components/Sidebar/SidebarToggle.vue.js +7 -0
- package/dist/components/Sidebar/SidebarToggle.vue.js.map +1 -0
- package/dist/components/Sidebar/SidebarToggle.vue.script.js +47 -0
- package/dist/components/Sidebar/SidebarToggle.vue.script.js.map +1 -0
- package/dist/components/Sidebar/index.d.ts +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/TopNav/TopNav.vue.js +7 -0
- package/dist/components/TopNav/TopNav.vue.js.map +1 -0
- package/dist/components/TopNav/TopNav.vue.script.js +232 -0
- package/dist/components/TopNav/TopNav.vue.script.js.map +1 -0
- package/dist/components/TopNav/TopNavItem.vue.d.ts.map +1 -1
- package/dist/components/TopNav/TopNavItem.vue.js +9 -0
- package/dist/components/TopNav/TopNavItem.vue.js.map +1 -0
- package/dist/components/TopNav/TopNavItem.vue.script.js +129 -0
- package/dist/components/TopNav/TopNavItem.vue.script.js.map +1 -0
- package/dist/components/ViewLayout/ViewLayout.vue.js +7 -0
- package/dist/components/ViewLayout/ViewLayout.vue.js.map +1 -0
- package/dist/components/ViewLayout/ViewLayout.vue.script.js +16 -0
- package/dist/components/ViewLayout/ViewLayout.vue.script.js.map +1 -0
- package/dist/components/ViewLayout/ViewLayoutCollapse.vue.js +7 -0
- package/dist/components/ViewLayout/ViewLayoutCollapse.vue.js.map +1 -0
- package/dist/components/ViewLayout/ViewLayoutCollapse.vue.script.js +84 -0
- package/dist/components/ViewLayout/ViewLayoutCollapse.vue.script.js.map +1 -0
- package/dist/components/ViewLayout/ViewLayoutContent.vue.js +13 -0
- package/dist/components/ViewLayout/ViewLayoutContent.vue.js.map +1 -0
- package/dist/components/ViewLayout/ViewLayoutSection.vue.js +7 -0
- package/dist/components/ViewLayout/ViewLayoutSection.vue.js.map +1 -0
- package/dist/components/ViewLayout/ViewLayoutSection.vue.script.js +21 -0
- package/dist/components/ViewLayout/ViewLayoutSection.vue.script.js.map +1 -0
- package/dist/components/ViewLayout/index.d.ts +1 -1
- package/dist/components/ViewLayout/index.js +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +3 -6
- package/dist/constants.js +27 -0
- package/dist/constants.js.map +1 -0
- package/dist/data/httpHeaders.js +539 -0
- package/dist/data/httpHeaders.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -4
- package/dist/hooks/index.js +4 -2
- package/dist/hooks/useClientConfig.js +10 -0
- package/dist/hooks/useClientConfig.js.map +1 -0
- package/dist/hooks/useFileDialog.js +33 -0
- package/dist/hooks/useFileDialog.js.map +1 -0
- package/dist/hooks/useLayout.js +13 -0
- package/dist/hooks/useLayout.js.map +1 -0
- package/dist/hooks/useResponseBody.js +32 -0
- package/dist/hooks/useResponseBody.js.map +1 -0
- package/dist/hooks/useSidebar.d.ts +1 -1
- package/dist/hooks/useSidebar.js +36 -0
- package/dist/hooks/useSidebar.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -7
- package/dist/layouts/App/ApiClientApp.vue.js +8 -0
- package/dist/layouts/App/ApiClientApp.vue.js.map +1 -0
- package/dist/layouts/App/ApiClientApp.vue.script.js +80 -0
- package/dist/layouts/App/ApiClientApp.vue.script.js.map +1 -0
- package/dist/layouts/App/MainLayout.vue.js +7 -0
- package/dist/layouts/App/MainLayout.vue.js.map +1 -0
- package/dist/layouts/App/MainLayout.vue.script.js +22 -0
- package/dist/layouts/App/MainLayout.vue.script.js.map +1 -0
- package/dist/layouts/App/create-api-client-app.d.ts +1 -1
- package/dist/layouts/App/create-api-client-app.d.ts.map +1 -1
- package/dist/layouts/App/create-api-client-app.js +36 -0
- package/dist/layouts/App/create-api-client-app.js.map +1 -0
- package/dist/layouts/App/hotkeys.js +74 -0
- package/dist/layouts/App/hotkeys.js.map +1 -0
- package/dist/layouts/App/index.d.ts +2 -2
- package/dist/layouts/App/index.js +2 -4
- package/dist/layouts/Modal/ApiClientModal.vue.js +7 -0
- package/dist/layouts/Modal/ApiClientModal.vue.js.map +1 -0
- package/dist/layouts/Modal/ApiClientModal.vue.script.js +41 -0
- package/dist/layouts/Modal/ApiClientModal.vue.script.js.map +1 -0
- package/dist/layouts/Modal/create-api-client-modal.js +34 -0
- package/dist/layouts/Modal/create-api-client-modal.js.map +1 -0
- package/dist/layouts/Modal/index.d.ts +1 -1
- package/dist/layouts/Modal/index.js +1 -2
- package/dist/layouts/Web/ApiClientWeb.vue.js +8 -0
- package/dist/layouts/Web/ApiClientWeb.vue.js.map +1 -0
- package/dist/layouts/Web/ApiClientWeb.vue.script.js +68 -0
- package/dist/layouts/Web/ApiClientWeb.vue.script.js.map +1 -0
- package/dist/layouts/Web/create-api-client-web.d.ts +1 -1
- package/dist/layouts/Web/create-api-client-web.d.ts.map +1 -1
- package/dist/layouts/Web/create-api-client-web.js +33 -0
- package/dist/layouts/Web/create-api-client-web.js.map +1 -0
- package/dist/layouts/Web/index.d.ts +2 -2
- package/dist/layouts/Web/index.js +2 -101
- package/dist/libs/create-client.d.ts +9 -9
- package/dist/libs/create-client.js +178 -0
- package/dist/libs/create-client.js.map +1 -0
- package/dist/libs/electron.js +9 -0
- package/dist/libs/electron.js.map +1 -0
- package/dist/libs/env-helpers.js +9 -0
- package/dist/libs/env-helpers.js.map +1 -0
- package/dist/libs/environment-parser.d.ts +1 -1
- package/dist/libs/environment-parser.js +19 -0
- package/dist/libs/environment-parser.js.map +1 -0
- package/dist/libs/errors.js +34 -0
- package/dist/libs/errors.js.map +1 -0
- package/dist/libs/event-bus.js +43 -0
- package/dist/libs/event-bus.js.map +1 -0
- package/dist/libs/extractAttachmentFilename.js +23 -0
- package/dist/libs/extractAttachmentFilename.js.map +1 -0
- package/dist/libs/find-request.js +40 -0
- package/dist/libs/find-request.js.map +1 -0
- package/dist/libs/formatters.js +36 -0
- package/dist/libs/formatters.js.map +1 -0
- package/dist/libs/get-request-uid-by-path-method.d.ts +1 -1
- package/dist/libs/get-request-uid-by-path-method.js +19 -0
- package/dist/libs/get-request-uid-by-path-method.js.map +1 -0
- package/dist/libs/getOpenApiDocumentDetails.js +45 -0
- package/dist/libs/getOpenApiDocumentDetails.js.map +1 -0
- package/dist/libs/hot-keys.js +92 -0
- package/dist/libs/hot-keys.js.map +1 -0
- package/dist/libs/importers/curl.js +54 -0
- package/dist/libs/importers/curl.js.map +1 -0
- package/dist/libs/importers/index.d.ts +1 -1
- package/dist/libs/importers/index.js +1 -1
- package/dist/libs/index.d.ts +14 -14
- package/dist/libs/index.js +17 -5
- package/dist/libs/isUrl.js +12 -0
- package/dist/libs/isUrl.js.map +1 -0
- package/dist/libs/local-storage.js +40 -0
- package/dist/libs/local-storage.js.map +1 -0
- package/dist/libs/normalize-headers.js +55 -0
- package/dist/libs/normalize-headers.js.map +1 -0
- package/dist/libs/parse-curl.js +106 -0
- package/dist/libs/parse-curl.js.map +1 -0
- package/dist/libs/postman.js +40 -0
- package/dist/libs/postman.js.map +1 -0
- package/dist/libs/send-request/build-request-security.js +41 -0
- package/dist/libs/send-request/build-request-security.js.map +1 -0
- package/dist/libs/send-request/create-fetch-body.js +44 -0
- package/dist/libs/send-request/create-fetch-body.js.map +1 -0
- package/dist/libs/send-request/create-fetch-headers.js +15 -0
- package/dist/libs/send-request/create-fetch-headers.js.map +1 -0
- package/dist/libs/send-request/create-fetch-query-params.js +43 -0
- package/dist/libs/send-request/create-fetch-query-params.js.map +1 -0
- package/dist/libs/send-request/create-request-operation.d.ts +2 -2
- package/dist/libs/send-request/create-request-operation.js +172 -0
- package/dist/libs/send-request/create-request-operation.js.map +1 -0
- package/dist/libs/send-request/decode-buffer.js +13 -0
- package/dist/libs/send-request/decode-buffer.js.map +1 -0
- package/dist/libs/send-request/index.d.ts +3 -3
- package/dist/libs/send-request/index.js +3 -2
- package/dist/libs/send-request/set-request-cookies.js +82 -0
- package/dist/libs/send-request/set-request-cookies.js.map +1 -0
- package/dist/libs/string-template.js +64 -0
- package/dist/libs/string-template.js.map +1 -0
- package/dist/libs/validate-parameters.js +35 -0
- package/dist/libs/validate-parameters.js.map +1 -0
- package/dist/plugins/hooks/usePluginManager.d.ts +1 -1
- package/dist/plugins/hooks/usePluginManager.js +16 -0
- package/dist/plugins/hooks/usePluginManager.js.map +1 -0
- package/dist/plugins/index.d.ts +2 -2
- package/dist/plugins/index.js +2 -1
- package/dist/plugins/plugin-manager.js +38 -0
- package/dist/plugins/plugin-manager.js.map +1 -0
- package/dist/routes.js +225 -0
- package/dist/routes.js.map +1 -0
- package/dist/store/active-entities.js +139 -0
- package/dist/store/active-entities.js.map +1 -0
- package/dist/store/collections.js +76 -0
- package/dist/store/collections.js.map +1 -0
- package/dist/store/cookies.js +16 -0
- package/dist/store/cookies.js.map +1 -0
- package/dist/store/environment.js +38 -0
- package/dist/store/environment.js.map +1 -0
- package/dist/store/events.d.ts +7 -7
- package/dist/store/events.js +17 -0
- package/dist/store/events.js.map +1 -0
- package/dist/store/import-spec.js +56 -0
- package/dist/store/import-spec.js.map +1 -0
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +2 -1
- package/dist/store/request-example.js +43 -0
- package/dist/store/request-example.js.map +1 -0
- package/dist/store/requests.d.ts +1 -1
- package/dist/store/requests.js +104 -0
- package/dist/store/requests.js.map +1 -0
- package/dist/store/router-params.js +27 -0
- package/dist/store/router-params.js.map +1 -0
- package/dist/store/security-schemes.js +45 -0
- package/dist/store/security-schemes.js.map +1 -0
- package/dist/store/servers.js +41 -0
- package/dist/store/servers.js.map +1 -0
- package/dist/store/store.d.ts +1 -1
- package/dist/store/store.js +180 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/tags.js +54 -0
- package/dist/store/tags.js.map +1 -0
- package/dist/store/workspace.js +57 -0
- package/dist/store/workspace.js.map +1 -0
- package/dist/style.css +2793 -2639
- package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +2 -2
- package/dist/v2/blocks/operation-block/OperationBlock.vue.js +7 -0
- package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -0
- package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +302 -0
- package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -0
- package/dist/v2/blocks/operation-block/components/Header.vue.js +9 -0
- package/dist/v2/blocks/operation-block/components/Header.vue.js.map +1 -0
- package/dist/v2/blocks/operation-block/components/Header.vue.script.js +126 -0
- package/dist/v2/blocks/operation-block/components/Header.vue.script.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.js +58 -0
- package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-body.js +65 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-body.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.js +55 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-parameters.js +159 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-parameters.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-security.d.ts +1 -1
- package/dist/v2/blocks/operation-block/helpers/build-request-security.js +53 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-security.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/build-request.d.ts +1 -1
- package/dist/v2/blocks/operation-block/helpers/build-request.js +102 -0
- package/dist/v2/blocks/operation-block/helpers/build-request.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.js +41 -0
- package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/decode-buffer.js +17 -0
- package/dist/v2/blocks/operation-block/helpers/decode-buffer.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.js +20 -0
- package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/get-cookie-header-keys.js +22 -0
- package/dist/v2/blocks/operation-block/helpers/get-cookie-header-keys.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/get-environment-variables.js +17 -0
- package/dist/v2/blocks/operation-block/helpers/get-environment-variables.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/get-example.js +41 -0
- package/dist/v2/blocks/operation-block/helpers/get-example.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/get-resolved-url.js +32 -0
- package/dist/v2/blocks/operation-block/helpers/get-resolved-url.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.js +15 -0
- package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/get-server-url.js +18 -0
- package/dist/v2/blocks/operation-block/helpers/get-server-url.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-request.js +80 -0
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-request.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.d.ts +1 -1
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.js +109 -0
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/response-cache.js +34 -0
- package/dist/v2/blocks/operation-block/helpers/response-cache.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +1 -1
- package/dist/v2/blocks/operation-block/helpers/send-request.js +149 -0
- package/dist/v2/blocks/operation-block/helpers/send-request.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/serialize-parameter.js +160 -0
- package/dist/v2/blocks/operation-block/helpers/serialize-parameter.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js +34 -0
- package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js.map +1 -0
- package/dist/v2/blocks/operation-block/index.d.ts +4 -4
- package/dist/v2/blocks/operation-block/index.js +4 -19
- package/dist/v2/blocks/operation-code-sample/components/ExamplePicker.vue.js +7 -0
- package/dist/v2/blocks/operation-code-sample/components/ExamplePicker.vue.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/components/ExamplePicker.vue.script.js +52 -0
- package/dist/v2/blocks/operation-code-sample/components/ExamplePicker.vue.script.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/components/HttpMethod.vue.js +7 -0
- package/dist/v2/blocks/operation-code-sample/components/HttpMethod.vue.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/components/HttpMethod.vue.script.js +33 -0
- package/dist/v2/blocks/operation-code-sample/components/HttpMethod.vue.script.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts.map +1 -1
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js +9 -0
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js +246 -0
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/filter-clients-by-query.d.ts +9 -0
- package/dist/v2/blocks/operation-code-sample/helpers/filter-clients-by-query.d.ts.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/filter-clients-by-query.js +37 -0
- package/dist/v2/blocks/operation-code-sample/helpers/filter-clients-by-query.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/find-client.js +55 -0
- package/dist/v2/blocks/operation-code-sample/helpers/find-client.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/generate-client-options.d.ts.map +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/generate-client-options.js +40 -0
- package/dist/v2/blocks/operation-code-sample/helpers/generate-client-options.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.js +36 -0
- package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-clients.d.ts.map +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/get-clients.js +31 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-clients.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-custom-code-samples.js +18 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-custom-code-samples.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.js +411 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-resolved-ref-deep.js +41 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-resolved-ref-deep.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.js +18 -0
- package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.js +106 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js +112 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js +216 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.js +65 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-server-url.js +19 -0
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-server-url.js.map +1 -0
- package/dist/v2/blocks/operation-code-sample/index.d.ts +7 -6
- package/dist/v2/blocks/operation-code-sample/index.d.ts.map +1 -1
- package/dist/v2/blocks/operation-code-sample/index.js +8 -2
- package/dist/v2/blocks/operation-code-sample/types.d.ts +7 -6
- package/dist/v2/blocks/operation-code-sample/types.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/RequestBlock.vue.js +9 -0
- package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +412 -0
- package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestBody.vue.js +9 -0
- package/dist/v2/blocks/request-block/components/RequestBody.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +188 -0
- package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.js +7 -0
- package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.script.js +98 -0
- package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts +1 -1
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.js +7 -0
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +128 -0
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts +1 -1
- package/dist/v2/blocks/request-block/components/RequestParams.vue.js +7 -0
- package/dist/v2/blocks/request-block/components/RequestParams.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js +97 -0
- package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +1 -1
- package/dist/v2/blocks/request-block/components/RequestTable.vue.js +9 -0
- package/dist/v2/blocks/request-block/components/RequestTable.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js +113 -0
- package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js +7 -0
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +226 -0
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.js +9 -0
- package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.js.map +1 -0
- package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js +68 -0
- package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.d.ts +1 -1
- package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.js +47 -0
- package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/files.js +11 -0
- package/dist/v2/blocks/request-block/helpers/files.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/get-default-headers.js +61 -0
- package/dist/v2/blocks/request-block/helpers/get-default-headers.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/get-form-body-rows.d.ts +1 -1
- package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js +46 -0
- package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/get-parameter-content.js +17 -0
- package/dist/v2/blocks/request-block/helpers/get-parameter-content.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/get-parameter-schema.js +14 -0
- package/dist/v2/blocks/request-block/helpers/get-parameter-schema.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/get-request-body-example.js +21 -0
- package/dist/v2/blocks/request-block/helpers/get-request-body-example.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/group-by.js +15 -0
- package/dist/v2/blocks/request-block/helpers/group-by.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/is-param-disabled.js +20 -0
- package/dist/v2/blocks/request-block/helpers/is-param-disabled.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/validate-parameter.js +49 -0
- package/dist/v2/blocks/request-block/helpers/validate-parameter.js.map +1 -0
- package/dist/v2/blocks/request-block/index.d.ts +1 -1
- package/dist/v2/blocks/request-block/index.js +1 -8
- package/dist/v2/blocks/response-block/ResponseBlock.vue.js +9 -0
- package/dist/v2/blocks/response-block/ResponseBlock.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js +204 -0
- package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/Headers.vue.js +7 -0
- package/dist/v2/blocks/response-block/components/Headers.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/Headers.vue.script.js +77 -0
- package/dist/v2/blocks/response-block/components/Headers.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBody.vue.js +9 -0
- package/dist/v2/blocks/response-block/components/ResponseBody.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBody.vue.script.js +90 -0
- package/dist/v2/blocks/response-block/components/ResponseBody.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.js +7 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js +35 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyInfo.vue.js +14 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyInfo.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js +9 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js +64 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.js +9 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.script.js +49 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.js +7 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js +111 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.js +7 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.script.js +25 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.js +8 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js +50 -0
- package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseCookies.vue.js +7 -0
- package/dist/v2/blocks/response-block/components/ResponseCookies.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseCookies.vue.script.js +42 -0
- package/dist/v2/blocks/response-block/components/ResponseCookies.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.js +9 -0
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js +69 -0
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.js +9 -0
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js +52 -0
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.js +7 -0
- package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.js.map +1 -0
- package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.script.js +68 -0
- package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.script.js.map +1 -0
- package/dist/v2/blocks/response-block/helpers/extract-filename.js +26 -0
- package/dist/v2/blocks/response-block/helpers/extract-filename.js.map +1 -0
- package/dist/v2/blocks/response-block/helpers/get-content-length.js +12 -0
- package/dist/v2/blocks/response-block/helpers/get-content-length.js.map +1 -0
- package/dist/v2/blocks/response-block/helpers/media-types.js +227 -0
- package/dist/v2/blocks/response-block/helpers/media-types.js.map +1 -0
- package/dist/v2/blocks/response-block/helpers/parse-set-cookie.js +30 -0
- package/dist/v2/blocks/response-block/helpers/parse-set-cookie.js.map +1 -0
- package/dist/v2/blocks/response-block/helpers/process-response-body.js +26 -0
- package/dist/v2/blocks/response-block/helpers/process-response-body.js.map +1 -0
- package/dist/v2/blocks/response-block/index.d.ts +1 -1
- package/dist/v2/blocks/response-block/index.js +1 -5
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +9 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +248 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +9 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js +84 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.js +7 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js +141 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/httpStatusCodeColors.js +20 -0
- package/dist/v2/blocks/scalar-address-bar-block/components/httpStatusCodeColors.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/hooks/use-loading-animation.js +84 -0
- package/dist/v2/blocks/scalar-address-bar-block/hooks/use-loading-animation.js.map +1 -0
- package/dist/v2/blocks/scalar-address-bar-block/index.d.ts +2 -2
- package/dist/v2/blocks/scalar-address-bar-block/index.js +1 -4
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts +3 -3
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.js +7 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js +227 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.js +7 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js +48 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js +7 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +285 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.js +9 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js +71 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.js +8 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js +141 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.js +7 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js +89 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.js +7 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js +95 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.js +7 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js +69 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js +7 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js +296 -0
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/auth-options.js +92 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/auth-options.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.js +141 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js +45 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.js +10 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.js +27 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js +183 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.js +39 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js +109 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/index.d.ts +4 -4
- package/dist/v2/blocks/scalar-auth-selector-block/index.js +3 -5
- package/dist/v2/components/callout/Callout.vue.js +9 -0
- package/dist/v2/components/callout/Callout.vue.js.map +1 -0
- package/dist/v2/components/callout/Callout.vue.script.js +35 -0
- package/dist/v2/components/callout/Callout.vue.script.js.map +1 -0
- package/dist/v2/components/code-input/CodeInput.vue.js +10 -0
- package/dist/v2/components/code-input/CodeInput.vue.js.map +1 -0
- package/dist/v2/components/code-input/CodeInput.vue.script.js +380 -0
- package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -0
- package/dist/v2/components/code-input/code-variable-widget.js +132 -0
- package/dist/v2/components/code-input/code-variable-widget.js.map +1 -0
- package/dist/v2/components/code-input/index.d.ts +1 -1
- package/dist/v2/components/code-input/index.js +1 -1
- package/dist/v2/components/context-menu/ContextMenu.vue.d.ts +27 -0
- package/dist/v2/components/context-menu/ContextMenu.vue.d.ts.map +1 -0
- package/dist/v2/components/context-menu/ContextMenu.vue.js +8 -0
- package/dist/v2/components/context-menu/ContextMenu.vue.js.map +1 -0
- package/dist/v2/components/context-menu/ContextMenu.vue.script.js +53 -0
- package/dist/v2/components/context-menu/ContextMenu.vue.script.js.map +1 -0
- package/dist/v2/components/context-menu/index.d.ts +2 -0
- package/dist/v2/components/context-menu/index.d.ts.map +1 -0
- package/dist/v2/components/context-menu/index.js +2 -0
- package/dist/v2/components/data-table/DataTable.vue.js +7 -0
- package/dist/v2/components/data-table/DataTable.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTable.vue.script.js +30 -0
- package/dist/v2/components/data-table/DataTable.vue.script.js.map +1 -0
- package/dist/v2/components/data-table/DataTableCell.vue.js +7 -0
- package/dist/v2/components/data-table/DataTableCell.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTableCell.vue.script.js +21 -0
- package/dist/v2/components/data-table/DataTableCell.vue.script.js.map +1 -0
- package/dist/v2/components/data-table/DataTableCheckbox.vue.js +7 -0
- package/dist/v2/components/data-table/DataTableCheckbox.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js +43 -0
- package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js.map +1 -0
- package/dist/v2/components/data-table/DataTableHeader.vue.js +7 -0
- package/dist/v2/components/data-table/DataTableHeader.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTableHeader.vue.script.js +20 -0
- package/dist/v2/components/data-table/DataTableHeader.vue.script.js.map +1 -0
- package/dist/v2/components/data-table/DataTableInput.vue.js +9 -0
- package/dist/v2/components/data-table/DataTableInput.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTableInput.vue.script.js +160 -0
- package/dist/v2/components/data-table/DataTableInput.vue.script.js.map +1 -0
- package/dist/v2/components/data-table/DataTableInputSelect.vue.d.ts +1 -1
- package/dist/v2/components/data-table/DataTableInputSelect.vue.js +7 -0
- package/dist/v2/components/data-table/DataTableInputSelect.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js +161 -0
- package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js.map +1 -0
- package/dist/v2/components/data-table/DataTableRow.vue.js +13 -0
- package/dist/v2/components/data-table/DataTableRow.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTableText.vue.js +7 -0
- package/dist/v2/components/data-table/DataTableText.vue.js.map +1 -0
- package/dist/v2/components/data-table/DataTableText.vue.script.js +20 -0
- package/dist/v2/components/data-table/DataTableText.vue.script.js.map +1 -0
- package/dist/v2/components/data-table/index.d.ts +8 -8
- package/dist/v2/components/data-table/index.js +8 -2
- package/dist/v2/components/forms/ConfirmationForm.vue.js +7 -0
- package/dist/v2/components/forms/ConfirmationForm.vue.js.map +1 -0
- package/dist/v2/components/forms/ConfirmationForm.vue.script.js +40 -0
- package/dist/v2/components/forms/ConfirmationForm.vue.script.js.map +1 -0
- package/dist/v2/components/forms/index.d.ts +1 -1
- package/dist/v2/components/forms/index.js +1 -1
- package/dist/v2/components/layout/CollapsibleSection.vue.js +7 -0
- package/dist/v2/components/layout/CollapsibleSection.vue.js.map +1 -0
- package/dist/v2/components/layout/CollapsibleSection.vue.script.js +79 -0
- package/dist/v2/components/layout/CollapsibleSection.vue.script.js.map +1 -0
- package/dist/v2/components/layout/ValueEmitter.vue.js +7 -0
- package/dist/v2/components/layout/ValueEmitter.vue.js.map +1 -0
- package/dist/v2/components/layout/ValueEmitter.vue.script.js +18 -0
- package/dist/v2/components/layout/ValueEmitter.vue.script.js.map +1 -0
- package/dist/v2/components/layout/index.d.ts +1 -1
- package/dist/v2/components/layout/index.js +1 -1
- package/dist/v2/components/modals/DeleteModal.vue.js +7 -0
- package/dist/v2/components/modals/DeleteModal.vue.js.map +1 -0
- package/dist/v2/components/modals/DeleteModal.vue.script.js +36 -0
- package/dist/v2/components/modals/DeleteModal.vue.script.js.map +1 -0
- package/dist/v2/components/modals/ModalClientContainer.vue.js +9 -0
- package/dist/v2/components/modals/ModalClientContainer.vue.js.map +1 -0
- package/dist/v2/components/modals/ModalClientContainer.vue.script.js +62 -0
- package/dist/v2/components/modals/ModalClientContainer.vue.script.js.map +1 -0
- package/dist/v2/components/modals/index.d.ts +1 -1
- package/dist/v2/components/modals/index.js +1 -37
- package/dist/v2/components/resize/Resize.vue.js +10 -0
- package/dist/v2/components/resize/Resize.vue.js.map +1 -0
- package/dist/v2/components/resize/Resize.vue.script.js +52 -0
- package/dist/v2/components/resize/Resize.vue.script.js.map +1 -0
- package/dist/v2/components/resize/index.d.ts +2 -2
- package/dist/v2/components/resize/index.js +2 -1
- package/dist/v2/components/resize/use-split-resize.js +62 -0
- package/dist/v2/components/resize/use-split-resize.js.map +1 -0
- package/dist/v2/components/server/ServerDropdown.vue.js +7 -0
- package/dist/v2/components/server/ServerDropdown.vue.js.map +1 -0
- package/dist/v2/components/server/ServerDropdown.vue.script.js +95 -0
- package/dist/v2/components/server/ServerDropdown.vue.script.js.map +1 -0
- package/dist/v2/components/server/ServerDropdownItem.vue.js +9 -0
- package/dist/v2/components/server/ServerDropdownItem.vue.js.map +1 -0
- package/dist/v2/components/server/ServerDropdownItem.vue.script.js +46 -0
- package/dist/v2/components/server/ServerDropdownItem.vue.script.js.map +1 -0
- package/dist/v2/components/server/index.d.ts +1 -1
- package/dist/v2/components/server/index.js +1 -1
- package/dist/v2/components/sidebar/Sidebar.vue.js +7 -0
- package/dist/v2/components/sidebar/Sidebar.vue.js.map +1 -0
- package/dist/v2/components/sidebar/Sidebar.vue.script.js +117 -0
- package/dist/v2/components/sidebar/Sidebar.vue.script.js.map +1 -0
- package/dist/v2/components/sidebar/SidebarMenu.vue.js +7 -0
- package/dist/v2/components/sidebar/SidebarMenu.vue.js.map +1 -0
- package/dist/v2/components/sidebar/SidebarMenu.vue.script.js +52 -0
- package/dist/v2/components/sidebar/SidebarMenu.vue.script.js.map +1 -0
- package/dist/v2/components/sidebar/SidebarToggle.vue.js +7 -0
- package/dist/v2/components/sidebar/SidebarToggle.vue.js.map +1 -0
- package/dist/v2/components/sidebar/SidebarToggle.vue.script.js +54 -0
- package/dist/v2/components/sidebar/SidebarToggle.vue.script.js.map +1 -0
- package/dist/v2/components/sidebar/index.d.ts +3 -3
- package/dist/v2/components/sidebar/index.js +3 -2
- package/dist/v2/constants.js +7 -0
- package/dist/v2/constants.js.map +1 -0
- package/dist/v2/features/app/App.vue.d.ts +2 -2
- package/dist/v2/features/app/App.vue.d.ts.map +1 -1
- package/dist/v2/features/app/App.vue.js +8 -0
- package/dist/v2/features/app/App.vue.js.map +1 -0
- package/dist/v2/features/app/App.vue.script.js +177 -0
- package/dist/v2/features/app/App.vue.script.js.map +1 -0
- package/dist/v2/features/app/app-events.js +242 -0
- package/dist/v2/features/app/app-events.js.map +1 -0
- package/dist/v2/features/app/app-state.d.ts +3 -1
- package/dist/v2/features/app/app-state.d.ts.map +1 -1
- package/dist/v2/features/app/app-state.js +629 -0
- package/dist/v2/features/app/app-state.js.map +1 -0
- package/dist/v2/features/app/components/AppSidebar.vue.js +9 -0
- package/dist/v2/features/app/components/AppSidebar.vue.js.map +1 -0
- package/dist/v2/features/app/components/AppSidebar.vue.script.js +318 -0
- package/dist/v2/features/app/components/AppSidebar.vue.script.js.map +1 -0
- package/dist/v2/features/app/components/CreateWorkspaceModal.vue.js +7 -0
- package/dist/v2/features/app/components/CreateWorkspaceModal.vue.js.map +1 -0
- package/dist/v2/features/app/components/CreateWorkspaceModal.vue.script.js +58 -0
- package/dist/v2/features/app/components/CreateWorkspaceModal.vue.script.js.map +1 -0
- package/dist/v2/features/app/components/DesktopTab.vue.d.ts.map +1 -1
- package/dist/v2/features/app/components/DesktopTab.vue.js +9 -0
- package/dist/v2/features/app/components/DesktopTab.vue.js.map +1 -0
- package/dist/v2/features/app/components/DesktopTab.vue.script.js +121 -0
- package/dist/v2/features/app/components/DesktopTab.vue.script.js.map +1 -0
- package/dist/v2/features/app/components/DesktopTabs.vue.js +7 -0
- package/dist/v2/features/app/components/DesktopTabs.vue.js.map +1 -0
- package/dist/v2/features/app/components/DesktopTabs.vue.script.js +75 -0
- package/dist/v2/features/app/components/DesktopTabs.vue.script.js.map +1 -0
- package/dist/v2/features/app/components/DownloadAppButton.vue.js +9 -0
- package/dist/v2/features/app/components/DownloadAppButton.vue.js.map +1 -0
- package/dist/v2/features/app/components/DownloadAppButton.vue.script.js +21 -0
- package/dist/v2/features/app/components/DownloadAppButton.vue.script.js.map +1 -0
- package/dist/v2/features/app/components/SidebarItemMenu.vue.js +7 -0
- package/dist/v2/features/app/components/SidebarItemMenu.vue.js.map +1 -0
- package/dist/v2/features/app/components/SidebarItemMenu.vue.script.js +175 -0
- package/dist/v2/features/app/components/SidebarItemMenu.vue.script.js.map +1 -0
- package/dist/v2/features/app/components/SplashScreen.vue.js +9 -0
- package/dist/v2/features/app/components/SplashScreen.vue.js.map +1 -0
- package/dist/v2/features/app/components/SplashScreen.vue.script.js +20 -0
- package/dist/v2/features/app/components/SplashScreen.vue.script.js.map +1 -0
- package/dist/v2/features/app/components/index.d.ts +1 -1
- package/dist/v2/features/app/components/index.js +1 -9
- package/dist/v2/features/app/helpers/create-api-client-app.d.ts +6 -2
- package/dist/v2/features/app/helpers/create-api-client-app.d.ts.map +1 -1
- package/dist/v2/features/app/helpers/create-api-client-app.js +54 -0
- package/dist/v2/features/app/helpers/create-api-client-app.js.map +1 -0
- package/dist/v2/features/app/helpers/filter-workspaces.js +55 -0
- package/dist/v2/features/app/helpers/filter-workspaces.js.map +1 -0
- package/dist/v2/features/app/helpers/get-route-param.d.ts +1 -1
- package/dist/v2/features/app/helpers/get-route-param.js +12 -0
- package/dist/v2/features/app/helpers/get-route-param.js.map +1 -0
- package/dist/v2/features/app/helpers/group-workspaces.js +38 -0
- package/dist/v2/features/app/helpers/group-workspaces.js.map +1 -0
- package/dist/v2/features/app/helpers/routes.d.ts +7 -3
- package/dist/v2/features/app/helpers/routes.d.ts.map +1 -1
- package/dist/v2/features/app/helpers/routes.js +133 -0
- package/dist/v2/features/app/helpers/routes.js.map +1 -0
- package/dist/v2/features/app/hooks/use-document-watcher.js +168 -0
- package/dist/v2/features/app/hooks/use-document-watcher.js.map +1 -0
- package/dist/v2/features/app/hooks/use-theme.d.ts +1 -1
- package/dist/v2/features/app/hooks/use-theme.js +94 -0
- package/dist/v2/features/app/hooks/use-theme.js.map +1 -0
- package/dist/v2/features/app/index.d.ts +7 -7
- package/dist/v2/features/app/index.js +7 -3161
- package/dist/v2/features/collection/DocumentCollection.vue.d.ts +1 -1
- package/dist/v2/features/collection/DocumentCollection.vue.js +8 -0
- package/dist/v2/features/collection/DocumentCollection.vue.js.map +1 -0
- package/dist/v2/features/collection/DocumentCollection.vue.script.js +339 -0
- package/dist/v2/features/collection/DocumentCollection.vue.script.js.map +1 -0
- package/dist/v2/features/collection/OperationCollection.vue.d.ts +1 -1
- package/dist/v2/features/collection/OperationCollection.vue.js +7 -0
- package/dist/v2/features/collection/OperationCollection.vue.js.map +1 -0
- package/dist/v2/features/collection/OperationCollection.vue.script.js +94 -0
- package/dist/v2/features/collection/OperationCollection.vue.script.js.map +1 -0
- package/dist/v2/features/collection/WorkspaceCollection.vue.d.ts +1 -1
- package/dist/v2/features/collection/WorkspaceCollection.vue.js +7 -0
- package/dist/v2/features/collection/WorkspaceCollection.vue.js.map +1 -0
- package/dist/v2/features/collection/WorkspaceCollection.vue.script.js +73 -0
- package/dist/v2/features/collection/WorkspaceCollection.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Authentication.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Authentication.vue.js +9 -0
- package/dist/v2/features/collection/components/Authentication.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Authentication.vue.script.js +166 -0
- package/dist/v2/features/collection/components/Authentication.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Cookies.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Cookies.vue.js +7 -0
- package/dist/v2/features/collection/components/Cookies.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Cookies.vue.script.js +57 -0
- package/dist/v2/features/collection/components/Cookies.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/Editor.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Editor/Editor.vue.js +9 -0
- package/dist/v2/features/collection/components/Editor/Editor.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/Editor.vue.script.js +360 -0
- package/dist/v2/features/collection/components/Editor/Editor.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/components/EditorDiagnosticsPanel.vue.js +7 -0
- package/dist/v2/features/collection/components/Editor/components/EditorDiagnosticsPanel.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/components/EditorDiagnosticsPanel.vue.script.js +69 -0
- package/dist/v2/features/collection/components/Editor/components/EditorDiagnosticsPanel.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/components/EditorSavePanel.vue.js +7 -0
- package/dist/v2/features/collection/components/Editor/components/EditorSavePanel.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/components/EditorSavePanel.vue.script.js +91 -0
- package/dist/v2/features/collection/components/Editor/components/EditorSavePanel.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/helpers/get-diagnostic-counts.js +22 -0
- package/dist/v2/features/collection/components/Editor/helpers/get-diagnostic-counts.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/helpers/get-operation-context.js +17 -0
- package/dist/v2/features/collection/components/Editor/helpers/get-operation-context.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/helpers/get-visible-diagnostics.js +17 -0
- package/dist/v2/features/collection/components/Editor/helpers/get-visible-diagnostics.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/helpers/parse-editor-object.js +34 -0
- package/dist/v2/features/collection/components/Editor/helpers/parse-editor-object.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/helpers/stringify-document.js +18 -0
- package/dist/v2/features/collection/components/Editor/helpers/stringify-document.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/hooks/use-editor-state.js +36 -0
- package/dist/v2/features/collection/components/Editor/hooks/use-editor-state.js.map +1 -0
- package/dist/v2/features/collection/components/Editor/index.d.ts +1 -1
- package/dist/v2/features/collection/components/Editor/index.js +1 -1
- package/dist/v2/features/collection/components/Environment.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Environment.vue.js +7 -0
- package/dist/v2/features/collection/components/Environment.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Environment.vue.script.js +60 -0
- package/dist/v2/features/collection/components/Environment.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Form.vue.js +7 -0
- package/dist/v2/features/collection/components/Form.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Form.vue.script.js +75 -0
- package/dist/v2/features/collection/components/Form.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/LabelInput.vue.js +9 -0
- package/dist/v2/features/collection/components/LabelInput.vue.js.map +1 -0
- package/dist/v2/features/collection/components/LabelInput.vue.script.js +38 -0
- package/dist/v2/features/collection/components/LabelInput.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Overview.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Overview.vue.js +9 -0
- package/dist/v2/features/collection/components/Overview.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Overview.vue.script.js +203 -0
- package/dist/v2/features/collection/components/Overview.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Servers.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Servers.vue.js +7 -0
- package/dist/v2/features/collection/components/Servers.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Servers.vue.script.js +217 -0
- package/dist/v2/features/collection/components/Servers.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Settings.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Settings.vue.d.ts.map +1 -1
- package/dist/v2/features/collection/components/Settings.vue.js +7 -0
- package/dist/v2/features/collection/components/Settings.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Settings.vue.script.js +80 -0
- package/dist/v2/features/collection/components/Settings.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/SyncConflictResolutionEditor.vue.js +9 -0
- package/dist/v2/features/collection/components/SyncConflictResolutionEditor.vue.js.map +1 -0
- package/dist/v2/features/collection/components/SyncConflictResolutionEditor.vue.script.js +136 -0
- package/dist/v2/features/collection/components/SyncConflictResolutionEditor.vue.script.js.map +1 -0
- package/dist/v2/features/collection/components/Tabs.vue.d.ts +1 -1
- package/dist/v2/features/collection/components/Tabs.vue.js +7 -0
- package/dist/v2/features/collection/components/Tabs.vue.js.map +1 -0
- package/dist/v2/features/collection/components/Tabs.vue.script.js +53 -0
- package/dist/v2/features/collection/components/Tabs.vue.script.js.map +1 -0
- package/dist/v2/features/collection/helpers/get-default-operation-security-toggle.js +19 -0
- package/dist/v2/features/collection/helpers/get-default-operation-security-toggle.js.map +1 -0
- package/dist/v2/features/command-palette/TheCommandPalette.vue.d.ts +1 -1
- package/dist/v2/features/command-palette/TheCommandPalette.vue.js +9 -0
- package/dist/v2/features/command-palette/TheCommandPalette.vue.js.map +1 -0
- package/dist/v2/features/command-palette/TheCommandPalette.vue.script.js +189 -0
- package/dist/v2/features/command-palette/TheCommandPalette.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandActionForm.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandActionForm.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js +47 -0
- package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandActionInput.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandActionInput.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandActionInput.vue.script.js +73 -0
- package/dist/v2/features/command-palette/components/CommandActionInput.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteExample.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandPaletteExample.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteExample.vue.script.js +207 -0
- package/dist/v2/features/command-palette/components/CommandPaletteExample.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImport.vue.d.ts +3 -23
- package/dist/v2/features/command-palette/components/CommandPaletteImport.vue.d.ts.map +1 -1
- package/dist/v2/features/command-palette/components/CommandPaletteImport.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImport.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImport.vue.script.js +206 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImport.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportCurl.vue.js +9 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportCurl.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportCurl.vue.script.js +125 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportCurl.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportPostman.vue.d.ts +30 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportPostman.vue.d.ts.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportPostman.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportPostman.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportPostman.vue.script.js +151 -0
- package/dist/v2/features/command-palette/components/CommandPaletteImportPostman.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteOpenApiDocument.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandPaletteOpenApiDocument.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteOpenApiDocument.vue.script.js +89 -0
- package/dist/v2/features/command-palette/components/CommandPaletteOpenApiDocument.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteRequest.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandPaletteRequest.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteRequest.vue.script.js +226 -0
- package/dist/v2/features/command-palette/components/CommandPaletteRequest.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteTag.vue.js +7 -0
- package/dist/v2/features/command-palette/components/CommandPaletteTag.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/CommandPaletteTag.vue.script.js +126 -0
- package/dist/v2/features/command-palette/components/CommandPaletteTag.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/PostmanImportPreview.vue.d.ts +58 -0
- package/dist/v2/features/command-palette/components/PostmanImportPreview.vue.d.ts.map +1 -0
- package/dist/v2/features/command-palette/components/PostmanImportPreview.vue.js +9 -0
- package/dist/v2/features/command-palette/components/PostmanImportPreview.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/PostmanImportPreview.vue.script.js +142 -0
- package/dist/v2/features/command-palette/components/PostmanImportPreview.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/PostmanRequestTreeRow.vue.d.ts +23 -0
- package/dist/v2/features/command-palette/components/PostmanRequestTreeRow.vue.d.ts.map +1 -0
- package/dist/v2/features/command-palette/components/PostmanRequestTreeRow.vue.js +9 -0
- package/dist/v2/features/command-palette/components/PostmanRequestTreeRow.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/PostmanRequestTreeRow.vue.script.js +138 -0
- package/dist/v2/features/command-palette/components/PostmanRequestTreeRow.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/components/WatchModeToggle.vue.js +7 -0
- package/dist/v2/features/command-palette/components/WatchModeToggle.vue.js.map +1 -0
- package/dist/v2/features/command-palette/components/WatchModeToggle.vue.script.js +39 -0
- package/dist/v2/features/command-palette/components/WatchModeToggle.vue.script.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/generate-unique-slug.js +29 -0
- package/dist/v2/features/command-palette/helpers/generate-unique-slug.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/get-merge-key.d.ts +11 -0
- package/dist/v2/features/command-palette/helpers/get-merge-key.d.ts.map +1 -0
- package/dist/v2/features/command-palette/helpers/get-merge-key.js +32 -0
- package/dist/v2/features/command-palette/helpers/get-merge-key.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/get-openapi-document-details.js +56 -0
- package/dist/v2/features/command-palette/helpers/get-openapi-document-details.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/get-openapi-from-postman.d.ts +2 -1
- package/dist/v2/features/command-palette/helpers/get-openapi-from-postman.d.ts.map +1 -1
- package/dist/v2/features/command-palette/helpers/get-openapi-from-postman.js +22 -0
- package/dist/v2/features/command-palette/helpers/get-openapi-from-postman.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/get-operation-from-curl.js +119 -0
- package/dist/v2/features/command-palette/helpers/get-operation-from-curl.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/get-postman-document-details.d.ts +4 -0
- package/dist/v2/features/command-palette/helpers/get-postman-document-details.d.ts.map +1 -1
- package/dist/v2/features/command-palette/helpers/get-postman-document-details.js +36 -0
- package/dist/v2/features/command-palette/helpers/get-postman-document-details.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/import-document-to-workspace.js +70 -0
- package/dist/v2/features/command-palette/helpers/import-document-to-workspace.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/is-postman-collection.js +24 -0
- package/dist/v2/features/command-palette/helpers/is-postman-collection.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/load-document-from-source.js +71 -0
- package/dist/v2/features/command-palette/helpers/load-document-from-source.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/postman-request-collisions.d.ts +11 -0
- package/dist/v2/features/command-palette/helpers/postman-request-collisions.d.ts.map +1 -0
- package/dist/v2/features/command-palette/helpers/postman-request-collisions.js +35 -0
- package/dist/v2/features/command-palette/helpers/postman-request-collisions.js.map +1 -0
- package/dist/v2/features/command-palette/helpers/postman-request-tree.d.ts +41 -0
- package/dist/v2/features/command-palette/helpers/postman-request-tree.d.ts.map +1 -0
- package/dist/v2/features/command-palette/helpers/postman-request-tree.js +139 -0
- package/dist/v2/features/command-palette/helpers/postman-request-tree.js.map +1 -0
- package/dist/v2/features/command-palette/hooks/use-command-palette-state.d.ts +38 -2
- package/dist/v2/features/command-palette/hooks/use-command-palette-state.d.ts.map +1 -1
- package/dist/v2/features/command-palette/hooks/use-command-palette-state.js +207 -0
- package/dist/v2/features/command-palette/hooks/use-command-palette-state.js.map +1 -0
- package/dist/v2/features/command-palette/index.d.ts +2 -2
- package/dist/v2/features/command-palette/index.js +2 -2
- package/dist/v2/features/editor/config.js +19 -0
- package/dist/v2/features/editor/config.js.map +1 -0
- package/dist/v2/features/editor/helpers/configure-language-support.js +48 -0
- package/dist/v2/features/editor/helpers/configure-language-support.js.map +1 -0
- package/dist/v2/features/editor/helpers/ensure-monaco-environment.js +21 -0
- package/dist/v2/features/editor/helpers/ensure-monaco-environment.js.map +1 -0
- package/dist/v2/features/editor/helpers/json/create-json-model.js +31 -0
- package/dist/v2/features/editor/helpers/json/create-json-model.js.map +1 -0
- package/dist/v2/features/editor/helpers/json/get-json-ast-node-from-path.d.ts +1 -1
- package/dist/v2/features/editor/helpers/json/get-json-ast-node-from-path.js +22 -0
- package/dist/v2/features/editor/helpers/json/get-json-ast-node-from-path.js.map +1 -0
- package/dist/v2/features/editor/helpers/json/json-ast.js +32 -0
- package/dist/v2/features/editor/helpers/json/json-ast.js.map +1 -0
- package/dist/v2/features/editor/helpers/json/json-pointer-links.js +104 -0
- package/dist/v2/features/editor/helpers/json/json-pointer-links.js.map +1 -0
- package/dist/v2/features/editor/helpers/json/json-pointer-path.d.ts +1 -1
- package/dist/v2/features/editor/helpers/json/json-pointer-path.js +27 -0
- package/dist/v2/features/editor/helpers/json/json-pointer-path.js.map +1 -0
- package/dist/v2/features/editor/helpers/range-to-whole-line.js +27 -0
- package/dist/v2/features/editor/helpers/range-to-whole-line.js.map +1 -0
- package/dist/v2/features/editor/helpers/theme/apply-scalar-theme.js +84 -0
- package/dist/v2/features/editor/helpers/theme/apply-scalar-theme.js.map +1 -0
- package/dist/v2/features/editor/helpers/theme/load-css-variables.js +41 -0
- package/dist/v2/features/editor/helpers/theme/load-css-variables.js.map +1 -0
- package/dist/v2/features/editor/helpers/yaml/create-yaml-model.js +32 -0
- package/dist/v2/features/editor/helpers/yaml/create-yaml-model.js.map +1 -0
- package/dist/v2/features/editor/helpers/yaml/get-yaml-node-range-from-path.js +70 -0
- package/dist/v2/features/editor/helpers/yaml/get-yaml-node-range-from-path.js.map +1 -0
- package/dist/v2/features/editor/hooks/use-editor-markers.js +37 -0
- package/dist/v2/features/editor/hooks/use-editor-markers.js.map +1 -0
- package/dist/v2/features/editor/hooks/use-editor.js +133 -0
- package/dist/v2/features/editor/hooks/use-editor.js.map +1 -0
- package/dist/v2/features/editor/hooks/use-json-pointer-link-support.js +45 -0
- package/dist/v2/features/editor/hooks/use-json-pointer-link-support.js.map +1 -0
- package/dist/v2/features/editor/hooks/use-three-way-merge-editor.js +396 -0
- package/dist/v2/features/editor/hooks/use-three-way-merge-editor.js.map +1 -0
- package/dist/v2/features/editor/index.d.ts +4 -4
- package/dist/v2/features/editor/index.js +4 -1
- package/dist/v2/features/editor/schemas/openapi-3.1-schema.json.js +51 -0
- package/dist/v2/features/editor/schemas/openapi-3.1-schema.json.js.map +1 -0
- package/dist/v2/features/environments/EnvironmentsList.vue.js +7 -0
- package/dist/v2/features/environments/EnvironmentsList.vue.js.map +1 -0
- package/dist/v2/features/environments/EnvironmentsList.vue.script.js +96 -0
- package/dist/v2/features/environments/EnvironmentsList.vue.script.js.map +1 -0
- package/dist/v2/features/environments/components/Environment.vue.js +7 -0
- package/dist/v2/features/environments/components/Environment.vue.js.map +1 -0
- package/dist/v2/features/environments/components/Environment.vue.script.js +65 -0
- package/dist/v2/features/environments/components/Environment.vue.script.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentColors.vue.js +7 -0
- package/dist/v2/features/environments/components/EnvironmentColors.vue.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentColors.vue.script.js +158 -0
- package/dist/v2/features/environments/components/EnvironmentColors.vue.script.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.js +7 -0
- package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js +97 -0
- package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.js +7 -0
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js +50 -0
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js +7 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +113 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.js +9 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.js.map +1 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js +152 -0
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js.map +1 -0
- package/dist/v2/features/environments/index.d.ts +1 -1
- package/dist/v2/features/environments/index.js +1 -3
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.js +9 -0
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.js.map +1 -0
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.script.js +186 -0
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.script.js.map +1 -0
- package/dist/v2/features/global-cookies/index.d.ts +1 -1
- package/dist/v2/features/global-cookies/index.js +1 -3
- package/dist/v2/features/modal/Modal.vue.d.ts +1 -1
- package/dist/v2/features/modal/Modal.vue.js +7 -0
- package/dist/v2/features/modal/Modal.vue.js.map +1 -0
- package/dist/v2/features/modal/Modal.vue.script.js +147 -0
- package/dist/v2/features/modal/Modal.vue.script.js.map +1 -0
- package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts +2 -2
- package/dist/v2/features/modal/helpers/create-api-client-modal.js +100 -0
- package/dist/v2/features/modal/helpers/create-api-client-modal.js.map +1 -0
- package/dist/v2/features/modal/helpers/map-hidden-clients-config.js +32 -0
- package/dist/v2/features/modal/helpers/map-hidden-clients-config.js.map +1 -0
- package/dist/v2/features/modal/helpers/resolve-route-parameters.js +92 -0
- package/dist/v2/features/modal/helpers/resolve-route-parameters.js.map +1 -0
- package/dist/v2/features/modal/helpers/restore-workspace-state.js +51 -0
- package/dist/v2/features/modal/helpers/restore-workspace-state.js.map +1 -0
- package/dist/v2/features/modal/hooks/use-modal-sidebar.d.ts +1 -1
- package/dist/v2/features/modal/hooks/use-modal-sidebar.js +142 -0
- package/dist/v2/features/modal/hooks/use-modal-sidebar.js.map +1 -0
- package/dist/v2/features/modal/index.d.ts +3 -3
- package/dist/v2/features/modal/index.js +3 -639
- package/dist/v2/features/modal/modal-events.d.ts +1 -1
- package/dist/v2/features/modal/modal-events.js +41 -0
- package/dist/v2/features/modal/modal-events.js.map +1 -0
- package/dist/v2/features/operation/Operation.vue.d.ts +2 -2
- package/dist/v2/features/operation/Operation.vue.js +7 -0
- package/dist/v2/features/operation/Operation.vue.js.map +1 -0
- package/dist/v2/features/operation/Operation.vue.script.js +182 -0
- package/dist/v2/features/operation/Operation.vue.script.js.map +1 -0
- package/dist/v2/features/operation/helpers/combine-params.js +20 -0
- package/dist/v2/features/operation/helpers/combine-params.js.map +1 -0
- package/dist/v2/features/operation/helpers/get-security-requirements.js +17 -0
- package/dist/v2/features/operation/helpers/get-security-requirements.js.map +1 -0
- package/dist/v2/features/operation/helpers/get-selected-security.js +41 -0
- package/dist/v2/features/operation/helpers/get-selected-security.js.map +1 -0
- package/dist/v2/features/operation/helpers/get-selected-server.js +21 -0
- package/dist/v2/features/operation/helpers/get-selected-server.js.map +1 -0
- package/dist/v2/features/operation/index.d.ts +5 -5
- package/dist/v2/features/operation/index.js +5 -18
- package/dist/v2/features/search/helpers/create-fuse-instance.js +52 -0
- package/dist/v2/features/search/helpers/create-fuse-instance.js.map +1 -0
- package/dist/v2/features/search/helpers/create-search-index.js +76 -0
- package/dist/v2/features/search/helpers/create-search-index.js.map +1 -0
- package/dist/v2/features/search/hooks/use-search-index.js +31 -0
- package/dist/v2/features/search/hooks/use-search-index.js.map +1 -0
- package/dist/v2/features/search/index.d.ts +1 -1
- package/dist/v2/features/search/index.js +1 -1
- package/dist/v2/features/settings/CollectionSettings.vue.d.ts +4 -0
- package/dist/v2/features/settings/CollectionSettings.vue.d.ts.map +1 -1
- package/dist/v2/features/settings/CollectionSettings.vue.js +7 -0
- package/dist/v2/features/settings/CollectionSettings.vue.js.map +1 -0
- package/dist/v2/features/settings/CollectionSettings.vue.script.js +229 -0
- package/dist/v2/features/settings/CollectionSettings.vue.script.js.map +1 -0
- package/dist/v2/features/settings/DocumentSettings.vue.js +7 -0
- package/dist/v2/features/settings/DocumentSettings.vue.js.map +1 -0
- package/dist/v2/features/settings/DocumentSettings.vue.script.js +92 -0
- package/dist/v2/features/settings/DocumentSettings.vue.script.js.map +1 -0
- package/dist/v2/features/settings/components/Appearance.vue.js +7 -0
- package/dist/v2/features/settings/components/Appearance.vue.js.map +1 -0
- package/dist/v2/features/settings/components/Appearance.vue.script.js +63 -0
- package/dist/v2/features/settings/components/Appearance.vue.script.js.map +1 -0
- package/dist/v2/features/settings/components/Section.vue.js +7 -0
- package/dist/v2/features/settings/components/Section.vue.js.map +1 -0
- package/dist/v2/features/settings/components/Section.vue.script.js +30 -0
- package/dist/v2/features/settings/components/Section.vue.script.js.map +1 -0
- package/dist/v2/features/settings/helpers/get-theme-colors.js +68 -0
- package/dist/v2/features/settings/helpers/get-theme-colors.js.map +1 -0
- package/dist/v2/features/settings/index.d.ts +2 -2
- package/dist/v2/features/settings/index.js +2 -1
- package/dist/v2/helpers/drag-handle-factory.d.ts.map +1 -1
- package/dist/v2/helpers/drag-handle-factory.js +258 -0
- package/dist/v2/helpers/drag-handle-factory.js.map +1 -0
- package/dist/v2/helpers/generate-location-id.js +25 -0
- package/dist/v2/helpers/generate-location-id.js.map +1 -0
- package/dist/v2/helpers/get-active-environment.js +19 -0
- package/dist/v2/helpers/get-active-environment.js.map +1 -0
- package/dist/v2/helpers/get-active-proxy-url.js +26 -0
- package/dist/v2/helpers/get-active-proxy-url.js.map +1 -0
- package/dist/v2/helpers/get-servers.js +106 -0
- package/dist/v2/helpers/get-servers.js.map +1 -0
- package/dist/v2/helpers/get-tab-details.d.ts +1 -1
- package/dist/v2/helpers/get-tab-details.js +54 -0
- package/dist/v2/helpers/get-tab-details.js.map +1 -0
- package/dist/v2/helpers/handle-hotkeys.js +151 -0
- package/dist/v2/helpers/handle-hotkeys.js.map +1 -0
- package/dist/v2/helpers/index.d.ts +2 -2
- package/dist/v2/helpers/index.js +2 -2
- package/dist/v2/helpers/is-url.js +9 -0
- package/dist/v2/helpers/is-url.js.map +1 -0
- package/dist/v2/helpers/slugify.js +15 -0
- package/dist/v2/helpers/slugify.js.map +1 -0
- package/dist/v2/helpers/storage.d.ts +8 -0
- package/dist/v2/helpers/storage.d.ts.map +1 -1
- package/dist/v2/helpers/storage.js +37 -0
- package/dist/v2/helpers/storage.js.map +1 -0
- package/dist/v2/hooks/use-color-mode.js +72 -0
- package/dist/v2/hooks/use-color-mode.js.map +1 -0
- package/dist/v2/hooks/use-global-hot-keys.js +22 -0
- package/dist/v2/hooks/use-global-hot-keys.js.map +1 -0
- package/dist/v2/hooks/use-scroll-lock.js +58 -0
- package/dist/v2/hooks/use-scroll-lock.js.map +1 -0
- package/dist/v2/posthog.d.ts +3 -0
- package/dist/v2/posthog.d.ts.map +1 -0
- package/dist/v2/posthog.js +19 -0
- package/dist/v2/posthog.js.map +1 -0
- package/dist/v2/workspace-events.js +109 -0
- package/dist/v2/workspace-events.js.map +1 -0
- package/dist/views/Collection/Collection.vue.js +7 -0
- package/dist/views/Collection/Collection.vue.js.map +1 -0
- package/dist/views/Collection/Collection.vue.script.js +46 -0
- package/dist/views/Collection/Collection.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionAuthentication.vue.js +9 -0
- package/dist/views/Collection/CollectionAuthentication.vue.js.map +1 -0
- package/dist/views/Collection/CollectionAuthentication.vue.script.js +52 -0
- package/dist/views/Collection/CollectionAuthentication.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionCookies.vue.js +7 -0
- package/dist/views/Collection/CollectionCookies.vue.js.map +1 -0
- package/dist/views/Collection/CollectionCookies.vue.script.js +18 -0
- package/dist/views/Collection/CollectionCookies.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionEnvironment.vue.js +8 -0
- package/dist/views/Collection/CollectionEnvironment.vue.js.map +1 -0
- package/dist/views/Collection/CollectionEnvironment.vue.script.js +238 -0
- package/dist/views/Collection/CollectionEnvironment.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionInfoForm.vue.js +9 -0
- package/dist/views/Collection/CollectionInfoForm.vue.js.map +1 -0
- package/dist/views/Collection/CollectionInfoForm.vue.script.js +73 -0
- package/dist/views/Collection/CollectionInfoForm.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionNavigation.vue.js +7 -0
- package/dist/views/Collection/CollectionNavigation.vue.js.map +1 -0
- package/dist/views/Collection/CollectionNavigation.vue.script.js +75 -0
- package/dist/views/Collection/CollectionNavigation.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionOverview.vue.js +7 -0
- package/dist/views/Collection/CollectionOverview.vue.js.map +1 -0
- package/dist/views/Collection/CollectionOverview.vue.script.js +42 -0
- package/dist/views/Collection/CollectionOverview.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionScripts.vue.js +7 -0
- package/dist/views/Collection/CollectionScripts.vue.js.map +1 -0
- package/dist/views/Collection/CollectionScripts.vue.script.js +18 -0
- package/dist/views/Collection/CollectionScripts.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionServerForm.vue.js +7 -0
- package/dist/views/Collection/CollectionServerForm.vue.js.map +1 -0
- package/dist/views/Collection/CollectionServerForm.vue.script.js +76 -0
- package/dist/views/Collection/CollectionServerForm.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionServers.vue.js +7 -0
- package/dist/views/Collection/CollectionServers.vue.js.map +1 -0
- package/dist/views/Collection/CollectionServers.vue.script.js +95 -0
- package/dist/views/Collection/CollectionServers.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionSettings.vue.js +7 -0
- package/dist/views/Collection/CollectionSettings.vue.js.map +1 -0
- package/dist/views/Collection/CollectionSettings.vue.script.js +87 -0
- package/dist/views/Collection/CollectionSettings.vue.script.js.map +1 -0
- package/dist/views/Collection/CollectionSync.vue.js +7 -0
- package/dist/views/Collection/CollectionSync.vue.js.map +1 -0
- package/dist/views/Collection/CollectionSync.vue.script.js +18 -0
- package/dist/views/Collection/CollectionSync.vue.script.js.map +1 -0
- package/dist/views/Collection/components/EnvironmentForm.vue.d.ts +1 -1
- package/dist/views/Collection/components/EnvironmentForm.vue.js +9 -0
- package/dist/views/Collection/components/EnvironmentForm.vue.js.map +1 -0
- package/dist/views/Collection/components/EnvironmentForm.vue.script.js +284 -0
- package/dist/views/Collection/components/EnvironmentForm.vue.script.js.map +1 -0
- package/dist/views/Collection/components/MarkdownInput.vue.d.ts +1 -1
- package/dist/views/Collection/components/MarkdownInput.vue.js +9 -0
- package/dist/views/Collection/components/MarkdownInput.vue.js.map +1 -0
- package/dist/views/Collection/components/MarkdownInput.vue.script.js +92 -0
- package/dist/views/Collection/components/MarkdownInput.vue.script.js.map +1 -0
- package/dist/views/Components/CodeSnippet/CodeSnippet.vue.d.ts +1 -1
- package/dist/views/Components/CodeSnippet/CodeSnippet.vue.js +7 -0
- package/dist/views/Components/CodeSnippet/CodeSnippet.vue.js.map +1 -0
- package/dist/views/Components/CodeSnippet/CodeSnippet.vue.script.js +74 -0
- package/dist/views/Components/CodeSnippet/CodeSnippet.vue.script.js.map +1 -0
- package/dist/views/Components/CodeSnippet/helpers/convert-to-har-request.js +66 -0
- package/dist/views/Components/CodeSnippet/helpers/convert-to-har-request.js.map +1 -0
- package/dist/views/Components/CodeSnippet/helpers/get-har-request.d.ts +1 -1
- package/dist/views/Components/CodeSnippet/helpers/get-har-request.js +86 -0
- package/dist/views/Components/CodeSnippet/helpers/get-har-request.js.map +1 -0
- package/dist/views/Components/CodeSnippet/helpers/get-snippet.d.ts +1 -1
- package/dist/views/Components/CodeSnippet/helpers/get-snippet.js +39 -0
- package/dist/views/Components/CodeSnippet/helpers/get-snippet.js.map +1 -0
- package/dist/views/Components/CodeSnippet/index.d.ts +4 -4
- package/dist/views/Components/CodeSnippet/index.js +4 -2
- package/dist/views/Cookies/CookieForm.vue.js +7 -0
- package/dist/views/Cookies/CookieForm.vue.js.map +1 -0
- package/dist/views/Cookies/CookieForm.vue.script.js +50 -0
- package/dist/views/Cookies/CookieForm.vue.script.js.map +1 -0
- package/dist/views/Cookies/CookieModal.vue.js +9 -0
- package/dist/views/Cookies/CookieModal.vue.js.map +1 -0
- package/dist/views/Cookies/CookieModal.vue.script.js +83 -0
- package/dist/views/Cookies/CookieModal.vue.script.js.map +1 -0
- package/dist/views/Cookies/Cookies.vue.js +7 -0
- package/dist/views/Cookies/Cookies.vue.js.map +1 -0
- package/dist/views/Cookies/Cookies.vue.script.js +156 -0
- package/dist/views/Cookies/Cookies.vue.script.js.map +1 -0
- package/dist/views/Environment/Environment.vue.js +7 -0
- package/dist/views/Environment/Environment.vue.js.map +1 -0
- package/dist/views/Environment/Environment.vue.script.js +384 -0
- package/dist/views/Environment/Environment.vue.script.js.map +1 -0
- package/dist/views/Environment/EnvironmentColorModal.vue.js +7 -0
- package/dist/views/Environment/EnvironmentColorModal.vue.js.map +1 -0
- package/dist/views/Environment/EnvironmentColorModal.vue.script.js +47 -0
- package/dist/views/Environment/EnvironmentColorModal.vue.script.js.map +1 -0
- package/dist/views/Environment/EnvironmentColors.vue.js +7 -0
- package/dist/views/Environment/EnvironmentColors.vue.js.map +1 -0
- package/dist/views/Environment/EnvironmentColors.vue.script.js +126 -0
- package/dist/views/Environment/EnvironmentColors.vue.script.js.map +1 -0
- package/dist/views/Environment/EnvironmentModal.vue.js +7 -0
- package/dist/views/Environment/EnvironmentModal.vue.js.map +1 -0
- package/dist/views/Environment/EnvironmentModal.vue.script.js +122 -0
- package/dist/views/Environment/EnvironmentModal.vue.script.js.map +1 -0
- package/dist/views/Environment/EnvironmentVariableDropdown.vue.d.ts +1 -1
- package/dist/views/Environment/EnvironmentVariableDropdown.vue.js +7 -0
- package/dist/views/Environment/EnvironmentVariableDropdown.vue.js.map +1 -0
- package/dist/views/Environment/EnvironmentVariableDropdown.vue.script.js +133 -0
- package/dist/views/Environment/EnvironmentVariableDropdown.vue.script.js.map +1 -0
- package/dist/views/Environment/handle-drag.d.ts +1 -1
- package/dist/views/Environment/handle-drag.js +38 -0
- package/dist/views/Environment/handle-drag.js.map +1 -0
- package/dist/views/Request/Request.vue.d.ts +1 -1
- package/dist/views/Request/Request.vue.js +9 -0
- package/dist/views/Request/Request.vue.js.map +1 -0
- package/dist/views/Request/Request.vue.script.js +117 -0
- package/dist/views/Request/Request.vue.script.js.map +1 -0
- package/dist/views/Request/RequestRoot.vue.d.ts.map +1 -1
- package/dist/views/Request/RequestRoot.vue.js +9 -0
- package/dist/views/Request/RequestRoot.vue.js.map +1 -0
- package/dist/views/Request/RequestRoot.vue.script.js +158 -0
- package/dist/views/Request/RequestRoot.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/DeleteRequestAuthModal.vue.js +7 -0
- package/dist/views/Request/RequestSection/RequestAuth/DeleteRequestAuthModal.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/DeleteRequestAuthModal.vue.script.js +52 -0
- package/dist/views/Request/RequestSection/RequestAuth/DeleteRequestAuthModal.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.js +7 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.script.js +204 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuthScopesInput.vue.js +7 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuthScopesInput.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuthScopesInput.vue.script.js +106 -0
- package/dist/views/Request/RequestSection/RequestAuth/OAuthScopesInput.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuth.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuth.vue.js +9 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuth.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuth.vue.script.js +216 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuth.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTable.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTable.vue.js +9 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTable.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTable.vue.script.js +116 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTable.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTableInput.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTableInput.vue.js +7 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTableInput.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTableInput.vue.script.js +73 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTableInput.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthTab.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthTab.vue.js +7 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthTab.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthTab.vue.script.js +205 -0
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthTab.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/helpers/restore-auth-from-local-storage.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/helpers/restore-auth-from-local-storage.js +39 -0
- package/dist/views/Request/RequestSection/RequestAuth/helpers/restore-auth-from-local-storage.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestAuth/index.d.ts +3 -3
- package/dist/views/Request/RequestSection/RequestAuth/index.js +3 -3
- package/dist/views/Request/RequestSection/RequestBody.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestBody.vue.js +9 -0
- package/dist/views/Request/RequestSection/RequestBody.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestBody.vue.script.js +477 -0
- package/dist/views/Request/RequestSection/RequestBody.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestCodeExample.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestCodeExample.vue.js +9 -0
- package/dist/views/Request/RequestSection/RequestCodeExample.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestCodeExample.vue.script.js +187 -0
- package/dist/views/Request/RequestSection/RequestCodeExample.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestParams.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestParams.vue.js +7 -0
- package/dist/views/Request/RequestSection/RequestParams.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestParams.vue.script.js +180 -0
- package/dist/views/Request/RequestSection/RequestParams.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestPathParams.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestPathParams.vue.js +7 -0
- package/dist/views/Request/RequestSection/RequestPathParams.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestPathParams.vue.script.js +115 -0
- package/dist/views/Request/RequestSection/RequestPathParams.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestSection.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestSection.vue.js +9 -0
- package/dist/views/Request/RequestSection/RequestSection.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestSection.vue.script.js +297 -0
- package/dist/views/Request/RequestSection/RequestSection.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestTable.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestTable.vue.js +9 -0
- package/dist/views/Request/RequestSection/RequestTable.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestTable.vue.script.js +266 -0
- package/dist/views/Request/RequestSection/RequestTable.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestTableTooltip.vue.js +9 -0
- package/dist/views/Request/RequestSection/RequestTableTooltip.vue.js.map +1 -0
- package/dist/views/Request/RequestSection/RequestTableTooltip.vue.script.js +64 -0
- package/dist/views/Request/RequestSection/RequestTableTooltip.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSection/helpers/filter-security-requirements.js +38 -0
- package/dist/views/Request/RequestSection/helpers/filter-security-requirements.js.map +1 -0
- package/dist/views/Request/RequestSection/helpers/getting-started.js +17 -0
- package/dist/views/Request/RequestSection/helpers/getting-started.js.map +1 -0
- package/dist/views/Request/RequestSection/helpers/update-scheme.d.ts +1 -1
- package/dist/views/Request/RequestSection/helpers/update-scheme.js +22 -0
- package/dist/views/Request/RequestSection/helpers/update-scheme.js.map +1 -0
- package/dist/views/Request/RequestSection/index.d.ts +2 -2
- package/dist/views/Request/RequestSection/index.js +2 -42
- package/dist/views/Request/RequestSidebar.vue.js +9 -0
- package/dist/views/Request/RequestSidebar.vue.js.map +1 -0
- package/dist/views/Request/RequestSidebar.vue.script.js +307 -0
- package/dist/views/Request/RequestSidebar.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSidebarItem.vue.js +10 -0
- package/dist/views/Request/RequestSidebarItem.vue.js.map +1 -0
- package/dist/views/Request/RequestSidebarItem.vue.script.js +475 -0
- package/dist/views/Request/RequestSidebarItem.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSidebarItemMenu.vue.js +9 -0
- package/dist/views/Request/RequestSidebarItemMenu.vue.js.map +1 -0
- package/dist/views/Request/RequestSidebarItemMenu.vue.script.js +222 -0
- package/dist/views/Request/RequestSidebarItemMenu.vue.script.js.map +1 -0
- package/dist/views/Request/RequestSubpageHeader.vue.d.ts +1 -1
- package/dist/views/Request/RequestSubpageHeader.vue.js +9 -0
- package/dist/views/Request/RequestSubpageHeader.vue.js.map +1 -0
- package/dist/views/Request/RequestSubpageHeader.vue.script.js +92 -0
- package/dist/views/Request/RequestSubpageHeader.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/RequestHeaders.vue.js +7 -0
- package/dist/views/Request/ResponseSection/RequestHeaders.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/RequestHeaders.vue.script.js +77 -0
- package/dist/views/Request/ResponseSection/RequestHeaders.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBody.vue.js +9 -0
- package/dist/views/Request/ResponseSection/ResponseBody.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBody.vue.script.js +91 -0
- package/dist/views/Request/ResponseSection/ResponseBody.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyDownload.vue.js +7 -0
- package/dist/views/Request/ResponseSection/ResponseBodyDownload.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyDownload.vue.script.js +35 -0
- package/dist/views/Request/ResponseSection/ResponseBodyDownload.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyInfo.vue.js +14 -0
- package/dist/views/Request/ResponseSection/ResponseBodyInfo.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyPreview.vue.js +9 -0
- package/dist/views/Request/ResponseSection/ResponseBodyPreview.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyPreview.vue.script.js +64 -0
- package/dist/views/Request/ResponseSection/ResponseBodyPreview.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyRaw.vue.js +9 -0
- package/dist/views/Request/ResponseSection/ResponseBodyRaw.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyRaw.vue.script.js +54 -0
- package/dist/views/Request/ResponseSection/ResponseBodyRaw.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyStreaming.vue.js +7 -0
- package/dist/views/Request/ResponseSection/ResponseBodyStreaming.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyStreaming.vue.script.js +85 -0
- package/dist/views/Request/ResponseSection/ResponseBodyStreaming.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyToggle.vue.js +7 -0
- package/dist/views/Request/ResponseSection/ResponseBodyToggle.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyToggle.vue.script.js +25 -0
- package/dist/views/Request/ResponseSection/ResponseBodyToggle.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyVirtual.vue.js +8 -0
- package/dist/views/Request/ResponseSection/ResponseBodyVirtual.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseBodyVirtual.vue.script.js +51 -0
- package/dist/views/Request/ResponseSection/ResponseBodyVirtual.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseCookies.vue.js +7 -0
- package/dist/views/Request/ResponseSection/ResponseCookies.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseCookies.vue.script.js +39 -0
- package/dist/views/Request/ResponseSection/ResponseCookies.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseEmpty.vue.js +9 -0
- package/dist/views/Request/ResponseSection/ResponseEmpty.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseEmpty.vue.script.js +98 -0
- package/dist/views/Request/ResponseSection/ResponseEmpty.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseHeaders.vue.js +7 -0
- package/dist/views/Request/ResponseSection/ResponseHeaders.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseHeaders.vue.script.js +77 -0
- package/dist/views/Request/ResponseSection/ResponseHeaders.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseLoadingOverlay.vue.js +9 -0
- package/dist/views/Request/ResponseSection/ResponseLoadingOverlay.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseLoadingOverlay.vue.script.js +44 -0
- package/dist/views/Request/ResponseSection/ResponseLoadingOverlay.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.js +7 -0
- package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.script.js +64 -0
- package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseSection.vue.d.ts +1 -1
- package/dist/views/Request/ResponseSection/ResponseSection.vue.js +9 -0
- package/dist/views/Request/ResponseSection/ResponseSection.vue.js.map +1 -0
- package/dist/views/Request/ResponseSection/ResponseSection.vue.script.js +206 -0
- package/dist/views/Request/ResponseSection/ResponseSection.vue.script.js.map +1 -0
- package/dist/views/Request/ResponseSection/index.d.ts +2 -2
- package/dist/views/Request/ResponseSection/index.js +2 -6
- package/dist/views/Request/components/WorkspaceDropdown.vue.js +7 -0
- package/dist/views/Request/components/WorkspaceDropdown.vue.js.map +1 -0
- package/dist/views/Request/components/WorkspaceDropdown.vue.script.js +182 -0
- package/dist/views/Request/components/WorkspaceDropdown.vue.script.js.map +1 -0
- package/dist/views/Request/components/index.d.ts +1 -1
- package/dist/views/Request/components/index.js +1 -1
- package/dist/views/Request/consts/index.d.ts +2 -2
- package/dist/views/Request/consts/index.js +2 -1
- package/dist/views/Request/consts/mediaTypes.js +231 -0
- package/dist/views/Request/consts/mediaTypes.js.map +1 -0
- package/dist/views/Request/consts/new-auth-options.js +90 -0
- package/dist/views/Request/consts/new-auth-options.js.map +1 -0
- package/dist/views/Request/handle-drag.d.ts +1 -1
- package/dist/views/Request/handle-drag.js +51 -0
- package/dist/views/Request/handle-drag.js.map +1 -0
- package/dist/views/Request/hooks/useOpenApiWatcher.js +96 -0
- package/dist/views/Request/hooks/useOpenApiWatcher.js.map +1 -0
- package/dist/views/Request/libs/auth.js +74 -0
- package/dist/views/Request/libs/auth.js.map +1 -0
- package/dist/views/Request/libs/index.d.ts +3 -3
- package/dist/views/Request/libs/index.js +3 -2
- package/dist/views/Request/libs/oauth2.d.ts +1 -1
- package/dist/views/Request/libs/oauth2.js +178 -0
- package/dist/views/Request/libs/oauth2.js.map +1 -0
- package/dist/views/Request/libs/request.js +46 -0
- package/dist/views/Request/libs/request.js.map +1 -0
- package/dist/views/Request/libs/watch-mode.d.ts +1 -1
- package/dist/views/Request/libs/watch-mode.js +375 -0
- package/dist/views/Request/libs/watch-mode.js.map +1 -0
- package/dist/views/Settings/Settings.vue.js +7 -0
- package/dist/views/Settings/Settings.vue.js.map +1 -0
- package/dist/views/Settings/Settings.vue.script.js +28 -0
- package/dist/views/Settings/Settings.vue.script.js.map +1 -0
- package/dist/views/Settings/SettingsGeneral.vue.js +7 -0
- package/dist/views/Settings/SettingsGeneral.vue.js.map +1 -0
- package/dist/views/Settings/SettingsGeneral.vue.script.js +241 -0
- package/dist/views/Settings/SettingsGeneral.vue.script.js.map +1 -0
- package/dist/views/Settings/components/SettingsAppearance.vue.js +7 -0
- package/dist/views/Settings/components/SettingsAppearance.vue.js.map +1 -0
- package/dist/views/Settings/components/SettingsAppearance.vue.script.js +62 -0
- package/dist/views/Settings/components/SettingsAppearance.vue.script.js.map +1 -0
- package/dist/views/Settings/components/SettingsSection.vue.js +7 -0
- package/dist/views/Settings/components/SettingsSection.vue.js.map +1 -0
- package/dist/views/Settings/components/SettingsSection.vue.script.js +27 -0
- package/dist/views/Settings/components/SettingsSection.vue.script.js.map +1 -0
- package/package.json +19 -14
- package/dist/AddressBar-BOZGKSoz.js +0 -302
- package/dist/AddressBar-BOZGKSoz.js.map +0 -1
- package/dist/App-Ckirvnv1.js +0 -2510
- package/dist/App-Ckirvnv1.js.map +0 -1
- package/dist/App-DHBmpWJI.js +0 -533
- package/dist/App-DHBmpWJI.js.map +0 -1
- package/dist/CodeInput-BTN8cC5h.js +0 -694
- package/dist/CodeInput-BTN8cC5h.js.map +0 -1
- package/dist/CodeSnippet-D7Heh1nd.js +0 -218
- package/dist/CodeSnippet-D7Heh1nd.js.map +0 -1
- package/dist/Collection-BsAG7ms5.js +0 -219
- package/dist/Collection-BsAG7ms5.js.map +0 -1
- package/dist/CollectionAuthentication-BMGhRnpo.js +0 -56
- package/dist/CollectionAuthentication-BMGhRnpo.js.map +0 -1
- package/dist/CollectionCookies-DyjPPMdt.js +0 -19
- package/dist/CollectionCookies-DyjPPMdt.js.map +0 -1
- package/dist/CollectionEnvironment-BY9Gcnln.js +0 -514
- package/dist/CollectionEnvironment-BY9Gcnln.js.map +0 -1
- package/dist/CollectionOverview-C3GvN8GY.js +0 -131
- package/dist/CollectionOverview-C3GvN8GY.js.map +0 -1
- package/dist/CollectionScripts-CMNlBlby.js +0 -19
- package/dist/CollectionScripts-CMNlBlby.js.map +0 -1
- package/dist/CollectionServers-DuOLysNB.js +0 -168
- package/dist/CollectionServers-DuOLysNB.js.map +0 -1
- package/dist/CollectionSettings-FtXNetOh.js +0 -87
- package/dist/CollectionSettings-FtXNetOh.js.map +0 -1
- package/dist/CollectionSync-CAflc5yW.js +0 -19
- package/dist/CollectionSync-CAflc5yW.js.map +0 -1
- package/dist/CommandActionInput-TkcAx6E8.js +0 -97
- package/dist/CommandActionInput-TkcAx6E8.js.map +0 -1
- package/dist/CommandPalette-BxoEK8TY.js +0 -964
- package/dist/CommandPalette-BxoEK8TY.js.map +0 -1
- package/dist/CommandPaletteImport-Diu5dDIY.js +0 -622
- package/dist/CommandPaletteImport-Diu5dDIY.js.map +0 -1
- package/dist/Cookies-BYTv1YIA.js +0 -284
- package/dist/Cookies-BYTv1YIA.js.map +0 -1
- package/dist/DataTable-BqbZKW3K.js +0 -62
- package/dist/DataTable-BqbZKW3K.js.map +0 -1
- package/dist/DataTableHeader-DJVB0jCZ.js +0 -21
- package/dist/DataTableHeader-DJVB0jCZ.js.map +0 -1
- package/dist/DataTableInput-RydMDjn2.js +0 -166
- package/dist/DataTableInput-RydMDjn2.js.map +0 -1
- package/dist/DataTableRow-c3XveEUO.js +0 -57
- package/dist/DataTableRow-c3XveEUO.js.map +0 -1
- package/dist/DeleteSidebarListElement-C-p87d03.js +0 -78
- package/dist/DeleteSidebarListElement-C-p87d03.js.map +0 -1
- package/dist/EditSidebarListElement-CodWPnM6.js +0 -32
- package/dist/EditSidebarListElement-CodWPnM6.js.map +0 -1
- package/dist/Editor-BomsGWHx.js +0 -909
- package/dist/Editor-BomsGWHx.js.map +0 -1
- package/dist/EmptyState-Cnm7hGW5.js +0 -46
- package/dist/EmptyState-Cnm7hGW5.js.map +0 -1
- package/dist/Environment-BIxG7DaO.js +0 -416
- package/dist/Environment-BIxG7DaO.js.map +0 -1
- package/dist/EnvironmentModal-C0lYytkh.js +0 -288
- package/dist/EnvironmentModal-C0lYytkh.js.map +0 -1
- package/dist/Form-KFcdRQp1.js +0 -83
- package/dist/Form-KFcdRQp1.js.map +0 -1
- package/dist/HttpMethod-rnWEgC3T.js +0 -78
- package/dist/HttpMethod-rnWEgC3T.js.map +0 -1
- package/dist/IconSelector-BDC_GQXv.js +0 -67
- package/dist/IconSelector-BDC_GQXv.js.map +0 -1
- package/dist/ImportCollection-CGjySEzP.js +0 -804
- package/dist/ImportCollection-CGjySEzP.js.map +0 -1
- package/dist/IntegrationLogo-B9EDW8db.js +0 -51
- package/dist/IntegrationLogo-B9EDW8db.js.map +0 -1
- package/dist/MainLayout-BnLwst16.js +0 -281
- package/dist/MainLayout-BnLwst16.js.map +0 -1
- package/dist/Modal-CTZ8UNds.js +0 -67
- package/dist/Modal-CTZ8UNds.js.map +0 -1
- package/dist/ModalClientContainer-qHsZi4wQ.js +0 -65
- package/dist/ModalClientContainer-qHsZi4wQ.js.map +0 -1
- package/dist/Request-d0RY0ZhC.js +0 -212
- package/dist/Request-d0RY0ZhC.js.map +0 -1
- package/dist/RequestAuth-1cRH3DDn.js +0 -989
- package/dist/RequestAuth-1cRH3DDn.js.map +0 -1
- package/dist/RequestRoot-pW0yXesG.js +0 -1611
- package/dist/RequestRoot-pW0yXesG.js.map +0 -1
- package/dist/RequestSection-D2BLvDTr.js +0 -1582
- package/dist/RequestSection-D2BLvDTr.js.map +0 -1
- package/dist/ResponseSection-B_YF7l_E.js +0 -949
- package/dist/ResponseSection-B_YF7l_E.js.map +0 -1
- package/dist/ScalarAsciiArt-BjuSnj8e.js +0 -45
- package/dist/ScalarAsciiArt-BjuSnj8e.js.map +0 -1
- package/dist/SectionFilter-hrtoRLwj.js +0 -99
- package/dist/SectionFilter-hrtoRLwj.js.map +0 -1
- package/dist/Server-CEKGIEfE.js +0 -303
- package/dist/Server-CEKGIEfE.js.map +0 -1
- package/dist/ServerVariablesForm-BRZ9XC8o.js +0 -145
- package/dist/ServerVariablesForm-BRZ9XC8o.js.map +0 -1
- package/dist/Settings-BaPvhJ8Y.js +0 -347
- package/dist/Settings-BaPvhJ8Y.js.map +0 -1
- package/dist/Sidebar-CRxdl38Y.js +0 -73
- package/dist/Sidebar-CRxdl38Y.js.map +0 -1
- package/dist/SidebarButton-BAagdMDe.js +0 -37
- package/dist/SidebarButton-BAagdMDe.js.map +0 -1
- package/dist/SidebarListElement-BfTPiihc.js +0 -232
- package/dist/SidebarListElement-BfTPiihc.js.map +0 -1
- package/dist/TheCommandPalette-Dl9TAeke.js +0 -204
- package/dist/TheCommandPalette-Dl9TAeke.js.map +0 -1
- package/dist/ValueEmitter-QYkZ9Hdc.js +0 -20
- package/dist/ValueEmitter-QYkZ9Hdc.js.map +0 -1
- package/dist/ViewLayout-BOXN0IYo.js +0 -17
- package/dist/ViewLayout-BOXN0IYo.js.map +0 -1
- package/dist/ViewLayoutCollapse-CiTb-Uml.js +0 -86
- package/dist/ViewLayoutCollapse-CiTb-Uml.js.map +0 -1
- package/dist/ViewLayoutContent-CvMoJYPF.js +0 -13
- package/dist/ViewLayoutContent-CvMoJYPF.js.map +0 -1
- package/dist/ViewLayoutSection-mUqKbQry.js +0 -23
- package/dist/ViewLayoutSection-mUqKbQry.js.map +0 -1
- package/dist/WatchModeToggle-D_eAiTWJ.js +0 -41
- package/dist/WatchModeToggle-D_eAiTWJ.js.map +0 -1
- package/dist/_plugin-vue_export-helper-BmmBcIzD.js +0 -8
- package/dist/analytics-BZimCWcw.js +0 -7
- package/dist/analytics-BZimCWcw.js.map +0 -1
- package/dist/analytics.d.ts +0 -18
- package/dist/analytics.d.ts.map +0 -1
- package/dist/build-request-security-BQjNr2MD.js +0 -41
- package/dist/build-request-security-BQjNr2MD.js.map +0 -1
- package/dist/code-input-iq-moLxi.js +0 -775
- package/dist/code-input-iq-moLxi.js.map +0 -1
- package/dist/components-B0BwUDFw.js +0 -183
- package/dist/components-B0BwUDFw.js.map +0 -1
- package/dist/components-ChixwQhN.js +0 -61
- package/dist/components-ChixwQhN.js.map +0 -1
- package/dist/computer-D7VW3Ruy.js +0 -562
- package/dist/computer-D7VW3Ruy.js.map +0 -1
- package/dist/consts-CyGRb9dl.js +0 -318
- package/dist/consts-CyGRb9dl.js.map +0 -1
- package/dist/curl-nbw1OxbV.js +0 -54
- package/dist/curl-nbw1OxbV.js.map +0 -1
- package/dist/data-table-PL7e8NRO.js +0 -282
- package/dist/data-table-PL7e8NRO.js.map +0 -1
- package/dist/editor-BZ_J0eze.js +0 -466
- package/dist/editor-BZ_J0eze.js.map +0 -1
- package/dist/environments-ByLK9lnC.js +0 -592
- package/dist/environments-ByLK9lnC.js.map +0 -1
- package/dist/formatters-DOGXZq9R.js +0 -36
- package/dist/formatters-DOGXZq9R.js.map +0 -1
- package/dist/forms-CZX6cFDS.js +0 -42
- package/dist/forms-CZX6cFDS.js.map +0 -1
- package/dist/get-active-environment-CkxyQ1dM.js +0 -19
- package/dist/get-active-environment-CkxyQ1dM.js.map +0 -1
- package/dist/get-resolved-url-SybDPV0U.js +0 -85
- package/dist/get-resolved-url-SybDPV0U.js.map +0 -1
- package/dist/get-server-url-UVN-dx79.js +0 -32
- package/dist/get-server-url-UVN-dx79.js.map +0 -1
- package/dist/get-servers-B_WNlQWB.js +0 -106
- package/dist/get-servers-B_WNlQWB.js.map +0 -1
- package/dist/get-snippet-DBRUSfZ2.js +0 -39
- package/dist/get-snippet-DBRUSfZ2.js.map +0 -1
- package/dist/global-cookies-D3ZS9ON3.js +0 -184
- package/dist/global-cookies-D3ZS9ON3.js.map +0 -1
- package/dist/hooks/useAnalytics.d.ts +0 -19
- package/dist/hooks/useAnalytics.d.ts.map +0 -1
- package/dist/hooks-BvZxH4XB.js +0 -80
- package/dist/hooks-BvZxH4XB.js.map +0 -1
- package/dist/layout-BWiL7dfb.js +0 -81
- package/dist/layout-BWiL7dfb.js.map +0 -1
- package/dist/layouts/Web/index.js.map +0 -1
- package/dist/libs-spbv4P0g.js +0 -249
- package/dist/libs-spbv4P0g.js.map +0 -1
- package/dist/operation-block-B1B3lJPx.js +0 -1674
- package/dist/operation-block-B1B3lJPx.js.map +0 -1
- package/dist/operation-code-sample-DOzAPxLQ.js +0 -1738
- package/dist/operation-code-sample-DOzAPxLQ.js.map +0 -1
- package/dist/parse-curl-BtypQT3D.js +0 -106
- package/dist/parse-curl-BtypQT3D.js.map +0 -1
- package/dist/plugins-B52hCIyZ.js +0 -50
- package/dist/plugins-B52hCIyZ.js.map +0 -1
- package/dist/rabbitjump-CMZXAR6d.js +0 -9
- package/dist/rabbitjump-CMZXAR6d.js.map +0 -1
- package/dist/request-block-C1kLLMEd.js +0 -1466
- package/dist/request-block-C1kLLMEd.js.map +0 -1
- package/dist/resize-D2IYvVdh.js +0 -114
- package/dist/resize-D2IYvVdh.js.map +0 -1
- package/dist/response-block-DmkaDZYs.js +0 -1188
- package/dist/response-block-DmkaDZYs.js.map +0 -1
- package/dist/scalar-address-bar-block-BbysOhkE.js +0 -425
- package/dist/scalar-address-bar-block-BbysOhkE.js.map +0 -1
- package/dist/scalar-auth-selector-block-Bs79QOMA.js +0 -1889
- package/dist/scalar-auth-selector-block-Bs79QOMA.js.map +0 -1
- package/dist/search-CmsQQkjn.js +0 -151
- package/dist/search-CmsQQkjn.js.map +0 -1
- package/dist/send-request-BsTfRiBC.js +0 -348
- package/dist/send-request-BsTfRiBC.js.map +0 -1
- package/dist/server-tcI-OCyx.js +0 -140
- package/dist/server-tcI-OCyx.js.map +0 -1
- package/dist/set-request-cookies-BJJhsU4A.js +0 -88
- package/dist/set-request-cookies-BJJhsU4A.js.map +0 -1
- package/dist/settings-BKk_1lcH.js +0 -455
- package/dist/settings-BKk_1lcH.js.map +0 -1
- package/dist/sidebar-ceSbYmnt.js +0 -217
- package/dist/sidebar-ceSbYmnt.js.map +0 -1
- package/dist/store-DnlAQK5d.js +0 -1512
- package/dist/store-DnlAQK5d.js.map +0 -1
- package/dist/string-template-sS5PtY6T.js +0 -64
- package/dist/string-template-sS5PtY6T.js.map +0 -1
- package/dist/use-global-hot-keys-D8Ai8Qbm.js +0 -274
- package/dist/use-global-hot-keys-D8Ai8Qbm.js.map +0 -1
- package/dist/useSidebar-DLTwHDI-.js +0 -45
- package/dist/useSidebar-DLTwHDI-.js.map +0 -1
- package/dist/v2/components/modals/index.js.map +0 -1
- package/dist/v2/features/app/index.js.map +0 -1
- package/dist/v2/features/modal/index.js.map +0 -1
- package/dist/views/Request/RequestSection/index.js.map +0 -1
- package/dist/watch-mode-Dbaqd9bG.js +0 -375
- package/dist/watch-mode-Dbaqd9bG.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["$slots"],"sources":["../../../../src/v2/features/command-palette/components/CommandPaletteExample.vue","../../../../src/v2/features/command-palette/components/CommandPaletteExample.vue","../../../../src/v2/features/command-palette/helpers/get-operation-from-curl.ts","../../../../src/v2/features/command-palette/components/CommandPaletteImportCurl.vue","../../../../src/v2/features/command-palette/components/CommandPaletteImportCurl.vue","../../../../src/v2/features/command-palette/components/CommandPaletteOpenApiDocument.vue","../../../../src/v2/features/command-palette/components/CommandPaletteOpenApiDocument.vue","../../../../src/v2/features/command-palette/components/CommandPaletteRequest.vue","../../../../src/v2/features/command-palette/components/CommandPaletteRequest.vue","../../../../src/v2/features/command-palette/components/CommandPaletteTag.vue","../../../../src/v2/features/command-palette/components/CommandPaletteTag.vue","../../../../src/v2/features/command-palette/hooks/use-command-palette-state.ts","../../../../src/v2/features/collection/helpers/get-default-operation-security-toggle.ts","../../../../src/v2/features/collection/components/Authentication.vue","../../../../src/v2/features/collection/components/Authentication.vue","../../../../src/v2/features/collection/components/Cookies.vue","../../../../src/v2/features/collection/components/Cookies.vue","../../../../src/v2/features/collection/components/Environment.vue","../../../../src/v2/features/collection/components/Environment.vue","../../../../src/v2/features/collection/components/Overview.vue","../../../../src/v2/features/collection/components/Overview.vue","../../../../src/v2/features/collection/components/Form.vue","../../../../src/v2/features/collection/components/Form.vue","../../../../src/v2/features/collection/components/Servers.vue","../../../../src/v2/features/collection/components/Servers.vue","../../../../src/v2/features/collection/components/Settings.vue","../../../../src/v2/features/collection/components/Settings.vue","../../../../src/v2/components/callout/Callout.vue","../../../../src/v2/components/callout/Callout.vue","../../../../src/v2/features/collection/components/LabelInput.vue","../../../../src/v2/features/collection/components/LabelInput.vue","../../../../src/v2/features/editor/hooks/use-three-way-merge-editor.ts","../../../../src/v2/features/collection/components/SyncConflictResolutionEditor.vue","../../../../src/v2/features/collection/components/SyncConflictResolutionEditor.vue","../../../../src/v2/features/collection/components/Tabs.vue","../../../../src/v2/features/collection/components/Tabs.vue","../../../../src/v2/features/collection/DocumentCollection.vue","../../../../src/v2/features/collection/DocumentCollection.vue","../../../../src/v2/features/collection/OperationCollection.vue","../../../../src/v2/features/collection/OperationCollection.vue","../../../../src/v2/features/collection/WorkspaceCollection.vue","../../../../src/v2/features/collection/WorkspaceCollection.vue","../../../../src/v2/features/app/helpers/routes.ts","../../../../src/v2/features/app/helpers/create-api-client-app.ts"],"sourcesContent":["<script lang=\"ts\">\n/**\n * Command Palette Example Component\n *\n * Provides a form for creating a new example for an API operation.\n * Users can name the example, select a document (collection), and choose an operation.\n * Automatically navigates to the example route which creates the example.\n *\n * @example\n * <CommandPaletteExample\n * :workspaceStore=\"workspaceStore\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {\n name: 'CommandPaletteExample',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n ScalarListbox,\n} from '@scalar/components'\nimport type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type {\n TraversedEntry,\n TraversedExample,\n TraversedOperation,\n} from '@scalar/workspace-store/schemas/navigation'\nimport { computed, ref, watch } from 'vue'\n\nimport HttpMethodBadge from '@/v2/blocks/operation-code-sample/components/HttpMethod.vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus, documentName, operationId, example } =\n defineProps<{\n /** The workspace store for accessing documents and operations */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting operation creation events */\n eventBus: WorkspaceEventBus\n /** Document id to create the example for */\n documentName?: string\n /** Preselected path and method to create the example for */\n operationId?: string\n /** Existing example for edit mode */\n example?: TraversedExample\n }>()\n\nconst emit = defineEmits<{\n /** Emitted when the example is created successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\n/** Operation option type for selectors */\ntype OperationOption = {\n id: string\n label: string\n path: string\n method: HttpMethod\n exampleNames: string[]\n}\n\nconst isEditMode = computed(() => example !== undefined)\n\nconst exampleName = ref(example?.name ?? '')\nconst exampleNameTrimmed = computed(() => exampleName.value.trim())\n\n/** All available documents (collections) in the workspace */\nconst availableDocuments = computed(() =>\n Object.entries(workspaceStore.workspace.documents).map(\n ([name, document]) => ({\n id: name,\n label: document.info.title || name,\n }),\n ),\n)\n\nconst selectedDocument = ref<{ id: string; label: string } | undefined>(\n documentName\n ? availableDocuments.value.find((document) => document.id === documentName)\n : (availableDocuments.value[0] ?? undefined),\n)\n\n/**\n * Recursively traverse navigation entries to find all operations.\n * Operations can be nested under tags or at the document level.\n */\nconst getAllOperations = (entries: TraversedEntry[]): TraversedOperation[] => {\n const operations: TraversedOperation[] = []\n\n for (const entry of entries) {\n if (entry.type === 'operation') {\n operations.push(entry)\n }\n\n /** Recursively traverse child entries if they exist */\n if ('children' in entry && entry.children) {\n operations.push(...getAllOperations(entry.children))\n }\n }\n\n return operations\n}\n\n/** All available operations for the selected document */\nconst availableOperations = computed(() => {\n if (!selectedDocument.value) {\n return []\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n if (!document || !document['x-scalar-navigation']) {\n return []\n }\n\n const navigation = document['x-scalar-navigation']\n const operations = getAllOperations(navigation.children ?? [])\n\n return operations.map((operation) => ({\n id: operation.id,\n label: `${operation.method.toUpperCase()} ${operation.path}`,\n path: operation.path,\n method: operation.method,\n exampleNames:\n operation.children\n ?.filter((child): child is TraversedExample => child.type === 'example')\n .map((child) => child.name) ?? [],\n }))\n})\n\nconst selectedOperation = ref<OperationOption | undefined>(\n operationId\n ? availableOperations.value.find(\n (operation) => operation.id === operationId,\n )\n : undefined,\n)\n\n/** Reset operation selection when document changes */\nwatch(\n selectedDocument,\n () => {\n selectedOperation.value = operationId\n ? availableOperations.value.find(\n (operation) => operation.id === operationId,\n )\n : (availableOperations.value[0] ?? undefined)\n },\n { immediate: true },\n)\n\n/** Handle operation selection from dropdown */\nconst handleSelect = (operation: OperationOption | undefined): void => {\n if (operation) {\n selectedOperation.value = operation\n }\n}\n\n/**\n * Check if the form should be disabled.\n * Disabled when any required field is missing or empty.\n */\nconst isDisabled = computed<boolean>(() => {\n if (\n !exampleNameTrimmed.value ||\n !selectedDocument.value ||\n !selectedOperation.value\n ) {\n return true\n }\n\n if (isEditMode.value && example) {\n if (exampleNameTrimmed.value === example.name) {\n return true\n }\n }\n\n if (\n selectedOperation.value.exampleNames.some(\n (name) => name === exampleNameTrimmed.value && name !== example?.name,\n )\n ) {\n return true\n }\n\n return false\n})\n\n/**\n * Navigate to the example route which will create it automatically.\n * The route handler will create the example with the provided details.\n */\nconst handleSubmit = (): void => {\n if (isDisabled.value || !selectedDocument.value || !selectedOperation.value) {\n return\n }\n\n if (isEditMode.value && example) {\n eventBus.emit('operation:rename:example', {\n documentName: selectedDocument.value.id,\n meta: {\n path: selectedOperation.value.path,\n method: selectedOperation.value.method,\n exampleKey: example.name,\n },\n payload: {\n name: exampleNameTrimmed.value,\n },\n })\n emit('close')\n return\n }\n\n eventBus.emit('operation:create:draft-example', {\n documentName: selectedDocument.value.id,\n meta: {\n path: selectedOperation.value.path,\n method: selectedOperation.value.method,\n },\n exampleName: exampleNameTrimmed.value,\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n if (isEditMode.value) {\n return\n }\n\n emit('back', event)\n}\n\n/** Handle cancel action in edit mode */\nconst handleCancel = (): void => {\n emit('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"exampleName\"\n label=\"Example Name\"\n placeholder=\"Example Name\"\n @delete=\"handleBack\" />\n\n <!-- Selectors for document and operation -->\n <template #options>\n <div\n v-if=\"!isEditMode\"\n class=\"flex flex-1 gap-1\">\n <!-- Document (collection) selector -->\n <ScalarListbox\n v-model=\"selectedDocument\"\n :options=\"availableDocuments\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-[150px] min-w-[150px] justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedDocument ? 'text-c-1 truncate' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : 'Select Document'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n\n <!-- Operation selector (path + method) -->\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 :disabled=\"!availableOperations.length\"\n variant=\"outlined\">\n <span\n v-if=\"selectedOperation\"\n class=\"text-c-1 truncate\">\n {{ selectedOperation.path }}\n </span>\n <span\n v-else\n class=\"text-c-3\">\n Select Operation\n </span>\n <div class=\"flex items-center gap-2\">\n <HttpMethodBadge\n v-if=\"selectedOperation\"\n :method=\"selectedOperation.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n\n <!-- Dropdown list of all operations -->\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"operation in availableOperations\"\n :key=\"operation.id\"\n class=\"flex h-7 w-full items-center justify-between px-1 pr-[26px]\"\n @click=\"handleSelect(operation)\">\n <span class=\"truncate\">{{ operation.path }}</span>\n <HttpMethodBadge :method=\"operation.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </div>\n\n <ScalarButton\n v-else\n class=\"max-h-8 px-3 text-xs\"\n variant=\"outlined\"\n @click=\"handleCancel\">\n Cancel\n </ScalarButton>\n </template>\n\n <template #submit>{{ isEditMode ? 'Save' : 'Create Example' }}</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\n/**\n * Command Palette Example Component\n *\n * Provides a form for creating a new example for an API operation.\n * Users can name the example, select a document (collection), and choose an operation.\n * Automatically navigates to the example route which creates the example.\n *\n * @example\n * <CommandPaletteExample\n * :workspaceStore=\"workspaceStore\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {\n name: 'CommandPaletteExample',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n ScalarListbox,\n} from '@scalar/components'\nimport type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type {\n TraversedEntry,\n TraversedExample,\n TraversedOperation,\n} from '@scalar/workspace-store/schemas/navigation'\nimport { computed, ref, watch } from 'vue'\n\nimport HttpMethodBadge from '@/v2/blocks/operation-code-sample/components/HttpMethod.vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus, documentName, operationId, example } =\n defineProps<{\n /** The workspace store for accessing documents and operations */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting operation creation events */\n eventBus: WorkspaceEventBus\n /** Document id to create the example for */\n documentName?: string\n /** Preselected path and method to create the example for */\n operationId?: string\n /** Existing example for edit mode */\n example?: TraversedExample\n }>()\n\nconst emit = defineEmits<{\n /** Emitted when the example is created successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\n/** Operation option type for selectors */\ntype OperationOption = {\n id: string\n label: string\n path: string\n method: HttpMethod\n exampleNames: string[]\n}\n\nconst isEditMode = computed(() => example !== undefined)\n\nconst exampleName = ref(example?.name ?? '')\nconst exampleNameTrimmed = computed(() => exampleName.value.trim())\n\n/** All available documents (collections) in the workspace */\nconst availableDocuments = computed(() =>\n Object.entries(workspaceStore.workspace.documents).map(\n ([name, document]) => ({\n id: name,\n label: document.info.title || name,\n }),\n ),\n)\n\nconst selectedDocument = ref<{ id: string; label: string } | undefined>(\n documentName\n ? availableDocuments.value.find((document) => document.id === documentName)\n : (availableDocuments.value[0] ?? undefined),\n)\n\n/**\n * Recursively traverse navigation entries to find all operations.\n * Operations can be nested under tags or at the document level.\n */\nconst getAllOperations = (entries: TraversedEntry[]): TraversedOperation[] => {\n const operations: TraversedOperation[] = []\n\n for (const entry of entries) {\n if (entry.type === 'operation') {\n operations.push(entry)\n }\n\n /** Recursively traverse child entries if they exist */\n if ('children' in entry && entry.children) {\n operations.push(...getAllOperations(entry.children))\n }\n }\n\n return operations\n}\n\n/** All available operations for the selected document */\nconst availableOperations = computed(() => {\n if (!selectedDocument.value) {\n return []\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n if (!document || !document['x-scalar-navigation']) {\n return []\n }\n\n const navigation = document['x-scalar-navigation']\n const operations = getAllOperations(navigation.children ?? [])\n\n return operations.map((operation) => ({\n id: operation.id,\n label: `${operation.method.toUpperCase()} ${operation.path}`,\n path: operation.path,\n method: operation.method,\n exampleNames:\n operation.children\n ?.filter((child): child is TraversedExample => child.type === 'example')\n .map((child) => child.name) ?? [],\n }))\n})\n\nconst selectedOperation = ref<OperationOption | undefined>(\n operationId\n ? availableOperations.value.find(\n (operation) => operation.id === operationId,\n )\n : undefined,\n)\n\n/** Reset operation selection when document changes */\nwatch(\n selectedDocument,\n () => {\n selectedOperation.value = operationId\n ? availableOperations.value.find(\n (operation) => operation.id === operationId,\n )\n : (availableOperations.value[0] ?? undefined)\n },\n { immediate: true },\n)\n\n/** Handle operation selection from dropdown */\nconst handleSelect = (operation: OperationOption | undefined): void => {\n if (operation) {\n selectedOperation.value = operation\n }\n}\n\n/**\n * Check if the form should be disabled.\n * Disabled when any required field is missing or empty.\n */\nconst isDisabled = computed<boolean>(() => {\n if (\n !exampleNameTrimmed.value ||\n !selectedDocument.value ||\n !selectedOperation.value\n ) {\n return true\n }\n\n if (isEditMode.value && example) {\n if (exampleNameTrimmed.value === example.name) {\n return true\n }\n }\n\n if (\n selectedOperation.value.exampleNames.some(\n (name) => name === exampleNameTrimmed.value && name !== example?.name,\n )\n ) {\n return true\n }\n\n return false\n})\n\n/**\n * Navigate to the example route which will create it automatically.\n * The route handler will create the example with the provided details.\n */\nconst handleSubmit = (): void => {\n if (isDisabled.value || !selectedDocument.value || !selectedOperation.value) {\n return\n }\n\n if (isEditMode.value && example) {\n eventBus.emit('operation:rename:example', {\n documentName: selectedDocument.value.id,\n meta: {\n path: selectedOperation.value.path,\n method: selectedOperation.value.method,\n exampleKey: example.name,\n },\n payload: {\n name: exampleNameTrimmed.value,\n },\n })\n emit('close')\n return\n }\n\n eventBus.emit('operation:create:draft-example', {\n documentName: selectedDocument.value.id,\n meta: {\n path: selectedOperation.value.path,\n method: selectedOperation.value.method,\n },\n exampleName: exampleNameTrimmed.value,\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n if (isEditMode.value) {\n return\n }\n\n emit('back', event)\n}\n\n/** Handle cancel action in edit mode */\nconst handleCancel = (): void => {\n emit('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"exampleName\"\n label=\"Example Name\"\n placeholder=\"Example Name\"\n @delete=\"handleBack\" />\n\n <!-- Selectors for document and operation -->\n <template #options>\n <div\n v-if=\"!isEditMode\"\n class=\"flex flex-1 gap-1\">\n <!-- Document (collection) selector -->\n <ScalarListbox\n v-model=\"selectedDocument\"\n :options=\"availableDocuments\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-[150px] min-w-[150px] justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedDocument ? 'text-c-1 truncate' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : 'Select Document'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n\n <!-- Operation selector (path + method) -->\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 :disabled=\"!availableOperations.length\"\n variant=\"outlined\">\n <span\n v-if=\"selectedOperation\"\n class=\"text-c-1 truncate\">\n {{ selectedOperation.path }}\n </span>\n <span\n v-else\n class=\"text-c-3\">\n Select Operation\n </span>\n <div class=\"flex items-center gap-2\">\n <HttpMethodBadge\n v-if=\"selectedOperation\"\n :method=\"selectedOperation.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n\n <!-- Dropdown list of all operations -->\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"operation in availableOperations\"\n :key=\"operation.id\"\n class=\"flex h-7 w-full items-center justify-between px-1 pr-[26px]\"\n @click=\"handleSelect(operation)\">\n <span class=\"truncate\">{{ operation.path }}</span>\n <HttpMethodBadge :method=\"operation.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </div>\n\n <ScalarButton\n v-else\n class=\"max-h-8 px-3 text-xs\"\n variant=\"outlined\"\n @click=\"handleCancel\">\n Cancel\n </ScalarButton>\n </template>\n\n <template #submit>{{ isEditMode ? 'Save' : 'Create Example' }}</template>\n </CommandActionForm>\n</template>\n","import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport type {\n OperationObject,\n ParameterObject,\n SchemaObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\n\nimport { parseCurlCommand } from '@/libs'\n\n/**\n * Represents the result of parsing a cURL command into an OpenAPI operation.\n */\ntype CurlOperationResult = {\n /** The URL path extracted from the cURL command. */\n path: string\n /** The HTTP method (GET, POST, etc.). */\n method: HttpMethod\n /** The OpenAPI operation object with parameters, body, and servers. */\n operation: OperationObject\n}\n\n/**\n * Represents data that can be either JSON or form-encoded key-value pairs.\n */\ntype ParsedData = Record<string, unknown>\n\n/**\n * Parses request body data from a string.\n * Attempts JSON parsing first, then falls back to form-encoded parsing.\n *\n * Form-encoded data is expected in the format: key1=value1&key2=value2\n */\nconst parseRequestBodyData = (data: string): ParsedData => {\n try {\n // Try parsing as JSON first\n return JSON.parse(data) as ParsedData\n } catch {\n // If JSON parsing fails, parse as form-encoded data (key=value&key2=value2)\n const result: Record<string, string> = {}\n\n data.split('&').forEach((pair) => {\n const [key, value] = pair.split('=')\n if (key && value) {\n result[decodeURIComponent(key)] = decodeURIComponent(value)\n }\n })\n\n return result\n }\n}\n\n/**\n * Determines the content type based on the request body structure.\n * Returns form-encoded if the body looks like form data, JSON if the body looks like JSON,\n * otherwise uses the header value.\n */\nconst detectContentType = (body: string, headers: Record<string, string>): string => {\n // If Content-Type header is explicitly provided, use it\n if (headers['Content-Type']) {\n return headers['Content-Type']\n }\n\n // Check if body looks like JSON (starts with { or [)\n const trimmedBody = body.trim()\n const isJson = trimmedBody.startsWith('{') || trimmedBody.startsWith('[')\n\n if (isJson) {\n return 'application/json'\n }\n\n // Check if body looks like form-encoded data (contains = but does not start with {)\n const isFormEncoded = body.includes('=') && !trimmedBody.startsWith('{')\n\n return isFormEncoded ? 'application/x-www-form-urlencoded' : ''\n}\n\n/**\n * Infers a JSON Schema type from a JavaScript value.\n * Maps JavaScript typeof results to JSON Schema primitive types.\n */\nconst inferSchemaType = (value: unknown): string => {\n const jsType = typeof value\n\n // Map JavaScript types to JSON Schema types\n if (jsType === 'string') {\n return 'string'\n }\n if (jsType === 'number') {\n return 'number'\n }\n if (jsType === 'boolean') {\n return 'boolean'\n }\n if (value === null) {\n return 'null'\n }\n if (Array.isArray(value)) {\n return 'array'\n }\n if (jsType === 'object') {\n return 'object'\n }\n\n // Default fallback for any other types\n return 'string'\n}\n\n/**\n * Creates query and header parameters from parsed cURL data.\n * Each parameter includes a schema with inferred type and an example value.\n */\nconst createParameters = (\n queryParameters: Array<{ key: string; value: string }>,\n headers: Record<string, string>,\n exampleKey: string,\n): ParameterObject[] => {\n const queryParams = Array.isArray(queryParameters)\n ? queryParameters.map(({ key, value }) => ({\n name: key,\n in: 'query' as const,\n schema: { type: inferSchemaType(value) },\n examples: {\n [exampleKey]: { value },\n },\n }))\n : []\n\n const headerParams = Object.entries(headers || {}).map(([key, value]) => ({\n name: key,\n in: 'header' as const,\n schema: { type: inferSchemaType(value) },\n examples: {\n [exampleKey]: { value },\n },\n }))\n\n return [...queryParams, ...headerParams]\n}\n\n/**\n * Creates a request body schema from parsed data.\n * Generates an object schema with properties inferred from the data structure.\n */\nconst createRequestBodySchema = (data: ParsedData): SchemaObject => {\n const properties = Object.fromEntries(\n Object.entries(data).map(([key, value]) => [key, { type: inferSchemaType(value) } as SchemaObject]),\n )\n\n return {\n type: 'object',\n properties,\n }\n}\n\n/** Don't want to throw for invalid URLs */\nconst safePathname = (url: string) => {\n try {\n return new URL(url).pathname\n } catch {\n return '/'\n }\n}\n\n/**\n * Converts a cURL command string into an OpenAPI operation object.\n *\n * This function parses a cURL command and extracts all relevant information\n * (path, method, headers, query parameters, request body) to create a complete\n * OpenAPI operation that can be used to populate a request in the API client.\n *\n * The exampleKey is used to namespace the example values in the operation object,\n * allowing multiple examples to coexist if needed.\n */\nexport const getOperationFromCurl = (curl: string, exampleKey = 'curl'): CurlOperationResult => {\n const parsedCurl = parseCurlCommand(curl)\n\n const { method = 'get', url, body = '', headers = {}, servers = [], queryParameters = [] } = parsedCurl\n\n const path = safePathname(url)\n const contentType = detectContentType(body, headers)\n const requestBodyData = body ? parseRequestBodyData(body) : {}\n\n const parameters = createParameters(queryParameters, headers, exampleKey)\n\n const serverObjects: ServerObject[] = servers.map((server) => ({\n url: server,\n }))\n\n return {\n path,\n method,\n operation: {\n parameters,\n requestBody: {\n content: {\n [contentType]: {\n schema: createRequestBodySchema(requestBodyData),\n examples: {\n [exampleKey]: { value: requestBodyData },\n },\n },\n },\n 'x-scalar-selected-content-type': {\n [exampleKey]: contentType,\n },\n },\n servers: serverObjects.length ? serverObjects : undefined,\n },\n }\n}\n","<script lang=\"ts\">\n/**\n * Command Palette Import cURL Component\n *\n * Provides a form for importing API requests from cURL commands.\n * Parses the cURL command to extract the HTTP method, URL, path, headers,\n * and body, then creates a new operation in the selected document.\n *\n * Validates that no conflicting operation exists at the same path/method.\n *\n * @example\n * <CommandPaletteImportCurl\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * :curl=\"curlCommand\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {\n name: 'CommandPaletteImportCurl',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarListbox,\n type ScalarComboboxOption,\n} from '@scalar/components'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethod from '@/v2/blocks/operation-code-sample/components/HttpMethod.vue'\nimport CommandActionForm from '@/v2/features/command-palette/components/CommandActionForm.vue'\nimport CommandActionInput from '@/v2/features/command-palette/components/CommandActionInput.vue'\nimport { getOperationFromCurl } from '@/v2/features/command-palette/helpers/get-operation-from-curl'\n\nconst { workspaceStore, inputValue, eventBus } = defineProps<{\n /** The workspace store for accessing documents and operations */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting operation creation events */\n eventBus: WorkspaceEventBus\n /** The cURL command string to parse and import */\n inputValue: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the import is complete */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst exampleKey = ref('')\n\n/** Trimmed version of the example key for validation and submission */\nconst exampleKeyTrimmed = computed<string>(() => exampleKey.value.trim())\n\n/** Parse the cURL command to extract path, method, and operation details */\nconst { path, method, operation } = getOperationFromCurl(inputValue)\n\n/** List of all available documents (collections) in the workspace */\nconst documents = computed(() =>\n Object.keys(workspaceStore.workspace.documents).map((document) => ({\n id: document,\n label: document,\n })),\n)\n\nconst selectedDocument = ref<ScalarComboboxOption | undefined>(\n documents.value[0],\n)\n\n/**\n * Check if the form should be disabled.\n * Disabled when:\n * - Example key is empty\n * - No document is selected\n * - An operation with the same path and method already exists in the selected document\n */\nconst isDisabled = computed<boolean>(() => {\n if (!exampleKeyTrimmed.value || !selectedDocument.value) {\n return true\n }\n\n /** Prevent creating duplicate operations at the same path/method */\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n if (document?.paths?.[path]?.[method]) {\n return true\n }\n\n return false\n})\n\n/**\n * Handle the import submission.\n * Creates a new operation in the selected document from the parsed cURL command.\n */\nconst handleImportClick = (): void => {\n const documentName = selectedDocument.value\n\n if (isDisabled.value || !documentName) {\n return\n }\n\n /** Re-parse with the example key to include it in the operation */\n const result = getOperationFromCurl(inputValue, exampleKeyTrimmed.value)\n\n eventBus.emit('operation:create:operation', {\n documentName: documentName.id,\n path: result.path,\n method: result.method,\n operation: result.operation,\n exampleKey: exampleKeyTrimmed.value,\n callback: (success) => {\n if (success) {\n // build the sidebar\n workspaceStore.buildSidebar(documentName.id)\n\n const path = result.path.startsWith('/')\n ? result.path\n : `/${result.path}`\n\n // navigate to the operation\n router.push({\n name: 'example',\n params: {\n documentSlug: documentName.id,\n pathEncoded: encodeURIComponent(path),\n method: result.method,\n exampleName: exampleKeyTrimmed.value,\n },\n })\n }\n },\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n emit('back', event)\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleImportClick\">\n <!-- Example key input -->\n <CommandActionInput\n v-model=\"exampleKey\"\n placeholder=\"Curl example key (e.g., example-1)\"\n @delete=\"handleBack\" />\n\n <!-- Preview of the parsed cURL request (method + URL + path) -->\n <div class=\"flex flex-1 flex-col gap-2\">\n <div\n class=\"flex h-9 flex-row items-center gap-2 rounded border p-[3px] text-sm\">\n <HttpMethod\n class=\"border-r-1 px-1\"\n :method=\"method\" />\n <span class=\"scroll-timeline-x whitespace-nowrap\">\n {{ operation.servers?.[0]?.url || '' }}{{ path }}\n </span>\n </div>\n </div>\n\n <!-- Document selector -->\n <template #options>\n <div class=\"flex items-center gap-2\">\n <ScalarListbox\n v-model=\"selectedDocument\"\n :options=\"documents\">\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=\"selectedDocument ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : '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>Import Request</template>\n </CommandActionForm>\n</template>\n<style scoped>\n/**\n * Custom horizontal scroll for the URL preview.\n * Hides scrollbar for a cleaner appearance while maintaining scroll functionality.\n */\n.scroll-timeline-x {\n overflow: auto;\n scroll-timeline: --scroll-timeline x;\n /* Firefox support */\n scroll-timeline: --scroll-timeline horizontal;\n /* Hide scrollbar in IE and Edge */\n -ms-overflow-style: none;\n /* Hide scrollbar in Firefox */\n scrollbar-width: none;\n}\n\n/* Hide scrollbar in Chrome, Safari, and Opera */\n.scroll-timeline-x::-webkit-scrollbar {\n display: none;\n}\n</style>\n","<script lang=\"ts\">\n/**\n * Command Palette Import cURL Component\n *\n * Provides a form for importing API requests from cURL commands.\n * Parses the cURL command to extract the HTTP method, URL, path, headers,\n * and body, then creates a new operation in the selected document.\n *\n * Validates that no conflicting operation exists at the same path/method.\n *\n * @example\n * <CommandPaletteImportCurl\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * :curl=\"curlCommand\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {\n name: 'CommandPaletteImportCurl',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarListbox,\n type ScalarComboboxOption,\n} from '@scalar/components'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethod from '@/v2/blocks/operation-code-sample/components/HttpMethod.vue'\nimport CommandActionForm from '@/v2/features/command-palette/components/CommandActionForm.vue'\nimport CommandActionInput from '@/v2/features/command-palette/components/CommandActionInput.vue'\nimport { getOperationFromCurl } from '@/v2/features/command-palette/helpers/get-operation-from-curl'\n\nconst { workspaceStore, inputValue, eventBus } = defineProps<{\n /** The workspace store for accessing documents and operations */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting operation creation events */\n eventBus: WorkspaceEventBus\n /** The cURL command string to parse and import */\n inputValue: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the import is complete */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst exampleKey = ref('')\n\n/** Trimmed version of the example key for validation and submission */\nconst exampleKeyTrimmed = computed<string>(() => exampleKey.value.trim())\n\n/** Parse the cURL command to extract path, method, and operation details */\nconst { path, method, operation } = getOperationFromCurl(inputValue)\n\n/** List of all available documents (collections) in the workspace */\nconst documents = computed(() =>\n Object.keys(workspaceStore.workspace.documents).map((document) => ({\n id: document,\n label: document,\n })),\n)\n\nconst selectedDocument = ref<ScalarComboboxOption | undefined>(\n documents.value[0],\n)\n\n/**\n * Check if the form should be disabled.\n * Disabled when:\n * - Example key is empty\n * - No document is selected\n * - An operation with the same path and method already exists in the selected document\n */\nconst isDisabled = computed<boolean>(() => {\n if (!exampleKeyTrimmed.value || !selectedDocument.value) {\n return true\n }\n\n /** Prevent creating duplicate operations at the same path/method */\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n if (document?.paths?.[path]?.[method]) {\n return true\n }\n\n return false\n})\n\n/**\n * Handle the import submission.\n * Creates a new operation in the selected document from the parsed cURL command.\n */\nconst handleImportClick = (): void => {\n const documentName = selectedDocument.value\n\n if (isDisabled.value || !documentName) {\n return\n }\n\n /** Re-parse with the example key to include it in the operation */\n const result = getOperationFromCurl(inputValue, exampleKeyTrimmed.value)\n\n eventBus.emit('operation:create:operation', {\n documentName: documentName.id,\n path: result.path,\n method: result.method,\n operation: result.operation,\n exampleKey: exampleKeyTrimmed.value,\n callback: (success) => {\n if (success) {\n // build the sidebar\n workspaceStore.buildSidebar(documentName.id)\n\n const path = result.path.startsWith('/')\n ? result.path\n : `/${result.path}`\n\n // navigate to the operation\n router.push({\n name: 'example',\n params: {\n documentSlug: documentName.id,\n pathEncoded: encodeURIComponent(path),\n method: result.method,\n exampleName: exampleKeyTrimmed.value,\n },\n })\n }\n },\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n emit('back', event)\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleImportClick\">\n <!-- Example key input -->\n <CommandActionInput\n v-model=\"exampleKey\"\n placeholder=\"Curl example key (e.g., example-1)\"\n @delete=\"handleBack\" />\n\n <!-- Preview of the parsed cURL request (method + URL + path) -->\n <div class=\"flex flex-1 flex-col gap-2\">\n <div\n class=\"flex h-9 flex-row items-center gap-2 rounded border p-[3px] text-sm\">\n <HttpMethod\n class=\"border-r-1 px-1\"\n :method=\"method\" />\n <span class=\"scroll-timeline-x whitespace-nowrap\">\n {{ operation.servers?.[0]?.url || '' }}{{ path }}\n </span>\n </div>\n </div>\n\n <!-- Document selector -->\n <template #options>\n <div class=\"flex items-center gap-2\">\n <ScalarListbox\n v-model=\"selectedDocument\"\n :options=\"documents\">\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=\"selectedDocument ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : '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>Import Request</template>\n </CommandActionForm>\n</template>\n<style scoped>\n/**\n * Custom horizontal scroll for the URL preview.\n * Hides scrollbar for a cleaner appearance while maintaining scroll functionality.\n */\n.scroll-timeline-x {\n overflow: auto;\n scroll-timeline: --scroll-timeline x;\n /* Firefox support */\n scroll-timeline: --scroll-timeline horizontal;\n /* Hide scrollbar in IE and Edge */\n -ms-overflow-style: none;\n /* Hide scrollbar in Firefox */\n scrollbar-width: none;\n}\n\n/* Hide scrollbar in Chrome, Safari, and Opera */\n.scroll-timeline-x::-webkit-scrollbar {\n display: none;\n}\n</style>\n","<script lang=\"ts\">\n/**\n * Command Palette OpenAPI Document Component\n *\n * Provides a form for creating a new empty document in the workspace.\n * Users can name the document and select an icon before creation.\n * Validates that the name is not empty and not already in use.\n *\n * @example\n * <CommandPaletteOpenApiDocument\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport IconSelector from '@/components/IconSelector.vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus } = defineProps<{\n /** The workspace store for accessing existing documents */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting document creation events */\n eventBus: WorkspaceEventBus\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the document is created successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst documentName = ref('')\nconst documentNameTrimmed = computed(() => documentName.value.trim())\n\n/** Default icon for new documents (folder icon) */\nconst documentIcon = ref('interface-content-folder')\n\n/**\n * Check if the form should be disabled.\n * Disabled when the name is empty or when a document with that name already exists.\n */\nconst isDisabled = computed<boolean>(() => {\n if (!documentNameTrimmed.value) {\n return true\n }\n\n /** Prevent duplicate document names in the workspace */\n if (\n workspaceStore.workspace.documents[documentNameTrimmed.value] !== undefined\n ) {\n return true\n }\n\n return false\n})\n\n/** Handle form submission to create a new document */\nconst handleSubmit = (): void => {\n if (isDisabled.value) {\n return\n }\n\n eventBus.emit('document:create:empty-document', {\n name: documentNameTrimmed.value,\n icon: documentIcon.value,\n callback: (success) => {\n if (success) {\n router.push({\n name: 'document.overview',\n params: {\n documentSlug: documentNameTrimmed.value,\n },\n })\n }\n },\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n emit('back', event)\n}\n</script>\n\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"documentName\"\n label=\"Document Name\"\n placeholder=\"Document Name\"\n @delete=\"handleBack\" />\n\n <!-- Icon selector for choosing document icon -->\n <template #options>\n <IconSelector\n v-model=\"documentIcon\"\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=\"documentIcon\" />\n </ScalarButton>\n </IconSelector>\n </template>\n\n <template #submit>Create Document</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\n/**\n * Command Palette OpenAPI Document Component\n *\n * Provides a form for creating a new empty document in the workspace.\n * Users can name the document and select an icon before creation.\n * Validates that the name is not empty and not already in use.\n *\n * @example\n * <CommandPaletteOpenApiDocument\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { computed, ref } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport IconSelector from '@/components/IconSelector.vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus } = defineProps<{\n /** The workspace store for accessing existing documents */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting document creation events */\n eventBus: WorkspaceEventBus\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the document is created successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\nconst router = useRouter()\n\nconst documentName = ref('')\nconst documentNameTrimmed = computed(() => documentName.value.trim())\n\n/** Default icon for new documents (folder icon) */\nconst documentIcon = ref('interface-content-folder')\n\n/**\n * Check if the form should be disabled.\n * Disabled when the name is empty or when a document with that name already exists.\n */\nconst isDisabled = computed<boolean>(() => {\n if (!documentNameTrimmed.value) {\n return true\n }\n\n /** Prevent duplicate document names in the workspace */\n if (\n workspaceStore.workspace.documents[documentNameTrimmed.value] !== undefined\n ) {\n return true\n }\n\n return false\n})\n\n/** Handle form submission to create a new document */\nconst handleSubmit = (): void => {\n if (isDisabled.value) {\n return\n }\n\n eventBus.emit('document:create:empty-document', {\n name: documentNameTrimmed.value,\n icon: documentIcon.value,\n callback: (success) => {\n if (success) {\n router.push({\n name: 'document.overview',\n params: {\n documentSlug: documentNameTrimmed.value,\n },\n })\n }\n },\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n emit('back', event)\n}\n</script>\n\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <CommandActionInput\n v-model=\"documentName\"\n label=\"Document Name\"\n placeholder=\"Document Name\"\n @delete=\"handleBack\" />\n\n <!-- Icon selector for choosing document icon -->\n <template #options>\n <IconSelector\n v-model=\"documentIcon\"\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=\"documentIcon\" />\n </ScalarButton>\n </IconSelector>\n </template>\n\n <template #submit>Create Document</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\n/**\n * Command Palette Request Component\n *\n * Provides a form for creating a new API request (operation) in a document.\n * Users can specify the request path, HTTP method, document (collection),\n * and optionally assign it to a tag.\n *\n * Validates that no operation with the same path and method already exists\n * in the selected document to prevent duplicates.\n *\n * @example\n * <CommandPaletteRequest\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {\n name: 'CommandPaletteRequest',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n ScalarListbox,\n} from '@scalar/components'\nimport {\n HTTP_METHODS,\n type HttpMethod,\n} from '@scalar/helpers/http/http-methods'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethodBadge from '@/v2/blocks/operation-code-sample/components/HttpMethod.vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus, documentName, tagId } = defineProps<{\n /** The workspace store for accessing documents and operations */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting operation creation events */\n eventBus: WorkspaceEventBus\n /** Preselected document id to create the request in */\n documentName?: string\n /** Preselected tag id to add the request to (optional) */\n tagId?: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the request is created successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\n/** HTTP method option type for selectors */\ntype MethodOption = {\n id: string\n label: string\n method: HttpMethod\n}\n\n/** Tag option type for selectors */\ntype TagOption = {\n id: string\n label: string\n}\n\nconst router = useRouter()\n\nconst requestPath = ref('/')\nconst requestPathTrimmed = computed(() => requestPath.value.trim())\n\n/** All available documents (collections) in the workspace */\nconst availableDocuments = computed(() =>\n Object.entries(workspaceStore.workspace.documents).map(\n ([name, document]) => ({\n id: name,\n label: document.info.title || name,\n }),\n ),\n)\n\n/** Available HTTP methods for the dropdown (GET, POST, PUT, etc.) */\nconst availableMethods: MethodOption[] = HTTP_METHODS.map((method) => ({\n id: method,\n label: method.toUpperCase(),\n method,\n}))\n\nconst selectedDocument = ref<{ id: string; label: string } | undefined>(\n documentName\n ? availableDocuments.value.find((document) => document.id === documentName)\n : (availableDocuments.value[0] ?? undefined),\n)\n\nconst selectedMethod = ref<MethodOption | undefined>(\n availableMethods.find((method) => method.method === 'get'),\n)\n\n/**\n * All available tags for the selected document.\n * Includes a \"No Tag\" option for operations without a tag assignment.\n */\nconst availableTags = computed<TagOption[]>(() => {\n if (!selectedDocument.value) {\n return []\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n if (!document) {\n return []\n }\n\n return [\n { id: '', label: 'No Tag' },\n ...(document.tags?.map((tag) => ({\n id: tag.name,\n label: tag.name,\n })) ?? []),\n ]\n})\n\nconst selectedTag = ref<TagOption | undefined>(\n tagId ? availableTags.value.find((tag) => tag.id === tagId) : undefined,\n)\n\n// Reset the selected tag to the \"No Tag\" option when the document changes\nwatch(selectedDocument, () => {\n selectedTag.value = availableTags.value.find((tag) => tag.id === '')\n})\n\n/**\n * Check if an operation with the same path and method already exists.\n * Used to prevent creating duplicate operations.\n */\nconst operationExists = computed<boolean>(() => {\n if (\n !selectedDocument.value ||\n !selectedMethod.value ||\n !requestPathTrimmed.value\n ) {\n return false\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n\n /** Ensure path starts with '/' for consistent lookup */\n const normalizedPath = requestPathTrimmed.value.startsWith('/')\n ? requestPathTrimmed.value\n : `/${requestPathTrimmed.value}`\n\n return !!document?.paths?.[normalizedPath]?.[selectedMethod.value.method]\n})\n\n/**\n * Check if the form should be disabled.\n * Disabled when any required field is missing or operation already exists.\n */\nconst isDisabled = computed<boolean>(() => {\n if (\n !requestPathTrimmed.value ||\n !selectedDocument.value ||\n !selectedMethod.value\n ) {\n return true\n }\n\n /** Prevent creating duplicate operations */\n if (operationExists.value) {\n return true\n }\n\n return false\n})\n\n/** Handle HTTP method selection from dropdown */\nconst handleSelectMethod = (method: MethodOption | undefined): void => {\n if (method) {\n selectedMethod.value = method\n }\n}\n\n/** Handle tag selection from dropdown */\nconst handleSelectTag = (tag: TagOption | undefined): void => {\n if (tag) {\n selectedTag.value = tag\n }\n}\n\n/**\n * Create the request and close the command palette.\n * Emits an event to create a new operation with the specified details.\n */\nconst handleSubmit = (): void => {\n if (isDisabled.value || !selectedDocument.value || !selectedMethod.value) {\n return\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n\n if (!document) {\n return\n }\n\n eventBus.emit('operation:create:operation', {\n documentName: selectedDocument.value.id,\n path: requestPathTrimmed.value,\n method: selectedMethod.value.method,\n operation: {\n tags: selectedTag.value?.id ? [selectedTag.value.id] : undefined,\n },\n callback: (success) => {\n if (success) {\n /** Build the sidebar */\n workspaceStore.buildSidebar(selectedDocument.value?.id ?? '')\n\n const path = requestPathTrimmed.value.startsWith('/')\n ? requestPathTrimmed.value\n : `/${requestPathTrimmed.value}`\n\n /** Navigate to the example */\n router.push({\n name: 'example',\n params: {\n documentSlug: selectedDocument.value?.id,\n pathEncoded: encodeURIComponent(path),\n method: selectedMethod.value?.method,\n exampleName: 'default',\n },\n })\n }\n },\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n emit('back', event)\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <!-- Request path input -->\n <CommandActionInput\n v-model=\"requestPath\"\n label=\"Request Path\"\n placeholder=\"/users\"\n @delete=\"handleBack\" />\n\n <!-- Selectors for document, method, and tag -->\n <template #options>\n <div class=\"flex flex-1 gap-1\">\n <!-- Document (collection) selector -->\n <ScalarListbox\n v-model=\"selectedDocument\"\n :options=\"availableDocuments\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-[150px] min-w-[150px] justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedDocument ? 'text-c-1 truncate' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : 'Select Document'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n\n <!-- HTTP method selector (GET, POST, PUT, etc.) -->\n <ScalarDropdown\n placement=\"bottom\"\n resize>\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-[100px] min-w-[100px] justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <div class=\"flex items-center gap-2\">\n <HttpMethodBadge\n v-if=\"selectedMethod\"\n :method=\"selectedMethod.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n\n <!-- Dropdown list of all HTTP methods -->\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"method in availableMethods\"\n :key=\"method.id\"\n class=\"flex h-7 w-full items-center justify-center px-1\"\n @click=\"handleSelectMethod(method)\">\n <HttpMethodBadge :method=\"method.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n\n <!-- Tag selector (optional) for organizing operations -->\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 :disabled=\"!availableTags.length\"\n variant=\"outlined\">\n <span :class=\"selectedTag ? 'text-c-1 truncate' : 'text-c-3'\">\n {{ selectedTag ? selectedTag.label : 'Select Tag (Optional)' }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n\n <!-- Dropdown list of available tags -->\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"tag in availableTags\"\n :key=\"tag.id\"\n class=\"flex h-7 w-full items-center px-1\"\n @click=\"handleSelectTag(tag)\">\n <span class=\"truncate\">{{ tag.label }}</span>\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </div>\n </template>\n\n <template #submit>Create Request</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\n/**\n * Command Palette Request Component\n *\n * Provides a form for creating a new API request (operation) in a document.\n * Users can specify the request path, HTTP method, document (collection),\n * and optionally assign it to a tag.\n *\n * Validates that no operation with the same path and method already exists\n * in the selected document to prevent duplicates.\n *\n * @example\n * <CommandPaletteRequest\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n */\nexport default {\n name: 'CommandPaletteRequest',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarDropdown,\n ScalarDropdownItem,\n ScalarIcon,\n ScalarListbox,\n} from '@scalar/components'\nimport {\n HTTP_METHODS,\n type HttpMethod,\n} from '@scalar/helpers/http/http-methods'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport HttpMethodBadge from '@/v2/blocks/operation-code-sample/components/HttpMethod.vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus, documentName, tagId } = defineProps<{\n /** The workspace store for accessing documents and operations */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting operation creation events */\n eventBus: WorkspaceEventBus\n /** Preselected document id to create the request in */\n documentName?: string\n /** Preselected tag id to add the request to (optional) */\n tagId?: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the request is created successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\n/** HTTP method option type for selectors */\ntype MethodOption = {\n id: string\n label: string\n method: HttpMethod\n}\n\n/** Tag option type for selectors */\ntype TagOption = {\n id: string\n label: string\n}\n\nconst router = useRouter()\n\nconst requestPath = ref('/')\nconst requestPathTrimmed = computed(() => requestPath.value.trim())\n\n/** All available documents (collections) in the workspace */\nconst availableDocuments = computed(() =>\n Object.entries(workspaceStore.workspace.documents).map(\n ([name, document]) => ({\n id: name,\n label: document.info.title || name,\n }),\n ),\n)\n\n/** Available HTTP methods for the dropdown (GET, POST, PUT, etc.) */\nconst availableMethods: MethodOption[] = HTTP_METHODS.map((method) => ({\n id: method,\n label: method.toUpperCase(),\n method,\n}))\n\nconst selectedDocument = ref<{ id: string; label: string } | undefined>(\n documentName\n ? availableDocuments.value.find((document) => document.id === documentName)\n : (availableDocuments.value[0] ?? undefined),\n)\n\nconst selectedMethod = ref<MethodOption | undefined>(\n availableMethods.find((method) => method.method === 'get'),\n)\n\n/**\n * All available tags for the selected document.\n * Includes a \"No Tag\" option for operations without a tag assignment.\n */\nconst availableTags = computed<TagOption[]>(() => {\n if (!selectedDocument.value) {\n return []\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n if (!document) {\n return []\n }\n\n return [\n { id: '', label: 'No Tag' },\n ...(document.tags?.map((tag) => ({\n id: tag.name,\n label: tag.name,\n })) ?? []),\n ]\n})\n\nconst selectedTag = ref<TagOption | undefined>(\n tagId ? availableTags.value.find((tag) => tag.id === tagId) : undefined,\n)\n\n// Reset the selected tag to the \"No Tag\" option when the document changes\nwatch(selectedDocument, () => {\n selectedTag.value = availableTags.value.find((tag) => tag.id === '')\n})\n\n/**\n * Check if an operation with the same path and method already exists.\n * Used to prevent creating duplicate operations.\n */\nconst operationExists = computed<boolean>(() => {\n if (\n !selectedDocument.value ||\n !selectedMethod.value ||\n !requestPathTrimmed.value\n ) {\n return false\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n\n /** Ensure path starts with '/' for consistent lookup */\n const normalizedPath = requestPathTrimmed.value.startsWith('/')\n ? requestPathTrimmed.value\n : `/${requestPathTrimmed.value}`\n\n return !!document?.paths?.[normalizedPath]?.[selectedMethod.value.method]\n})\n\n/**\n * Check if the form should be disabled.\n * Disabled when any required field is missing or operation already exists.\n */\nconst isDisabled = computed<boolean>(() => {\n if (\n !requestPathTrimmed.value ||\n !selectedDocument.value ||\n !selectedMethod.value\n ) {\n return true\n }\n\n /** Prevent creating duplicate operations */\n if (operationExists.value) {\n return true\n }\n\n return false\n})\n\n/** Handle HTTP method selection from dropdown */\nconst handleSelectMethod = (method: MethodOption | undefined): void => {\n if (method) {\n selectedMethod.value = method\n }\n}\n\n/** Handle tag selection from dropdown */\nconst handleSelectTag = (tag: TagOption | undefined): void => {\n if (tag) {\n selectedTag.value = tag\n }\n}\n\n/**\n * Create the request and close the command palette.\n * Emits an event to create a new operation with the specified details.\n */\nconst handleSubmit = (): void => {\n if (isDisabled.value || !selectedDocument.value || !selectedMethod.value) {\n return\n }\n\n const document = workspaceStore.workspace.documents[selectedDocument.value.id]\n\n if (!document) {\n return\n }\n\n eventBus.emit('operation:create:operation', {\n documentName: selectedDocument.value.id,\n path: requestPathTrimmed.value,\n method: selectedMethod.value.method,\n operation: {\n tags: selectedTag.value?.id ? [selectedTag.value.id] : undefined,\n },\n callback: (success) => {\n if (success) {\n /** Build the sidebar */\n workspaceStore.buildSidebar(selectedDocument.value?.id ?? '')\n\n const path = requestPathTrimmed.value.startsWith('/')\n ? requestPathTrimmed.value\n : `/${requestPathTrimmed.value}`\n\n /** Navigate to the example */\n router.push({\n name: 'example',\n params: {\n documentSlug: selectedDocument.value?.id,\n pathEncoded: encodeURIComponent(path),\n method: selectedMethod.value?.method,\n exampleName: 'default',\n },\n })\n }\n },\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n emit('back', event)\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <!-- Request path input -->\n <CommandActionInput\n v-model=\"requestPath\"\n label=\"Request Path\"\n placeholder=\"/users\"\n @delete=\"handleBack\" />\n\n <!-- Selectors for document, method, and tag -->\n <template #options>\n <div class=\"flex flex-1 gap-1\">\n <!-- Document (collection) selector -->\n <ScalarListbox\n v-model=\"selectedDocument\"\n :options=\"availableDocuments\">\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-[150px] min-w-[150px] justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <span :class=\"selectedDocument ? 'text-c-1 truncate' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : 'Select Document'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n\n <!-- HTTP method selector (GET, POST, PUT, etc.) -->\n <ScalarDropdown\n placement=\"bottom\"\n resize>\n <ScalarButton\n class=\"hover:bg-b-2 max-h-8 w-[100px] min-w-[100px] justify-between gap-1 p-2 text-xs\"\n variant=\"outlined\">\n <div class=\"flex items-center gap-2\">\n <HttpMethodBadge\n v-if=\"selectedMethod\"\n :method=\"selectedMethod.method\" />\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </div>\n </ScalarButton>\n\n <!-- Dropdown list of all HTTP methods -->\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"method in availableMethods\"\n :key=\"method.id\"\n class=\"flex h-7 w-full items-center justify-center px-1\"\n @click=\"handleSelectMethod(method)\">\n <HttpMethodBadge :method=\"method.method\" />\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n\n <!-- Tag selector (optional) for organizing operations -->\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 :disabled=\"!availableTags.length\"\n variant=\"outlined\">\n <span :class=\"selectedTag ? 'text-c-1 truncate' : 'text-c-3'\">\n {{ selectedTag ? selectedTag.label : 'Select Tag (Optional)' }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n\n <!-- Dropdown list of available tags -->\n <template #items>\n <div class=\"custom-scroll max-h-40\">\n <ScalarDropdownItem\n v-for=\"tag in availableTags\"\n :key=\"tag.id\"\n class=\"flex h-7 w-full items-center px-1\"\n @click=\"handleSelectTag(tag)\">\n <span class=\"truncate\">{{ tag.label }}</span>\n </ScalarDropdownItem>\n </div>\n </template>\n </ScalarDropdown>\n </div>\n </template>\n\n <template #submit>Create Request</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\n/**\n * Command Palette Tag Component\n *\n * Provides a form for creating or editing a tag in a document (collection).\n * Tags are used to organize and group related API operations.\n *\n * When `tag` is provided, the component enters edit mode where:\n * - The name input is pre-filled with the current tag name\n * - The collection selector is hidden (tag already belongs to a document)\n * - A cancel button is shown to close the modal without saving\n * - Back navigation is disabled (cannot go back with backspace)\n * - Submitting emits an 'edit' event instead of creating a new tag\n *\n * In create mode, validates that the tag name does not already exist\n * in the selected document to prevent duplicates.\n *\n * @example\n * // Create mode\n * <CommandPaletteTag\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n *\n * // Edit mode\n * <CommandPaletteTag\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * :tag=\"tag\"\n * @close=\"handleClose\"\n * @edit=\"handleEdit\"\n * />\n */\nexport default {\n name: 'CommandPaletteTag',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { TraversedTag } from '@scalar/workspace-store/schemas/navigation'\nimport { computed, ref } from 'vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus, documentName, tag } = defineProps<{\n /** The workspace store for accessing documents and tags */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting tag creation events */\n eventBus: WorkspaceEventBus\n /** Preselected document id to create the tag in */\n documentName?: string\n /** When provided, the component enters edit mode with this name pre-filled */\n tag?: TraversedTag\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the tag is created or edited successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\nconst isEditMode = computed(() => tag !== undefined)\n\nconst name = ref(tag?.name ?? '')\nconst nameTrimmed = computed(() => name.value.trim())\n\n/** All available documents (collections) in the workspace */\nconst availableDocuments = computed(() =>\n Object.entries(workspaceStore.workspace.documents).map(\n ([name, document]) => ({\n id: name,\n label: document.info.title || name,\n }),\n ),\n)\n\nconst selectedDocument = ref<{ id: string; label: string } | undefined>(\n documentName\n ? availableDocuments.value.find((document) => document.id === documentName)\n : (availableDocuments.value[0] ?? undefined),\n)\n\n/**\n * Check if the form should be disabled.\n *\n * In edit mode, disabled when:\n * - Tag name is empty\n * - Name is unchanged from the original\n * - The new name conflicts with an existing tag in the same document\n *\n * In create mode, disabled when:\n * - Tag name is empty\n * - No collection is selected\n * - The selected document does not exist\n * - A tag with the same name already exists in the selected document\n */\nconst isDisabled = computed<boolean>(() => {\n const document =\n workspaceStore.workspace.documents[selectedDocument.value?.id ?? '']\n if (!nameTrimmed.value || !selectedDocument.value || !document) {\n return true\n }\n\n // In edit mode, disable if the name has not changed\n if (isEditMode.value) {\n if (nameTrimmed.value === tag?.name) {\n return true\n }\n }\n\n // Prevent creating duplicate tags with the same name\n if (document.tags?.some((tag) => tag.name === nameTrimmed.value)) {\n return true\n }\n\n return false\n})\n\n/**\n * Handle form submission.\n * In edit mode, emits the new name. In create mode, creates the tag via the event bus.\n */\nconst handleSubmit = (): void => {\n if (isDisabled.value || !selectedDocument.value) {\n return\n }\n\n // In edit mode, emit the new name and close\n if (isEditMode.value && tag) {\n eventBus.emit(\n 'tag:edit:tag',\n {\n tag,\n documentName: selectedDocument.value.id,\n newName: nameTrimmed.value,\n },\n { skipUnpackProxy: true },\n )\n emit('close')\n return\n }\n\n eventBus.emit('tag:create:tag', {\n name: nameTrimmed.value,\n documentName: selectedDocument.value.id,\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n // Do not allow back navigation in edit mode\n if (isEditMode.value) {\n return\n }\n emit('back', event)\n}\n\n/** Handle cancel action in edit mode */\nconst handleCancel = (): void => {\n emit('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <!-- Tag name input -->\n <CommandActionInput\n v-model=\"name\"\n label=\"Tag Name\"\n placeholder=\"Tag Name\"\n @delete=\"handleBack\" />\n\n <!-- Collection selector (hidden in edit mode) -->\n <template #options>\n <ScalarListbox\n v-if=\"!isEditMode\"\n v-model=\"selectedDocument\"\n :options=\"availableDocuments\">\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=\"selectedDocument ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : 'Select Collection'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n\n <!-- Cancel button in edit mode -->\n <ScalarButton\n v-if=\"isEditMode\"\n class=\"max-h-8 px-3 text-xs\"\n variant=\"outlined\"\n @click=\"handleCancel\">\n Cancel\n </ScalarButton>\n </template>\n\n <template #submit>{{ isEditMode ? 'Save' : 'Create Tag' }}</template>\n </CommandActionForm>\n</template>\n","<script lang=\"ts\">\n/**\n * Command Palette Tag Component\n *\n * Provides a form for creating or editing a tag in a document (collection).\n * Tags are used to organize and group related API operations.\n *\n * When `tag` is provided, the component enters edit mode where:\n * - The name input is pre-filled with the current tag name\n * - The collection selector is hidden (tag already belongs to a document)\n * - A cancel button is shown to close the modal without saving\n * - Back navigation is disabled (cannot go back with backspace)\n * - Submitting emits an 'edit' event instead of creating a new tag\n *\n * In create mode, validates that the tag name does not already exist\n * in the selected document to prevent duplicates.\n *\n * @example\n * // Create mode\n * <CommandPaletteTag\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * @close=\"handleClose\"\n * @back=\"handleBack\"\n * />\n *\n * // Edit mode\n * <CommandPaletteTag\n * :workspaceStore=\"workspaceStore\"\n * :eventBus=\"eventBus\"\n * :tag=\"tag\"\n * @close=\"handleClose\"\n * @edit=\"handleEdit\"\n * />\n */\nexport default {\n name: 'CommandPaletteTag',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarListbox } from '@scalar/components'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { TraversedTag } from '@scalar/workspace-store/schemas/navigation'\nimport { computed, ref } from 'vue'\n\nimport CommandActionForm from './CommandActionForm.vue'\nimport CommandActionInput from './CommandActionInput.vue'\n\nconst { workspaceStore, eventBus, documentName, tag } = defineProps<{\n /** The workspace store for accessing documents and tags */\n workspaceStore: WorkspaceStore\n /** Event bus for emitting tag creation events */\n eventBus: WorkspaceEventBus\n /** Preselected document id to create the tag in */\n documentName?: string\n /** When provided, the component enters edit mode with this name pre-filled */\n tag?: TraversedTag\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the tag is created or edited successfully */\n (event: 'close'): void\n /** Emitted when user navigates back (e.g., backspace on empty input) */\n (event: 'back', keyboardEvent: KeyboardEvent): void\n}>()\n\nconst isEditMode = computed(() => tag !== undefined)\n\nconst name = ref(tag?.name ?? '')\nconst nameTrimmed = computed(() => name.value.trim())\n\n/** All available documents (collections) in the workspace */\nconst availableDocuments = computed(() =>\n Object.entries(workspaceStore.workspace.documents).map(\n ([name, document]) => ({\n id: name,\n label: document.info.title || name,\n }),\n ),\n)\n\nconst selectedDocument = ref<{ id: string; label: string } | undefined>(\n documentName\n ? availableDocuments.value.find((document) => document.id === documentName)\n : (availableDocuments.value[0] ?? undefined),\n)\n\n/**\n * Check if the form should be disabled.\n *\n * In edit mode, disabled when:\n * - Tag name is empty\n * - Name is unchanged from the original\n * - The new name conflicts with an existing tag in the same document\n *\n * In create mode, disabled when:\n * - Tag name is empty\n * - No collection is selected\n * - The selected document does not exist\n * - A tag with the same name already exists in the selected document\n */\nconst isDisabled = computed<boolean>(() => {\n const document =\n workspaceStore.workspace.documents[selectedDocument.value?.id ?? '']\n if (!nameTrimmed.value || !selectedDocument.value || !document) {\n return true\n }\n\n // In edit mode, disable if the name has not changed\n if (isEditMode.value) {\n if (nameTrimmed.value === tag?.name) {\n return true\n }\n }\n\n // Prevent creating duplicate tags with the same name\n if (document.tags?.some((tag) => tag.name === nameTrimmed.value)) {\n return true\n }\n\n return false\n})\n\n/**\n * Handle form submission.\n * In edit mode, emits the new name. In create mode, creates the tag via the event bus.\n */\nconst handleSubmit = (): void => {\n if (isDisabled.value || !selectedDocument.value) {\n return\n }\n\n // In edit mode, emit the new name and close\n if (isEditMode.value && tag) {\n eventBus.emit(\n 'tag:edit:tag',\n {\n tag,\n documentName: selectedDocument.value.id,\n newName: nameTrimmed.value,\n },\n { skipUnpackProxy: true },\n )\n emit('close')\n return\n }\n\n eventBus.emit('tag:create:tag', {\n name: nameTrimmed.value,\n documentName: selectedDocument.value.id,\n })\n\n emit('close')\n}\n\n/** Handle back navigation when user presses backspace on empty input */\nconst handleBack = (event: KeyboardEvent): void => {\n // Do not allow back navigation in edit mode\n if (isEditMode.value) {\n return\n }\n emit('back', event)\n}\n\n/** Handle cancel action in edit mode */\nconst handleCancel = (): void => {\n emit('close')\n}\n</script>\n<template>\n <CommandActionForm\n :disabled=\"isDisabled\"\n @submit=\"handleSubmit\">\n <!-- Tag name input -->\n <CommandActionInput\n v-model=\"name\"\n label=\"Tag Name\"\n placeholder=\"Tag Name\"\n @delete=\"handleBack\" />\n\n <!-- Collection selector (hidden in edit mode) -->\n <template #options>\n <ScalarListbox\n v-if=\"!isEditMode\"\n v-model=\"selectedDocument\"\n :options=\"availableDocuments\">\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=\"selectedDocument ? 'text-c-1' : 'text-c-3'\">\n {{\n selectedDocument ? selectedDocument.label : 'Select Collection'\n }}\n </span>\n <ScalarIcon\n class=\"text-c-3\"\n icon=\"ChevronDown\"\n size=\"md\" />\n </ScalarButton>\n </ScalarListbox>\n\n <!-- Cancel button in edit mode -->\n <ScalarButton\n v-if=\"isEditMode\"\n class=\"max-h-8 px-3 text-xs\"\n variant=\"outlined\"\n @click=\"handleCancel\">\n Cancel\n </ScalarButton>\n </template>\n\n <template #submit>{{ isEditMode ? 'Save' : 'Create Tag' }}</template>\n </CommandActionForm>\n</template>\n","import { useModal } from '@scalar/components'\nimport {\n ScalarIconArrowSquareIn,\n ScalarIconArrowUpRight,\n ScalarIconBracketsCurly,\n ScalarIconCookie,\n ScalarIconFolder,\n ScalarIconPackage,\n ScalarIconPuzzlePiece,\n ScalarIconSlidersHorizontal,\n} from '@scalar/icons'\nimport type { ScalarIconComponent } from '@scalar/icons/types'\nimport type { CommandPalettePayload } from '@scalar/workspace-store/events'\nimport Fuse from 'fuse.js'\nimport {\n type Component,\n type ComputedRef,\n type MaybeRefOrGetter,\n type Ref,\n type ShallowRef,\n computed,\n ref,\n shallowRef,\n toValue,\n} from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\n\nimport CommandPaletteExample from '../components/CommandPaletteExample.vue'\nimport CommandPaletteImport from '../components/CommandPaletteImport.vue'\nimport CommandPaletteImportCurl from '../components/CommandPaletteImportCurl.vue'\nimport CommandPaletteOpenApiDocument from '../components/CommandPaletteOpenApiDocument.vue'\nimport CommandPaletteRequest from '../components/CommandPaletteRequest.vue'\nimport CommandPaletteTag from '../components/CommandPaletteTag.vue'\n\n/**\n * Command IDs that map to UI components (folder and hidden-folder types)\n *\n * For base app commands they are defined by their action payload\n */\ntype UiCommandIds = keyof CommandPalettePayload\n\n/** Map the the prop definitons to the prop value */\ntype CommandPaletteActionProps<K extends UiCommandIds> = CommandPalettePayload[K]\n\n/**\n * Type for the open function in the command palette.\n * Supports two usage patterns:\n * - open() - Opens the palette without a specific command\n * - open(commandId) - Opens a command that does not require props\n * - open(commandId, props) - Opens a command with required props\n */\ntype OpenCommand = {\n (): void\n <T extends UiCommandIds>(commandId: T, props: CommandPaletteActionProps<T>): void\n}\n\n/** Route enntry for the palette list */\nexport type CommandPaletteRoute = {\n id: string\n type: 'route'\n icon: ScalarIconComponent\n name: string\n to: RouteLocationRaw\n}\n\n/** Command entry for the palette list */\ntype BaseCommandPaletteAction = {\n id: keyof CommandPalettePayload\n name: string\n icon?: ScalarIconComponent\n component: Component\n hidden?: boolean\n}\n\nexport type CommandPaletteAction = Omit<BaseCommandPaletteAction, 'id'> & {\n id: string\n}\n\nexport type CommandPaletteEntry = CommandPaletteAction | CommandPaletteRoute\n\n// ---------------------------------------------------------------------------\n\n/**\n * Return type for the useCommandPaletteState composable.\n * Provides reactive state and methods to control the command palette.\n */\nexport type CommandPaletteState = {\n /** Whether the command palette is currently open */\n isOpen: Ref<boolean>\n /** The currently active command, or null if showing the main list */\n activeCommand: ShallowRef<CommandPaletteAction | null>\n /** Properties passed to the active command component */\n activeCommandProps: Ref<Record<string, unknown> | null>\n /** Current filter/search query for filtering commands */\n filterQuery: Ref<string>\n /** Grouped actions and routes to be rendered */\n filteredCommands: ComputedRef<\n {\n label?: string\n commands: (CommandPaletteAction | CommandPaletteRoute)[]\n }[]\n >\n /**\n * Opens the command palette, optionally with a specific command active.\n * When opening a command, props are required only if the command defines them.\n */\n open: OpenCommand\n /** Closes the command palette and resets state */\n close: () => void\n /** Updates the filter query for searching commands */\n setFilterQuery: (query: string) => void\n /** Resets all state to initial values */\n reset: () => void\n}\n\n/**\n * Composable for managing command palette state.\n *\n * Centralizes all state management for the command palette including:\n * - Open/closed state\n * - Filter/search query\n * - Command filtering logic\n *\n * @example\n * const palette = useCommandPaletteState()\n *\n * // Open the palette\n * palette.open()\n *\n * // Open with a specific command\n * palette.open('create-openapi-document')\n *\n * // Open with command props\n * palette.open('import-curl-command', { curl: 'curl https://api.example.com' })\n *\n * // Update filter query (automatically filters commands)\n * palette.setFilterQuery('import')\n *\n * // Access filtered results\n * console.log(palette.filteredCommands.value)\n *\n * // Close and reset\n * palette.close()\n */\nexport const useCommandPaletteState = (\n actions: MaybeRefOrGetter<CommandPaletteAction[]> = baseClientActions,\n routes: MaybeRefOrGetter<CommandPaletteRoute[]> = baseRoutes,\n): CommandPaletteState => {\n const modalState = useModal()\n\n const filterQuery = ref('')\n const activeCommand = shallowRef<CommandPaletteAction | null>(null)\n const activeCommandProps = ref<Record<string, unknown> | null>(null)\n\n /** Whether the command palette is currently open */\n const isOpen = computed<boolean>(() => modalState.open)\n\n const fuseActions = computed(\n () =>\n new Fuse(toValue(actions), {\n keys: ['name'],\n threshold: 0.2,\n }),\n )\n\n const fuseRoutes = computed(\n () =>\n new Fuse(toValue(routes), {\n keys: ['name'],\n threshold: 0.2,\n }),\n )\n\n /**\n * Filtered commands based on the current search query.\n * When no query is present, returns all visible commands (excluding hidden-folder).\n * When a query exists, filters commands by name (case-insensitive) and excludes hidden-folder.\n * Empty groups are excluded from the results.\n */\n const filteredActions = computed<CommandPaletteAction[]>(() => {\n const query = filterQuery.value.toLowerCase().trim()\n\n // Filter commands by name when query exists\n const base = query ? fuseActions.value.search(query).map((a) => a.item) : toValue(actions)\n\n // Always exclude hidden folders\n return base.filter((a) => !a.hidden)\n })\n\n const filteredRoutes = computed<CommandPaletteRoute[]>(() => {\n const query = filterQuery.value.toLowerCase().trim()\n\n return query ? fuseRoutes.value.search(query).map((a) => a.item) : toValue(routes)\n })\n\n /**\n * Opens the command palette, optionally with a specific command active.\n * If a commandId is provided, that command will be opened immediately.\n * Props are type-safe and checked against the command's expected props.\n */\n const open: OpenCommand = (commandId?: UiCommandIds, ...args: unknown[]): void => {\n if (commandId) {\n activeCommand.value = toValue(actions).find((a) => a.id === commandId) ?? null\n activeCommandProps.value = (args[0] as Record<string, unknown>) ?? null\n }\n modalState.show()\n }\n\n /** Closes the command palette and resets all state */\n const close = (): void => {\n modalState.hide()\n reset()\n }\n\n /** Updates the filter query for searching commands */\n const setFilterQuery = (query: string): void => {\n filterQuery.value = query\n }\n\n /** Resets all internal state to initial values */\n const reset = (): void => {\n filterQuery.value = ''\n activeCommand.value = null\n activeCommandProps.value = null\n }\n\n return {\n isOpen,\n activeCommand,\n activeCommandProps,\n filterQuery,\n filteredCommands: computed(() => [\n {\n label: '',\n commands: filteredActions.value,\n },\n {\n label: 'Pages',\n commands: filteredRoutes.value,\n },\n ]),\n open,\n close,\n setFilterQuery,\n reset,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Base commands\n\n/**\n * The base naviation routes used in the command palette.\n * This object can be extended and passed to the useCommandPaletteState hook to add custom routes\n */\nexport const baseRoutes: CommandPaletteRoute[] = [\n {\n type: 'route',\n id: 'environment',\n name: 'Environment',\n icon: ScalarIconBracketsCurly,\n to: {\n name: 'workspace.environment',\n },\n },\n {\n type: 'route',\n id: 'cookies',\n name: 'Cookies',\n icon: ScalarIconCookie,\n to: {\n name: 'workspace.cookies',\n },\n },\n {\n type: 'route',\n id: 'settings',\n name: 'Settings',\n icon: ScalarIconSlidersHorizontal,\n to: {\n name: 'workspace.settings',\n },\n },\n]\n\n/**\n * The internal client command palette actions\n * This object can be extended and passed to the useCommandPaletteState hook to add custom actions\n */\nexport const baseClientActions = [\n {\n id: 'import-from-openapi-swagger-postman-curl',\n name: 'Import from OpenAPI/Swagger/Postman/cURL',\n component: CommandPaletteImport,\n icon: ScalarIconArrowSquareIn,\n },\n {\n id: 'create-openapi-document',\n name: 'Create OpenAPI Document',\n component: CommandPaletteOpenApiDocument,\n icon: ScalarIconPackage,\n },\n {\n id: 'add-tag',\n name: 'Add Tag',\n component: CommandPaletteTag,\n icon: ScalarIconFolder,\n },\n {\n id: 'create-request',\n name: 'Create Request',\n component: CommandPaletteRequest,\n icon: ScalarIconArrowUpRight,\n },\n {\n id: 'add-example',\n name: 'Add Example',\n component: CommandPaletteExample,\n icon: ScalarIconPuzzlePiece,\n },\n {\n id: 'import-curl-command',\n name: 'Import cURL Command',\n hidden: true,\n component: CommandPaletteImportCurl,\n },\n {\n id: 'edit-tag',\n name: 'Edit Tag',\n hidden: true,\n component: CommandPaletteTag,\n },\n {\n id: 'edit-example',\n name: 'Edit Example',\n hidden: true,\n component: CommandPaletteExample,\n },\n] as const satisfies BaseCommandPaletteAction[]\n","import type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport type { AuthMeta } from '@scalar/workspace-store/events'\n\n/**\n * Determines the default toggle state for operation security.\n * Returns false for 'document' type, undefined if path/method is missing,\n * otherwise checks if there are selected auth schemas for the operation.\n */\nexport const getDefaultOperationSecurityToggle = ({\n authStore,\n documentName,\n ...payload\n}: {\n authStore: AuthStore\n documentName: string\n} & AuthMeta) => {\n // If the payload type is 'document', security toggle should be off by default\n if (payload.type === 'document') {\n return false\n }\n\n // Check if there are any selected authentication schemas for this operation\n return (\n authStore.getAuthSelectedSchemas({\n type: 'operation',\n documentName,\n path: payload.path,\n method: payload.method,\n }) !== undefined\n )\n}\n","<script setup lang=\"ts\">\nimport { ScalarToggle } from '@scalar/components'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport type { AuthMeta } from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport { computed, ref, watchEffect } from 'vue'\n\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { getDefaultOperationSecurityToggle } from '@/v2/features/collection/helpers/get-default-operation-security-toggle'\nimport { getSelectedSecurity } from '@/v2/features/operation'\nimport Section from '@/v2/features/settings/components/Section.vue'\nimport { getServers } from '@/v2/helpers'\nimport { getActiveProxyUrl } from '@/v2/helpers/get-active-proxy-url'\n\nconst {\n document,\n eventBus,\n environment,\n securitySchemes,\n workspaceStore,\n documentSlug,\n path,\n method,\n collectionType,\n layout,\n} = defineProps<CollectionProps>()\n\n/**\n * Compute the authentication metadata based on the current collection type.\n * If we're working with an operation, include its path and method; otherwise, use the document scope.\n */\nconst authMeta = computed<AuthMeta>(() => {\n if (collectionType === 'operation') {\n return {\n type: 'operation',\n path: path ?? '',\n method: method ?? 'get',\n }\n }\n return { type: 'document' }\n})\n\n/**\n * Compute the operation object based on the current collection type.\n */\nconst operation = computed(() => {\n if (collectionType === 'operation') {\n // Operation not found\n if (!path || !isHttpMethod(method)) {\n return null\n }\n // Operation found, return the servers\n return getResolvedRef(document?.paths?.[path]?.[method])\n }\n return null\n})\n\n/**\n * If enabled we use/set the selected security schemes on the operation level\n */\nconst useOperationSecurity = ref(false)\nwatchEffect(() => {\n useOperationSecurity.value = getDefaultOperationSecurityToggle({\n authStore: workspaceStore.auth,\n documentName: documentSlug,\n ...authMeta.value,\n })\n})\n\n/** Resolved selected security for the current collection (operation or document), with defaults applied */\nconst selectedSecurity = computed(() => {\n if (collectionType === 'operation') {\n const fromStore = workspaceStore.auth.getAuthSelectedSchemas({\n type: 'operation',\n documentName: documentSlug,\n path: path ?? '',\n method: method ?? 'get',\n })\n return getSelectedSecurity(\n undefined,\n fromStore,\n operation.value?.security ?? [],\n securitySchemes,\n )\n }\n const fromStore = workspaceStore.auth.getAuthSelectedSchemas({\n type: 'document',\n documentName: documentSlug,\n })\n return getSelectedSecurity(\n fromStore,\n undefined,\n document?.security ?? [],\n securitySchemes,\n )\n})\n\n/** Compute the security requirements for the operation or document based on the current collection type */\nconst securityRequirements = computed(() => {\n if (collectionType === 'operation') {\n return operation.value?.security ?? []\n }\n return document?.security ?? []\n})\n\n/** Compute the proxy URL for the current layout (for the electron we don't want to use the proxy by default) */\nconst proxyUrl = computed(\n () =>\n getActiveProxyUrl(\n workspaceStore.workspace['x-scalar-active-proxy'],\n layout,\n ) ?? '',\n)\n\nconst servers = computed(() => {\n return getServers(operation.value?.servers ?? document?.servers, {\n documentUrl: document?.['x-scalar-original-source-url'],\n })\n})\n\n/** Grab the currently selected server for relative auth URIs */\nconst server = computed(() => {\n const documentServer = document?.['x-scalar-selected-server']\n const operationServer = operation.value?.['x-scalar-selected-server']\n const selectedServerUrl = operationServer ?? documentServer\n return (\n servers.value.find(({ url }) => url === selectedServerUrl) ??\n servers.value[0] ??\n null\n )\n})\n\n/**\n * Handles toggling operation-level security authentication. (Only for operation collections)\n * When enabled (`value` is true), overrides document-level authentication for the current operation.\n * When disabled (`value` is false), reverts to using document-level authentication instead.\n */\nconst handleToggleOperationSecurity = (value: boolean) => {\n if (authMeta.value.type !== 'operation') {\n return\n }\n\n useOperationSecurity.value = value\n\n if (value) {\n // Use the same resolved selection as the UI; unpack so the event payload is plain objects\n const { selectedSchemes } = selectedSecurity.value\n return eventBus.emit('auth:update:selected-security-schemes', {\n selectedRequirements: unpackProxyObject(selectedSchemes, { depth: 1 }),\n newSchemes: [],\n meta: authMeta.value,\n })\n }\n\n // Clear the operation security so document level authentication is used\n return eventBus.emit('auth:clear:selected-security-schemes', {\n meta: authMeta.value,\n })\n}\n</script>\n\n<template>\n <Section>\n <template #title>Authentication</template>\n <template #description>\n <template v-if=\"collectionType === 'operation'\">\n <span class=\"block\">\n Override authentication for this operation with the toggle.\n </span>\n <span class=\"mt-1 block\">\n <strong>On</strong> — Authentication below applies only to this\n operation.\n </span>\n <span class=\"mt-1 block\">\n <strong>Off</strong> — This operation uses document-level\n authentication from the OpenAPI spec.\n </span>\n </template>\n <template v-else>\n Configure authentication for this document. Selected authentication\n applies to all operations unless overridden at the operation level.\n </template>\n </template>\n <template\n v-if=\"collectionType === 'operation'\"\n #actions>\n <div class=\"flex h-8 items-center\">\n <ScalarToggle\n class=\"w-4\"\n :modelValue=\"useOperationSecurity\"\n @update:modelValue=\"handleToggleOperationSecurity\" />\n </div>\n </template>\n\n <!-- Auth Selector -->\n <div\n :class=\"\n collectionType === 'operation' &&\n !useOperationSecurity &&\n 'cursor-not-allowed'\n \">\n <AuthSelector\n class=\"scalar-collection-auth border-none!\"\n :class=\"\n collectionType === 'operation' &&\n !useOperationSecurity &&\n 'pointer-events-none opacity-50 mix-blend-luminosity'\n \"\n :createAnySecurityScheme=\"true\"\n :environment\n :eventBus=\"eventBus\"\n isStatic\n :meta=\"authMeta\"\n :proxyUrl=\"proxyUrl\"\n :securityRequirements=\"securityRequirements\"\n :securitySchemes\n :selectedSecurity=\"selectedSecurity\"\n :server\n title=\"Authentication\" />\n </div>\n </Section>\n</template>\n<style scoped>\n.scalar-collection-auth {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-lg);\n overflow: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarToggle } from '@scalar/components'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport type { AuthMeta } from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport { computed, ref, watchEffect } from 'vue'\n\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { getDefaultOperationSecurityToggle } from '@/v2/features/collection/helpers/get-default-operation-security-toggle'\nimport { getSelectedSecurity } from '@/v2/features/operation'\nimport Section from '@/v2/features/settings/components/Section.vue'\nimport { getServers } from '@/v2/helpers'\nimport { getActiveProxyUrl } from '@/v2/helpers/get-active-proxy-url'\n\nconst {\n document,\n eventBus,\n environment,\n securitySchemes,\n workspaceStore,\n documentSlug,\n path,\n method,\n collectionType,\n layout,\n} = defineProps<CollectionProps>()\n\n/**\n * Compute the authentication metadata based on the current collection type.\n * If we're working with an operation, include its path and method; otherwise, use the document scope.\n */\nconst authMeta = computed<AuthMeta>(() => {\n if (collectionType === 'operation') {\n return {\n type: 'operation',\n path: path ?? '',\n method: method ?? 'get',\n }\n }\n return { type: 'document' }\n})\n\n/**\n * Compute the operation object based on the current collection type.\n */\nconst operation = computed(() => {\n if (collectionType === 'operation') {\n // Operation not found\n if (!path || !isHttpMethod(method)) {\n return null\n }\n // Operation found, return the servers\n return getResolvedRef(document?.paths?.[path]?.[method])\n }\n return null\n})\n\n/**\n * If enabled we use/set the selected security schemes on the operation level\n */\nconst useOperationSecurity = ref(false)\nwatchEffect(() => {\n useOperationSecurity.value = getDefaultOperationSecurityToggle({\n authStore: workspaceStore.auth,\n documentName: documentSlug,\n ...authMeta.value,\n })\n})\n\n/** Resolved selected security for the current collection (operation or document), with defaults applied */\nconst selectedSecurity = computed(() => {\n if (collectionType === 'operation') {\n const fromStore = workspaceStore.auth.getAuthSelectedSchemas({\n type: 'operation',\n documentName: documentSlug,\n path: path ?? '',\n method: method ?? 'get',\n })\n return getSelectedSecurity(\n undefined,\n fromStore,\n operation.value?.security ?? [],\n securitySchemes,\n )\n }\n const fromStore = workspaceStore.auth.getAuthSelectedSchemas({\n type: 'document',\n documentName: documentSlug,\n })\n return getSelectedSecurity(\n fromStore,\n undefined,\n document?.security ?? [],\n securitySchemes,\n )\n})\n\n/** Compute the security requirements for the operation or document based on the current collection type */\nconst securityRequirements = computed(() => {\n if (collectionType === 'operation') {\n return operation.value?.security ?? []\n }\n return document?.security ?? []\n})\n\n/** Compute the proxy URL for the current layout (for the electron we don't want to use the proxy by default) */\nconst proxyUrl = computed(\n () =>\n getActiveProxyUrl(\n workspaceStore.workspace['x-scalar-active-proxy'],\n layout,\n ) ?? '',\n)\n\nconst servers = computed(() => {\n return getServers(operation.value?.servers ?? document?.servers, {\n documentUrl: document?.['x-scalar-original-source-url'],\n })\n})\n\n/** Grab the currently selected server for relative auth URIs */\nconst server = computed(() => {\n const documentServer = document?.['x-scalar-selected-server']\n const operationServer = operation.value?.['x-scalar-selected-server']\n const selectedServerUrl = operationServer ?? documentServer\n return (\n servers.value.find(({ url }) => url === selectedServerUrl) ??\n servers.value[0] ??\n null\n )\n})\n\n/**\n * Handles toggling operation-level security authentication. (Only for operation collections)\n * When enabled (`value` is true), overrides document-level authentication for the current operation.\n * When disabled (`value` is false), reverts to using document-level authentication instead.\n */\nconst handleToggleOperationSecurity = (value: boolean) => {\n if (authMeta.value.type !== 'operation') {\n return\n }\n\n useOperationSecurity.value = value\n\n if (value) {\n // Use the same resolved selection as the UI; unpack so the event payload is plain objects\n const { selectedSchemes } = selectedSecurity.value\n return eventBus.emit('auth:update:selected-security-schemes', {\n selectedRequirements: unpackProxyObject(selectedSchemes, { depth: 1 }),\n newSchemes: [],\n meta: authMeta.value,\n })\n }\n\n // Clear the operation security so document level authentication is used\n return eventBus.emit('auth:clear:selected-security-schemes', {\n meta: authMeta.value,\n })\n}\n</script>\n\n<template>\n <Section>\n <template #title>Authentication</template>\n <template #description>\n <template v-if=\"collectionType === 'operation'\">\n <span class=\"block\">\n Override authentication for this operation with the toggle.\n </span>\n <span class=\"mt-1 block\">\n <strong>On</strong> — Authentication below applies only to this\n operation.\n </span>\n <span class=\"mt-1 block\">\n <strong>Off</strong> — This operation uses document-level\n authentication from the OpenAPI spec.\n </span>\n </template>\n <template v-else>\n Configure authentication for this document. Selected authentication\n applies to all operations unless overridden at the operation level.\n </template>\n </template>\n <template\n v-if=\"collectionType === 'operation'\"\n #actions>\n <div class=\"flex h-8 items-center\">\n <ScalarToggle\n class=\"w-4\"\n :modelValue=\"useOperationSecurity\"\n @update:modelValue=\"handleToggleOperationSecurity\" />\n </div>\n </template>\n\n <!-- Auth Selector -->\n <div\n :class=\"\n collectionType === 'operation' &&\n !useOperationSecurity &&\n 'cursor-not-allowed'\n \">\n <AuthSelector\n class=\"scalar-collection-auth border-none!\"\n :class=\"\n collectionType === 'operation' &&\n !useOperationSecurity &&\n 'pointer-events-none opacity-50 mix-blend-luminosity'\n \"\n :createAnySecurityScheme=\"true\"\n :environment\n :eventBus=\"eventBus\"\n isStatic\n :meta=\"authMeta\"\n :proxyUrl=\"proxyUrl\"\n :securityRequirements=\"securityRequirements\"\n :securitySchemes\n :selectedSecurity=\"selectedSecurity\"\n :server\n title=\"Authentication\" />\n </div>\n </Section>\n</template>\n<style scoped>\n.scalar-collection-auth {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-lg);\n overflow: hidden;\n}\n</style>\n","<script lang=\"ts\">\n/**\n * Cookies section for the collection.\n * Renders document or workspace cookies and lets users manage key-value data\n * sent with API requests (e.g. session tokens, auth, preferences).\n */\nexport default {\n name: 'Cookies',\n}\n</script>\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { CookiesTable } from '@/v2/features/global-cookies'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst { collectionType, eventBus, document, workspaceStore } =\n defineProps<CollectionProps>()\n\nconst cookies = computed(() => {\n return (\n (collectionType === 'document'\n ? document['x-scalar-cookies']\n : workspaceStore.workspace['x-scalar-cookies']) ?? []\n )\n})\n</script>\n\n<template>\n <Section v-if=\"collectionType !== 'operation'\">\n <template #title>Cookies</template>\n <template #description>\n Manage your collection's cookies here.<br />Cookies allow you to store and\n send key-value data with your API requests—often used for things like\n session tokens, authentication, and saving user preferences.<br />\n </template>\n <CookiesTable\n :collectionType=\"collectionType\"\n :cookies=\"cookies\"\n :eventBus=\"eventBus\" />\n </Section>\n</template>\n","<script lang=\"ts\">\n/**\n * Cookies section for the collection.\n * Renders document or workspace cookies and lets users manage key-value data\n * sent with API requests (e.g. session tokens, auth, preferences).\n */\nexport default {\n name: 'Cookies',\n}\n</script>\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { CookiesTable } from '@/v2/features/global-cookies'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst { collectionType, eventBus, document, workspaceStore } =\n defineProps<CollectionProps>()\n\nconst cookies = computed(() => {\n return (\n (collectionType === 'document'\n ? document['x-scalar-cookies']\n : workspaceStore.workspace['x-scalar-cookies']) ?? []\n )\n})\n</script>\n\n<template>\n <Section v-if=\"collectionType !== 'operation'\">\n <template #title>Cookies</template>\n <template #description>\n Manage your collection's cookies here.<br />Cookies allow you to store and\n send key-value data with your API requests—often used for things like\n session tokens, authentication, and saving user preferences.<br />\n </template>\n <CookiesTable\n :collectionType=\"collectionType\"\n :cookies=\"cookies\"\n :eventBus=\"eventBus\" />\n </Section>\n</template>\n","<script lang=\"ts\">\n/**\n * Environment variables section for the collection.\n * Renders document or workspace environments and lets users set variables\n * that can be referenced in request inputs via {{ variable }}.\n */\nexport default {\n name: 'Environment',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { EnvironmentsList } from '@/v2/features/environments'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst { document, eventBus, collectionType, workspaceStore } =\n defineProps<CollectionProps>()\n\n/** Document or workspace environments */\nconst environments = computed(\n () =>\n (collectionType === 'document'\n ? document['x-scalar-environments']\n : workspaceStore.workspace['x-scalar-environments']) ?? {},\n)\n\nconst activeEnvironment = computed(() => {\n return workspaceStore.workspace['x-scalar-active-environment']\n})\n</script>\n\n<template>\n <Section v-if=\"collectionType !== 'operation'\">\n <template #title>Environment Variables</template>\n <template #description>\n Set environment variables at your collection level. Use\n <code\n v-pre\n class=\"font-code text-c-2\">\n {{ variable }}\n </code>\n to add / search among the selected environment's variables in your request\n inputs.\n </template>\n <EnvironmentsList\n :activeEnvironment\n :collectionType\n :environments\n :eventBus />\n </Section>\n</template>\n","<script lang=\"ts\">\n/**\n * Environment variables section for the collection.\n * Renders document or workspace environments and lets users set variables\n * that can be referenced in request inputs via {{ variable }}.\n */\nexport default {\n name: 'Environment',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { EnvironmentsList } from '@/v2/features/environments'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst { document, eventBus, collectionType, workspaceStore } =\n defineProps<CollectionProps>()\n\n/** Document or workspace environments */\nconst environments = computed(\n () =>\n (collectionType === 'document'\n ? document['x-scalar-environments']\n : workspaceStore.workspace['x-scalar-environments']) ?? {},\n)\n\nconst activeEnvironment = computed(() => {\n return workspaceStore.workspace['x-scalar-active-environment']\n})\n</script>\n\n<template>\n <Section v-if=\"collectionType !== 'operation'\">\n <template #title>Environment Variables</template>\n <template #description>\n Set environment variables at your collection level. Use\n <code\n v-pre\n class=\"font-code text-c-2\">\n {{ variable }}\n </code>\n to add / search among the selected environment's variables in your request\n inputs.\n </template>\n <EnvironmentsList\n :activeEnvironment\n :collectionType\n :environments\n :eventBus />\n </Section>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarMarkdown,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { ScalarIconPencil } from '@scalar/icons'\nimport {\n computed,\n nextTick,\n ref,\n useTemplateRef,\n type ComputedRef,\n type Ref,\n} from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { CodeInput } from '@/v2/components/code-input'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst {\n document,\n eventBus,\n layout,\n collectionType,\n path,\n method,\n documentSlug,\n} = defineProps<CollectionProps>()\n\nconst operationLabel = computed(() => {\n if (!method || !path) {\n return 'this operation'\n }\n const upperMethod = typeof method === 'string' ? method.toUpperCase() : method\n return `${upperMethod} ${path}`\n})\n\nconst description: ComputedRef<string> = computed(() => {\n if (collectionType === 'operation') {\n if (!path || !method || !isHttpMethod(method)) {\n return ''\n }\n\n return document?.paths?.[path]?.[method]?.description ?? ''\n }\n\n return document?.info?.description ?? ''\n})\n\nconst deprecated: ComputedRef<boolean> = computed(() => {\n if (collectionType !== 'operation' || !path || !isHttpMethod(method)) {\n return false\n }\n\n const operation = document?.paths?.[path]?.[method] as\n | { deprecated?: boolean }\n | undefined\n return operation?.deprecated ?? false\n})\n\nconst mode: Ref<'edit' | 'preview'> = ref('preview')\n\nconst codeInputRef = useTemplateRef('codeInputRef')\n\n/**\n * Switch between edit and preview modes.\n * When switching to edit mode, focus the input after the DOM updates.\n */\nconst switchMode = async (newMode: 'edit' | 'preview'): Promise<void> => {\n mode.value = newMode\n\n if (newMode === 'edit') {\n await nextTick()\n codeInputRef.value?.focus()\n }\n}\n\n/**\n * Updates the description of the collection\n * @param payload - The new description\n * @returns void\n */\nconst handleDescriptionUpdate = async (payload: string) => {\n await switchMode('preview')\n\n /** If the collection type is a document, update the description of the document */\n if (collectionType === 'document') {\n return eventBus.emit('document:update:info', { description: payload })\n }\n\n /** If the collection type is an operation, update the description of the operation */\n if (collectionType === 'operation') {\n if (!path || !method) {\n console.error('Invalid path or method', { path, method })\n return\n }\n\n return eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: {\n description: payload,\n },\n })\n }\n\n console.error('Invalid collection type', { collectionType })\n}\n\nconst handleDeprecatedChange = (value: boolean) => {\n if (collectionType !== 'operation' || !path || !method) {\n return\n }\n\n eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: { deprecated: value },\n })\n}\n\nconst deleteOperationModal = useModal()\n\nconst handleDeleteOperation = () => {\n if (collectionType !== 'operation' || !path || !method || !documentSlug) {\n return\n }\n\n eventBus.emit('operation:delete:operation', {\n documentName: documentSlug,\n meta: { path, method },\n })\n deleteOperationModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-8\">\n <Section>\n <template #title>Description</template>\n <template #actions>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </template>\n <div class=\"has-focus-visible:bg-b-1 group rounded-lg\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"description.trim().length\">\n <ScalarMarkdown\n class=\"flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"description\"\n withImages\n @dblclick=\"switchMode('edit')\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-focus-visible:hidden\" />\n </template>\n\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-else>\n <CodeInput\n ref=\"codeInputRef\"\n class=\"border px-0.5 py-0\"\n :environment=\"undefined\"\n :layout=\"layout\"\n :modelValue=\"description\"\n @blur=\"handleDescriptionUpdate\" />\n </template>\n </div>\n </Section>\n\n <!-- Operation-only: Status and Danger Zone -->\n <template v-if=\"collectionType === 'operation'\">\n <Section>\n <template #title>Status</template>\n <div\n class=\"rounded-lg border text-sm transition-colors\"\n :class=\"\n deprecated\n ? 'border-(--scalar-color-alert) bg-(--scalar-background-alert)'\n : 'bg-b-2 border-(--scalar-background-3)'\n \">\n <div class=\"flex items-center justify-between gap-4 rounded-lg p-4\">\n <div class=\"min-w-0 flex-1\">\n <h4\n class=\"font-medium\"\n :class=\"\n deprecated ? 'text-(--scalar-color-alert)' : 'text-c-1'\n \">\n Deprecated\n </h4>\n <p class=\"text-c-2 mt-1.5\">\n Mark this operation as deprecated. Consumers SHOULD refrain from\n using it.\n </p>\n </div>\n <ScalarToggle\n class=\"shrink-0\"\n :modelValue=\"deprecated\"\n @update:modelValue=\"handleDeprecatedChange\" />\n </div>\n </div>\n </Section>\n\n <Section>\n <template #title>Danger Zone</template>\n <div\n class=\"bg-b-2 flex items-center justify-between gap-4 rounded-lg border border-(--scalar-background-3) p-4 text-sm\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"text-c-1 font-medium\">Delete Operation</h4>\n <p class=\"text-c-2 mt-1.5\">\n Be careful, my friend. Once deleted, there is no way to recover\n the operation.\n </p>\n </div>\n <ScalarButton\n class=\"shrink-0\"\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteOperationModal.show()\">\n Delete Operation\n </ScalarButton>\n </div>\n </Section>\n </template>\n </div>\n\n <!-- Delete Operation Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteOperationModal\"\n :title=\"`Delete ${operationLabel}`\">\n <DeleteSidebarListElement\n :variableName=\"operationLabel\"\n warningMessage=\"This action cannot be undone.\"\n @close=\"deleteOperationModal.hide()\"\n @delete=\"handleDeleteOperation\" />\n </ScalarModal>\n</template>\n\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarMarkdown,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { ScalarIconPencil } from '@scalar/icons'\nimport {\n computed,\n nextTick,\n ref,\n useTemplateRef,\n type ComputedRef,\n type Ref,\n} from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { CodeInput } from '@/v2/components/code-input'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst {\n document,\n eventBus,\n layout,\n collectionType,\n path,\n method,\n documentSlug,\n} = defineProps<CollectionProps>()\n\nconst operationLabel = computed(() => {\n if (!method || !path) {\n return 'this operation'\n }\n const upperMethod = typeof method === 'string' ? method.toUpperCase() : method\n return `${upperMethod} ${path}`\n})\n\nconst description: ComputedRef<string> = computed(() => {\n if (collectionType === 'operation') {\n if (!path || !method || !isHttpMethod(method)) {\n return ''\n }\n\n return document?.paths?.[path]?.[method]?.description ?? ''\n }\n\n return document?.info?.description ?? ''\n})\n\nconst deprecated: ComputedRef<boolean> = computed(() => {\n if (collectionType !== 'operation' || !path || !isHttpMethod(method)) {\n return false\n }\n\n const operation = document?.paths?.[path]?.[method] as\n | { deprecated?: boolean }\n | undefined\n return operation?.deprecated ?? false\n})\n\nconst mode: Ref<'edit' | 'preview'> = ref('preview')\n\nconst codeInputRef = useTemplateRef('codeInputRef')\n\n/**\n * Switch between edit and preview modes.\n * When switching to edit mode, focus the input after the DOM updates.\n */\nconst switchMode = async (newMode: 'edit' | 'preview'): Promise<void> => {\n mode.value = newMode\n\n if (newMode === 'edit') {\n await nextTick()\n codeInputRef.value?.focus()\n }\n}\n\n/**\n * Updates the description of the collection\n * @param payload - The new description\n * @returns void\n */\nconst handleDescriptionUpdate = async (payload: string) => {\n await switchMode('preview')\n\n /** If the collection type is a document, update the description of the document */\n if (collectionType === 'document') {\n return eventBus.emit('document:update:info', { description: payload })\n }\n\n /** If the collection type is an operation, update the description of the operation */\n if (collectionType === 'operation') {\n if (!path || !method) {\n console.error('Invalid path or method', { path, method })\n return\n }\n\n return eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: {\n description: payload,\n },\n })\n }\n\n console.error('Invalid collection type', { collectionType })\n}\n\nconst handleDeprecatedChange = (value: boolean) => {\n if (collectionType !== 'operation' || !path || !method) {\n return\n }\n\n eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: { deprecated: value },\n })\n}\n\nconst deleteOperationModal = useModal()\n\nconst handleDeleteOperation = () => {\n if (collectionType !== 'operation' || !path || !method || !documentSlug) {\n return\n }\n\n eventBus.emit('operation:delete:operation', {\n documentName: documentSlug,\n meta: { path, method },\n })\n deleteOperationModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-8\">\n <Section>\n <template #title>Description</template>\n <template #actions>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </template>\n <div class=\"has-focus-visible:bg-b-1 group rounded-lg\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"description.trim().length\">\n <ScalarMarkdown\n class=\"flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"description\"\n withImages\n @dblclick=\"switchMode('edit')\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-focus-visible:hidden\" />\n </template>\n\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-else>\n <CodeInput\n ref=\"codeInputRef\"\n class=\"border px-0.5 py-0\"\n :environment=\"undefined\"\n :layout=\"layout\"\n :modelValue=\"description\"\n @blur=\"handleDescriptionUpdate\" />\n </template>\n </div>\n </Section>\n\n <!-- Operation-only: Status and Danger Zone -->\n <template v-if=\"collectionType === 'operation'\">\n <Section>\n <template #title>Status</template>\n <div\n class=\"rounded-lg border text-sm transition-colors\"\n :class=\"\n deprecated\n ? 'border-(--scalar-color-alert) bg-(--scalar-background-alert)'\n : 'bg-b-2 border-(--scalar-background-3)'\n \">\n <div class=\"flex items-center justify-between gap-4 rounded-lg p-4\">\n <div class=\"min-w-0 flex-1\">\n <h4\n class=\"font-medium\"\n :class=\"\n deprecated ? 'text-(--scalar-color-alert)' : 'text-c-1'\n \">\n Deprecated\n </h4>\n <p class=\"text-c-2 mt-1.5\">\n Mark this operation as deprecated. Consumers SHOULD refrain from\n using it.\n </p>\n </div>\n <ScalarToggle\n class=\"shrink-0\"\n :modelValue=\"deprecated\"\n @update:modelValue=\"handleDeprecatedChange\" />\n </div>\n </div>\n </Section>\n\n <Section>\n <template #title>Danger Zone</template>\n <div\n class=\"bg-b-2 flex items-center justify-between gap-4 rounded-lg border border-(--scalar-background-3) p-4 text-sm\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"text-c-1 font-medium\">Delete Operation</h4>\n <p class=\"text-c-2 mt-1.5\">\n Be careful, my friend. Once deleted, there is no way to recover\n the operation.\n </p>\n </div>\n <ScalarButton\n class=\"shrink-0\"\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteOperationModal.show()\">\n Delete Operation\n </ScalarButton>\n </div>\n </Section>\n </template>\n </div>\n\n <!-- Delete Operation Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteOperationModal\"\n :title=\"`Delete ${operationLabel}`\">\n <DeleteSidebarListElement\n :variableName=\"operationLabel\"\n warningMessage=\"This action cannot be undone.\"\n @close=\"deleteOperationModal.hide()\"\n @delete=\"handleDeleteOperation\" />\n </ScalarModal>\n</template>\n\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { useId } from 'vue'\n\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport DataTable from '@/v2/components/data-table/DataTable.vue'\nimport DataTableInput from '@/v2/components/data-table/DataTableInput.vue'\nimport DataTableRow from '@/v2/components/data-table/DataTableRow.vue'\n\ndefineProps<{\n title?: string\n options: {\n key: string\n label: string\n placeholder: string\n lineWrapping?: boolean\n }[]\n data: Record<string, any>\n onUpdate: (key: string, value: string | number) => void\n environment: XScalarEnvironment\n}>()\n\nconst id = useId()\n</script>\n<template>\n <ViewLayoutSection class=\"last:rounded-b-lg\">\n <template\n v-if=\"title || $slots.title\"\n #title>\n <span v-if=\"title\">{{ title }}</span>\n <slot\n v-else\n name=\"title\" />\n </template>\n <div class=\"flex flex-1 flex-col gap-1.5\">\n <DataTable\n v-if=\"Object.keys(data).length > 0\"\n class=\"rounded-b-lg\"\n :columns=\"['']\">\n <DataTableRow\n v-for=\"(option, index) in options\"\n :key=\"index\">\n <DataTableInput\n :id=\"id\"\n class=\"pr-9\"\n :environment=\"environment\"\n :lineWrapping=\"option.lineWrapping ?? false\"\n :modelValue=\"data[option.key] ?? ''\"\n :placeholder=\"option.placeholder\"\n @update:modelValue=\"onUpdate(option.key, $event)\">\n <template #default>\n <label :for=\"id\">\n {{ option.label }}\n </label>\n </template>\n <template\n v-if=\"option.key === 'description'\"\n #icon>\n <div\n class=\"centered-y bg-b-2 flex-center absolute right-1 z-1 rounded px-1 py-0.5\">\n <ScalarIcon\n icon=\"Markdown\"\n size=\"lg\" />\n </div>\n </template>\n </DataTableInput>\n </DataTableRow>\n </DataTable>\n </div>\n </ViewLayoutSection>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { useId } from 'vue'\n\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport DataTable from '@/v2/components/data-table/DataTable.vue'\nimport DataTableInput from '@/v2/components/data-table/DataTableInput.vue'\nimport DataTableRow from '@/v2/components/data-table/DataTableRow.vue'\n\ndefineProps<{\n title?: string\n options: {\n key: string\n label: string\n placeholder: string\n lineWrapping?: boolean\n }[]\n data: Record<string, any>\n onUpdate: (key: string, value: string | number) => void\n environment: XScalarEnvironment\n}>()\n\nconst id = useId()\n</script>\n<template>\n <ViewLayoutSection class=\"last:rounded-b-lg\">\n <template\n v-if=\"title || $slots.title\"\n #title>\n <span v-if=\"title\">{{ title }}</span>\n <slot\n v-else\n name=\"title\" />\n </template>\n <div class=\"flex flex-1 flex-col gap-1.5\">\n <DataTable\n v-if=\"Object.keys(data).length > 0\"\n class=\"rounded-b-lg\"\n :columns=\"['']\">\n <DataTableRow\n v-for=\"(option, index) in options\"\n :key=\"index\">\n <DataTableInput\n :id=\"id\"\n class=\"pr-9\"\n :environment=\"environment\"\n :lineWrapping=\"option.lineWrapping ?? false\"\n :modelValue=\"data[option.key] ?? ''\"\n :placeholder=\"option.placeholder\"\n @update:modelValue=\"onUpdate(option.key, $event)\">\n <template #default>\n <label :for=\"id\">\n {{ option.label }}\n </label>\n </template>\n <template\n v-if=\"option.key === 'description'\"\n #icon>\n <div\n class=\"centered-y bg-b-2 flex-center absolute right-1 z-1 rounded px-1 py-0.5\">\n <ScalarIcon\n icon=\"Markdown\"\n size=\"lg\" />\n </div>\n </template>\n </DataTableInput>\n </DataTableRow>\n </DataTable>\n </div>\n </ViewLayoutSection>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarMarkdown,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { debounce } from '@scalar/helpers/general/debounce'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { ScalarIconPlus, ScalarIconTrash } from '@scalar/icons'\nimport type { ServerMeta } from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed, ref, watchEffect } from 'vue'\n\nimport { ServerVariablesForm } from '@/components/Server'\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nimport Form from './Form.vue'\n\nconst { document, eventBus, collectionType, path, method } =\n defineProps<CollectionProps>()\n\nconst deleteModal = useModal()\nconst selectedServerIndex = ref<number>(-1)\n\nconst isOperation = computed(() => collectionType === 'operation')\n\nconst operation = computed(() => {\n if (!isOperation.value) {\n return null\n }\n // Operation not found\n if (!path || !isHttpMethod(method)) {\n return null\n }\n // Operation found, return the servers\n return getResolvedRef(document?.paths?.[path]?.[method])\n})\n\nconst useOperationServers = ref(false)\nwatchEffect(() => {\n useOperationServers.value = operation.value?.servers !== undefined\n})\n\n/** Grab the servers for the collection */\nconst servers = computed(() => {\n if (collectionType === 'operation' && operation.value) {\n return operation.value.servers ?? []\n }\n return document?.servers ?? []\n})\n\n/** Grab whichever server we are working on */\nconst selectedServer = computed(() => servers.value[selectedServerIndex.value])\n\n/** Meta for server events: document-level or operation-level based on collection type */\nconst serverMeta = computed<ServerMeta>(() => {\n if (collectionType === 'operation' && path && isHttpMethod(method)) {\n return { type: 'operation', path, method }\n }\n return { type: 'document' }\n})\n\n// Form field configuration\nconst FORM_OPTIONS = [\n {\n label: 'URL',\n key: 'url',\n placeholder: 'https://void.scalar.com',\n },\n {\n label: 'Description',\n key: 'description',\n placeholder: 'Production',\n lineWrapping: true,\n },\n]\n\n/** Opens the delete confirmation modal for a server */\nconst openDeleteModal = (index: number) => {\n selectedServerIndex.value = index\n deleteModal.show()\n}\n\n/** Closes the delete modal and resets the selected server */\nconst resetState = () => {\n deleteModal.hide()\n selectedServerIndex.value = -1\n}\n\n/** Handles server deletion */\nconst handleDeleteServer = () => {\n if (selectedServerIndex.value < 0) {\n return\n }\n\n eventBus.emit('server:delete:server', {\n index: selectedServerIndex.value,\n meta: serverMeta.value,\n })\n resetState()\n}\n\n/** Debounced execute function for server updates, keyed so we only debounce by server + key */\nconst { execute } = debounce({ delay: 328, maxWait: 1000 })\n\n/** Handles server property updates with debouncing */\nconst handleServerUpdate = (\n index: number,\n key: string,\n value: string | number,\n) =>\n execute(`${index}-${key}-${serverMeta.value.type}`, () =>\n eventBus.emit('server:update:server', {\n index,\n server: { [key]: value },\n meta: serverMeta.value,\n }),\n )\n\n/** Handles server variable updates with debouncing */\nconst handleVariableUpdate = (index: number, key: string, value: string) =>\n execute(`${index}-${key}-${serverMeta.value.type}`, () =>\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: serverMeta.value,\n }),\n )\n\n/** Handles adding a new server */\nconst handleAddServer = () =>\n eventBus.emit('server:add:server', { meta: serverMeta.value })\n\n/**\n * Gets the display name for a server\n */\nconst getServerDisplayName = (server?: ServerObject, index = 0): string =>\n server?.description || `Server ${index + 1}`\n\n/** Handles toggling the operation servers */\nconst handleToggleOperationServers = (value: boolean) => {\n // Only toggle for operation collections\n if (serverMeta.value.type !== 'operation') {\n return\n }\n\n // update the operation servers\n useOperationServers.value = value\n\n if (value) {\n // Initialize the servers with an empty array so we will infer the servers from the operation\n return eventBus.emit('server:initialize:servers', {\n meta: serverMeta.value,\n })\n }\n return eventBus.emit('server:clear:servers', { meta: serverMeta.value })\n}\n</script>\n\n<template>\n <Section>\n <template #title>Servers</template>\n <template #description>\n <template v-if=\"isOperation\">\n <span class=\"block\">\n Override servers for this operation with the toggle.\n </span>\n <span class=\"mt-1 block\">\n <strong>On</strong> — Servers below apply only to this operation.\n </span>\n <span class=\"mt-1 block\">\n <strong>Off</strong> — Removes operation servers; this operation uses\n document or path servers from the OpenAPI spec.\n </span>\n <span class=\"text-c-3 mt-1 block\">\n Use <code class=\"font-code text-c-2\">{variables}</code> for dynamic\n URL parts.\n </span>\n </template>\n <template v-else>\n Add different base URLs for your API. Use\n <code class=\"font-code text-c-2\">{variables}</code> for dynamic parts.\n </template>\n </template>\n <!-- Operation Servers Toggle to use the operation servers instead of the document servers -->\n <template\n v-if=\"isOperation\"\n #actions>\n <div class=\"flex h-8 items-center\">\n <ScalarToggle\n class=\"w-4\"\n :modelValue=\"useOperationServers\"\n @update:modelValue=\"handleToggleOperationServers\" />\n </div>\n </template>\n\n <div :class=\"isOperation && !useOperationServers && 'cursor-not-allowed'\">\n <div\n class=\"flex flex-col gap-4\"\n :class=\"\n isOperation &&\n !useOperationServers &&\n 'pointer-events-none cursor-not-allowed opacity-50 mix-blend-luminosity'\n \">\n <!-- Server List -->\n <div class=\"flex flex-col gap-4\">\n <div\n v-for=\"(server, index) in servers\"\n :key=\"index\"\n class=\"rounded-lg border\">\n <!-- Server Header -->\n <div\n class=\"bg-b-2 flex items-center justify-between rounded-t-lg px-3 py-1 text-sm\">\n <ScalarMarkdown\n v-if=\"server.description\"\n class=\"self-center\"\n :value=\"server.description\" />\n <span\n v-else\n class=\"self-center\">\n {{ getServerDisplayName(server, index) }}\n </span>\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n data-testid=\"delete-server-button\"\n variant=\"ghost\"\n @click=\"openDeleteModal(index)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n\n <!-- Server Variables Form -->\n <div\n class=\"divide-0 flex w-full flex-col divide-y rounded-b-lg text-sm\">\n <Form\n :data=\"server\"\n :environment=\"environment\"\n :onUpdate=\"\n (key, value) => handleServerUpdate(index, key, value)\n \"\n :options=\"FORM_OPTIONS\" />\n <ServerVariablesForm\n v-if=\"server.variables\"\n :variables=\"server.variables\"\n @update:variable=\"\n (name, value) => handleVariableUpdate(index, name, value)\n \" />\n </div>\n </div>\n </div>\n\n <!-- Add Server Button -->\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"handleAddServer\">\n <ScalarIconPlus />\n <span>Add Server</span>\n </ScalarButton>\n </div>\n </div>\n </div>\n </Section>\n\n <!-- Delete Confirmation Modal -->\n <ScalarModal\n size=\"xxs\"\n :state=\"deleteModal\"\n :title=\"`Delete ${getServerDisplayName(selectedServer, selectedServerIndex)}`\">\n <DeleteSidebarListElement\n variableName=\"Server\"\n warningMessage=\"Are you sure you want to delete this server? This action cannot be undone.\"\n @close=\"resetState\"\n @delete=\"handleDeleteServer\" />\n </ScalarModal>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarMarkdown,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { debounce } from '@scalar/helpers/general/debounce'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { ScalarIconPlus, ScalarIconTrash } from '@scalar/icons'\nimport type { ServerMeta } from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed, ref, watchEffect } from 'vue'\n\nimport { ServerVariablesForm } from '@/components/Server'\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nimport Form from './Form.vue'\n\nconst { document, eventBus, collectionType, path, method } =\n defineProps<CollectionProps>()\n\nconst deleteModal = useModal()\nconst selectedServerIndex = ref<number>(-1)\n\nconst isOperation = computed(() => collectionType === 'operation')\n\nconst operation = computed(() => {\n if (!isOperation.value) {\n return null\n }\n // Operation not found\n if (!path || !isHttpMethod(method)) {\n return null\n }\n // Operation found, return the servers\n return getResolvedRef(document?.paths?.[path]?.[method])\n})\n\nconst useOperationServers = ref(false)\nwatchEffect(() => {\n useOperationServers.value = operation.value?.servers !== undefined\n})\n\n/** Grab the servers for the collection */\nconst servers = computed(() => {\n if (collectionType === 'operation' && operation.value) {\n return operation.value.servers ?? []\n }\n return document?.servers ?? []\n})\n\n/** Grab whichever server we are working on */\nconst selectedServer = computed(() => servers.value[selectedServerIndex.value])\n\n/** Meta for server events: document-level or operation-level based on collection type */\nconst serverMeta = computed<ServerMeta>(() => {\n if (collectionType === 'operation' && path && isHttpMethod(method)) {\n return { type: 'operation', path, method }\n }\n return { type: 'document' }\n})\n\n// Form field configuration\nconst FORM_OPTIONS = [\n {\n label: 'URL',\n key: 'url',\n placeholder: 'https://void.scalar.com',\n },\n {\n label: 'Description',\n key: 'description',\n placeholder: 'Production',\n lineWrapping: true,\n },\n]\n\n/** Opens the delete confirmation modal for a server */\nconst openDeleteModal = (index: number) => {\n selectedServerIndex.value = index\n deleteModal.show()\n}\n\n/** Closes the delete modal and resets the selected server */\nconst resetState = () => {\n deleteModal.hide()\n selectedServerIndex.value = -1\n}\n\n/** Handles server deletion */\nconst handleDeleteServer = () => {\n if (selectedServerIndex.value < 0) {\n return\n }\n\n eventBus.emit('server:delete:server', {\n index: selectedServerIndex.value,\n meta: serverMeta.value,\n })\n resetState()\n}\n\n/** Debounced execute function for server updates, keyed so we only debounce by server + key */\nconst { execute } = debounce({ delay: 328, maxWait: 1000 })\n\n/** Handles server property updates with debouncing */\nconst handleServerUpdate = (\n index: number,\n key: string,\n value: string | number,\n) =>\n execute(`${index}-${key}-${serverMeta.value.type}`, () =>\n eventBus.emit('server:update:server', {\n index,\n server: { [key]: value },\n meta: serverMeta.value,\n }),\n )\n\n/** Handles server variable updates with debouncing */\nconst handleVariableUpdate = (index: number, key: string, value: string) =>\n execute(`${index}-${key}-${serverMeta.value.type}`, () =>\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: serverMeta.value,\n }),\n )\n\n/** Handles adding a new server */\nconst handleAddServer = () =>\n eventBus.emit('server:add:server', { meta: serverMeta.value })\n\n/**\n * Gets the display name for a server\n */\nconst getServerDisplayName = (server?: ServerObject, index = 0): string =>\n server?.description || `Server ${index + 1}`\n\n/** Handles toggling the operation servers */\nconst handleToggleOperationServers = (value: boolean) => {\n // Only toggle for operation collections\n if (serverMeta.value.type !== 'operation') {\n return\n }\n\n // update the operation servers\n useOperationServers.value = value\n\n if (value) {\n // Initialize the servers with an empty array so we will infer the servers from the operation\n return eventBus.emit('server:initialize:servers', {\n meta: serverMeta.value,\n })\n }\n return eventBus.emit('server:clear:servers', { meta: serverMeta.value })\n}\n</script>\n\n<template>\n <Section>\n <template #title>Servers</template>\n <template #description>\n <template v-if=\"isOperation\">\n <span class=\"block\">\n Override servers for this operation with the toggle.\n </span>\n <span class=\"mt-1 block\">\n <strong>On</strong> — Servers below apply only to this operation.\n </span>\n <span class=\"mt-1 block\">\n <strong>Off</strong> — Removes operation servers; this operation uses\n document or path servers from the OpenAPI spec.\n </span>\n <span class=\"text-c-3 mt-1 block\">\n Use <code class=\"font-code text-c-2\">{variables}</code> for dynamic\n URL parts.\n </span>\n </template>\n <template v-else>\n Add different base URLs for your API. Use\n <code class=\"font-code text-c-2\">{variables}</code> for dynamic parts.\n </template>\n </template>\n <!-- Operation Servers Toggle to use the operation servers instead of the document servers -->\n <template\n v-if=\"isOperation\"\n #actions>\n <div class=\"flex h-8 items-center\">\n <ScalarToggle\n class=\"w-4\"\n :modelValue=\"useOperationServers\"\n @update:modelValue=\"handleToggleOperationServers\" />\n </div>\n </template>\n\n <div :class=\"isOperation && !useOperationServers && 'cursor-not-allowed'\">\n <div\n class=\"flex flex-col gap-4\"\n :class=\"\n isOperation &&\n !useOperationServers &&\n 'pointer-events-none cursor-not-allowed opacity-50 mix-blend-luminosity'\n \">\n <!-- Server List -->\n <div class=\"flex flex-col gap-4\">\n <div\n v-for=\"(server, index) in servers\"\n :key=\"index\"\n class=\"rounded-lg border\">\n <!-- Server Header -->\n <div\n class=\"bg-b-2 flex items-center justify-between rounded-t-lg px-3 py-1 text-sm\">\n <ScalarMarkdown\n v-if=\"server.description\"\n class=\"self-center\"\n :value=\"server.description\" />\n <span\n v-else\n class=\"self-center\">\n {{ getServerDisplayName(server, index) }}\n </span>\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n data-testid=\"delete-server-button\"\n variant=\"ghost\"\n @click=\"openDeleteModal(index)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n\n <!-- Server Variables Form -->\n <div\n class=\"divide-0 flex w-full flex-col divide-y rounded-b-lg text-sm\">\n <Form\n :data=\"server\"\n :environment=\"environment\"\n :onUpdate=\"\n (key, value) => handleServerUpdate(index, key, value)\n \"\n :options=\"FORM_OPTIONS\" />\n <ServerVariablesForm\n v-if=\"server.variables\"\n :variables=\"server.variables\"\n @update:variable=\"\n (name, value) => handleVariableUpdate(index, name, value)\n \" />\n </div>\n </div>\n </div>\n\n <!-- Add Server Button -->\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"handleAddServer\">\n <ScalarIconPlus />\n <span>Add Server</span>\n </ScalarButton>\n </div>\n </div>\n </div>\n </Section>\n\n <!-- Delete Confirmation Modal -->\n <ScalarModal\n size=\"xxs\"\n :state=\"deleteModal\"\n :title=\"`Delete ${getServerDisplayName(selectedServer, selectedServerIndex)}`\">\n <DeleteSidebarListElement\n variableName=\"Server\"\n warningMessage=\"Are you sure you want to delete this server? This action cannot be undone.\"\n @close=\"resetState\"\n @delete=\"handleDeleteServer\" />\n </ScalarModal>\n</template>\n","<script setup lang=\"ts\">\nimport type { ColorMode } from '@scalar/workspace-store/schemas/workspace'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { CollectionSettings, DocumentSettings } from '@/v2/features/settings'\nimport { getActiveProxyUrl } from '@/v2/helpers/get-active-proxy-url'\n\nconst {\n eventBus,\n documentSlug,\n document,\n workspaceStore,\n collectionType,\n layout,\n} = defineProps<CollectionProps>()\n\nconst handleUpdateWatchMode = (watchMode: boolean) => {\n eventBus.emit('document:update:watch-mode', watchMode)\n}\n\nconst handleUpdateThemeSlug = (themeSlug?: string) => {\n eventBus.emit('workspace:update:theme', themeSlug)\n}\nconst handleUpdateActiveProxy = (proxy: string | null) => {\n eventBus.emit('workspace:update:active-proxy', proxy)\n}\n\nconst handleUpdateColorMode = (colorMode: ColorMode) => {\n eventBus.emit('workspace:update:color-mode', colorMode)\n}\n</script>\n<template>\n <DocumentSettings\n v-if=\"collectionType === 'document'\"\n :documentUrl=\"document?.['x-scalar-original-source-url']\"\n :isDraftDocument=\"documentSlug === 'drafts'\"\n :title=\"document?.info.title ?? ''\"\n :watchMode=\"document?.['x-scalar-watch-mode']\"\n @delete:document=\"\n eventBus.emit('document:delete:document', { name: documentSlug })\n \"\n @update:watchMode=\"handleUpdateWatchMode\" />\n <CollectionSettings\n v-else\n :activeProxyUrl=\"\n getActiveProxyUrl(\n workspaceStore.workspace['x-scalar-active-proxy'],\n layout,\n )\n \"\n :activeThemeSlug=\"workspaceStore.workspace['x-scalar-theme'] ?? 'none'\"\n :colorMode=\"workspaceStore.workspace['x-scalar-color-mode'] ?? 'system'\"\n :customThemes=\"customThemes\"\n @update:colorMode=\"handleUpdateColorMode\"\n @update:proxyUrl=\"handleUpdateActiveProxy\"\n @update:themeSlug=\"handleUpdateThemeSlug\" />\n</template>\n","<script setup lang=\"ts\">\nimport type { ColorMode } from '@scalar/workspace-store/schemas/workspace'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { CollectionSettings, DocumentSettings } from '@/v2/features/settings'\nimport { getActiveProxyUrl } from '@/v2/helpers/get-active-proxy-url'\n\nconst {\n eventBus,\n documentSlug,\n document,\n workspaceStore,\n collectionType,\n layout,\n} = defineProps<CollectionProps>()\n\nconst handleUpdateWatchMode = (watchMode: boolean) => {\n eventBus.emit('document:update:watch-mode', watchMode)\n}\n\nconst handleUpdateThemeSlug = (themeSlug?: string) => {\n eventBus.emit('workspace:update:theme', themeSlug)\n}\nconst handleUpdateActiveProxy = (proxy: string | null) => {\n eventBus.emit('workspace:update:active-proxy', proxy)\n}\n\nconst handleUpdateColorMode = (colorMode: ColorMode) => {\n eventBus.emit('workspace:update:color-mode', colorMode)\n}\n</script>\n<template>\n <DocumentSettings\n v-if=\"collectionType === 'document'\"\n :documentUrl=\"document?.['x-scalar-original-source-url']\"\n :isDraftDocument=\"documentSlug === 'drafts'\"\n :title=\"document?.info.title ?? ''\"\n :watchMode=\"document?.['x-scalar-watch-mode']\"\n @delete:document=\"\n eventBus.emit('document:delete:document', { name: documentSlug })\n \"\n @update:watchMode=\"handleUpdateWatchMode\" />\n <CollectionSettings\n v-else\n :activeProxyUrl=\"\n getActiveProxyUrl(\n workspaceStore.workspace['x-scalar-active-proxy'],\n layout,\n )\n \"\n :activeThemeSlug=\"workspaceStore.workspace['x-scalar-theme'] ?? 'none'\"\n :colorMode=\"workspaceStore.workspace['x-scalar-color-mode'] ?? 'system'\"\n :customThemes=\"customThemes\"\n @update:colorMode=\"handleUpdateColorMode\"\n @update:proxyUrl=\"handleUpdateActiveProxy\"\n @update:themeSlug=\"handleUpdateThemeSlug\" />\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarIconCheckCircle,\n ScalarIconInfo,\n ScalarIconWarning,\n ScalarIconWarningCircle,\n} from '@scalar/icons'\n\ntype CalloutType = 'info' | 'success' | 'warning' | 'danger' | 'neutral'\n\nconst { type } = defineProps<{\n type: CalloutType\n}>()\n\nconst slots = defineSlots<{\n default: () => string\n actions?: () => string\n}>()\n\nconst iconsMapping = {\n info: ScalarIconInfo,\n success: ScalarIconCheckCircle,\n warning: ScalarIconWarning,\n danger: ScalarIconWarningCircle,\n neutral: ScalarIconInfo,\n} satisfies Record<CalloutType, unknown>\n</script>\n\n<template>\n <div :class=\"`callout t-editor__callout callout__${type}`\">\n <div class=\"flex w-full flex-col gap-2\">\n <div class=\"flex items-start gap-2\">\n <div\n class=\"callout-content__icon\"\n data-scalar-name=\"callout-icon\">\n <component\n :is=\"iconsMapping[type]\"\n class=\"size-5 shrink-0\" />\n </div>\n <div class=\"callout-content__text\">\n <slots.default />\n </div>\n </div>\n <div\n v-if=\"slots.actions\"\n class=\"flex justify-end gap-2\">\n <slots.actions />\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n/* ----------------------------------------------------- */\n/* Custom Callout Styles */\n\n.dark-mode .t-editor__callout,\n.light-mode .t-editor__callout {\n --callout-font-size: var(--scalar-small);\n\n --callout-neutral-primary: var(--scalar-color-3);\n --callout-neutral-secondary: color-mix(\n in srgb,\n var(--scalar-background-2),\n transparent 50%\n );\n --callout-neutral-font-color: var(--scalar-color-1);\n\n --callout-success-primary: var(--scalar-color-green);\n --callout-success-secondary: color-mix(\n in srgb,\n var(--scalar-color-green),\n transparent 97%\n );\n --callout-success-font-color: var(--scalar-color-1);\n\n --callout-danger-primary: var(--scalar-color-red);\n --callout-danger-secondary: color-mix(\n in srgb,\n var(--scalar-color-red),\n transparent 97%\n );\n --callout-danger-font-color: var(--scalar-color-1);\n\n --callout-warning-primary: var(--scalar-color-yellow);\n --callout-warning-secondary: color-mix(\n in srgb,\n var(--scalar-color-yellow),\n transparent 97%\n );\n --callout-warning-font-color: var(--scalar-color-1);\n\n --callout-info-primary: var(--scalar-color-blue);\n --callout-info-secondary: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 97%\n );\n --callout-info-font-color: var(--scalar-color-1);\n\n --callout-line-height: 22px;\n}\n\n.t-editor__callout {\n border-radius: var(--scalar-radius);\n margin-top: var(--scalar-block-spacing);\n padding: 10px 14px;\n\n --callout-primary: var(--scalar-border-color);\n --callout-secondary: var(--scalar-background-2);\n --callout-svg: var(--callout-primary);\n\n background: var(--callout-secondary);\n border: var(--scalar-border-width) solid\n color-mix(in srgb, var(--callout-primary), transparent 50%);\n}\n\n.t-editor__callout .callout-content__text {\n font-size: var(--callout-font-size);\n flex: 1 1 0%;\n line-height: var(--callout-line-height);\n}\n\n.t-editor__callout .callout-content__icon {\n position: relative;\n border-radius: var(--scalar-radius);\n width: 18px;\n height: fit-content;\n color: var(--callout-svg);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.t-editor__callout .callout-content__icon svg,\n.t-editor__callout .callout-content__icon img {\n width: 18px;\n height: 18px;\n}\n\n/* vertical align icon to text, don't remove this */\n.t-editor__callout .callout-content__icon:before {\n content: '\\200b';\n line-height: var(--callout-line-height);\n}\n\n/* Apply callout colors */\n.t-editor__callout.callout__neutral {\n --callout-primary: var(--callout-neutral-primary);\n --callout-secondary: var(--callout-neutral-secondary);\n --callout-font-color: var(--callout-neutral-font-color);\n --callout-svg: var(--callout-neutral-font-color);\n}\n\n.t-editor__callout.callout__info {\n --callout-primary: var(--callout-info-primary);\n --callout-secondary: var(--callout-info-secondary);\n --callout-font-color: var(--callout-info-font-color);\n --callout-svg: var(--callout-info-primary);\n}\n\n.t-editor__callout.callout__warning {\n --callout-primary: var(--callout-warning-primary);\n --callout-secondary: var(--callout-warning-secondary);\n --callout-font-color: var(--callout-warning-font-color);\n --callout-svg: var(--callout-warning-primary);\n}\n\n.t-editor__callout.callout__success {\n --callout-primary: var(--callout-success-primary);\n --callout-secondary: var(--callout-success-secondary);\n --callout-font-color: var(--callout-success-font-color);\n --callout-svg: var(--callout-success-primary);\n}\n\n.t-editor__callout.callout__danger {\n --callout-primary: var(--callout-danger-primary);\n --callout-secondary: var(--callout-danger-secondary);\n --callout-font-color: var(--callout-danger-font-color);\n --callout-svg: var(--callout-danger-primary);\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarIconCheckCircle,\n ScalarIconInfo,\n ScalarIconWarning,\n ScalarIconWarningCircle,\n} from '@scalar/icons'\n\ntype CalloutType = 'info' | 'success' | 'warning' | 'danger' | 'neutral'\n\nconst { type } = defineProps<{\n type: CalloutType\n}>()\n\nconst slots = defineSlots<{\n default: () => string\n actions?: () => string\n}>()\n\nconst iconsMapping = {\n info: ScalarIconInfo,\n success: ScalarIconCheckCircle,\n warning: ScalarIconWarning,\n danger: ScalarIconWarningCircle,\n neutral: ScalarIconInfo,\n} satisfies Record<CalloutType, unknown>\n</script>\n\n<template>\n <div :class=\"`callout t-editor__callout callout__${type}`\">\n <div class=\"flex w-full flex-col gap-2\">\n <div class=\"flex items-start gap-2\">\n <div\n class=\"callout-content__icon\"\n data-scalar-name=\"callout-icon\">\n <component\n :is=\"iconsMapping[type]\"\n class=\"size-5 shrink-0\" />\n </div>\n <div class=\"callout-content__text\">\n <slots.default />\n </div>\n </div>\n <div\n v-if=\"slots.actions\"\n class=\"flex justify-end gap-2\">\n <slots.actions />\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n/* ----------------------------------------------------- */\n/* Custom Callout Styles */\n\n.dark-mode .t-editor__callout,\n.light-mode .t-editor__callout {\n --callout-font-size: var(--scalar-small);\n\n --callout-neutral-primary: var(--scalar-color-3);\n --callout-neutral-secondary: color-mix(\n in srgb,\n var(--scalar-background-2),\n transparent 50%\n );\n --callout-neutral-font-color: var(--scalar-color-1);\n\n --callout-success-primary: var(--scalar-color-green);\n --callout-success-secondary: color-mix(\n in srgb,\n var(--scalar-color-green),\n transparent 97%\n );\n --callout-success-font-color: var(--scalar-color-1);\n\n --callout-danger-primary: var(--scalar-color-red);\n --callout-danger-secondary: color-mix(\n in srgb,\n var(--scalar-color-red),\n transparent 97%\n );\n --callout-danger-font-color: var(--scalar-color-1);\n\n --callout-warning-primary: var(--scalar-color-yellow);\n --callout-warning-secondary: color-mix(\n in srgb,\n var(--scalar-color-yellow),\n transparent 97%\n );\n --callout-warning-font-color: var(--scalar-color-1);\n\n --callout-info-primary: var(--scalar-color-blue);\n --callout-info-secondary: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 97%\n );\n --callout-info-font-color: var(--scalar-color-1);\n\n --callout-line-height: 22px;\n}\n\n.t-editor__callout {\n border-radius: var(--scalar-radius);\n margin-top: var(--scalar-block-spacing);\n padding: 10px 14px;\n\n --callout-primary: var(--scalar-border-color);\n --callout-secondary: var(--scalar-background-2);\n --callout-svg: var(--callout-primary);\n\n background: var(--callout-secondary);\n border: var(--scalar-border-width) solid\n color-mix(in srgb, var(--callout-primary), transparent 50%);\n}\n\n.t-editor__callout .callout-content__text {\n font-size: var(--callout-font-size);\n flex: 1 1 0%;\n line-height: var(--callout-line-height);\n}\n\n.t-editor__callout .callout-content__icon {\n position: relative;\n border-radius: var(--scalar-radius);\n width: 18px;\n height: fit-content;\n color: var(--callout-svg);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.t-editor__callout .callout-content__icon svg,\n.t-editor__callout .callout-content__icon img {\n width: 18px;\n height: 18px;\n}\n\n/* vertical align icon to text, don't remove this */\n.t-editor__callout .callout-content__icon:before {\n content: '\\200b';\n line-height: var(--callout-line-height);\n}\n\n/* Apply callout colors */\n.t-editor__callout.callout__neutral {\n --callout-primary: var(--callout-neutral-primary);\n --callout-secondary: var(--callout-neutral-secondary);\n --callout-font-color: var(--callout-neutral-font-color);\n --callout-svg: var(--callout-neutral-font-color);\n}\n\n.t-editor__callout.callout__info {\n --callout-primary: var(--callout-info-primary);\n --callout-secondary: var(--callout-info-secondary);\n --callout-font-color: var(--callout-info-font-color);\n --callout-svg: var(--callout-info-primary);\n}\n\n.t-editor__callout.callout__warning {\n --callout-primary: var(--callout-warning-primary);\n --callout-secondary: var(--callout-warning-secondary);\n --callout-font-color: var(--callout-warning-font-color);\n --callout-svg: var(--callout-warning-primary);\n}\n\n.t-editor__callout.callout__success {\n --callout-primary: var(--callout-success-primary);\n --callout-secondary: var(--callout-success-secondary);\n --callout-font-color: var(--callout-success-font-color);\n --callout-svg: var(--callout-success-primary);\n}\n\n.t-editor__callout.callout__danger {\n --callout-primary: var(--callout-danger-primary);\n --callout-secondary: var(--callout-danger-secondary);\n --callout-font-color: var(--callout-danger-font-color);\n --callout-svg: var(--callout-danger-primary);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useId } from 'vue'\n\nconst { placeholder } = defineProps<{\n placeholder?: string\n}>()\n\nconst emit = defineEmits<{\n (e: 'blur', value: string): void\n}>()\nconst model = defineModel<string>({ required: true })\n\nconst id = useId()\n\nconst handleBlur = () => {\n emit('blur', model.value)\n}\n</script>\n<template>\n <div class=\"group pointer-events-none flex flex-1 items-center gap-1\">\n <label\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"id\" />\n <input\n :id=\"id\"\n v-model=\"model\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative -ml-0.5 h-8 w-full flex-1 rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"placeholder ?? 'Untitled Document'\"\n @blur=\"handleBlur\"\n @keydown.enter=\"($event.target as HTMLInputElement)?.blur()\" />\n </div>\n</template>\n<style scoped>\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useId } from 'vue'\n\nconst { placeholder } = defineProps<{\n placeholder?: string\n}>()\n\nconst emit = defineEmits<{\n (e: 'blur', value: string): void\n}>()\nconst model = defineModel<string>({ required: true })\n\nconst id = useId()\n\nconst handleBlur = () => {\n emit('blur', model.value)\n}\n</script>\n<template>\n <div class=\"group pointer-events-none flex flex-1 items-center gap-1\">\n <label\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"id\" />\n <input\n :id=\"id\"\n v-model=\"model\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative -ml-0.5 h-8 w-full flex-1 rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"placeholder ?? 'Untitled Document'\"\n @blur=\"handleBlur\"\n @keydown.enter=\"($event.target as HTMLInputElement)?.blur()\" />\n </div>\n</template>\n<style scoped>\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n","import { apply, type merge } from '@scalar/json-magic/diff'\nimport { deepClone } from '@scalar/workspace-store/helpers/deep-clone'\nimport * as monaco from 'monaco-editor'\nimport type { ComputedRef } from 'vue'\nimport { type MaybeRefOrGetter, computed, markRaw, ref, shallowRef, toValue, watch } from 'vue'\n\nimport { rangeToWholeLine } from '@/v2/features/editor'\nimport { createJsonModel } from '@/v2/features/editor/helpers/json/create-json-model'\nimport { ensureJsonPointerLinkSupport } from '@/v2/features/editor/helpers/json/json-pointer-links'\nimport { parseJsonPointerPath } from '@/v2/features/editor/helpers/json/json-pointer-path'\nimport type { EditorModel, Path } from '@/v2/features/editor/helpers/model'\n\ntype ConflictResolutionState = 'manual' | 'local' | 'remote' | 'ignore' | 'idle'\n\ntype ConflictRange = { index: number; path: string[]; range: monaco.Range }\n\ntype UseThreeWayMergeEditorOptions = {\n /** Base document (common ancestor). */\n baseDocument: MaybeRefOrGetter<Record<string, unknown>>\n /** Document with resolved conflicts (current result). */\n resolvedDocument: MaybeRefOrGetter<Record<string, unknown>>\n /** Merge conflicts from diff. */\n conflicts: MaybeRefOrGetter<ReturnType<typeof merge>['conflicts']>\n /** Called when user applies resolved changes. */\n onApplyChanges: (resolvedDocument: Record<string, unknown>) => void\n /** Optional: called with error message for conflicts left or parse errors. */\n onError?: (message: string) => void\n}\n\ntype ThreeWayMergeEditorContainers = {\n /** Container for the local (current) diff editor. */\n local: HTMLElement\n /** Container for the remote diff editor. */\n remote: HTMLElement\n /** Container for the result (editable) diff editor. */\n result: HTMLElement\n}\n\n/**\n * Shared state and logic for a 3-way merge editor (base | local | remote → result).\n * Create editors by calling init() with the three container elements (e.g. from refs in onMounted).\n * Call dispose() in onUnmounted.\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * const localRef = ref<HTMLDivElement>()\n * const remoteRef = ref<HTMLDivElement>()\n * const resultRef = ref<HTMLDivElement>()\n *\n * const mergeEditor = useThreeWayMergeEditor({\n * baseDocument,\n * resolvedDocument,\n * conflicts,\n * onApplyChanges: (doc) => emit('applyChanges', { resolvedDocument: doc }),\n * onError: (msg) => toast(msg, 'error'),\n * })\n *\n * onMounted(() => {\n * const local = localRef.value\n * const remote = remoteRef.value\n * const result = resultRef.value\n * if (local && remote && result) {\n * mergeEditor.init({ local, remote, result })\n * }\n * })\n *\n * onUnmounted(() => {\n * mergeEditor.dispose()\n * })\n * </script>\n *\n * <template>\n * <div ref=\"localRef\" />\n * <div ref=\"remoteRef\" />\n * <div ref=\"resultRef\" />\n * <button @click=\"mergeEditor.goToNextConflict\">Next conflict</button>\n * <button :disabled=\"mergeEditor.conflictsLeft > 0\" @click=\"mergeEditor.applyResolvedConflicts\">\n * Apply ({{ mergeEditor.conflictsLeft }} left)\n * </button>\n * </template>\n * ```\n */\nexport function useThreeWayMergeEditor(options: UseThreeWayMergeEditorOptions): {\n init: (containers: ThreeWayMergeEditorContainers) => void\n dispose: () => void\n conflictsLeft: ComputedRef<number>\n goToNextConflict: () => void\n applyResolvedConflicts: () => void\n} {\n const { baseDocument, resolvedDocument, conflicts, onApplyChanges, onError } = options\n\n const resolvedConflicts = ref<ConflictResolutionState[]>([])\n const conflictRangesState = shallowRef<ConflictRange[]>([])\n const localConflictRangesState = shallowRef<ConflictRange[]>([])\n const remoteConflictRangesState = shallowRef<ConflictRange[]>([])\n const lastNavigatedConflictIndex = ref<number>(-1)\n\n const localChangesEditor = shallowRef<monaco.editor.IStandaloneDiffEditor>()\n const remoteChangesEditor = shallowRef<monaco.editor.IStandaloneDiffEditor>()\n const resultEditor = shallowRef<monaco.editor.IStandaloneDiffEditor>()\n\n let resultCodeLensProviderDisposable: monaco.IDisposable | undefined\n let jsonPointerLinkSupportDispose: (() => void) | undefined\n const codeLensCommandDisposables: monaco.IDisposable[] = []\n /** Models created in init(); disposed in dispose() to avoid leaks when the sync conflict modal closes. */\n let modelsToDispose: monaco.editor.ITextModel[] = []\n\n const normalizeConflicts = computed(() => {\n const conflictList = toValue(conflicts)\n return conflictList.map((conflict) => {\n const localChanges = conflict[0]\n const remoteChanges = conflict[1]\n let smallestPath = localChanges[0]!.path\n for (const localChange of localChanges) {\n if (localChange.path.length < smallestPath.length) {\n smallestPath = localChange.path\n }\n }\n for (const remoteChange of remoteChanges) {\n if (remoteChange.path.length < smallestPath.length) {\n smallestPath = remoteChange.path\n }\n }\n return {\n local: {\n path: smallestPath,\n changes: localChanges,\n type: localChanges[0]!.type,\n },\n remote: {\n path: smallestPath,\n changes: remoteChanges,\n type: remoteChanges[0]!.type,\n },\n }\n })\n })\n\n const documentWithLocalChanges = computed(() =>\n apply(\n deepClone(toValue(resolvedDocument)),\n toValue(conflicts).flatMap((it) => it[0]),\n ),\n )\n\n const documentWithRemoteChanges = computed(() =>\n apply(\n deepClone(toValue(resolvedDocument)),\n toValue(conflicts).flatMap((it) => it[1]),\n ),\n )\n\n const conflictsLeft = computed(() => resolvedConflicts.value.filter((status) => status === 'idle').length)\n\n watch(\n normalizeConflicts,\n (nextConflicts) => {\n resolvedConflicts.value = nextConflicts.map((_, index) => resolvedConflicts.value[index] ?? 'idle')\n },\n { immediate: true },\n )\n\n const focusEditorRange = (\n diffEditor: monaco.editor.IStandaloneDiffEditor | undefined,\n range: monaco.Range | undefined,\n ): void => {\n if (!diffEditor || !range) {\n return\n }\n const modifiedEditor = diffEditor.getModifiedEditor()\n const safeRange = new monaco.Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)\n modifiedEditor.setSelection(safeRange)\n modifiedEditor.revealRangeNearTop(safeRange)\n }\n\n const goToNextConflict = (): void => {\n const unresolvedConflictIndexes = normalizeConflicts.value\n .map((_, index) => index)\n .filter((index) => resolvedConflicts.value[index] === 'idle')\n if (!unresolvedConflictIndexes.length) {\n return\n }\n const nextConflictIndex =\n unresolvedConflictIndexes.find((index) => index > lastNavigatedConflictIndex.value) ??\n unresolvedConflictIndexes[0]\n if (nextConflictIndex === undefined) {\n return\n }\n const nextConflict = normalizeConflicts.value[nextConflictIndex]\n if (!nextConflict) {\n return\n }\n const localRange = localConflictRangesState.value.find((cr) => cr.index === nextConflictIndex)?.range\n const remoteRange = remoteConflictRangesState.value.find((cr) => cr.index === nextConflictIndex)?.range\n const resultRange = conflictRangesState.value.find((cr) => cr.index === nextConflictIndex)?.range\n focusEditorRange(localChangesEditor.value, localRange)\n focusEditorRange(remoteChangesEditor.value, remoteRange)\n focusEditorRange(resultEditor.value, resultRange)\n resultEditor.value?.getModifiedEditor().focus()\n lastNavigatedConflictIndex.value = nextConflictIndex\n }\n\n const applyResolvedConflicts = (): void => {\n if (conflictsLeft.value > 0) {\n onError?.('You have conflicts left')\n return\n }\n const modifiedResultModel = resultEditor.value?.getModel()?.modified\n if (!modifiedResultModel) {\n return\n }\n let nextResolvedDocument: Record<string, unknown> | null = null\n try {\n nextResolvedDocument = JSON.parse(modifiedResultModel.getValue()) as Record<string, unknown>\n } catch {\n onError?.('You have formatting errors')\n return\n }\n onApplyChanges(nextResolvedDocument)\n }\n\n const init = (containers: ThreeWayMergeEditorContainers): void => {\n const base = toValue(baseDocument)\n const resolved = toValue(resolvedDocument)\n const localDoc = documentWithLocalChanges.value\n const remoteDoc = documentWithRemoteChanges.value\n\n const originalModelLocal = monaco.editor.createModel(JSON.stringify(resolved, null, 2), 'json')\n const modifiedModelLocal = createJsonModel(JSON.stringify(localDoc, null, 2))\n\n const originalModelRemote = monaco.editor.createModel(JSON.stringify(resolved, null, 2), 'json')\n const modifiedModelRemote = createJsonModel(JSON.stringify(remoteDoc, null, 2))\n\n const originalResultModel = monaco.editor.createModel(JSON.stringify(base, null, 2), 'json')\n const modifiedResultModel = createJsonModel(JSON.stringify(resolved, null, 2))\n\n modelsToDispose = [\n originalModelLocal,\n modifiedModelLocal.model,\n originalModelRemote,\n modifiedModelRemote.model,\n originalResultModel,\n modifiedResultModel.model,\n ]\n\n const localDiffEditor = monaco.editor.createDiffEditor(containers.local, {\n originalEditable: false,\n readOnly: true,\n automaticLayout: true,\n renderSideBySide: false,\n })\n localDiffEditor.setModel({\n original: originalModelLocal,\n modified: modifiedModelLocal.model,\n })\n localChangesEditor.value = localDiffEditor\n\n const remoteDiffEditor = monaco.editor.createDiffEditor(containers.remote, {\n originalEditable: false,\n readOnly: true,\n automaticLayout: true,\n renderSideBySide: false,\n })\n remoteDiffEditor.setModel({\n original: originalModelRemote,\n modified: modifiedModelRemote.model,\n })\n remoteChangesEditor.value = remoteDiffEditor\n\n const resultDiffEditor = monaco.editor.createDiffEditor(containers.result, {\n originalEditable: false,\n readOnly: false,\n renderSideBySide: false,\n automaticLayout: true,\n })\n resultDiffEditor.setModel({\n original: originalResultModel,\n modified: modifiedResultModel.model,\n })\n const resultModifiedEditor = resultDiffEditor.getModifiedEditor()\n resultModifiedEditor.updateOptions({ codeLens: true })\n\n const focusResultPath = async (path: Path): Promise<void> => {\n const range = await modifiedResultModel.getRangeFromPath(path)\n if (!range) {\n return\n }\n const safeRange = new monaco.Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)\n resultModifiedEditor.setSelection(safeRange)\n resultModifiedEditor.revealRangeNearTop(safeRange)\n }\n\n const navigateJsonPointer = async (pointer: string): Promise<void> => {\n const path = parseJsonPointerPath(pointer)\n if (!path) {\n return\n }\n await focusResultPath(path)\n }\n\n const linkSupport = ensureJsonPointerLinkSupport(navigateJsonPointer)\n jsonPointerLinkSupportDispose = linkSupport.dispose\n\n let resultHighlightDecorations: string[] = []\n let suppressedChangeEvents = 0\n\n const applyCurrentCodeLensCommandId = 'scalar.conflict.applyCurrent'\n const applyRemoteCodeLensCommandId = 'scalar.conflict.applyRemote'\n const ignoreCodeLensCommandId = 'scalar.conflict.ignore'\n const noOpCodeLensCommandId = resultModifiedEditor.addCommand(0, () => undefined) ?? 'scalar.conflict.status.noop'\n\n const getBoxDecorationsForRange = (range: monaco.Range): monaco.editor.IModelDeltaDecoration[] => {\n const startLine = range.startLineNumber\n const endLine = range.endLineNumber\n if (startLine === endLine) {\n return [\n {\n range,\n options: {\n isWholeLine: true,\n className: 'json-focus-highlight-box-single',\n },\n },\n ]\n }\n const topRange = new monaco.Range(startLine, 1, startLine, range.endColumn)\n const middleRange = new monaco.Range(startLine + 1, 1, Math.max(startLine + 1, endLine - 1), 1)\n const bottomRange = new monaco.Range(endLine, 1, endLine, range.endColumn)\n const decorations: monaco.editor.IModelDeltaDecoration[] = [\n {\n range: topRange,\n options: {\n isWholeLine: true,\n className: 'json-focus-highlight-box-top',\n },\n },\n {\n range: bottomRange,\n options: {\n isWholeLine: true,\n className: 'json-focus-highlight-box-bottom',\n },\n },\n ]\n if (endLine - startLine > 1) {\n decorations.push({\n range: middleRange,\n options: {\n isWholeLine: true,\n className: 'json-focus-highlight-box-middle',\n },\n })\n }\n return decorations\n }\n\n const refreshCodeLensProvider = (): void => {\n resultCodeLensProviderDisposable?.dispose()\n resultCodeLensProviderDisposable = monaco.languages.registerCodeLensProvider('json', {\n provideCodeLenses: (model) => {\n if (model.uri.toString() !== modifiedResultModel.model.uri.toString()) {\n return { lenses: [], dispose: () => undefined }\n }\n return {\n lenses: conflictRangesState.value.flatMap((conflictRange) => {\n const lensRange = new monaco.Range(\n conflictRange.range.startLineNumber,\n 1,\n conflictRange.range.startLineNumber,\n 1,\n )\n return [\n {\n range: lensRange,\n command: {\n id: noOpCodeLensCommandId,\n title: `Status: ${resolvedConflicts.value[conflictRange.index] ?? 'idle'}`,\n },\n },\n {\n range: lensRange,\n command: {\n id: applyCurrentCodeLensCommandId,\n title: 'Accept Current',\n arguments: [conflictRange.index],\n },\n },\n {\n range: lensRange,\n command: {\n id: applyRemoteCodeLensCommandId,\n title: 'Accept Remote',\n arguments: [conflictRange.index],\n },\n },\n {\n range: lensRange,\n command: {\n id: ignoreCodeLensCommandId,\n title: 'Ignore',\n arguments: [conflictRange.index],\n },\n },\n ]\n }),\n dispose: () => undefined,\n }\n },\n })\n }\n\n const getConflictRange = async (\n editorModel: EditorModel,\n index: number,\n path: string[],\n ): Promise<ConflictRange> => {\n const { model } = editorModel\n const fallbackRange = new monaco.Range(1, 1, 1, model.getLineMaxColumn(1))\n let range: monaco.Range | null = null\n for (let depth = path.length; depth >= 0; depth -= 1) {\n const candidatePath = path.slice(0, depth)\n const nodeRange = await editorModel.getRangeFromPath(candidatePath)\n if (!nodeRange) {\n continue\n }\n range = rangeToWholeLine(model, nodeRange)\n break\n }\n return {\n index,\n path,\n range: markRaw(range ?? fallbackRange),\n }\n }\n\n const refreshConflictRangesAndDecorations = async (): Promise<void> => {\n const [resultRanges, localRanges, remoteRanges] = await Promise.all([\n Promise.all(\n normalizeConflicts.value.map((conflict, index) =>\n getConflictRange(modifiedResultModel, index, conflict.local.path),\n ),\n ),\n Promise.all(\n normalizeConflicts.value.map((conflict, index) =>\n getConflictRange(modifiedModelLocal, index, conflict.local.path),\n ),\n ),\n Promise.all(\n normalizeConflicts.value.map((conflict, index) =>\n getConflictRange(modifiedModelRemote, index, conflict.local.path),\n ),\n ),\n ])\n conflictRangesState.value = resultRanges.filter((r): r is ConflictRange => Boolean(r))\n localConflictRangesState.value = localRanges.filter((r): r is ConflictRange => Boolean(r))\n remoteConflictRangesState.value = remoteRanges.filter((r): r is ConflictRange => Boolean(r))\n resultHighlightDecorations = resultModifiedEditor.deltaDecorations(\n resultHighlightDecorations,\n conflictRangesState.value.flatMap((cr) => getBoxDecorationsForRange(cr.range)),\n )\n refreshCodeLensProvider()\n }\n\n const setConflictResolution = (index: number, resolution: ConflictResolutionState): void => {\n resolvedConflicts.value[index] = resolution\n refreshCodeLensProvider()\n }\n\n const applyConflictChoice = async (index: number, source: 'local' | 'remote'): Promise<void> => {\n const conflict = normalizeConflicts.value[index]\n if (!conflict) {\n return\n }\n let currentDocument: Record<string, unknown> | null = null\n try {\n currentDocument = JSON.parse(modifiedResultModel.model.getValue()) as Record<string, unknown>\n } catch {\n return\n }\n const changes = source === 'local' ? conflict.local.changes : conflict.remote.changes\n const nextDocument = apply(deepClone(currentDocument), changes)\n suppressedChangeEvents += 1\n modifiedResultModel.model.setValue(JSON.stringify(nextDocument, null, 2))\n setConflictResolution(index, source)\n await refreshConflictRangesAndDecorations()\n }\n\n codeLensCommandDisposables.push(\n monaco.editor.registerCommand(applyCurrentCodeLensCommandId, (_accessor, index: number) => {\n void applyConflictChoice(index, 'local')\n }),\n )\n codeLensCommandDisposables.push(\n monaco.editor.registerCommand(applyRemoteCodeLensCommandId, (_accessor, index: number) => {\n void applyConflictChoice(index, 'remote')\n }),\n )\n codeLensCommandDisposables.push(\n monaco.editor.registerCommand(ignoreCodeLensCommandId, (_accessor, index: number) => {\n setConflictResolution(index, 'ignore')\n }),\n )\n\n void refreshConflictRangesAndDecorations()\n\n resultModifiedEditor.onDidChangeModelContent((event) => {\n if (suppressedChangeEvents > 0) {\n suppressedChangeEvents -= 1\n return\n }\n let hasStatusUpdates = false\n for (const change of event.changes) {\n const matchingConflicts = conflictRangesState.value.filter((cr) =>\n monaco.Range.areIntersectingOrTouching(change.range, cr.range),\n )\n if (!matchingConflicts.length) {\n continue\n }\n matchingConflicts.forEach((conflict) => {\n if (resolvedConflicts.value[conflict.index] !== 'manual') {\n resolvedConflicts.value[conflict.index] = 'manual'\n hasStatusUpdates = true\n }\n })\n }\n if (hasStatusUpdates) {\n refreshCodeLensProvider()\n }\n })\n\n resultEditor.value = resultDiffEditor\n }\n\n const dispose = (): void => {\n localChangesEditor.value?.dispose()\n localChangesEditor.value = undefined\n remoteChangesEditor.value?.dispose()\n remoteChangesEditor.value = undefined\n resultEditor.value?.dispose()\n resultEditor.value = undefined\n\n for (const model of modelsToDispose) {\n model.dispose()\n }\n modelsToDispose = []\n\n resultCodeLensProviderDisposable?.dispose()\n resultCodeLensProviderDisposable = undefined\n jsonPointerLinkSupportDispose?.()\n jsonPointerLinkSupportDispose = undefined\n codeLensCommandDisposables.forEach((d) => d.dispose())\n codeLensCommandDisposables.length = 0\n }\n\n return {\n init,\n dispose,\n conflictsLeft,\n goToNextConflict,\n applyResolvedConflicts,\n }\n}\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { type merge } from '@scalar/json-magic/diff'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport { useSplitResize } from '@/v2/components/resize'\nimport { useThreeWayMergeEditor } from '@/v2/features/editor/hooks/use-three-way-merge-editor'\n\nconst { conflicts, baseDocument, resolvedDocument } = defineProps<{\n conflicts: ReturnType<typeof merge>['conflicts']\n baseDocument: Record<string, unknown>\n resolvedDocument: Record<string, unknown>\n}>()\n\nconst emit = defineEmits<{\n applyChanges: [\n payload: {\n resolvedDocument: Record<string, unknown>\n },\n ]\n}>()\n\nconst { toast } = useToasts()\n\nconst splitContainerRef = ref<HTMLDivElement>()\nconst topEditorsRowRef = ref<HTMLDivElement>()\nconst topPaneSize = ref(50)\nconst leftPaneSize = ref(50)\n\nconst { onHorizontalResizeStart, onVerticalResizeStart, stopActiveResize } =\n useSplitResize({\n horizontalContainerRef: topEditorsRowRef,\n verticalContainerRef: splitContainerRef,\n leftPaneSize,\n topPaneSize,\n horizontalMin: 20,\n horizontalMax: 80,\n verticalMin: 25,\n verticalMax: 75,\n })\n\nconst mergeEditor = useThreeWayMergeEditor({\n baseDocument,\n resolvedDocument,\n conflicts,\n onApplyChanges: (resolvedDoc) =>\n emit('applyChanges', { resolvedDocument: resolvedDoc }),\n onError: (message) => toast(message, 'error'),\n})\n\nconst conflictsLeft = computed(() => mergeEditor.conflictsLeft.value)\n\nconst topPaneStyle = computed(() => ({ height: `${topPaneSize.value}%` }))\nconst leftPaneStyle = computed(() => ({ width: `${leftPaneSize.value}%` }))\nconst rightPaneStyle = computed(() => ({\n width: `${100 - leftPaneSize.value}%`,\n}))\n\nconst localChangesEditorRef = ref<HTMLDivElement>()\nconst remoteChangesEditorRef = ref<HTMLDivElement>()\nconst resultEditorRef = ref<HTMLDivElement>()\n\nonMounted(() => {\n const localEl = localChangesEditorRef.value\n const remoteEl = remoteChangesEditorRef.value\n const resultEl = resultEditorRef.value\n if (localEl && remoteEl && resultEl) {\n mergeEditor.init({\n local: localEl,\n remote: remoteEl,\n result: resultEl,\n })\n }\n})\n\nonUnmounted(() => {\n stopActiveResize()\n mergeEditor.dispose()\n})\n</script>\n\n<template>\n <p class=\"text-c-2 text-xs\">\n Resolve conflicts inline in the full document editor. Use the buttons inside\n the editor for each conflict.\n </p>\n\n <div\n ref=\"splitContainerRef\"\n class=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <div\n ref=\"topEditorsRowRef\"\n class=\"flex min-h-0 gap-1 p-1\"\n :style=\"topPaneStyle\">\n <div\n class=\"sync-editor-pane border-c-3 flex min-h-0 flex-col overflow-hidden rounded-lg border\"\n :style=\"leftPaneStyle\">\n <div\n class=\"sync-pane-title text-c-2 border-c-3 shrink-0 border-b px-2 py-1 text-[11px]\">\n Current\n </div>\n <div\n ref=\"localChangesEditorRef\"\n class=\"min-h-0 flex-1\"></div>\n </div>\n\n <button\n aria-label=\"Resize current and remote editors\"\n class=\"resize-handle resize-handle-col\"\n type=\"button\"\n @pointerdown=\"onHorizontalResizeStart\" />\n\n <div\n class=\"sync-editor-pane border-c-3 flex min-h-0 flex-col overflow-hidden rounded-lg border\"\n :style=\"rightPaneStyle\">\n <div\n class=\"sync-pane-title text-c-2 border-c-3 shrink-0 border-b px-2 py-1 text-[11px]\">\n Remote\n </div>\n <div\n ref=\"remoteChangesEditorRef\"\n class=\"min-h-0 flex-1\"></div>\n </div>\n </div>\n\n <button\n aria-label=\"Resize top and result editors\"\n class=\"resize-handle resize-handle-row\"\n type=\"button\"\n @pointerdown=\"onVerticalResizeStart\" />\n\n <div\n class=\"sync-editor-pane border-c-3 mx-1 mb-1 flex min-h-0 flex-1 flex-col overflow-hidden rounded-lg border\">\n <div\n class=\"sync-pane-title text-c-2 border-c-3 flex shrink-0 items-center justify-between border-b px-2 py-1 text-[11px]\">\n <span> Result </span>\n <div class=\"flex items-center gap-2\">\n <span class=\"text-c-2 text-[11px] normal-case\">\n {{ conflictsLeft }} conflict{{ conflictsLeft === 1 ? '' : 's' }}\n left\n </span>\n <ScalarButton\n :disabled=\"conflictsLeft === 0\"\n size=\"xs\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"mergeEditor.goToNextConflict\">\n Next Conflict\n </ScalarButton>\n </div>\n </div>\n <div\n ref=\"resultEditorRef\"\n class=\"min-h-0 flex-1\"></div>\n </div>\n\n <div class=\"flex shrink-0 items-center justify-end gap-2\">\n <ScalarButton\n :disabled=\"conflictsLeft > 0\"\n size=\"xs\"\n type=\"button\"\n @click=\"mergeEditor.applyResolvedConflicts\">\n Apply changes\n </ScalarButton>\n </div>\n </div>\n</template>\n<style scoped>\n.editor-container {\n width: 100%;\n height: 100%;\n}\n\n.sync-layout-root {\n background: color-mix(\n in srgb,\n var(--scalar-color-background-1, #1e1e1e) 96%,\n transparent\n );\n}\n\n.sync-editor-pane {\n background: color-mix(\n in srgb,\n var(--scalar-color-background-1, #1e1e1e) 95%,\n transparent\n );\n}\n\n.sync-pane-title {\n letter-spacing: 0.03em;\n text-transform: uppercase;\n font-weight: 600;\n background: color-mix(\n in srgb,\n var(--scalar-color-background-2, #2d2d30) 85%,\n transparent\n );\n}\n\n.resize-handle {\n position: relative;\n display: block;\n flex-shrink: 0;\n border: none;\n border-radius: 999px;\n background: transparent;\n transition:\n background-color 0.12s ease,\n box-shadow 0.12s ease;\n}\n\n.resize-handle::before {\n content: '';\n position: absolute;\n border-radius: 999px;\n opacity: 1;\n transition:\n background-color 0.12s ease,\n transform 0.12s ease;\n}\n\n.resize-handle:hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-accent, #007acc) 12%,\n transparent\n );\n}\n\n.resize-handle:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-accent, #007acc) 18%,\n transparent\n );\n}\n\n.resize-handle:focus-visible {\n outline: none;\n box-shadow: 0 0 0 1px\n color-mix(in srgb, var(--scalar-color-accent, #007acc) 70%, transparent);\n}\n\n.resize-handle-col {\n width: 8px;\n min-height: 44px;\n margin: 2px 0;\n cursor: col-resize;\n}\n\n.resize-handle-col::before {\n top: 50%;\n left: 50%;\n width: 1px;\n height: calc(100% - 8px);\n transform: translate(-50%, -50%);\n background: color-mix(\n in srgb,\n var(--scalar-color-border, #3c3c3c) 85%,\n transparent\n );\n}\n\n.resize-handle-row {\n height: 8px;\n margin: 0 4px;\n cursor: row-resize;\n}\n\n.resize-handle-row::before {\n top: 50%;\n left: 50%;\n width: calc(100% - 8px);\n height: 1px;\n transform: translate(-50%, -50%);\n background: color-mix(\n in srgb,\n var(--scalar-color-border, #3c3c3c) 85%,\n transparent\n );\n}\n\n.resize-handle-col:hover::before,\n.resize-handle-col:active::before,\n.resize-handle-row:hover::before,\n.resize-handle-row:active::before {\n background: color-mix(\n in srgb,\n var(--scalar-color-accent, #007acc) 78%,\n transparent\n );\n}\n\n:deep(.json-path-highlight) {\n background-color: rgba(255, 200, 0, 0.35);\n border-radius: 4px;\n}\n\n:deep(.json-focus-highlight-box-single) {\n border: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-sizing: border-box;\n}\n\n:deep(.json-focus-highlight-box-top) {\n border-top: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-left: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-right: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-sizing: border-box;\n}\n\n:deep(.json-focus-highlight-box-middle) {\n border-left: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-right: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-sizing: border-box;\n}\n\n:deep(.json-focus-highlight-box-bottom) {\n border-bottom: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-left: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-right: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, #fde047 35%, transparent);\n box-sizing: border-box;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { type merge } from '@scalar/json-magic/diff'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport { useSplitResize } from '@/v2/components/resize'\nimport { useThreeWayMergeEditor } from '@/v2/features/editor/hooks/use-three-way-merge-editor'\n\nconst { conflicts, baseDocument, resolvedDocument } = defineProps<{\n conflicts: ReturnType<typeof merge>['conflicts']\n baseDocument: Record<string, unknown>\n resolvedDocument: Record<string, unknown>\n}>()\n\nconst emit = defineEmits<{\n applyChanges: [\n payload: {\n resolvedDocument: Record<string, unknown>\n },\n ]\n}>()\n\nconst { toast } = useToasts()\n\nconst splitContainerRef = ref<HTMLDivElement>()\nconst topEditorsRowRef = ref<HTMLDivElement>()\nconst topPaneSize = ref(50)\nconst leftPaneSize = ref(50)\n\nconst { onHorizontalResizeStart, onVerticalResizeStart, stopActiveResize } =\n useSplitResize({\n horizontalContainerRef: topEditorsRowRef,\n verticalContainerRef: splitContainerRef,\n leftPaneSize,\n topPaneSize,\n horizontalMin: 20,\n horizontalMax: 80,\n verticalMin: 25,\n verticalMax: 75,\n })\n\nconst mergeEditor = useThreeWayMergeEditor({\n baseDocument,\n resolvedDocument,\n conflicts,\n onApplyChanges: (resolvedDoc) =>\n emit('applyChanges', { resolvedDocument: resolvedDoc }),\n onError: (message) => toast(message, 'error'),\n})\n\nconst conflictsLeft = computed(() => mergeEditor.conflictsLeft.value)\n\nconst topPaneStyle = computed(() => ({ height: `${topPaneSize.value}%` }))\nconst leftPaneStyle = computed(() => ({ width: `${leftPaneSize.value}%` }))\nconst rightPaneStyle = computed(() => ({\n width: `${100 - leftPaneSize.value}%`,\n}))\n\nconst localChangesEditorRef = ref<HTMLDivElement>()\nconst remoteChangesEditorRef = ref<HTMLDivElement>()\nconst resultEditorRef = ref<HTMLDivElement>()\n\nonMounted(() => {\n const localEl = localChangesEditorRef.value\n const remoteEl = remoteChangesEditorRef.value\n const resultEl = resultEditorRef.value\n if (localEl && remoteEl && resultEl) {\n mergeEditor.init({\n local: localEl,\n remote: remoteEl,\n result: resultEl,\n })\n }\n})\n\nonUnmounted(() => {\n stopActiveResize()\n mergeEditor.dispose()\n})\n</script>\n\n<template>\n <p class=\"text-c-2 text-xs\">\n Resolve conflicts inline in the full document editor. Use the buttons inside\n the editor for each conflict.\n </p>\n\n <div\n ref=\"splitContainerRef\"\n class=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <div\n ref=\"topEditorsRowRef\"\n class=\"flex min-h-0 gap-1 p-1\"\n :style=\"topPaneStyle\">\n <div\n class=\"sync-editor-pane border-c-3 flex min-h-0 flex-col overflow-hidden rounded-lg border\"\n :style=\"leftPaneStyle\">\n <div\n class=\"sync-pane-title text-c-2 border-c-3 shrink-0 border-b px-2 py-1 text-[11px]\">\n Current\n </div>\n <div\n ref=\"localChangesEditorRef\"\n class=\"min-h-0 flex-1\"></div>\n </div>\n\n <button\n aria-label=\"Resize current and remote editors\"\n class=\"resize-handle resize-handle-col\"\n type=\"button\"\n @pointerdown=\"onHorizontalResizeStart\" />\n\n <div\n class=\"sync-editor-pane border-c-3 flex min-h-0 flex-col overflow-hidden rounded-lg border\"\n :style=\"rightPaneStyle\">\n <div\n class=\"sync-pane-title text-c-2 border-c-3 shrink-0 border-b px-2 py-1 text-[11px]\">\n Remote\n </div>\n <div\n ref=\"remoteChangesEditorRef\"\n class=\"min-h-0 flex-1\"></div>\n </div>\n </div>\n\n <button\n aria-label=\"Resize top and result editors\"\n class=\"resize-handle resize-handle-row\"\n type=\"button\"\n @pointerdown=\"onVerticalResizeStart\" />\n\n <div\n class=\"sync-editor-pane border-c-3 mx-1 mb-1 flex min-h-0 flex-1 flex-col overflow-hidden rounded-lg border\">\n <div\n class=\"sync-pane-title text-c-2 border-c-3 flex shrink-0 items-center justify-between border-b px-2 py-1 text-[11px]\">\n <span> Result </span>\n <div class=\"flex items-center gap-2\">\n <span class=\"text-c-2 text-[11px] normal-case\">\n {{ conflictsLeft }} conflict{{ conflictsLeft === 1 ? '' : 's' }}\n left\n </span>\n <ScalarButton\n :disabled=\"conflictsLeft === 0\"\n size=\"xs\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"mergeEditor.goToNextConflict\">\n Next Conflict\n </ScalarButton>\n </div>\n </div>\n <div\n ref=\"resultEditorRef\"\n class=\"min-h-0 flex-1\"></div>\n </div>\n\n <div class=\"flex shrink-0 items-center justify-end gap-2\">\n <ScalarButton\n :disabled=\"conflictsLeft > 0\"\n size=\"xs\"\n type=\"button\"\n @click=\"mergeEditor.applyResolvedConflicts\">\n Apply changes\n </ScalarButton>\n </div>\n </div>\n</template>\n<style scoped>\n.editor-container {\n width: 100%;\n height: 100%;\n}\n\n.sync-layout-root {\n background: color-mix(\n in srgb,\n var(--scalar-color-background-1, #1e1e1e) 96%,\n transparent\n );\n}\n\n.sync-editor-pane {\n background: color-mix(\n in srgb,\n var(--scalar-color-background-1, #1e1e1e) 95%,\n transparent\n );\n}\n\n.sync-pane-title {\n letter-spacing: 0.03em;\n text-transform: uppercase;\n font-weight: 600;\n background: color-mix(\n in srgb,\n var(--scalar-color-background-2, #2d2d30) 85%,\n transparent\n );\n}\n\n.resize-handle {\n position: relative;\n display: block;\n flex-shrink: 0;\n border: none;\n border-radius: 999px;\n background: transparent;\n transition:\n background-color 0.12s ease,\n box-shadow 0.12s ease;\n}\n\n.resize-handle::before {\n content: '';\n position: absolute;\n border-radius: 999px;\n opacity: 1;\n transition:\n background-color 0.12s ease,\n transform 0.12s ease;\n}\n\n.resize-handle:hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-accent, #007acc) 12%,\n transparent\n );\n}\n\n.resize-handle:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-accent, #007acc) 18%,\n transparent\n );\n}\n\n.resize-handle:focus-visible {\n outline: none;\n box-shadow: 0 0 0 1px\n color-mix(in srgb, var(--scalar-color-accent, #007acc) 70%, transparent);\n}\n\n.resize-handle-col {\n width: 8px;\n min-height: 44px;\n margin: 2px 0;\n cursor: col-resize;\n}\n\n.resize-handle-col::before {\n top: 50%;\n left: 50%;\n width: 1px;\n height: calc(100% - 8px);\n transform: translate(-50%, -50%);\n background: color-mix(\n in srgb,\n var(--scalar-color-border, #3c3c3c) 85%,\n transparent\n );\n}\n\n.resize-handle-row {\n height: 8px;\n margin: 0 4px;\n cursor: row-resize;\n}\n\n.resize-handle-row::before {\n top: 50%;\n left: 50%;\n width: calc(100% - 8px);\n height: 1px;\n transform: translate(-50%, -50%);\n background: color-mix(\n in srgb,\n var(--scalar-color-border, #3c3c3c) 85%,\n transparent\n );\n}\n\n.resize-handle-col:hover::before,\n.resize-handle-col:active::before,\n.resize-handle-row:hover::before,\n.resize-handle-row:active::before {\n background: color-mix(\n in srgb,\n var(--scalar-color-accent, #007acc) 78%,\n transparent\n );\n}\n\n:deep(.json-path-highlight) {\n background-color: rgba(255, 200, 0, 0.35);\n border-radius: 4px;\n}\n\n:deep(.json-focus-highlight-box-single) {\n border: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-sizing: border-box;\n}\n\n:deep(.json-focus-highlight-box-top) {\n border-top: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-left: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-right: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-sizing: border-box;\n}\n\n:deep(.json-focus-highlight-box-middle) {\n border-left: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-right: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-sizing: border-box;\n}\n\n:deep(.json-focus-highlight-box-bottom) {\n border-bottom: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-left: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n border-right: 2px solid color-mix(in srgb, #facc15 90%, #eab308 10%);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, #fde047 35%, transparent);\n box-sizing: border-box;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { capitalize, computed } from 'vue'\nimport { RouterLink } from 'vue-router'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\n\nconst { type } = defineProps<{\n type: CollectionProps['collectionType']\n}>()\n\n/** Different routes for workspace vs document */\nconst routes = computed(() => {\n if (type === 'workspace') {\n return ['environment', 'cookies', 'settings']\n }\n\n if (type === 'operation') {\n return ['overview', 'servers', 'authentication', 'editor']\n }\n\n return [\n 'overview',\n 'servers',\n 'authentication',\n 'environment',\n 'cookies',\n 'settings',\n ]\n})\n</script>\n\n<template>\n <div class=\"flex w-full gap-2 border-b pl-1.5 md:ml-1.5 md:pl-0\">\n <RouterLink\n v-for=\"route in routes\"\n :key=\"route\"\n v-slot=\"{ isActive, href, navigate }\"\n custom\n :to=\"{ name: `${type}.${route}` }\">\n <a\n class=\"-ml-2 flex h-10 cursor-pointer items-center px-2 text-center text-sm font-medium whitespace-nowrap no-underline -outline-offset-1 has-[:focus-visible]:outline\"\n :href=\"href\"\n @click=\"navigate\">\n <span\n class=\"flex-center hover:text-c-1 h-full border-b\"\n :class=\"\n isActive\n ? 'text-c-1 border-c-1'\n : 'text-c-2 hover:text-c-1 border-transparent'\n \">\n {{ capitalize(route) }}\n </span>\n </a>\n </RouterLink>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { capitalize, computed } from 'vue'\nimport { RouterLink } from 'vue-router'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\n\nconst { type } = defineProps<{\n type: CollectionProps['collectionType']\n}>()\n\n/** Different routes for workspace vs document */\nconst routes = computed(() => {\n if (type === 'workspace') {\n return ['environment', 'cookies', 'settings']\n }\n\n if (type === 'operation') {\n return ['overview', 'servers', 'authentication', 'editor']\n }\n\n return [\n 'overview',\n 'servers',\n 'authentication',\n 'environment',\n 'cookies',\n 'settings',\n ]\n})\n</script>\n\n<template>\n <div class=\"flex w-full gap-2 border-b pl-1.5 md:ml-1.5 md:pl-0\">\n <RouterLink\n v-for=\"route in routes\"\n :key=\"route\"\n v-slot=\"{ isActive, href, navigate }\"\n custom\n :to=\"{ name: `${type}.${route}` }\">\n <a\n class=\"-ml-2 flex h-10 cursor-pointer items-center px-2 text-center text-sm font-medium whitespace-nowrap no-underline -outline-offset-1 has-[:focus-visible]:outline\"\n :href=\"href\"\n @click=\"navigate\">\n <span\n class=\"flex-center hover:text-c-1 h-full border-b\"\n :class=\"\n isActive\n ? 'text-c-1 border-c-1'\n : 'text-c-2 hover:text-c-1 border-transparent'\n \">\n {{ capitalize(route) }}\n </span>\n </a>\n </RouterLink>\n </div>\n</template>\n","<script lang=\"ts\">\n/**\n * Document Collection Page\n *\n * Displays primary document editing and viewing interface, enabling users to:\n * - Choose a document icon\n * - Edit the document title\n * - Navigate among Overview, Servers, Authentication, Environment, Cookies, and Settings tabs\n */\nexport default {\n name: 'DocumentCollection',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarButton, ScalarModal, useModal } from '@scalar/components'\nimport {\n ScalarIconCloudArrowDown,\n ScalarIconFloppyDisk,\n ScalarIconSpinner,\n ScalarIconWarning,\n} from '@scalar/icons'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport { apply, type Difference, type merge } from '@scalar/json-magic/diff'\nimport { useToasts } from '@scalar/use-toasts'\nimport { deepClone } from '@scalar/workspace-store/helpers/deep-clone'\nimport { computed, ref } from 'vue'\nimport { RouterView } from 'vue-router'\n\nimport IconSelector from '@/components/IconSelector.vue'\nimport Callout from '@/v2/components/callout/Callout.vue'\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\n\nimport LabelInput from './components/LabelInput.vue'\nimport SyncConflictResolutionEditor from './components/SyncConflictResolutionEditor.vue'\nimport Tabs from './components/Tabs.vue'\n\nconst props = defineProps<RouteProps>()\n\n/** Snag the title from the info object */\nconst title = computed(() => props.document?.info?.title ?? '')\n\n/** Default to the folder icon */\nconst icon = computed(\n () => props.document?.['x-scalar-icon'] || 'interface-content-folder',\n)\n\nconst syncModal = useModal()\nconst dirtyBeforeSyncModal = useModal()\n\nconst isDocumentDirty = computed(\n () => props.document?.['x-scalar-is-dirty'] === true,\n)\n\nconst documentSourceUrl = computed(\n () => props.document?.['x-scalar-original-source-url'] as string | undefined,\n)\n\nconst documentRegistryMeta = computed(\n () =>\n props.document?.['x-scalar-registry-meta'] as\n | { namespace: string; slug: string }\n | undefined,\n)\n\n/** Show Sync when the document has a source URL or registry meta (registry can be used if fetchRegistryDocument is set). */\nconst canShowSyncButton = computed(\n () =>\n documentSourceUrl.value !== undefined ||\n documentRegistryMeta.value !== undefined,\n)\n\nconst { toast } = useToasts()\n\nconst undoChanges = () => {\n props.workspaceStore.revertDocumentChanges(props.documentSlug)\n}\n\nconst saveChanges = () => {\n props.workspaceStore.saveDocument(props.documentSlug)\n}\n\nconst handleSaveThenCloseDirtyModal = async () => {\n await props.workspaceStore.saveDocument(props.documentSlug)\n dirtyBeforeSyncModal.hide()\n await handleSyncFlow()\n}\n\nconst handleDiscardThenCloseDirtyModal = async () => {\n await props.workspaceStore.revertDocumentChanges(props.documentSlug)\n dirtyBeforeSyncModal.hide()\n await handleSyncFlow()\n}\n\nconst isSyncInProgress = ref(false)\n\nconst rebaseResult = ref<{\n originalDocument: Record<string, unknown>\n resolvedDocument: Record<string, unknown>\n conflicts: ReturnType<typeof merge>['conflicts']\n applyChanges: (\n applyChangesInput:\n | {\n resolvedConflicts: Difference<unknown>[]\n }\n | {\n resolvedDocument: Record<string, unknown>\n },\n ) => Promise<void>\n} | null>(null)\n\n/**\n * Resolves the source for syncing. Registry meta has priority over x-scalar-original-source-url\n * when fetchRegistryDocument is provided. Returns either a URL or the full document object.\n */\nconst resolveSyncInput = async (): Promise<\n { url: string } | { document: Record<string, unknown> } | null\n> => {\n const registryMeta = documentRegistryMeta.value\n if (registryMeta && props.fetchRegistryDocument) {\n try {\n const result = await props.fetchRegistryDocument(registryMeta)\n if (!result.ok) {\n toast(result.error, 'error')\n return null\n }\n return { document: result.data }\n } catch (err) {\n toast('Failed to resolve document from registry', 'error')\n return null\n }\n }\n const url = documentSourceUrl.value\n if (url) {\n return { url }\n }\n return null\n}\n\n/**\n * Handles actions to perform when synchronization is complete.\n * Hides the sync modal, resets the sync progress flag, and emits the\n * 'hooks:on:rebase:document:complete' event with document metadata.\n */\nconst onSyncComplete = () => {\n syncModal.hide()\n isSyncInProgress.value = false\n // Display the toast to show that the sync is complete\n toast(\n 'Your document has been rebased with the latest version from the source.',\n 'info',\n )\n // Emit the event to notify other components that the sync is complete\n props.eventBus.emit('hooks:on:rebase:document:complete', {\n meta: {\n documentName: props.documentSlug,\n },\n })\n}\n\n/**\n * Handles errors that occur during synchronization.\n * If an error string is provided, it displays the error via toast.\n * Always resets the sync progress flag.\n */\nconst onSyncError = (error: string | null) => {\n if (error !== null) {\n toast(error, 'error')\n }\n isSyncInProgress.value = false\n}\n\n/**\n * Handles the synchronization flow for a document.\n * Checks for unsaved changes, resolves source (registry over URL),\n * initiates rebasing, handles conflicts, and emits completion events.\n * If conflicts are detected, a modal dialog is shown for user resolution.\n */\nconst handleSyncFlow = async () => {\n if (isDocumentDirty.value) {\n dirtyBeforeSyncModal.show()\n return\n }\n\n if (isSyncInProgress.value) {\n return\n }\n\n isSyncInProgress.value = true\n\n const input = await resolveSyncInput()\n if (!input) {\n onSyncError(null)\n return\n }\n\n const result = await props.workspaceStore.rebaseDocument({\n name: props.documentSlug,\n ...input,\n })\n\n if (result?.ok) {\n const originalDocument =\n props.workspaceStore.getOriginalDocument(props.documentSlug) ?? {}\n rebaseResult.value = {\n conflicts: result.conflicts,\n applyChanges: result.applyChanges,\n resolvedDocument: apply(deepClone(originalDocument), result.changes),\n originalDocument,\n }\n\n if (rebaseResult.value.conflicts.length > 0) {\n syncModal.show()\n } else {\n // If there is no conflict just rebase immediately\n await rebaseResult.value?.applyChanges({\n resolvedDocument: rebaseResult.value.resolvedDocument,\n })\n onSyncComplete()\n }\n } else if (result?.ok === false && result.type === 'NO_CHANGES_DETECTED') {\n // Emit the event either way even if there was no need to rebase the document\n onSyncComplete()\n } else {\n onSyncError('Failed to sync document')\n }\n}\n\n/*\n * Handles applying changes to the current document after conflict resolution.\n * Emits a completion event and hides the sync modal dialog.\n */\nconst handleApplyChanges = async ({\n resolvedDocument,\n}: {\n resolvedDocument: Record<string, unknown>\n}) => {\n await rebaseResult.value?.applyChanges({ resolvedDocument })\n props.eventBus.emit('hooks:on:rebase:document:complete', {\n meta: {\n documentName: props.documentSlug,\n },\n })\n syncModal.hide()\n}\n\n/**\n * Resets sync state when the sync conflict modal is closed (dismissed or after\n * applying changes). Ensures the Sync button is re-enabled and conflict state\n * is cleared.\n */\nconst onSyncModalClose = () => {\n isSyncInProgress.value = false\n rebaseResult.value = null\n}\n</script>\n\n<template>\n <div class=\"custom-scroll h-full\">\n <div\n v-if=\"document\"\n class=\"w-full px-3 md:mx-auto md:max-w-180\">\n <!-- Header -->\n <div\n :aria-label=\"`title: ${title}`\"\n class=\"mx-auto flex h-fit w-full flex-col gap-2 pt-14 pb-3 md:max-w-180 md:pt-6\">\n <Callout\n v-if=\"document?.['x-scalar-is-dirty']\"\n class=\"mb-5\"\n type=\"warning\">\n <p>\n You have unsaved changes. Save your work to keep your changes, or\n undo to revert them.\n </p>\n <template #actions>\n <ScalarButton\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"xs\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"undoChanges\">\n <span>Undo</span>\n </ScalarButton>\n <ScalarButton\n class=\"text-c-btn flex items-center gap-2\"\n size=\"xs\"\n type=\"button\"\n variant=\"solid\"\n @click=\"saveChanges\">\n <ScalarIconFloppyDisk\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Save</span>\n </ScalarButton>\n </template>\n </Callout>\n <div class=\"flex flex-row items-center justify-between gap-2\">\n <div class=\"flex min-w-0 items-center gap-2\">\n <IconSelector\n :modelValue=\"icon\"\n placement=\"bottom-start\"\n @update:modelValue=\"\n (icon) => eventBus.emit('document:update:icon', icon)\n \">\n <ScalarButton\n class=\"hover:bg-b-2 aspect-square h-7 w-7 cursor-pointer rounded border border-transparent p-0 hover:border-inherit\"\n variant=\"ghost\">\n <LibraryIcon\n class=\"text-c-2 size-5\"\n :src=\"icon\"\n stroke-width=\"2\" />\n </ScalarButton>\n </IconSelector>\n\n <div class=\"group relative ml-1.25 min-w-0\">\n <LabelInput\n class=\"text-xl font-bold\"\n inputId=\"documentName\"\n :modelValue=\"title\"\n @update:modelValue=\"\n (title) => eventBus.emit('document:update:info', { title })\n \" />\n </div>\n </div>\n\n <ScalarButton\n v-if=\"canShowSyncButton\"\n class=\"text-c-2 hover:text-c-1 shrink-0 gap-1.5\"\n data-testid=\"document-sync-button\"\n :disabled=\"isSyncInProgress\"\n size=\"xs\"\n :title=\"'Pull the latest version from the document source and merge with your local copy. Save your changes first if you have unsaved edits.'\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"handleSyncFlow\">\n <ScalarIconSpinner\n v-if=\"isSyncInProgress\"\n class=\"size-3.5 animate-spin\"\n size=\"sm\" />\n <ScalarIconCloudArrowDown\n v-else\n class=\"size-3.5\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Sync from source</span>\n </ScalarButton>\n </div>\n </div>\n\n <!-- Tabs -->\n <Tabs type=\"document\" />\n\n <!-- Router views -->\n <div class=\"px-1.5 py-8\">\n <RouterView v-slot=\"{ Component }\">\n <component\n :is=\"Component\"\n v-bind=\"props\"\n collectionType=\"document\" />\n </RouterView>\n </div>\n </div>\n\n <!-- Document not found -->\n <div\n v-else\n class=\"flex w-full flex-1 items-center justify-center\">\n <div class=\"flex h-full flex-col items-center justify-center\">\n <h1 class=\"text-2xl font-bold\">Document not found</h1>\n <p class=\"text-gray-500\">\n The document you are looking for does not exist.\n </p>\n </div>\n </div>\n </div>\n <ScalarModal\n bodyClass=\"border-t-0 rounded-t-lg flex flex-col gap-5\"\n size=\"xs\"\n :state=\"dirtyBeforeSyncModal\"\n title=\"Sync requires saved document\"\n @close=\"dirtyBeforeSyncModal.hide()\">\n <div class=\"flex flex-col gap-5\">\n <div class=\"flex gap-3\">\n <div\n aria-hidden=\"true\"\n class=\"bg-b-3 text-c-2 flex size-10 shrink-0 items-center justify-center rounded-lg\">\n <ScalarIconWarning class=\"size-5 text-[var(--scalar-color-yellow)]\" />\n </div>\n <div class=\"min-w-0 flex-1 space-y-1\">\n <p class=\"text-c-1 text-sm leading-snug font-medium\">\n You have unsaved changes\n </p>\n <p class=\"text-c-2 text-sm leading-relaxed\">\n Save your work to keep changes, or discard to revert to the last\n saved version. Then you can sync with the source.\n </p>\n </div>\n </div>\n <div\n class=\"flex flex-wrap items-center justify-end gap-2 border-t border-[var(--scalar-border-color)] pt-4\">\n <ScalarButton\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"dirtyBeforeSyncModal.hide()\">\n Cancel\n </ScalarButton>\n <ScalarButton\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleDiscardThenCloseDirtyModal\">\n Discard changes\n </ScalarButton>\n <ScalarButton\n class=\"flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"solid\"\n @click=\"handleSaveThenCloseDirtyModal\">\n <ScalarIconFloppyDisk\n size=\"sm\"\n thickness=\"1.5\" />\n Save and continue\n </ScalarButton>\n </div>\n </div>\n </ScalarModal>\n <ScalarModal\n v-if=\"rebaseResult\"\n bodyClass=\"sync-conflict-modal-root flex h-dvh flex-col p-4\"\n maxWidth=\"calc(100dvw - 32px)\"\n size=\"full\"\n :state=\"syncModal\"\n @close=\"onSyncModalClose\">\n <div class=\"flex h-full w-full flex-col gap-4 overflow-hidden\">\n <SyncConflictResolutionEditor\n :baseDocument=\"rebaseResult.originalDocument\"\n :conflicts=\"rebaseResult.conflicts\"\n :resolvedDocument=\"rebaseResult.resolvedDocument\"\n @applyChanges=\"(payload) => handleApplyChanges(payload)\" />\n </div>\n </ScalarModal>\n</template>\n\n<style>\n.full-size-styles:has(.sync-conflict-modal-root) {\n width: 100dvw !important;\n max-width: 100dvw !important;\n border-right: none !important;\n}\n\n.full-size-styles:has(.sync-conflict-modal-root)::after {\n display: none;\n}\n</style>\n","<script lang=\"ts\">\n/**\n * Document Collection Page\n *\n * Displays primary document editing and viewing interface, enabling users to:\n * - Choose a document icon\n * - Edit the document title\n * - Navigate among Overview, Servers, Authentication, Environment, Cookies, and Settings tabs\n */\nexport default {\n name: 'DocumentCollection',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarButton, ScalarModal, useModal } from '@scalar/components'\nimport {\n ScalarIconCloudArrowDown,\n ScalarIconFloppyDisk,\n ScalarIconSpinner,\n ScalarIconWarning,\n} from '@scalar/icons'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport { apply, type Difference, type merge } from '@scalar/json-magic/diff'\nimport { useToasts } from '@scalar/use-toasts'\nimport { deepClone } from '@scalar/workspace-store/helpers/deep-clone'\nimport { computed, ref } from 'vue'\nimport { RouterView } from 'vue-router'\n\nimport IconSelector from '@/components/IconSelector.vue'\nimport Callout from '@/v2/components/callout/Callout.vue'\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\n\nimport LabelInput from './components/LabelInput.vue'\nimport SyncConflictResolutionEditor from './components/SyncConflictResolutionEditor.vue'\nimport Tabs from './components/Tabs.vue'\n\nconst props = defineProps<RouteProps>()\n\n/** Snag the title from the info object */\nconst title = computed(() => props.document?.info?.title ?? '')\n\n/** Default to the folder icon */\nconst icon = computed(\n () => props.document?.['x-scalar-icon'] || 'interface-content-folder',\n)\n\nconst syncModal = useModal()\nconst dirtyBeforeSyncModal = useModal()\n\nconst isDocumentDirty = computed(\n () => props.document?.['x-scalar-is-dirty'] === true,\n)\n\nconst documentSourceUrl = computed(\n () => props.document?.['x-scalar-original-source-url'] as string | undefined,\n)\n\nconst documentRegistryMeta = computed(\n () =>\n props.document?.['x-scalar-registry-meta'] as\n | { namespace: string; slug: string }\n | undefined,\n)\n\n/** Show Sync when the document has a source URL or registry meta (registry can be used if fetchRegistryDocument is set). */\nconst canShowSyncButton = computed(\n () =>\n documentSourceUrl.value !== undefined ||\n documentRegistryMeta.value !== undefined,\n)\n\nconst { toast } = useToasts()\n\nconst undoChanges = () => {\n props.workspaceStore.revertDocumentChanges(props.documentSlug)\n}\n\nconst saveChanges = () => {\n props.workspaceStore.saveDocument(props.documentSlug)\n}\n\nconst handleSaveThenCloseDirtyModal = async () => {\n await props.workspaceStore.saveDocument(props.documentSlug)\n dirtyBeforeSyncModal.hide()\n await handleSyncFlow()\n}\n\nconst handleDiscardThenCloseDirtyModal = async () => {\n await props.workspaceStore.revertDocumentChanges(props.documentSlug)\n dirtyBeforeSyncModal.hide()\n await handleSyncFlow()\n}\n\nconst isSyncInProgress = ref(false)\n\nconst rebaseResult = ref<{\n originalDocument: Record<string, unknown>\n resolvedDocument: Record<string, unknown>\n conflicts: ReturnType<typeof merge>['conflicts']\n applyChanges: (\n applyChangesInput:\n | {\n resolvedConflicts: Difference<unknown>[]\n }\n | {\n resolvedDocument: Record<string, unknown>\n },\n ) => Promise<void>\n} | null>(null)\n\n/**\n * Resolves the source for syncing. Registry meta has priority over x-scalar-original-source-url\n * when fetchRegistryDocument is provided. Returns either a URL or the full document object.\n */\nconst resolveSyncInput = async (): Promise<\n { url: string } | { document: Record<string, unknown> } | null\n> => {\n const registryMeta = documentRegistryMeta.value\n if (registryMeta && props.fetchRegistryDocument) {\n try {\n const result = await props.fetchRegistryDocument(registryMeta)\n if (!result.ok) {\n toast(result.error, 'error')\n return null\n }\n return { document: result.data }\n } catch (err) {\n toast('Failed to resolve document from registry', 'error')\n return null\n }\n }\n const url = documentSourceUrl.value\n if (url) {\n return { url }\n }\n return null\n}\n\n/**\n * Handles actions to perform when synchronization is complete.\n * Hides the sync modal, resets the sync progress flag, and emits the\n * 'hooks:on:rebase:document:complete' event with document metadata.\n */\nconst onSyncComplete = () => {\n syncModal.hide()\n isSyncInProgress.value = false\n // Display the toast to show that the sync is complete\n toast(\n 'Your document has been rebased with the latest version from the source.',\n 'info',\n )\n // Emit the event to notify other components that the sync is complete\n props.eventBus.emit('hooks:on:rebase:document:complete', {\n meta: {\n documentName: props.documentSlug,\n },\n })\n}\n\n/**\n * Handles errors that occur during synchronization.\n * If an error string is provided, it displays the error via toast.\n * Always resets the sync progress flag.\n */\nconst onSyncError = (error: string | null) => {\n if (error !== null) {\n toast(error, 'error')\n }\n isSyncInProgress.value = false\n}\n\n/**\n * Handles the synchronization flow for a document.\n * Checks for unsaved changes, resolves source (registry over URL),\n * initiates rebasing, handles conflicts, and emits completion events.\n * If conflicts are detected, a modal dialog is shown for user resolution.\n */\nconst handleSyncFlow = async () => {\n if (isDocumentDirty.value) {\n dirtyBeforeSyncModal.show()\n return\n }\n\n if (isSyncInProgress.value) {\n return\n }\n\n isSyncInProgress.value = true\n\n const input = await resolveSyncInput()\n if (!input) {\n onSyncError(null)\n return\n }\n\n const result = await props.workspaceStore.rebaseDocument({\n name: props.documentSlug,\n ...input,\n })\n\n if (result?.ok) {\n const originalDocument =\n props.workspaceStore.getOriginalDocument(props.documentSlug) ?? {}\n rebaseResult.value = {\n conflicts: result.conflicts,\n applyChanges: result.applyChanges,\n resolvedDocument: apply(deepClone(originalDocument), result.changes),\n originalDocument,\n }\n\n if (rebaseResult.value.conflicts.length > 0) {\n syncModal.show()\n } else {\n // If there is no conflict just rebase immediately\n await rebaseResult.value?.applyChanges({\n resolvedDocument: rebaseResult.value.resolvedDocument,\n })\n onSyncComplete()\n }\n } else if (result?.ok === false && result.type === 'NO_CHANGES_DETECTED') {\n // Emit the event either way even if there was no need to rebase the document\n onSyncComplete()\n } else {\n onSyncError('Failed to sync document')\n }\n}\n\n/*\n * Handles applying changes to the current document after conflict resolution.\n * Emits a completion event and hides the sync modal dialog.\n */\nconst handleApplyChanges = async ({\n resolvedDocument,\n}: {\n resolvedDocument: Record<string, unknown>\n}) => {\n await rebaseResult.value?.applyChanges({ resolvedDocument })\n props.eventBus.emit('hooks:on:rebase:document:complete', {\n meta: {\n documentName: props.documentSlug,\n },\n })\n syncModal.hide()\n}\n\n/**\n * Resets sync state when the sync conflict modal is closed (dismissed or after\n * applying changes). Ensures the Sync button is re-enabled and conflict state\n * is cleared.\n */\nconst onSyncModalClose = () => {\n isSyncInProgress.value = false\n rebaseResult.value = null\n}\n</script>\n\n<template>\n <div class=\"custom-scroll h-full\">\n <div\n v-if=\"document\"\n class=\"w-full px-3 md:mx-auto md:max-w-180\">\n <!-- Header -->\n <div\n :aria-label=\"`title: ${title}`\"\n class=\"mx-auto flex h-fit w-full flex-col gap-2 pt-14 pb-3 md:max-w-180 md:pt-6\">\n <Callout\n v-if=\"document?.['x-scalar-is-dirty']\"\n class=\"mb-5\"\n type=\"warning\">\n <p>\n You have unsaved changes. Save your work to keep your changes, or\n undo to revert them.\n </p>\n <template #actions>\n <ScalarButton\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"xs\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"undoChanges\">\n <span>Undo</span>\n </ScalarButton>\n <ScalarButton\n class=\"text-c-btn flex items-center gap-2\"\n size=\"xs\"\n type=\"button\"\n variant=\"solid\"\n @click=\"saveChanges\">\n <ScalarIconFloppyDisk\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Save</span>\n </ScalarButton>\n </template>\n </Callout>\n <div class=\"flex flex-row items-center justify-between gap-2\">\n <div class=\"flex min-w-0 items-center gap-2\">\n <IconSelector\n :modelValue=\"icon\"\n placement=\"bottom-start\"\n @update:modelValue=\"\n (icon) => eventBus.emit('document:update:icon', icon)\n \">\n <ScalarButton\n class=\"hover:bg-b-2 aspect-square h-7 w-7 cursor-pointer rounded border border-transparent p-0 hover:border-inherit\"\n variant=\"ghost\">\n <LibraryIcon\n class=\"text-c-2 size-5\"\n :src=\"icon\"\n stroke-width=\"2\" />\n </ScalarButton>\n </IconSelector>\n\n <div class=\"group relative ml-1.25 min-w-0\">\n <LabelInput\n class=\"text-xl font-bold\"\n inputId=\"documentName\"\n :modelValue=\"title\"\n @update:modelValue=\"\n (title) => eventBus.emit('document:update:info', { title })\n \" />\n </div>\n </div>\n\n <ScalarButton\n v-if=\"canShowSyncButton\"\n class=\"text-c-2 hover:text-c-1 shrink-0 gap-1.5\"\n data-testid=\"document-sync-button\"\n :disabled=\"isSyncInProgress\"\n size=\"xs\"\n :title=\"'Pull the latest version from the document source and merge with your local copy. Save your changes first if you have unsaved edits.'\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"handleSyncFlow\">\n <ScalarIconSpinner\n v-if=\"isSyncInProgress\"\n class=\"size-3.5 animate-spin\"\n size=\"sm\" />\n <ScalarIconCloudArrowDown\n v-else\n class=\"size-3.5\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Sync from source</span>\n </ScalarButton>\n </div>\n </div>\n\n <!-- Tabs -->\n <Tabs type=\"document\" />\n\n <!-- Router views -->\n <div class=\"px-1.5 py-8\">\n <RouterView v-slot=\"{ Component }\">\n <component\n :is=\"Component\"\n v-bind=\"props\"\n collectionType=\"document\" />\n </RouterView>\n </div>\n </div>\n\n <!-- Document not found -->\n <div\n v-else\n class=\"flex w-full flex-1 items-center justify-center\">\n <div class=\"flex h-full flex-col items-center justify-center\">\n <h1 class=\"text-2xl font-bold\">Document not found</h1>\n <p class=\"text-gray-500\">\n The document you are looking for does not exist.\n </p>\n </div>\n </div>\n </div>\n <ScalarModal\n bodyClass=\"border-t-0 rounded-t-lg flex flex-col gap-5\"\n size=\"xs\"\n :state=\"dirtyBeforeSyncModal\"\n title=\"Sync requires saved document\"\n @close=\"dirtyBeforeSyncModal.hide()\">\n <div class=\"flex flex-col gap-5\">\n <div class=\"flex gap-3\">\n <div\n aria-hidden=\"true\"\n class=\"bg-b-3 text-c-2 flex size-10 shrink-0 items-center justify-center rounded-lg\">\n <ScalarIconWarning class=\"size-5 text-[var(--scalar-color-yellow)]\" />\n </div>\n <div class=\"min-w-0 flex-1 space-y-1\">\n <p class=\"text-c-1 text-sm leading-snug font-medium\">\n You have unsaved changes\n </p>\n <p class=\"text-c-2 text-sm leading-relaxed\">\n Save your work to keep changes, or discard to revert to the last\n saved version. Then you can sync with the source.\n </p>\n </div>\n </div>\n <div\n class=\"flex flex-wrap items-center justify-end gap-2 border-t border-[var(--scalar-border-color)] pt-4\">\n <ScalarButton\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"dirtyBeforeSyncModal.hide()\">\n Cancel\n </ScalarButton>\n <ScalarButton\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleDiscardThenCloseDirtyModal\">\n Discard changes\n </ScalarButton>\n <ScalarButton\n class=\"flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"solid\"\n @click=\"handleSaveThenCloseDirtyModal\">\n <ScalarIconFloppyDisk\n size=\"sm\"\n thickness=\"1.5\" />\n Save and continue\n </ScalarButton>\n </div>\n </div>\n </ScalarModal>\n <ScalarModal\n v-if=\"rebaseResult\"\n bodyClass=\"sync-conflict-modal-root flex h-dvh flex-col p-4\"\n maxWidth=\"calc(100dvw - 32px)\"\n size=\"full\"\n :state=\"syncModal\"\n @close=\"onSyncModalClose\">\n <div class=\"flex h-full w-full flex-col gap-4 overflow-hidden\">\n <SyncConflictResolutionEditor\n :baseDocument=\"rebaseResult.originalDocument\"\n :conflicts=\"rebaseResult.conflicts\"\n :resolvedDocument=\"rebaseResult.resolvedDocument\"\n @applyChanges=\"(payload) => handleApplyChanges(payload)\" />\n </div>\n </ScalarModal>\n</template>\n\n<style>\n.full-size-styles:has(.sync-conflict-modal-root) {\n width: 100dvw !important;\n max-width: 100dvw !important;\n border-right: none !important;\n}\n\n.full-size-styles:has(.sync-conflict-modal-root)::after {\n display: none;\n}\n</style>\n","<script lang=\"ts\">\n/** Document collection page — tabs for Overview, Servers, Auth, Environment, Cookies, and Settings. */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { computed, ref, watch } from 'vue'\nimport { RouterView } from 'vue-router'\n\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\nimport LabelInput from '@/v2/features/collection/components/LabelInput.vue'\n\nimport Tabs from './components/Tabs.vue'\n\nconst props = defineProps<RouteProps>()\n\nconst operation = computed(() => {\n if (!props.path || !props.method) {\n return undefined\n }\n\n return getResolvedRef(props.document?.paths?.[props.path]?.[props.method])\n})\n\n/**\n * Local copy of the label so we can reset on empty-blur rejection and stay in\n * sync when Vue Router reuses this component across workspace navigations.\n */\nconst operationSummary = ref(operation.value?.summary ?? '')\n\nwatch(\n () => operation.value?.summary,\n (newSummary) => {\n operationSummary.value = newSummary ?? ''\n },\n)\n\n/** Emits the rename event on blur, or resets the input if the title is blank. */\nconst handleSummaryUpdate = (payload: string) => {\n const { path, method } = props\n\n if (!path || !method || !isHttpMethod(method)) {\n return\n }\n\n props.eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: {\n summary: payload.trim(),\n },\n })\n}\n\nconst operationPlaceholder = computed(() => {\n if (!props.path || !props.method) {\n return 'Untitled Operation'\n }\n return `${props.method.toUpperCase()} ${props.path}`\n})\n</script>\n\n<template>\n <div\n v-if=\"operation !== undefined\"\n class=\"custom-scroll h-full\">\n <div class=\"w-full px-3 md:mx-auto md:max-w-180\">\n <!-- Header -->\n <div\n :aria-label=\"`title: ${operationSummary}`\"\n class=\"mx-auto flex h-fit w-full flex-row items-center gap-2 pt-14 pb-3 md:max-w-180 md:pt-8\">\n <div class=\"group relative ml-1.25\">\n <LabelInput\n v-model=\"operationSummary\"\n class=\"text-xl font-bold\"\n inputId=\"operationSummary\"\n :placeholder=\"operationPlaceholder\"\n @blur=\"handleSummaryUpdate\" />\n </div>\n </div>\n\n <!-- Tabs -->\n <Tabs type=\"operation\" />\n\n <!-- Router views -->\n <div class=\"px-1.5 py-8\">\n <RouterView\n v-bind=\"props\"\n collectionType=\"operation\" />\n </div>\n </div>\n </div>\n\n <!-- Operation not found -->\n <div\n v-else\n class=\"flex w-full flex-1 items-center justify-center\">\n <div class=\"flex h-full flex-col items-center justify-center\">\n <h1 class=\"text-2xl font-bold\">Operation not found</h1>\n <p class=\"text-gray-500\">\n The operation you are looking for does not exist.\n </p>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\n/** Document collection page — tabs for Overview, Servers, Auth, Environment, Cookies, and Settings. */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { computed, ref, watch } from 'vue'\nimport { RouterView } from 'vue-router'\n\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\nimport LabelInput from '@/v2/features/collection/components/LabelInput.vue'\n\nimport Tabs from './components/Tabs.vue'\n\nconst props = defineProps<RouteProps>()\n\nconst operation = computed(() => {\n if (!props.path || !props.method) {\n return undefined\n }\n\n return getResolvedRef(props.document?.paths?.[props.path]?.[props.method])\n})\n\n/**\n * Local copy of the label so we can reset on empty-blur rejection and stay in\n * sync when Vue Router reuses this component across workspace navigations.\n */\nconst operationSummary = ref(operation.value?.summary ?? '')\n\nwatch(\n () => operation.value?.summary,\n (newSummary) => {\n operationSummary.value = newSummary ?? ''\n },\n)\n\n/** Emits the rename event on blur, or resets the input if the title is blank. */\nconst handleSummaryUpdate = (payload: string) => {\n const { path, method } = props\n\n if (!path || !method || !isHttpMethod(method)) {\n return\n }\n\n props.eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: {\n summary: payload.trim(),\n },\n })\n}\n\nconst operationPlaceholder = computed(() => {\n if (!props.path || !props.method) {\n return 'Untitled Operation'\n }\n return `${props.method.toUpperCase()} ${props.path}`\n})\n</script>\n\n<template>\n <div\n v-if=\"operation !== undefined\"\n class=\"custom-scroll h-full\">\n <div class=\"w-full px-3 md:mx-auto md:max-w-180\">\n <!-- Header -->\n <div\n :aria-label=\"`title: ${operationSummary}`\"\n class=\"mx-auto flex h-fit w-full flex-row items-center gap-2 pt-14 pb-3 md:max-w-180 md:pt-8\">\n <div class=\"group relative ml-1.25\">\n <LabelInput\n v-model=\"operationSummary\"\n class=\"text-xl font-bold\"\n inputId=\"operationSummary\"\n :placeholder=\"operationPlaceholder\"\n @blur=\"handleSummaryUpdate\" />\n </div>\n </div>\n\n <!-- Tabs -->\n <Tabs type=\"operation\" />\n\n <!-- Router views -->\n <div class=\"px-1.5 py-8\">\n <RouterView\n v-bind=\"props\"\n collectionType=\"operation\" />\n </div>\n </div>\n </div>\n\n <!-- Operation not found -->\n <div\n v-else\n class=\"flex w-full flex-1 items-center justify-center\">\n <div class=\"flex h-full flex-col items-center justify-center\">\n <h1 class=\"text-2xl font-bold\">Operation not found</h1>\n <p class=\"text-gray-500\">\n The operation you are looking for does not exist.\n </p>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\n/** Document collection page — tabs for Overview, Servers, Auth, Environment, Cookies, and Settings. */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport { RouterView } from 'vue-router'\n\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\nimport LabelInput from '@/v2/features/collection/components/LabelInput.vue'\n\nimport Tabs from './components/Tabs.vue'\n\nconst props = defineProps<RouteProps>()\n\n/**\n * Local copy of the label so we can reset on empty-blur rejection and stay in\n * sync when Vue Router reuses this component across workspace navigations.\n */\nconst workspaceTitle = ref(props.activeWorkspace.label)\n\nwatch(\n () => props.activeWorkspace.label,\n (newLabel) => {\n workspaceTitle.value = newLabel\n },\n)\n\n/** Emits the rename event on blur, or resets the input if the title is blank. */\nconst handleUpdateWorkspaceTitle = (title: string) => {\n if (title.trim() === '') {\n // Force defineModel inside LabelInput to re-sync to the original value.\n workspaceTitle.value = props.activeWorkspace.label\n return\n }\n props.eventBus.emit('workspace:update:name', title)\n}\n</script>\n\n<template>\n <div class=\"custom-scroll h-full\">\n <div class=\"w-full px-3 md:mx-auto md:max-w-180\">\n <!-- Header -->\n <div\n :aria-label=\"`title: ${activeWorkspace.label}`\"\n class=\"mx-auto flex h-fit w-full flex-row items-center gap-2 pt-14 pb-3 md:max-w-180 md:pt-6\">\n <div class=\"group relative ml-1.25\">\n <LabelInput\n v-model=\"workspaceTitle\"\n class=\"text-xl font-bold\"\n inputId=\"workspaceName\"\n placeholder=\"Untitled Workspace\"\n @blur=\"handleUpdateWorkspaceTitle\" />\n </div>\n </div>\n\n <!-- Tabs -->\n <Tabs type=\"workspace\" />\n\n <!-- Router views -->\n <div class=\"px-1.5 py-8\">\n <RouterView\n v-bind=\"props\"\n collectionType=\"workspace\" />\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\n/** Document collection page — tabs for Overview, Servers, Auth, Environment, Cookies, and Settings. */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport { RouterView } from 'vue-router'\n\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\nimport LabelInput from '@/v2/features/collection/components/LabelInput.vue'\n\nimport Tabs from './components/Tabs.vue'\n\nconst props = defineProps<RouteProps>()\n\n/**\n * Local copy of the label so we can reset on empty-blur rejection and stay in\n * sync when Vue Router reuses this component across workspace navigations.\n */\nconst workspaceTitle = ref(props.activeWorkspace.label)\n\nwatch(\n () => props.activeWorkspace.label,\n (newLabel) => {\n workspaceTitle.value = newLabel\n },\n)\n\n/** Emits the rename event on blur, or resets the input if the title is blank. */\nconst handleUpdateWorkspaceTitle = (title: string) => {\n if (title.trim() === '') {\n // Force defineModel inside LabelInput to re-sync to the original value.\n workspaceTitle.value = props.activeWorkspace.label\n return\n }\n props.eventBus.emit('workspace:update:name', title)\n}\n</script>\n\n<template>\n <div class=\"custom-scroll h-full\">\n <div class=\"w-full px-3 md:mx-auto md:max-w-180\">\n <!-- Header -->\n <div\n :aria-label=\"`title: ${activeWorkspace.label}`\"\n class=\"mx-auto flex h-fit w-full flex-row items-center gap-2 pt-14 pb-3 md:max-w-180 md:pt-6\">\n <div class=\"group relative ml-1.25\">\n <LabelInput\n v-model=\"workspaceTitle\"\n class=\"text-xl font-bold\"\n inputId=\"workspaceName\"\n placeholder=\"Untitled Workspace\"\n @blur=\"handleUpdateWorkspaceTitle\" />\n </div>\n </div>\n\n <!-- Tabs -->\n <Tabs type=\"workspace\" />\n\n <!-- Router views -->\n <div class=\"px-1.5 py-8\">\n <RouterView\n v-bind=\"props\"\n collectionType=\"workspace\" />\n </div>\n </div>\n </div>\n</template>\n","import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { mergeSearchParams } from '@scalar/helpers/url/merge-urls'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { Theme } from '@scalar/themes'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { WorkspaceDocument } from '@scalar/workspace-store/schemas/workspace'\nimport type { RouteRecordRaw } from 'vue-router'\n\nimport type { MergedSecuritySchemes } from '@/v2/blocks/scalar-auth-selector-block/helpers/merge-security'\nimport Authentication from '@/v2/features/collection/components/Authentication.vue'\nimport Cookies from '@/v2/features/collection/components/Cookies.vue'\nimport { Editor } from '@/v2/features/collection/components/Editor'\nimport Environment from '@/v2/features/collection/components/Environment.vue'\nimport Overview from '@/v2/features/collection/components/Overview.vue'\nimport Servers from '@/v2/features/collection/components/Servers.vue'\nimport Settings from '@/v2/features/collection/components/Settings.vue'\nimport DocumentCollection from '@/v2/features/collection/DocumentCollection.vue'\nimport OperationCollection from '@/v2/features/collection/OperationCollection.vue'\nimport WorkspaceCollection from '@/v2/features/collection/WorkspaceCollection.vue'\nimport { Operation } from '@/v2/features/operation'\nimport { workspaceStorage } from '@/v2/helpers/storage'\nimport type { ImportDocumentFromRegistry } from '@/v2/types/configuration'\nimport type { ClientLayout } from '@/v2/types/layout'\n\n/** These props are provided at the route level */\nexport type RouteProps = {\n /** The slug of the currently selected document in the workspace */\n documentSlug: string\n /** The currently active document */\n document: WorkspaceDocument | null\n /** The workspace event bus */\n eventBus: WorkspaceEventBus\n /** The layout of the client */\n layout: ClientLayout\n /** The API path currently selected (e.g. \"/users/{id}\") */\n path?: string\n /** The HTTP method for the currently selected API path (e.g. GET, POST) */\n method?: HttpMethod\n /** The name of the currently selected example (for examples within an endpoint) */\n exampleName?: string\n /** The currently active environment */\n environment: XScalarEnvironment\n /** The merged security schemes */\n securitySchemes: MergedSecuritySchemes\n /** The workspace store */\n workspaceStore: WorkspaceStore\n /** The currently active workspace */\n activeWorkspace: { id: string; label: string }\n /** Client plugins */\n plugins: ClientPlugin[]\n /** Custom themes available to the team */\n customThemes?: Theme[]\n /** The currently selected theme styles string */\n currentTheme?: string\n /** Whether the current color mode is dark */\n isDarkMode?: boolean\n /**\n * Fetches the full document from registry by meta. When provided, registry meta takes priority\n * over x-scalar-original-source-url when syncing. Returns the document as a plain object.\n */\n fetchRegistryDocument?: ImportDocumentFromRegistry\n}\n\n/** When in the collections pages */\nexport type CollectionProps = RouteProps &\n (\n | {\n collectionType: 'document' | 'operation'\n document: WorkspaceDocument\n }\n | {\n collectionType: 'workspace'\n document: null\n }\n )\n\nexport type ScalarClientAppRouteParams =\n | 'namespace'\n | 'workspaceSlug'\n | 'documentSlug'\n | 'pathEncoded'\n | 'method'\n | 'exampleName'\n\n/** Routes for the API client app and web, the same as modal + workspace routes */\nexport const ROUTES = [\n {\n path: '/@:namespace/:workspaceSlug',\n children: [\n {\n path: 'document/:documentSlug',\n children: [\n // Example page\n {\n path: 'path/:pathEncoded/method/:method',\n children: [\n {\n name: 'example',\n path: 'example/:exampleName',\n component: Operation,\n },\n {\n name: 'operation',\n path: '',\n component: OperationCollection,\n redirect: {\n name: 'operation.overview',\n },\n children: [\n {\n name: 'operation.overview',\n path: 'overview',\n component: Overview,\n },\n {\n name: 'operation.servers',\n path: 'servers',\n component: Servers,\n },\n {\n name: 'operation.authentication',\n path: 'authentication',\n component: Authentication,\n },\n {\n name: 'operation.editor',\n path: 'editor',\n component: Editor,\n },\n ],\n },\n ],\n },\n // Document Page\n {\n name: 'document',\n path: '',\n component: DocumentCollection,\n children: [\n // Redirect to overview\n {\n name: 'document.redirect',\n path: '',\n redirect: {\n name: 'document.overview',\n },\n },\n // Document overview\n {\n name: 'document.overview',\n path: 'overview',\n component: Overview,\n },\n // Document servers\n {\n name: 'document.servers',\n path: 'servers',\n component: Servers,\n },\n // Document environment\n {\n name: 'document.environment',\n path: 'environment',\n component: Environment,\n },\n // Document authentication\n {\n name: 'document.authentication',\n path: 'authentication',\n component: Authentication,\n },\n // Document cookies\n {\n name: 'document.cookies',\n path: 'cookies',\n component: Cookies,\n },\n // Document settings\n {\n name: 'document.settings',\n path: 'settings',\n component: Settings,\n },\n ],\n },\n ],\n },\n // Workspace page\n {\n name: 'workspace',\n path: '',\n component: WorkspaceCollection,\n children: [\n // Workspace environment\n {\n name: 'workspace.environment',\n path: 'environment',\n component: Environment,\n },\n // Workspace cookies\n {\n name: 'workspace.cookies',\n path: 'cookies',\n component: Cookies,\n },\n // Workspace settings\n {\n name: 'workspace.settings',\n path: 'settings',\n component: Settings,\n },\n ],\n },\n ],\n },\n {\n path: '/:pathMatch(.*)*',\n redirect: () => {\n const DEFAULT_PATH = '/@local/default/document/drafts/overview'\n const lastPath = workspaceStorage.getLastPath() ?? DEFAULT_PATH\n\n // Set the default path to the last path so we don't go to an inifite loop if the last path is invalid\n workspaceStorage.setCurrentPath(DEFAULT_PATH)\n\n const url = new URL(lastPath, 'http://example.com')\n\n const queryParameters = new URLSearchParams(window.location.search)\n\n //Merge the query parameters with the last path\n const mergedSearchParams = mergeSearchParams(url.searchParams, queryParameters)\n\n // Preserve all query paramters\n return `${url.pathname}?${mergedSearchParams.toString()}`\n },\n },\n] satisfies RouteRecordRaw[]\n","import type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { Theme } from '@scalar/themes'\nimport { createApp } from 'vue'\nimport { createRouter as createVueRouter, createWebHashHistory, createWebHistory } from 'vue-router'\n\nimport App from '@/v2/features/app/App.vue'\nimport { createAppState } from '@/v2/features/app/app-state'\nimport { ROUTES } from '@/v2/features/app/helpers/routes'\nimport type { ImportDocumentFromRegistry } from '@/v2/types/configuration'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport { useCommandPaletteState } from '../../command-palette/hooks/use-command-palette-state'\n\ntype CreateApiClientOptions = {\n /**\n * The layout of the client, limited to web or desktop in app\n * @see {@link ClientLayout}\n *\n * @default 'desktop'\n */\n layout: Exclude<ClientLayout, 'modal'>\n /**\n * Api client plugins to include in the app\n */\n plugins?: ClientPlugin[]\n /**\n * Custom themes to include in the app\n */\n customThemes?: Theme[]\n /**\n * Fallback theme slug to use if no theme is selected for the workspace\n * @default 'default'\n */\n fallbackThemeSlug?: () => string\n /**\n * Fetches the full document from registry by meta. When set, registry meta takes priority\n * over x-scalar-original-source-url when syncing. Returns the document as a plain object.\n */\n fetchRegistryDocument?: ImportDocumentFromRegistry\n}\n\n/**\n * Creates the appropriate router with the appropriate routes based on the layout\n */\nexport const createAppRouter = (layout: CreateApiClientOptions['layout']) => {\n // Web uses the standard HTML5 history API\n if (layout === 'web') {\n return createVueRouter({ history: createWebHistory(), routes: ROUTES })\n }\n\n // Electron app has to use the webHashHistory due to file routing\n return createVueRouter({ history: createWebHashHistory(), routes: ROUTES })\n}\n\n/**\n * Create the API Client with router and passes in the workspace store as a prop\n */\nexport const createApiClientApp = async (\n el: HTMLElement | null,\n { layout = 'desktop', plugins, customThemes, fallbackThemeSlug, fetchRegistryDocument }: CreateApiClientOptions,\n) => {\n // Add the router\n const router = createAppRouter(layout)\n const state = await createAppState({\n router,\n customThemes,\n fallbackThemeSlug,\n })\n const commandPaletteState = useCommandPaletteState()\n\n // Pass in our initial props at the top level\n const app = createApp(App, {\n layout,\n plugins,\n getAppState: () => state,\n getCommandPaletteState: () => commandPaletteState,\n fetchRegistryDocument,\n })\n app.use(router)\n\n // Mount the vue app\n if (!el) {\n console.error(\n '[@scalar/api-client-modal] Could not create the API client.',\n 'Invalid HTML element provided.',\n 'Read more: https://github.com/scalar/scalar/tree/main/packages/api-client',\n )\n\n return\n }\n app.mount(el)\n\n return {\n app,\n state,\n }\n}\n"],"mappings":"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"}
|