@scalar/agent-chat 0.12.30 → 0.12.32

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.
@@ -1,6 +1,6 @@
1
1
  import type { Chat } from '@ai-sdk/vue';
2
2
  import type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example';
3
- import type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
3
+ import type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
4
4
  import type { UIDataTypes, UIMessage } from 'ai';
5
5
  import type { Tools } from '../state/state.js';
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"execute-request.js","names":[],"sources":["../../src/client-tools/execute-request.ts"],"sourcesContent":["import type { Chat } from '@ai-sdk/vue'\nimport { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport { buildRequestSecurity, getResolvedUrl } from '@scalar/workspace-store/request-example'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport type { UIDataTypes, UIMessage } from 'ai'\nimport { encode as encodeBase64 } from 'js-base64'\nimport { n } from 'neverpanic'\nimport truncateJson from 'truncate-json'\n\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities'\nimport { createError } from '@/entities/error/helpers'\nimport type { Tools } from '@/state/state'\n\n// The maximum number of bytes the requests response can be.\nconst MAX_RESPONSE_SIZE = 50_000\n\nconst getBody = n.safeFn(\n async (response: Response) => {\n const contentType = response.headers.get('content-type')\n\n if (contentType === 'application/json') {\n return { success: true, data: await response.json() }\n }\n\n return { success: true, data: await response.text() }\n },\n (originalError) => createError('FAILED_TO_PARSE_RESPONSE_BODY', { originalError }),\n)\n\nconst truncateResponse = (response: unknown) =>\n JSON.parse(truncateJson(JSON.stringify(response), MAX_RESPONSE_SIZE).jsonString)\n\n/* Result type wrapper for fetch */\nconst safeFetch = n.safeFn(\n async (url: string, init: RequestInit) => {\n const response = await fetch(url, init)\n\n const responseBodyResult = await getBody(response)\n\n if (!response.ok) {\n return {\n success: false,\n error: createError('REQUEST_NOT_OK', {\n status: response.status,\n url: response.url,\n responseBody: truncateResponse(responseBodyResult.success ? responseBodyResult.data : undefined),\n headers: Object.fromEntries(response.headers.entries()),\n }),\n }\n }\n\n if (!responseBodyResult.success) {\n return responseBodyResult\n }\n\n return {\n success: true,\n data: {\n status: response.status,\n responseBody: truncateResponse(responseBodyResult.data),\n headers: Object.fromEntries(response.headers.entries()),\n },\n }\n },\n (originalError) => createError('FAILED_TO_FETCH', { originalError }),\n)\n\nfunction createUrl({\n path,\n activeServer,\n proxyUrl,\n queryParams,\n}: {\n path: string\n activeServer: ServerObject | null\n proxyUrl: string\n queryParams: URLSearchParams\n}) {\n const resolvedUrl = getResolvedUrl({\n path,\n server: activeServer,\n urlParams: queryParams,\n })\n\n return redirectToProxy(proxyUrl, resolvedUrl)\n}\n\n/**\n * Executes an HTTP request with the specified options, including method, path, headers, and security schemes, and returns the processed response.\n */\nexport const executeRequestTool = n.safeFn(\n async ({\n documentSettings,\n toolCallId,\n chat,\n proxyUrl,\n input: { method, path, body, headers, documentName },\n }: {\n documentSettings: Record<\n string,\n { activeServer: ServerObject | null; securitySchemes: SecuritySchemeObjectSecret[] }\n >\n toolCallId: string\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n proxyUrl: string\n input: {\n method: string\n path: string\n headers?: Record<string, string>\n body?: string\n documentName: string\n }\n }) => {\n const settings = documentSettings[documentName]\n\n if (!settings) {\n return {\n success: false,\n error: createError('DOCUMENT_SETTINGS_COULD_NOT_BE_DETERMINED', {\n documentName,\n }),\n }\n }\n\n const requestSecurityOptions = buildRequestSecurity(settings.securitySchemes)\n\n const requestSecurity = requestSecurityOptions.reduce<{\n headers: Record<string, string>\n queryParams: URLSearchParams\n cookies: Record<string, string>\n }>(\n (acc, securityOption) => {\n /** Format the security value based on its authentication scheme. */\n const securityValue = (() => {\n if (securityOption.format === 'basic') {\n return `Basic ${encodeBase64(securityOption.value)}`\n }\n if (securityOption.format === 'bearer') {\n return `Bearer ${securityOption.value}`\n }\n return securityOption.value\n })()\n\n if (securityOption.in === 'header') {\n acc.headers[securityOption.name] = securityValue\n } else if (securityOption.in === 'query') {\n acc.queryParams.set(securityOption.name, securityValue)\n } else if (securityOption.in === 'cookie') {\n acc.cookies[securityOption.name] = securityValue\n }\n\n return acc\n },\n {\n headers: {},\n queryParams: new URLSearchParams(),\n cookies: {},\n },\n )\n\n const cookieHeader = Object.entries(requestSecurity.cookies)\n .map(([name, value]) => `${name}=${value}`)\n .join('; ')\n\n const fetchOptions = {\n method,\n body,\n headers: {\n ...headers,\n ...requestSecurity.headers,\n Cookie: cookieHeader,\n },\n }\n\n const url = createUrl({\n path,\n activeServer: settings.activeServer,\n proxyUrl,\n queryParams: requestSecurity.queryParams,\n })\n\n const result = await safeFetch(url, fetchOptions)\n\n void chat.addToolOutput({\n tool: EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n toolCallId,\n output: result,\n state: 'output-available',\n })\n\n return result\n },\n (originalError) => createError('FAILED_TO_EXECUTE_REQUEST', originalError),\n)\n"],"mappings":";;;;;;;;AAeA,IAAM,oBAAoB;AAE1B,IAAM,UAAU,EAAE,OAChB,OAAO,aAAuB;CAG5B,IAFoB,SAAS,QAAQ,IAAI,cAErC,MAAgB,oBAClB,OAAO;EAAE,SAAS;EAAM,MAAM,MAAM,SAAS,KAAK;CAAE;CAGtD,OAAO;EAAE,SAAS;EAAM,MAAM,MAAM,SAAS,KAAK;CAAE;AACtD,IACC,kBAAkB,YAAY,iCAAiC,EAAE,cAAc,CAAC,CACnF;AAEA,IAAM,oBAAoB,aACxB,KAAK,MAAM,aAAa,KAAK,UAAU,QAAQ,GAAG,iBAAiB,CAAC,CAAC,UAAU;AAGjF,IAAM,YAAY,EAAE,OAClB,OAAO,KAAa,SAAsB;CACxC,MAAM,WAAW,MAAM,MAAM,KAAK,IAAI;CAEtC,MAAM,qBAAqB,MAAM,QAAQ,QAAQ;CAEjD,IAAI,CAAC,SAAS,IACZ,OAAO;EACL,SAAS;EACT,OAAO,YAAY,kBAAkB;GACnC,QAAQ,SAAS;GACjB,KAAK,SAAS;GACd,cAAc,iBAAiB,mBAAmB,UAAU,mBAAmB,OAAO,KAAA,CAAS;GAC/F,SAAS,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;EACxD,CAAC;CACH;CAGF,IAAI,CAAC,mBAAmB,SACtB,OAAO;CAGT,OAAO;EACL,SAAS;EACT,MAAM;GACJ,QAAQ,SAAS;GACjB,cAAc,iBAAiB,mBAAmB,IAAI;GACtD,SAAS,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;EACxD;CACF;AACF,IACC,kBAAkB,YAAY,mBAAmB,EAAE,cAAc,CAAC,CACrE;AAEA,SAAS,UAAU,EACjB,MACA,cACA,UACA,eAMC;CAOD,OAAO,gBAAgB,UANH,eAAe;EACjC;EACA,QAAQ;EACR,WAAW;CACb,CAEiC,CAAW;AAC9C;;;;AAKA,IAAa,qBAAqB,EAAE,OAClC,OAAO,EACL,kBACA,YACA,MACA,UACA,OAAO,EAAE,QAAQ,MAAM,MAAM,SAAS,qBAgBlC;CACJ,MAAM,WAAW,iBAAiB;CAElC,IAAI,CAAC,UACH,OAAO;EACL,SAAS;EACT,OAAO,YAAY,6CAA6C,EAC9D,aACF,CAAC;CACH;CAKF,MAAM,kBAFyB,qBAAqB,SAAS,eAErC,CAAA,CAAuB,QAK5C,KAAK,mBAAmB;;EAEvB,MAAM,uBAAuB;GAC3B,IAAI,eAAe,WAAW,SAC5B,OAAO,SAAS,OAAa,eAAe,KAAK;GAEnD,IAAI,eAAe,WAAW,UAC5B,OAAO,UAAU,eAAe;GAElC,OAAO,eAAe;EACxB,EAAA,CAAG;EAEH,IAAI,eAAe,OAAO,UACxB,IAAI,QAAQ,eAAe,QAAQ;OAC9B,IAAI,eAAe,OAAO,SAC/B,IAAI,YAAY,IAAI,eAAe,MAAM,aAAa;OACjD,IAAI,eAAe,OAAO,UAC/B,IAAI,QAAQ,eAAe,QAAQ;EAGrC,OAAO;CACT,GACA;EACE,SAAS,CAAC;EACV,aAAa,IAAI,gBAAgB;EACjC,SAAS,CAAC;CACZ,CACF;CAEA,MAAM,eAAe,OAAO,QAAQ,gBAAgB,OAAO,CAAC,CACzD,KAAK,CAAC,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC,CAC1C,KAAK,IAAI;CAEZ,MAAM,eAAe;EACnB;EACA;EACA,SAAS;GACP,GAAG;GACH,GAAG,gBAAgB;GACnB,QAAQ;EACV;CACF;CASA,MAAM,SAAS,MAAM,UAPT,UAAU;EACpB;EACA,cAAc,SAAS;EACvB;EACA,aAAa,gBAAgB;CAC/B,CAE+B,GAAK,YAAY;CAEhD,KAAU,cAAc;EACtB,MAAM;EACN;EACA,QAAQ;EACR,OAAO;CACT,CAAC;CAED,OAAO;AACT,IACC,kBAAkB,YAAY,6BAA6B,aAAa,CAC3E"}
1
+ {"version":3,"file":"execute-request.js","names":[],"sources":["../../src/client-tools/execute-request.ts"],"sourcesContent":["import type { Chat } from '@ai-sdk/vue'\nimport { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport { buildRequestSecurity, getResolvedUrl } from '@scalar/workspace-store/request-example'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport type { UIDataTypes, UIMessage } from 'ai'\nimport { encode as encodeBase64 } from 'js-base64'\nimport { n } from 'neverpanic'\nimport truncateJson from 'truncate-json'\n\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities'\nimport { createError } from '@/entities/error/helpers'\nimport type { Tools } from '@/state/state'\n\n// The maximum number of bytes the requests response can be.\nconst MAX_RESPONSE_SIZE = 50_000\n\nconst getBody = n.safeFn(\n async (response: Response) => {\n const contentType = response.headers.get('content-type')\n\n if (contentType === 'application/json') {\n return { success: true, data: await response.json() }\n }\n\n return { success: true, data: await response.text() }\n },\n (originalError) => createError('FAILED_TO_PARSE_RESPONSE_BODY', { originalError }),\n)\n\nconst truncateResponse = (response: unknown) =>\n JSON.parse(truncateJson(JSON.stringify(response), MAX_RESPONSE_SIZE).jsonString)\n\n/* Result type wrapper for fetch */\nconst safeFetch = n.safeFn(\n async (url: string, init: RequestInit) => {\n const response = await fetch(url, init)\n\n const responseBodyResult = await getBody(response)\n\n if (!response.ok) {\n return {\n success: false,\n error: createError('REQUEST_NOT_OK', {\n status: response.status,\n url: response.url,\n responseBody: truncateResponse(responseBodyResult.success ? responseBodyResult.data : undefined),\n headers: Object.fromEntries(response.headers.entries()),\n }),\n }\n }\n\n if (!responseBodyResult.success) {\n return responseBodyResult\n }\n\n return {\n success: true,\n data: {\n status: response.status,\n responseBody: truncateResponse(responseBodyResult.data),\n headers: Object.fromEntries(response.headers.entries()),\n },\n }\n },\n (originalError) => createError('FAILED_TO_FETCH', { originalError }),\n)\n\nfunction createUrl({\n path,\n activeServer,\n proxyUrl,\n queryParams,\n}: {\n path: string\n activeServer: ServerObject | null\n proxyUrl: string\n queryParams: URLSearchParams\n}) {\n const resolvedUrl = getResolvedUrl({\n path,\n server: activeServer,\n urlParams: queryParams,\n })\n\n return redirectToProxy(proxyUrl, resolvedUrl)\n}\n\n/**\n * Executes an HTTP request with the specified options, including method, path, headers, and security schemes, and returns the processed response.\n */\nexport const executeRequestTool = n.safeFn(\n async ({\n documentSettings,\n toolCallId,\n chat,\n proxyUrl,\n input: { method, path, body, headers, documentName },\n }: {\n documentSettings: Record<\n string,\n { activeServer: ServerObject | null; securitySchemes: SecuritySchemeObjectSecret[] }\n >\n toolCallId: string\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n proxyUrl: string\n input: {\n method: string\n path: string\n headers?: Record<string, string>\n body?: string\n documentName: string\n }\n }) => {\n const settings = documentSettings[documentName]\n\n if (!settings) {\n return {\n success: false,\n error: createError('DOCUMENT_SETTINGS_COULD_NOT_BE_DETERMINED', {\n documentName,\n }),\n }\n }\n\n const requestSecurityOptions = buildRequestSecurity(settings.securitySchemes)\n\n const requestSecurity = requestSecurityOptions.reduce<{\n headers: Record<string, string>\n queryParams: URLSearchParams\n cookies: Record<string, string>\n }>(\n (acc, securityOption) => {\n /** Format the security value based on its authentication scheme. */\n const securityValue = (() => {\n if (securityOption.format === 'basic') {\n return `Basic ${encodeBase64(securityOption.value)}`\n }\n if (securityOption.format === 'bearer') {\n return `Bearer ${securityOption.value}`\n }\n return securityOption.value\n })()\n\n if (securityOption.in === 'header') {\n acc.headers[securityOption.name] = securityValue\n } else if (securityOption.in === 'query') {\n acc.queryParams.set(securityOption.name, securityValue)\n } else if (securityOption.in === 'cookie') {\n acc.cookies[securityOption.name] = securityValue\n }\n\n return acc\n },\n {\n headers: {},\n queryParams: new URLSearchParams(),\n cookies: {},\n },\n )\n\n const cookieHeader = Object.entries(requestSecurity.cookies)\n .map(([name, value]) => `${name}=${value}`)\n .join('; ')\n\n const fetchOptions = {\n method,\n body,\n headers: {\n ...headers,\n ...requestSecurity.headers,\n Cookie: cookieHeader,\n },\n }\n\n const url = createUrl({\n path,\n activeServer: settings.activeServer,\n proxyUrl,\n queryParams: requestSecurity.queryParams,\n })\n\n const result = await safeFetch(url, fetchOptions)\n\n void chat.addToolOutput({\n tool: EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n toolCallId,\n output: result,\n state: 'output-available',\n })\n\n return result\n },\n (originalError) => createError('FAILED_TO_EXECUTE_REQUEST', originalError),\n)\n"],"mappings":";;;;;;;;AAeA,IAAM,oBAAoB;AAE1B,IAAM,UAAU,EAAE,OAChB,OAAO,aAAuB;CAG5B,IAFoB,SAAS,QAAQ,IAAI,cAErC,MAAgB,oBAClB,OAAO;EAAE,SAAS;EAAM,MAAM,MAAM,SAAS,KAAK;CAAE;CAGtD,OAAO;EAAE,SAAS;EAAM,MAAM,MAAM,SAAS,KAAK;CAAE;AACtD,IACC,kBAAkB,YAAY,iCAAiC,EAAE,cAAc,CAAC,CACnF;AAEA,IAAM,oBAAoB,aACxB,KAAK,MAAM,aAAa,KAAK,UAAU,QAAQ,GAAG,iBAAiB,CAAC,CAAC,UAAU;AAGjF,IAAM,YAAY,EAAE,OAClB,OAAO,KAAa,SAAsB;CACxC,MAAM,WAAW,MAAM,MAAM,KAAK,IAAI;CAEtC,MAAM,qBAAqB,MAAM,QAAQ,QAAQ;CAEjD,IAAI,CAAC,SAAS,IACZ,OAAO;EACL,SAAS;EACT,OAAO,YAAY,kBAAkB;GACnC,QAAQ,SAAS;GACjB,KAAK,SAAS;GACd,cAAc,iBAAiB,mBAAmB,UAAU,mBAAmB,OAAO,KAAA,CAAS;GAC/F,SAAS,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;EACxD,CAAC;CACH;CAGF,IAAI,CAAC,mBAAmB,SACtB,OAAO;CAGT,OAAO;EACL,SAAS;EACT,MAAM;GACJ,QAAQ,SAAS;GACjB,cAAc,iBAAiB,mBAAmB,IAAI;GACtD,SAAS,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;EACxD;CACF;AACF,IACC,kBAAkB,YAAY,mBAAmB,EAAE,cAAc,CAAC,CACrE;AAEA,SAAS,UAAU,EACjB,MACA,cACA,UACA,eAMC;CAOD,OAAO,gBAAgB,UANH,eAAe;EACjC;EACA,QAAQ;EACR,WAAW;CACb,CAEiC,CAAW;AAC9C;;;;AAKA,IAAa,qBAAqB,EAAE,OAClC,OAAO,EACL,kBACA,YACA,MACA,UACA,OAAO,EAAE,QAAQ,MAAM,MAAM,SAAS,qBAgBlC;CACJ,MAAM,WAAW,iBAAiB;CAElC,IAAI,CAAC,UACH,OAAO;EACL,SAAS;EACT,OAAO,YAAY,6CAA6C,EAC9D,aACF,CAAC;CACH;CAKF,MAAM,kBAFyB,qBAAqB,SAAS,eAErC,CAAA,CAAuB,QAK5C,KAAK,mBAAmB;;EAEvB,MAAM,uBAAuB;GAC3B,IAAI,eAAe,WAAW,SAC5B,OAAO,SAAS,OAAa,eAAe,KAAK;GAEnD,IAAI,eAAe,WAAW,UAC5B,OAAO,UAAU,eAAe;GAElC,OAAO,eAAe;EACxB,EAAA,CAAG;EAEH,IAAI,eAAe,OAAO,UACxB,IAAI,QAAQ,eAAe,QAAQ;OAC9B,IAAI,eAAe,OAAO,SAC/B,IAAI,YAAY,IAAI,eAAe,MAAM,aAAa;OACjD,IAAI,eAAe,OAAO,UAC/B,IAAI,QAAQ,eAAe,QAAQ;EAGrC,OAAO;CACT,GACA;EACE,SAAS,CAAC;EACV,aAAa,IAAI,gBAAgB;EACjC,SAAS,CAAC;CACZ,CACF;CAEA,MAAM,eAAe,OAAO,QAAQ,gBAAgB,OAAO,CAAC,CACzD,KAAK,CAAC,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC,CAC1C,KAAK,IAAI;CAEZ,MAAM,eAAe;EACnB;EACA;EACA,SAAS;GACP,GAAG;GACH,GAAG,gBAAgB;GACnB,QAAQ;EACV;CACF;CASA,MAAM,SAAS,MAAM,UAPT,UAAU;EACpB;EACA,cAAc,SAAS;EACvB;EACA,aAAa,gBAAgB;CAC/B,CAE+B,GAAK,YAAY;CAEhD,KAAU,cAAc;EACtB,MAAM;EACN;EACA,QAAQ;EACR,OAAO;CACT,CAAC;CAED,OAAO;AACT,IACC,kBAAkB,YAAY,6BAA6B,aAAa,CAC3E"}
@@ -1,4 +1,4 @@
1
- import type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
1
+ import type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
2
2
  type __VLS_Props = {
3
3
  /** The selected server URL */
4
4
  selectedServer: ServerObject | null;
@@ -1 +1 @@
1
- {"version":3,"file":"Selector.vue.js","names":[],"sources":["../../src/components/Selector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarListbox } from '@scalar/components/listbox'\nimport { ScalarIconCaretDown } from '@scalar/icons'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed } from 'vue'\n\nconst { target, servers, selectedServer } = defineProps<{\n /** The selected server URL */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n /** The id of the target to use for the popover (e.g. address bar) */\n target: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the selected server changes */\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst serverOptions = computed(() =>\n servers.map((server) => ({\n id: server.url,\n label: server.url,\n })),\n)\n\nconst serverUrlWithoutTrailingSlash = computed(\n () => selectedServer?.url?.replace(/\\/$/, '') || '',\n)\n\nconst selectedServerOption = computed(() =>\n serverOptions.value.find((opt) => opt.id === selectedServer?.url),\n)\n\n// For testing\ndefineExpose({\n servers,\n serverUrlWithoutTrailingSlash,\n serverOptions,\n selectedServer,\n})\n</script>\n<template>\n <ScalarListbox\n v-if=\"serverOptions.length > 1\"\n ref=\"elem\"\n class=\"group\"\n :modelValue=\"selectedServerOption\"\n :options=\"serverOptions\"\n placement=\"bottom-start\"\n resize\n :target=\"target\"\n @update:modelValue=\"(e) => emit('update:modelValue', e.id)\">\n <ScalarButton\n class=\"bg-b-1 text-c-1 h-auto w-full justify-start gap-1.5 overflow-x-auto rounded-t-none rounded-b-xl px-3 py-1.5 text-base font-normal whitespace-nowrap -outline-offset-1\"\n variant=\"ghost\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{\n serverUrlWithoutTrailingSlash || 'Select a server'\n }}</span>\n <ScalarIconCaretDown\n class=\"text-c-2 ui-open:rotate-180 mt-0.25 size-3 transition-transform duration-100\"\n weight=\"bold\" />\n </ScalarButton>\n </ScalarListbox>\n <div\n v-else\n class=\"text-c-1 flex h-auto w-full items-center gap-0.75 rounded-b-lg px-3 py-1.5 text-base leading-[20px] whitespace-nowrap\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{ serverUrlWithoutTrailingSlash }}</span>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"Selector.vue.js","names":[],"sources":["../../src/components/Selector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarListbox } from '@scalar/components/listbox'\nimport { ScalarIconCaretDown } from '@scalar/icons'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed } from 'vue'\n\nconst { target, servers, selectedServer } = defineProps<{\n /** The selected server URL */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n /** The id of the target to use for the popover (e.g. address bar) */\n target: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the selected server changes */\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst serverOptions = computed(() =>\n servers.map((server) => ({\n id: server.url,\n label: server.url,\n })),\n)\n\nconst serverUrlWithoutTrailingSlash = computed(\n () => selectedServer?.url?.replace(/\\/$/, '') || '',\n)\n\nconst selectedServerOption = computed(() =>\n serverOptions.value.find((opt) => opt.id === selectedServer?.url),\n)\n\n// For testing\ndefineExpose({\n servers,\n serverUrlWithoutTrailingSlash,\n serverOptions,\n selectedServer,\n})\n</script>\n<template>\n <ScalarListbox\n v-if=\"serverOptions.length > 1\"\n ref=\"elem\"\n class=\"group\"\n :modelValue=\"selectedServerOption\"\n :options=\"serverOptions\"\n placement=\"bottom-start\"\n resize\n :target=\"target\"\n @update:modelValue=\"(e) => emit('update:modelValue', e.id)\">\n <ScalarButton\n class=\"bg-b-1 text-c-1 h-auto w-full justify-start gap-1.5 overflow-x-auto rounded-t-none rounded-b-xl px-3 py-1.5 text-base font-normal whitespace-nowrap -outline-offset-1\"\n variant=\"ghost\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{\n serverUrlWithoutTrailingSlash || 'Select a server'\n }}</span>\n <ScalarIconCaretDown\n class=\"text-c-2 ui-open:rotate-180 mt-0.25 size-3 transition-transform duration-100\"\n weight=\"bold\" />\n </ScalarButton>\n </ScalarListbox>\n <div\n v-else\n class=\"text-c-1 flex h-auto w-full items-center gap-0.75 rounded-b-lg px-3 py-1.5 text-base leading-[20px] whitespace-nowrap\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{ serverUrlWithoutTrailingSlash }}</span>\n </div>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"Selector.vue.script.js","names":[],"sources":["../../src/components/Selector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarListbox } from '@scalar/components/listbox'\nimport { ScalarIconCaretDown } from '@scalar/icons'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed } from 'vue'\n\nconst { target, servers, selectedServer } = defineProps<{\n /** The selected server URL */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n /** The id of the target to use for the popover (e.g. address bar) */\n target: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the selected server changes */\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst serverOptions = computed(() =>\n servers.map((server) => ({\n id: server.url,\n label: server.url,\n })),\n)\n\nconst serverUrlWithoutTrailingSlash = computed(\n () => selectedServer?.url?.replace(/\\/$/, '') || '',\n)\n\nconst selectedServerOption = computed(() =>\n serverOptions.value.find((opt) => opt.id === selectedServer?.url),\n)\n\n// For testing\ndefineExpose({\n servers,\n serverUrlWithoutTrailingSlash,\n serverOptions,\n selectedServer,\n})\n</script>\n<template>\n <ScalarListbox\n v-if=\"serverOptions.length > 1\"\n ref=\"elem\"\n class=\"group\"\n :modelValue=\"selectedServerOption\"\n :options=\"serverOptions\"\n placement=\"bottom-start\"\n resize\n :target=\"target\"\n @update:modelValue=\"(e) => emit('update:modelValue', e.id)\">\n <ScalarButton\n class=\"bg-b-1 text-c-1 h-auto w-full justify-start gap-1.5 overflow-x-auto rounded-t-none rounded-b-xl px-3 py-1.5 text-base font-normal whitespace-nowrap -outline-offset-1\"\n variant=\"ghost\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{\n serverUrlWithoutTrailingSlash || 'Select a server'\n }}</span>\n <ScalarIconCaretDown\n class=\"text-c-2 ui-open:rotate-180 mt-0.25 size-3 transition-transform duration-100\"\n weight=\"bold\" />\n </ScalarButton>\n </ScalarListbox>\n <div\n v-else\n class=\"text-c-1 flex h-auto w-full items-center gap-0.75 rounded-b-lg px-3 py-1.5 text-base leading-[20px] whitespace-nowrap\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{ serverUrlWithoutTrailingSlash }}</span>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAgBA,MAAM,OAAO;EAKb,MAAM,gBAAgB,eACpB,QAAA,QAAQ,KAAK,YAAY;GACvB,IAAI,OAAO;GACX,OAAO,OAAO;EAChB,EAAE,CACJ;EAEA,MAAM,gCAAgC,eAC9B,QAAA,gBAAgB,KAAK,QAAQ,OAAO,EAAE,KAAK,EACnD;EAEA,MAAM,uBAAuB,eAC3B,cAAc,MAAM,MAAM,QAAQ,IAAI,OAAO,QAAA,gBAAgB,GAAG,CAClE;EAGA,SAAa;GACX,SAAM,QAAA;GACN;GACA;GACA,gBAAa,QAAA;EACf,CAAC;;UAIS,cAAA,MAAc,SAAM,KAAA,UAAA,GAD5B,YAqBgB,MAAA,aAAA,GAAA;;IAnBd,KAAI;IACJ,OAAM;IACL,YAAY,qBAAA;IACZ,SAAS,cAAA;IACV,WAAU;IACV,QAAA;IACC,QAAQ,QAAA;IACR,uBAAiB,OAAA,OAAA,OAAA,MAAG,MAAM,KAAI,qBAAsB,EAAE,EAAE;;2BAW1C,CAVf,YAUe,MAAA,YAAA,GAAA;KATb,OAAM;KACN,SAAQ;;4BAC4B;gCAApC,mBAAoC,QAAA,EAA9B,OAAM,UAAS,GAAC,WAAO,EAAA;MAC7B,mBAES,QAFT,YAES,gBADP,8BAAA,SAA6B,iBAAA,GAAA,CAAA;MAE/B,YAEkB,MAAA,mBAAA,GAAA;OADhB,OAAM;OACN,QAAO;;;;;;;;;;uBAGb,mBAKM,OALN,YAKM,CAAA,OAAA,OAAA,OAAA,KAFJ,mBAAoC,QAAA,EAA9B,OAAM,UAAS,GAAC,WAAO,EAAA,IAC7B,mBAAwE,QAAxE,YAAwE,gBAAvC,8BAAA,KAA6B,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Selector.vue.script.js","names":[],"sources":["../../src/components/Selector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarListbox } from '@scalar/components/listbox'\nimport { ScalarIconCaretDown } from '@scalar/icons'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed } from 'vue'\n\nconst { target, servers, selectedServer } = defineProps<{\n /** The selected server URL */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n /** The id of the target to use for the popover (e.g. address bar) */\n target: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the selected server changes */\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst serverOptions = computed(() =>\n servers.map((server) => ({\n id: server.url,\n label: server.url,\n })),\n)\n\nconst serverUrlWithoutTrailingSlash = computed(\n () => selectedServer?.url?.replace(/\\/$/, '') || '',\n)\n\nconst selectedServerOption = computed(() =>\n serverOptions.value.find((opt) => opt.id === selectedServer?.url),\n)\n\n// For testing\ndefineExpose({\n servers,\n serverUrlWithoutTrailingSlash,\n serverOptions,\n selectedServer,\n})\n</script>\n<template>\n <ScalarListbox\n v-if=\"serverOptions.length > 1\"\n ref=\"elem\"\n class=\"group\"\n :modelValue=\"selectedServerOption\"\n :options=\"serverOptions\"\n placement=\"bottom-start\"\n resize\n :target=\"target\"\n @update:modelValue=\"(e) => emit('update:modelValue', e.id)\">\n <ScalarButton\n class=\"bg-b-1 text-c-1 h-auto w-full justify-start gap-1.5 overflow-x-auto rounded-t-none rounded-b-xl px-3 py-1.5 text-base font-normal whitespace-nowrap -outline-offset-1\"\n variant=\"ghost\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{\n serverUrlWithoutTrailingSlash || 'Select a server'\n }}</span>\n <ScalarIconCaretDown\n class=\"text-c-2 ui-open:rotate-180 mt-0.25 size-3 transition-transform duration-100\"\n weight=\"bold\" />\n </ScalarButton>\n </ScalarListbox>\n <div\n v-else\n class=\"text-c-1 flex h-auto w-full items-center gap-0.75 rounded-b-lg px-3 py-1.5 text-base leading-[20px] whitespace-nowrap\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{ serverUrlWithoutTrailingSlash }}</span>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAgBA,MAAM,OAAO;EAKb,MAAM,gBAAgB,eACpB,QAAA,QAAQ,KAAK,YAAY;GACvB,IAAI,OAAO;GACX,OAAO,OAAO;EAChB,EAAE,CACJ;EAEA,MAAM,gCAAgC,eAC9B,QAAA,gBAAgB,KAAK,QAAQ,OAAO,EAAE,KAAK,EACnD;EAEA,MAAM,uBAAuB,eAC3B,cAAc,MAAM,MAAM,QAAQ,IAAI,OAAO,QAAA,gBAAgB,GAAG,CAClE;EAGA,SAAa;GACX,SAAM,QAAA;GACN;GACA;GACA,gBAAa,QAAA;EACf,CAAC;;UAIS,cAAA,MAAc,SAAM,KAAA,UAAA,GAD5B,YAqBgB,MAAA,aAAA,GAAA;;IAnBd,KAAI;IACJ,OAAM;IACL,YAAY,qBAAA;IACZ,SAAS,cAAA;IACV,WAAU;IACV,QAAA;IACC,QAAQ,QAAA;IACR,uBAAiB,OAAA,OAAA,OAAA,MAAG,MAAM,KAAI,qBAAsB,EAAE,EAAE;;2BAW1C,CAVf,YAUe,MAAA,YAAA,GAAA;KATb,OAAM;KACN,SAAQ;;4BAC4B;gCAApC,mBAAoC,QAAA,EAA9B,OAAM,UAAS,GAAC,WAAO,EAAA;MAC7B,mBAES,QAFT,YAES,gBADP,8BAAA,SAA6B,iBAAA,GAAA,CAAA;MAE/B,YAEkB,MAAA,mBAAA,GAAA;OADhB,OAAM;OACN,QAAO;;;;;;;;;;uBAGb,mBAKM,OALN,YAKM,CAAA,OAAA,OAAA,OAAA,KAFJ,mBAAoC,QAAA,EAA9B,OAAM,UAAS,GAAC,WAAO,EAAA,IAC7B,mBAAwE,QAAxE,YAAwE,gBAAvC,8BAAA,KAA6B,GAAA,CAAA,CAAA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import type { WorkspaceEventBus } from '@scalar/workspace-store/events';
2
- import type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
2
+ import type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
3
3
  type SelectorProps = {
4
4
  /** The event bus to use for emitting events */
5
5
  eventBus: WorkspaceEventBus;
@@ -1 +1 @@
1
- {"version":3,"file":"ServerSelector.vue.js","names":[],"sources":["../../src/components/ServerSelector.vue"],"sourcesContent":["<script lang=\"ts\">\ntype SelectorProps = {\n /** The event bus to use for emitting events */\n eventBus: WorkspaceEventBus\n /** The selected server */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n}\n\n/**\n * ServerSelector\n *\n * Core component for rendering a server selector block.\n * Handles server selection and emits a 'server:update:selected' event when the selected server changes.\n *\n * @event server:update:selected - Emitted when the selected server changes\n * @event server:update:variables - Emitted when a server variable changes\n */\nexport default {}\n</script>\n\n<script lang=\"ts\" setup>\nimport { ServerVariablesForm } from '@scalar/api-client/components/Server'\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { useId } from 'vue'\n\nimport Selector from './Selector.vue'\n\nconst { eventBus, servers, selectedServer } = defineProps<SelectorProps>()\n\nconst id = useId()\n\n/** Update the selected server */\nconst updateServer = (newServer: string) => {\n eventBus.emit('server:update:selected', {\n url: selectedServer?.url === newServer ? '' : newServer,\n meta: {\n type: 'document',\n },\n })\n}\n\n/** Update the server variable */\nconst updateServerVariable = (key: string, value: string) => {\n /** Find the index of the selected server */\n const index = servers.findIndex((s) => s.url === selectedServer?.url)\n if (index === -1) {\n return\n }\n\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: {\n type: 'document',\n },\n })\n}\n</script>\n\n<template>\n <label\n class=\"bg-b-2 flex h-8 items-center rounded-t-xl border-x border-t px-3 py-2.5 font-medium\">\n Server\n </label>\n <div\n :id=\"id\"\n class=\"border\"\n :class=\"{\n 'rounded-b-xl':\n !selectedServer?.description && !selectedServer?.variables,\n }\">\n <Selector\n v-if=\"servers.length\"\n :selectedServer\n :servers=\"servers\"\n :target=\"id\"\n @update:modelValue=\"updateServer\" />\n </div>\n <ServerVariablesForm\n layout=\"reference\"\n :variables=\"selectedServer?.variables\"\n @update:variable=\"updateServerVariable\" />\n\n <!-- Description -->\n <ScalarMarkdown\n v-if=\"selectedServer?.description\"\n class=\"text-c-3 rounded-b-xl border-x border-b px-3 py-1.5\"\n :value=\"selectedServer.description\" />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ServerSelector.vue.js","names":[],"sources":["../../src/components/ServerSelector.vue"],"sourcesContent":["<script lang=\"ts\">\ntype SelectorProps = {\n /** The event bus to use for emitting events */\n eventBus: WorkspaceEventBus\n /** The selected server */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n}\n\n/**\n * ServerSelector\n *\n * Core component for rendering a server selector block.\n * Handles server selection and emits a 'server:update:selected' event when the selected server changes.\n *\n * @event server:update:selected - Emitted when the selected server changes\n * @event server:update:variables - Emitted when a server variable changes\n */\nexport default {}\n</script>\n\n<script lang=\"ts\" setup>\nimport { ServerVariablesForm } from '@scalar/api-client/components/Server'\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { useId } from 'vue'\n\nimport Selector from './Selector.vue'\n\nconst { eventBus, servers, selectedServer } = defineProps<SelectorProps>()\n\nconst id = useId()\n\n/** Update the selected server */\nconst updateServer = (newServer: string) => {\n eventBus.emit('server:update:selected', {\n url: selectedServer?.url === newServer ? '' : newServer,\n meta: {\n type: 'document',\n },\n })\n}\n\n/** Update the server variable */\nconst updateServerVariable = (key: string, value: string) => {\n /** Find the index of the selected server */\n const index = servers.findIndex((s) => s.url === selectedServer?.url)\n if (index === -1) {\n return\n }\n\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: {\n type: 'document',\n },\n })\n}\n</script>\n\n<template>\n <label\n class=\"bg-b-2 flex h-8 items-center rounded-t-xl border-x border-t px-3 py-2.5 font-medium\">\n Server\n </label>\n <div\n :id=\"id\"\n class=\"border\"\n :class=\"{\n 'rounded-b-xl':\n !selectedServer?.description && !selectedServer?.variables,\n }\">\n <Selector\n v-if=\"servers.length\"\n :selectedServer\n :servers=\"servers\"\n :target=\"id\"\n @update:modelValue=\"updateServer\" />\n </div>\n <ServerVariablesForm\n layout=\"reference\"\n :variables=\"selectedServer?.variables\"\n @update:variable=\"updateServerVariable\" />\n\n <!-- Description -->\n <ScalarMarkdown\n v-if=\"selectedServer?.description\"\n class=\"text-c-3 rounded-b-xl border-x border-b px-3 py-1.5\"\n :value=\"selectedServer.description\" />\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ServerSelector.vue.script.js","names":[],"sources":["../../src/components/ServerSelector.vue"],"sourcesContent":["<script lang=\"ts\">\ntype SelectorProps = {\n /** The event bus to use for emitting events */\n eventBus: WorkspaceEventBus\n /** The selected server */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n}\n\n/**\n * ServerSelector\n *\n * Core component for rendering a server selector block.\n * Handles server selection and emits a 'server:update:selected' event when the selected server changes.\n *\n * @event server:update:selected - Emitted when the selected server changes\n * @event server:update:variables - Emitted when a server variable changes\n */\nexport default {}\n</script>\n\n<script lang=\"ts\" setup>\nimport { ServerVariablesForm } from '@scalar/api-client/components/Server'\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { useId } from 'vue'\n\nimport Selector from './Selector.vue'\n\nconst { eventBus, servers, selectedServer } = defineProps<SelectorProps>()\n\nconst id = useId()\n\n/** Update the selected server */\nconst updateServer = (newServer: string) => {\n eventBus.emit('server:update:selected', {\n url: selectedServer?.url === newServer ? '' : newServer,\n meta: {\n type: 'document',\n },\n })\n}\n\n/** Update the server variable */\nconst updateServerVariable = (key: string, value: string) => {\n /** Find the index of the selected server */\n const index = servers.findIndex((s) => s.url === selectedServer?.url)\n if (index === -1) {\n return\n }\n\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: {\n type: 'document',\n },\n })\n}\n</script>\n\n<template>\n <label\n class=\"bg-b-2 flex h-8 items-center rounded-t-xl border-x border-t px-3 py-2.5 font-medium\">\n Server\n </label>\n <div\n :id=\"id\"\n class=\"border\"\n :class=\"{\n 'rounded-b-xl':\n !selectedServer?.description && !selectedServer?.variables,\n }\">\n <Selector\n v-if=\"servers.length\"\n :selectedServer\n :servers=\"servers\"\n :target=\"id\"\n @update:modelValue=\"updateServer\" />\n </div>\n <ServerVariablesForm\n layout=\"reference\"\n :variables=\"selectedServer?.variables\"\n @update:variable=\"updateServerVariable\" />\n\n <!-- Description -->\n <ScalarMarkdown\n v-if=\"selectedServer?.description\"\n class=\"text-c-3 rounded-b-xl border-x border-b px-3 py-1.5\"\n :value=\"selectedServer.description\" />\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAiCA,MAAM,KAAK,MAAM;;EAGjB,MAAM,gBAAgB,cAAsB;GAC1C,QAAA,SAAS,KAAK,0BAA0B;IACtC,KAAK,QAAA,gBAAgB,QAAQ,YAAY,KAAK;IAC9C,MAAM,EACJ,MAAM,WACR;GACF,CAAC;EACH;;EAGA,MAAM,wBAAwB,KAAa,UAAkB;;GAE3D,MAAM,QAAQ,QAAA,QAAQ,WAAW,MAAM,EAAE,QAAQ,QAAA,gBAAgB,GAAG;GACpE,IAAI,UAAU,IACZ;GAGF,QAAA,SAAS,KAAK,2BAA2B;IACvC;IACA;IACA;IACA,MAAM,EACJ,MAAM,WACR;GACF,CAAC;EACH;;;8BAIE,mBAGQ,SAAA,EAFN,OAAM,sFAAqF,GAAC,YAE9F,EAAA;IACA,mBAaM,OAAA;KAZH,IAAI,MAAA,EAAA;KACL,OAAK,eAAA,CAAC,UAAQ,EAAA,gBAAA,CAC2B,QAAA,gBAAgB,eAAW,CAAK,QAAA,gBAAgB,UAAA,CAAA,CAAA;QAKjF,QAAA,QAAQ,UAAA,UAAA,GADhB,YAKsC,kBAAA;;KAHnC,gBAAA,QAAA;KACA,SAAS,QAAA;KACT,QAAQ,MAAA,EAAA;KACR,uBAAmB;;;;;;IAExB,YAG4C,MAAA,mBAAA,GAAA;KAF1C,QAAO;KACN,WAAW,QAAA,gBAAgB;KAC3B,qBAAiB;;IAIZ,QAAA,gBAAgB,eAAA,UAAA,GADxB,YAGwC,MAAA,cAAA,GAAA;;KADtC,OAAM;KACL,OAAO,QAAA,eAAe"}
1
+ {"version":3,"file":"ServerSelector.vue.script.js","names":[],"sources":["../../src/components/ServerSelector.vue"],"sourcesContent":["<script lang=\"ts\">\ntype SelectorProps = {\n /** The event bus to use for emitting events */\n eventBus: WorkspaceEventBus\n /** The selected server */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n}\n\n/**\n * ServerSelector\n *\n * Core component for rendering a server selector block.\n * Handles server selection and emits a 'server:update:selected' event when the selected server changes.\n *\n * @event server:update:selected - Emitted when the selected server changes\n * @event server:update:variables - Emitted when a server variable changes\n */\nexport default {}\n</script>\n\n<script lang=\"ts\" setup>\nimport { ServerVariablesForm } from '@scalar/api-client/components/Server'\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { useId } from 'vue'\n\nimport Selector from './Selector.vue'\n\nconst { eventBus, servers, selectedServer } = defineProps<SelectorProps>()\n\nconst id = useId()\n\n/** Update the selected server */\nconst updateServer = (newServer: string) => {\n eventBus.emit('server:update:selected', {\n url: selectedServer?.url === newServer ? '' : newServer,\n meta: {\n type: 'document',\n },\n })\n}\n\n/** Update the server variable */\nconst updateServerVariable = (key: string, value: string) => {\n /** Find the index of the selected server */\n const index = servers.findIndex((s) => s.url === selectedServer?.url)\n if (index === -1) {\n return\n }\n\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: {\n type: 'document',\n },\n })\n}\n</script>\n\n<template>\n <label\n class=\"bg-b-2 flex h-8 items-center rounded-t-xl border-x border-t px-3 py-2.5 font-medium\">\n Server\n </label>\n <div\n :id=\"id\"\n class=\"border\"\n :class=\"{\n 'rounded-b-xl':\n !selectedServer?.description && !selectedServer?.variables,\n }\">\n <Selector\n v-if=\"servers.length\"\n :selectedServer\n :servers=\"servers\"\n :target=\"id\"\n @update:modelValue=\"updateServer\" />\n </div>\n <ServerVariablesForm\n layout=\"reference\"\n :variables=\"selectedServer?.variables\"\n @update:variable=\"updateServerVariable\" />\n\n <!-- Description -->\n <ScalarMarkdown\n v-if=\"selectedServer?.description\"\n class=\"text-c-3 rounded-b-xl border-x border-b px-3 py-1.5\"\n :value=\"selectedServer.description\" />\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAiCA,MAAM,KAAK,MAAM;;EAGjB,MAAM,gBAAgB,cAAsB;GAC1C,QAAA,SAAS,KAAK,0BAA0B;IACtC,KAAK,QAAA,gBAAgB,QAAQ,YAAY,KAAK;IAC9C,MAAM,EACJ,MAAM,WACR;GACF,CAAC;EACH;;EAGA,MAAM,wBAAwB,KAAa,UAAkB;;GAE3D,MAAM,QAAQ,QAAA,QAAQ,WAAW,MAAM,EAAE,QAAQ,QAAA,gBAAgB,GAAG;GACpE,IAAI,UAAU,IACZ;GAGF,QAAA,SAAS,KAAK,2BAA2B;IACvC;IACA;IACA;IACA,MAAM,EACJ,MAAM,WACR;GACF,CAAC;EACH;;;8BAIE,mBAGQ,SAAA,EAFN,OAAM,sFAAqF,GAAC,YAE9F,EAAA;IACA,mBAaM,OAAA;KAZH,IAAI,MAAA,EAAA;KACL,OAAK,eAAA,CAAC,UAAQ,EAAA,gBAAA,CAC2B,QAAA,gBAAgB,eAAW,CAAK,QAAA,gBAAgB,UAAA,CAAA,CAAA;QAKjF,QAAA,QAAQ,UAAA,UAAA,GADhB,YAKsC,kBAAA;;KAHnC,gBAAA,QAAA;KACA,SAAS,QAAA;KACT,QAAQ,MAAA,EAAA;KACR,uBAAmB;;;;;;IAExB,YAG4C,MAAA,mBAAA,GAAA;KAF1C,QAAO;KACN,WAAW,QAAA,gBAAgB;KAC3B,qBAAiB;;IAIZ,QAAA,gBAAgB,eAAA,UAAA,GADxB,YAGwC,MAAA,cAAA,GAAA;;KADtC,OAAM;KACL,OAAO,QAAA,eAAe"}
package/dist/helpers.d.ts CHANGED
@@ -2,12 +2,12 @@ import type { OpenAPIV3_1 } from '@scalar/openapi-types';
2
2
  import type { WorkspaceStore } from '@scalar/workspace-store/client';
3
3
  import { type Auth } from '@scalar/workspace-store/entities/auth';
4
4
  import type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example';
5
- import type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
5
+ import type { OperationObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
6
6
  export declare function getOperations(doc: Partial<OpenAPIV3_1.Document>): OperationObject[];
7
7
  /** Generate document settings from workspace store. AsyncAPI docs are skipped — this feature is OpenAPI-native. */
8
8
  export declare function createDocumentSettings(workspaceStore: WorkspaceStore): {
9
9
  [k: string]: {
10
- activeServer: import("@scalar/workspace-store/schemas/v3.1/strict/server").ServerObject | null;
10
+ activeServer: import("@scalar/workspace-store/schemas/v3.2/strict/server").ServerObject | null;
11
11
  securitySchemes: SecuritySchemeObjectSecret[];
12
12
  };
13
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","names":[],"sources":["../src/helpers.ts"],"sourcesContent":["import { REFERENCE_LS_KEYS, safeLocalStorage } from '@scalar/helpers/object/local-storage'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport { type Auth, AuthSchema } from '@scalar/workspace-store/entities/auth'\nimport type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport {\n getSecurityRequirements,\n getSecuritySchemes,\n getSelectedSecurity,\n getSelectedServer,\n getServers,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport { isOpenApiDocument } from '@scalar/workspace-store/schemas/type-guards'\nimport { coerceValue } from '@scalar/workspace-store/schemas/typebox-coerce'\nimport type { OpenApiDocument, OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\n\nexport function getOperations(doc: Partial<OpenAPIV3_1.Document>) {\n return Object.values(doc.paths ?? {}).flatMap((path) => Object.values(path ?? {})) as OperationObject[]\n}\n\n/** Flattens all security requirements from a document */\nfunction getSecurityFromDocument(\n documentName: string,\n document: OpenApiDocument,\n authStore: AuthStore,\n): SecuritySchemeObjectSecret[] {\n const mergedSecurity = mergeSecurity(document?.components?.securitySchemes, {}, authStore, documentName)\n\n const securityRequirements = getSecurityRequirements(document.security)\n\n const selectedSecurity = getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName,\n }),\n undefined,\n securityRequirements,\n )\n\n return getSecuritySchemes(mergedSecurity, selectedSecurity.selectedSchemes[selectedSecurity.selectedIndex] ?? {})\n}\n\n/** Generate document settings from workspace store. AsyncAPI docs are skipped — this feature is OpenAPI-native. */\nexport function createDocumentSettings(workspaceStore: WorkspaceStore) {\n const openApiEntries: [string, OpenApiDocument][] = []\n for (const [key, document] of Object.entries(workspaceStore.workspace.documents)) {\n if (isOpenApiDocument(document)) {\n openApiEntries.push([key, document])\n }\n }\n\n return Object.fromEntries(\n openApiEntries.map(([key, document]) => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return [\n key,\n {\n activeServer: getSelectedServer(document, null, null, servers),\n securitySchemes: getSecurityFromDocument(key, document, workspaceStore.auth),\n },\n ]\n }),\n )\n}\n\n// Local storage helper instance, safely wrapped.\nconst storage = safeLocalStorage()\n\n/**\n * Provides an interface to store and retrieve authentication scheme\n * information in local storage, including both the available schemes and\n * the user's selected schemes.\n */\nexport const authStorage = () => {\n const getKey = (slug: string) => {\n return `${REFERENCE_LS_KEYS.AUTH}-${slug}`\n }\n\n return {\n /**\n * Retrieves and coerces the authentication schemes stored in local storage.\n */\n getAuth: (slug: string) => {\n const parsed = JSON.parse(storage.getItem(getKey(slug)) ?? '{}')\n return coerceValue(AuthSchema, parsed)\n },\n /**\n * Stores the authentication schemes in local storage.\n * @param value The Auth object to stringify and store.\n */\n setAuth: (slug: string, value: Auth) => {\n storage.setItem(getKey(slug), JSON.stringify(value))\n },\n }\n}\n\n/**\n * Restores authentication secrets from local storage to the workspace store.\n *\n * This function iterates through stored authentication schemes and restores\n * any secret values (keys starting with x-scalar-secret-) to the active\n * document's security schemes. It uses the current security schemes as the\n * source of truth, only restoring secrets for structures that exist in the\n * current document.\n */\nexport const restoreAuthSecretsFromStorage = ({\n documentName,\n workspaceStore,\n}: {\n documentName: string\n workspaceStore: WorkspaceStore\n}): void => {\n const authPersistence = authStorage()\n const auth = authPersistence.getAuth(documentName)\n workspaceStore.auth.load({ [documentName]: auth })\n}\n\nexport function safeParseJson(value: string) {\n try {\n return JSON.parse(value)\n } catch {\n return\n }\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,cAAc,KAAoC;CAChE,OAAO,OAAO,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAC;AACnF;;AAGA,SAAS,wBACP,cACA,UACA,WAC8B;CAC9B,MAAM,iBAAiB,cAAc,UAAU,YAAY,iBAAiB,CAAC,GAAG,WAAW,YAAY;CAEvG,MAAM,uBAAuB,wBAAwB,SAAS,QAAQ;CAEtE,MAAM,mBAAmB,oBACvB,UAAU,uBAAuB;EAC/B,MAAM;EACN;CACF,CAAC,GACD,KAAA,GACA,oBACF;CAEA,OAAO,mBAAmB,gBAAgB,iBAAiB,gBAAgB,iBAAiB,kBAAkB,CAAC,CAAC;AAClH;;AAGA,SAAgB,uBAAuB,gBAAgC;CACrE,MAAM,iBAA8C,CAAC;CACrD,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,eAAe,UAAU,SAAS,GAC7E,IAAI,kBAAkB,QAAQ,GAC5B,eAAe,KAAK,CAAC,KAAK,QAAQ,CAAC;CAIvC,OAAO,OAAO,YACZ,eAAe,KAAK,CAAC,KAAK,cAAc;EAKtC,OAAO,CACL,KACA;GACE,cAAc,kBAAkB,UAAU,MAAM,MAPpC,WAAW,SAAS,SAAS,EAC3C,aAAa,SAAS,gCACxB,CAK0D,CAAO;GAC7D,iBAAiB,wBAAwB,KAAK,UAAU,eAAe,IAAI;EAC7E,CACF;CACF,CAAC,CACH;AACF;AAGA,IAAM,UAAU,iBAAiB;;;;;;AAOjC,IAAa,oBAAoB;CAC/B,MAAM,UAAU,SAAiB;EAC/B,OAAO,GAAG,kBAAkB,KAAK,GAAG;CACtC;CAEA,OAAO;;;;EAIL,UAAU,SAAiB;GAEzB,OAAO,YAAY,YADJ,KAAK,MAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC,KAAK,IAC5B,CAAM;EACvC;;;;;EAKA,UAAU,MAAc,UAAgB;GACtC,QAAQ,QAAQ,OAAO,IAAI,GAAG,KAAK,UAAU,KAAK,CAAC;EACrD;CACF;AACF;;;;;;;;;;AAWA,IAAa,iCAAiC,EAC5C,cACA,qBAIU;CAEV,MAAM,OADkB,YACX,CAAA,CAAgB,QAAQ,YAAY;CACjD,eAAe,KAAK,KAAK,GAAG,eAAe,KAAK,CAAC;AACnD;AAEA,SAAgB,cAAc,OAAe;CAC3C,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN;CACF;AACF"}
1
+ {"version":3,"file":"helpers.js","names":[],"sources":["../src/helpers.ts"],"sourcesContent":["import { REFERENCE_LS_KEYS, safeLocalStorage } from '@scalar/helpers/object/local-storage'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport { type Auth, AuthSchema } from '@scalar/workspace-store/entities/auth'\nimport type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport {\n getSecurityRequirements,\n getSecuritySchemes,\n getSelectedSecurity,\n getSelectedServer,\n getServers,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport { isOpenApiDocument } from '@scalar/workspace-store/schemas/type-guards'\nimport { coerceValue } from '@scalar/workspace-store/schemas/typebox-coerce'\nimport type { OpenApiDocument, OperationObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\nexport function getOperations(doc: Partial<OpenAPIV3_1.Document>) {\n return Object.values(doc.paths ?? {}).flatMap((path) => Object.values(path ?? {})) as OperationObject[]\n}\n\n/** Flattens all security requirements from a document */\nfunction getSecurityFromDocument(\n documentName: string,\n document: OpenApiDocument,\n authStore: AuthStore,\n): SecuritySchemeObjectSecret[] {\n const mergedSecurity = mergeSecurity(document?.components?.securitySchemes, {}, authStore, documentName)\n\n const securityRequirements = getSecurityRequirements(document.security)\n\n const selectedSecurity = getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName,\n }),\n undefined,\n securityRequirements,\n )\n\n return getSecuritySchemes(mergedSecurity, selectedSecurity.selectedSchemes[selectedSecurity.selectedIndex] ?? {})\n}\n\n/** Generate document settings from workspace store. AsyncAPI docs are skipped — this feature is OpenAPI-native. */\nexport function createDocumentSettings(workspaceStore: WorkspaceStore) {\n const openApiEntries: [string, OpenApiDocument][] = []\n for (const [key, document] of Object.entries(workspaceStore.workspace.documents)) {\n if (isOpenApiDocument(document)) {\n openApiEntries.push([key, document])\n }\n }\n\n return Object.fromEntries(\n openApiEntries.map(([key, document]) => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return [\n key,\n {\n activeServer: getSelectedServer(document, null, null, servers),\n securitySchemes: getSecurityFromDocument(key, document, workspaceStore.auth),\n },\n ]\n }),\n )\n}\n\n// Local storage helper instance, safely wrapped.\nconst storage = safeLocalStorage()\n\n/**\n * Provides an interface to store and retrieve authentication scheme\n * information in local storage, including both the available schemes and\n * the user's selected schemes.\n */\nexport const authStorage = () => {\n const getKey = (slug: string) => {\n return `${REFERENCE_LS_KEYS.AUTH}-${slug}`\n }\n\n return {\n /**\n * Retrieves and coerces the authentication schemes stored in local storage.\n */\n getAuth: (slug: string) => {\n const parsed = JSON.parse(storage.getItem(getKey(slug)) ?? '{}')\n return coerceValue(AuthSchema, parsed)\n },\n /**\n * Stores the authentication schemes in local storage.\n * @param value The Auth object to stringify and store.\n */\n setAuth: (slug: string, value: Auth) => {\n storage.setItem(getKey(slug), JSON.stringify(value))\n },\n }\n}\n\n/**\n * Restores authentication secrets from local storage to the workspace store.\n *\n * This function iterates through stored authentication schemes and restores\n * any secret values (keys starting with x-scalar-secret-) to the active\n * document's security schemes. It uses the current security schemes as the\n * source of truth, only restoring secrets for structures that exist in the\n * current document.\n */\nexport const restoreAuthSecretsFromStorage = ({\n documentName,\n workspaceStore,\n}: {\n documentName: string\n workspaceStore: WorkspaceStore\n}): void => {\n const authPersistence = authStorage()\n const auth = authPersistence.getAuth(documentName)\n workspaceStore.auth.load({ [documentName]: auth })\n}\n\nexport function safeParseJson(value: string) {\n try {\n return JSON.parse(value)\n } catch {\n return\n }\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,cAAc,KAAoC;CAChE,OAAO,OAAO,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAC;AACnF;;AAGA,SAAS,wBACP,cACA,UACA,WAC8B;CAC9B,MAAM,iBAAiB,cAAc,UAAU,YAAY,iBAAiB,CAAC,GAAG,WAAW,YAAY;CAEvG,MAAM,uBAAuB,wBAAwB,SAAS,QAAQ;CAEtE,MAAM,mBAAmB,oBACvB,UAAU,uBAAuB;EAC/B,MAAM;EACN;CACF,CAAC,GACD,KAAA,GACA,oBACF;CAEA,OAAO,mBAAmB,gBAAgB,iBAAiB,gBAAgB,iBAAiB,kBAAkB,CAAC,CAAC;AAClH;;AAGA,SAAgB,uBAAuB,gBAAgC;CACrE,MAAM,iBAA8C,CAAC;CACrD,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,eAAe,UAAU,SAAS,GAC7E,IAAI,kBAAkB,QAAQ,GAC5B,eAAe,KAAK,CAAC,KAAK,QAAQ,CAAC;CAIvC,OAAO,OAAO,YACZ,eAAe,KAAK,CAAC,KAAK,cAAc;EAKtC,OAAO,CACL,KACA;GACE,cAAc,kBAAkB,UAAU,MAAM,MAPpC,WAAW,SAAS,SAAS,EAC3C,aAAa,SAAS,gCACxB,CAK0D,CAAO;GAC7D,iBAAiB,wBAAwB,KAAK,UAAU,eAAe,IAAI;EAC7E,CACF;CACF,CAAC,CACH;AACF;AAGA,IAAM,UAAU,iBAAiB;;;;;;AAOjC,IAAa,oBAAoB;CAC/B,MAAM,UAAU,SAAiB;EAC/B,OAAO,GAAG,kBAAkB,KAAK,GAAG;CACtC;CAEA,OAAO;;;;EAIL,UAAU,SAAiB;GAEzB,OAAO,YAAY,YADJ,KAAK,MAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC,KAAK,IAC5B,CAAM;EACvC;;;;;EAKA,UAAU,MAAc,UAAgB;GACtC,QAAQ,QAAQ,OAAO,IAAI,GAAG,KAAK,UAAU,KAAK,CAAC;EACrD;CACF;AACF;;;;;;;;;;AAWA,IAAa,iCAAiC,EAC5C,cACA,qBAIU;CAEV,MAAM,OADkB,YACX,CAAA,CAAgB,QAAQ,YAAY;CACjD,eAAe,KAAK,KAAK,GAAG,eAAe,KAAK,CAAC;AACnD;AAEA,SAAgB,cAAc,OAAe;CAC3C,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN;CACF;AACF"}
package/dist/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "git+https://github.com/scalar/scalar.git",
11
11
  "directory": "packages/agent-chat"
12
12
  },
13
- "version": "0.12.30",
13
+ "version": "0.12.32",
14
14
  "engines": {
15
15
  "node": ">=22"
16
16
  },
package/dist/style.css CHANGED
@@ -257,7 +257,7 @@
257
257
  transform: translate3d(0, 0, 0);
258
258
  }
259
259
 
260
- .dark-mode .scalar-dropdown-item[data-v-f5e0d3d8]:hover, .dark-mode .scalar-dropdown-item[data-highlighted][data-v-f5e0d3d8], .dark-mode .scalar-dropdown-item[data-v-3402682d]:hover {
260
+ .dark-mode .scalar-dropdown-item[data-v-128eed00]:hover, .dark-mode .scalar-dropdown-item[data-highlighted][data-v-128eed00], .dark-mode .scalar-dropdown-item[data-v-3402682d]:hover {
261
261
  filter: brightness(1.1);
262
262
  }
263
263
 
@@ -1461,11 +1461,11 @@
1461
1461
  background: var(--scalar-sidebar-item-hover-background, var(--scalar-background-2));
1462
1462
  }
1463
1463
 
1464
- .fade-request-section-content[data-v-07ff8fc3] {
1464
+ .fade-request-section-content[data-v-ac788106] {
1465
1465
  background: linear-gradient(to left, var(--scalar-background-1) 64%, transparent);
1466
1466
  }
1467
1467
 
1468
- .filter-hover[data-v-07ff8fc3] {
1468
+ .filter-hover[data-v-ac788106] {
1469
1469
  height: 100%;
1470
1470
  padding-left: 24px;
1471
1471
  padding-right: 39px;
@@ -1475,12 +1475,12 @@
1475
1475
  overflow: hidden;
1476
1476
  }
1477
1477
 
1478
- .filter-hover[data-v-07ff8fc3]:hover, .filter-hover[data-v-07ff8fc3]:has(:focus-visible) {
1478
+ .filter-hover[data-v-ac788106]:hover, .filter-hover[data-v-ac788106]:has(:focus-visible) {
1479
1479
  z-index: 10;
1480
1480
  width: 100%;
1481
1481
  }
1482
1482
 
1483
- .filter-hover[data-v-07ff8fc3]:before {
1483
+ .filter-hover[data-v-ac788106]:before {
1484
1484
  content: "";
1485
1485
  background-color: var(--scalar-background-1);
1486
1486
  opacity: 0;
@@ -1493,90 +1493,90 @@
1493
1493
  left: 0;
1494
1494
  }
1495
1495
 
1496
- .filter-hover-item[data-v-07ff8fc3] {
1496
+ .filter-hover-item[data-v-ac788106] {
1497
1497
  opacity: 0;
1498
1498
  }
1499
1499
 
1500
- .filter-hover-item[data-v-07ff8fc3]:not(:last-of-type) {
1500
+ .filter-hover-item[data-v-ac788106]:not(:last-of-type) {
1501
1501
  transform: translate3d(0, 3px, 0);
1502
1502
  }
1503
1503
 
1504
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3] {
1504
+ .filter-hover:hover .filter-hover-item[data-v-ac788106] {
1505
1505
  transition: opacity .2s ease-in-out, transform .2s ease-in-out;
1506
1506
  }
1507
1507
 
1508
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3]:last-of-type {
1508
+ .filter-hover:hover .filter-hover-item[data-v-ac788106]:last-of-type {
1509
1509
  transition-delay: 50ms;
1510
1510
  }
1511
1511
 
1512
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3]:nth-last-of-type(2) {
1512
+ .filter-hover:hover .filter-hover-item[data-v-ac788106]:nth-last-of-type(2) {
1513
1513
  transition-delay: .1s;
1514
1514
  }
1515
1515
 
1516
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3]:nth-last-of-type(3) {
1516
+ .filter-hover:hover .filter-hover-item[data-v-ac788106]:nth-last-of-type(3) {
1517
1517
  transition-delay: .15s;
1518
1518
  }
1519
1519
 
1520
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3]:nth-last-of-type(4) {
1520
+ .filter-hover:hover .filter-hover-item[data-v-ac788106]:nth-last-of-type(4) {
1521
1521
  transition-delay: .2s;
1522
1522
  }
1523
1523
 
1524
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3]:nth-last-of-type(5) {
1524
+ .filter-hover:hover .filter-hover-item[data-v-ac788106]:nth-last-of-type(5) {
1525
1525
  transition-delay: .25s;
1526
1526
  }
1527
1527
 
1528
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3]:nth-last-of-type(6) {
1528
+ .filter-hover:hover .filter-hover-item[data-v-ac788106]:nth-last-of-type(6) {
1529
1529
  transition-delay: .3s;
1530
1530
  }
1531
1531
 
1532
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3]:nth-last-of-type(7) {
1532
+ .filter-hover:hover .filter-hover-item[data-v-ac788106]:nth-last-of-type(7) {
1533
1533
  transition-delay: .35s;
1534
1534
  }
1535
1535
 
1536
- .filter-hover:hover .filter-hover-item[data-v-07ff8fc3], .filter-hover:has(:focus-visible) .filter-hover-item[data-v-07ff8fc3] {
1536
+ .filter-hover:hover .filter-hover-item[data-v-ac788106], .filter-hover:has(:focus-visible) .filter-hover-item[data-v-ac788106] {
1537
1537
  opacity: 1;
1538
1538
  transform: translate3d(0, 0, 0);
1539
1539
  }
1540
1540
 
1541
- .filter-hover[data-v-07ff8fc3]:hover:before, .filter-hover[data-v-07ff8fc3]:has(:focus-visible):before {
1541
+ .filter-hover[data-v-ac788106]:hover:before, .filter-hover[data-v-ac788106]:has(:focus-visible):before {
1542
1542
  opacity: .9;
1543
1543
  -webkit-backdrop-filter: blur(10px);
1544
1544
  backdrop-filter: blur(10px);
1545
1545
  }
1546
1546
 
1547
- .filter-button[data-v-07ff8fc3] {
1547
+ .filter-button[data-v-ac788106] {
1548
1548
  top: 50%;
1549
1549
  transform: translateY(-50%);
1550
1550
  }
1551
1551
 
1552
- .context-bar-group:hover .context-bar-group-hover\:text-c-1[data-v-07ff8fc3], .context-bar-group:has(:focus-visible) .context-bar-group-hover\:text-c-1[data-v-07ff8fc3] {
1552
+ .context-bar-group:hover .context-bar-group-hover\:text-c-1[data-v-ac788106], .context-bar-group:has(:focus-visible) .context-bar-group-hover\:text-c-1[data-v-ac788106] {
1553
1553
  --tw-text-opacity: 1;
1554
1554
  color: rgb(var(--scalar-color-1) / var(--tw-text-opacity));
1555
1555
  }
1556
1556
 
1557
- .context-bar-group:hover .context-bar-group-hover\:hidden[data-v-07ff8fc3], .context-bar-group:has(:focus-visible) .context-bar-group-hover\:hidden[data-v-07ff8fc3] {
1557
+ .context-bar-group:hover .context-bar-group-hover\:hidden[data-v-ac788106], .context-bar-group:has(:focus-visible) .context-bar-group-hover\:hidden[data-v-ac788106] {
1558
1558
  display: none;
1559
1559
  }
1560
1560
 
1561
- [data-v-dfc591f4] .cm-editor {
1561
+ [data-v-dbc85839] .cm-editor {
1562
1562
  background: none;
1563
1563
  outline: none;
1564
1564
  height: 100%;
1565
1565
  padding: 0;
1566
1566
  }
1567
1567
 
1568
- [data-v-dfc591f4] .cm-placeholder {
1568
+ [data-v-dbc85839] .cm-placeholder {
1569
1569
  color: var(--scalar-color-3);
1570
1570
  }
1571
1571
 
1572
- [data-v-dfc591f4] .cm-content {
1572
+ [data-v-dbc85839] .cm-content {
1573
1573
  font-family: var(--scalar-font-code);
1574
1574
  font-size: var(--scalar-small);
1575
1575
  max-height: 20px;
1576
1576
  padding: 8px 0;
1577
1577
  }
1578
1578
 
1579
- [data-v-dfc591f4] .cm-tooltip {
1579
+ [data-v-dbc85839] .cm-tooltip {
1580
1580
  filter: brightness(var(--scalar-lifted-brightness));
1581
1581
  border-radius: var(--scalar-radius);
1582
1582
  box-shadow: var(--scalar-shadow-2);
@@ -1586,47 +1586,47 @@
1586
1586
  overflow: hidden !important;
1587
1587
  }
1588
1588
 
1589
- [data-v-dfc591f4] .cm-tooltip-autocomplete ul li {
1589
+ [data-v-dbc85839] .cm-tooltip-autocomplete ul li {
1590
1590
  padding: 3px 6px !important;
1591
1591
  }
1592
1592
 
1593
- [data-v-dfc591f4] .cm-completionIcon-type:after {
1593
+ [data-v-dbc85839] .cm-completionIcon-type:after {
1594
1594
  color: var(--scalar-color-3) !important;
1595
1595
  }
1596
1596
 
1597
- [data-v-dfc591f4] .cm-tooltip-autocomplete ul li[aria-selected] {
1597
+ [data-v-dbc85839] .cm-tooltip-autocomplete ul li[aria-selected] {
1598
1598
  background: var(--scalar-background-2) !important;
1599
1599
  color: var(--scalar-color-1) !important;
1600
1600
  }
1601
1601
 
1602
- [data-v-dfc591f4] .cm-tooltip-autocomplete ul {
1602
+ [data-v-dbc85839] .cm-tooltip-autocomplete ul {
1603
1603
  position: relative;
1604
1604
  padding: 6px !important;
1605
1605
  }
1606
1606
 
1607
- [data-v-dfc591f4] .cm-tooltip-autocomplete ul li:hover {
1607
+ [data-v-dbc85839] .cm-tooltip-autocomplete ul li:hover {
1608
1608
  border-radius: 3px;
1609
1609
  color: var(--scalar-color-1) !important;
1610
1610
  background: var(--scalar-background-3) !important;
1611
1611
  }
1612
1612
 
1613
- [data-v-dfc591f4] .cm-activeLine, [data-v-dfc591f4] .cm-activeLineGutter {
1613
+ [data-v-dbc85839] .cm-activeLine, [data-v-dbc85839] .cm-activeLineGutter {
1614
1614
  background-color: #0000;
1615
1615
  }
1616
1616
 
1617
- [data-v-dfc591f4] .cm-selectionMatch, [data-v-dfc591f4] .cm-matchingBracket {
1617
+ [data-v-dbc85839] .cm-selectionMatch, [data-v-dbc85839] .cm-matchingBracket {
1618
1618
  border-radius: var(--scalar-radius);
1619
1619
  background: var(--scalar-background-4) !important;
1620
1620
  }
1621
1621
 
1622
- [data-v-dfc591f4] .cm-css-color-picker-wrapper {
1622
+ [data-v-dbc85839] .cm-css-color-picker-wrapper {
1623
1623
  outline: 1px solid var(--scalar-background-3);
1624
1624
  border-radius: 3px;
1625
1625
  display: inline-flex;
1626
1626
  overflow: hidden;
1627
1627
  }
1628
1628
 
1629
- [data-v-dfc591f4] .cm-gutters {
1629
+ [data-v-dbc85839] .cm-gutters {
1630
1630
  color: var(--scalar-color-3);
1631
1631
  font-size: var(--scalar-small);
1632
1632
  background-color: #0000;
@@ -1635,7 +1635,7 @@
1635
1635
  line-height: 22px;
1636
1636
  }
1637
1637
 
1638
- [data-v-dfc591f4] .cm-gutters:before {
1638
+ [data-v-dbc85839] .cm-gutters:before {
1639
1639
  content: "";
1640
1640
  border-radius: var(--scalar-radius) 0 0 var(--scalar-radius);
1641
1641
  background-color: var(--scalar-background-1);
@@ -1646,7 +1646,7 @@
1646
1646
  left: 2px;
1647
1647
  }
1648
1648
 
1649
- [data-v-dfc591f4] .cm-gutterElement {
1649
+ [data-v-dbc85839] .cm-gutterElement {
1650
1650
  justify-content: flex-end;
1651
1651
  align-items: center;
1652
1652
  display: flex;
@@ -1656,19 +1656,28 @@
1656
1656
  padding-right: 6px !important;
1657
1657
  }
1658
1658
 
1659
- [data-v-dfc591f4] .cm-lineNumbers .cm-gutterElement {
1659
+ [data-v-dbc85839] .cm-lineNumbers .cm-gutterElement {
1660
1660
  min-width: fit-content;
1661
1661
  }
1662
1662
 
1663
- [data-v-dfc591f4] .cm-gutter + .cm-gutter :not(.cm-foldGutter) .cm-gutterElement {
1663
+ [data-v-dbc85839] .cm-gutter + .cm-gutter :not(.cm-foldGutter) .cm-gutterElement {
1664
1664
  padding-left: 0 !important;
1665
1665
  }
1666
1666
 
1667
- [data-v-dfc591f4] .cm-scroller {
1667
+ [data-v-dbc85839] .cm-scroller {
1668
1668
  overflow: auto;
1669
1669
  }
1670
1670
 
1671
- .line-wrapping[data-v-dfc591f4]:focus-within .cm-content {
1671
+ [data-v-dbc85839] .cm-lineWrapping .cm-line {
1672
+ word-break: break-all;
1673
+ }
1674
+
1675
+ [data-v-dbc85839] .cm-lineWrapping .cm-content {
1676
+ white-space: pre-wrap;
1677
+ max-height: none;
1678
+ }
1679
+
1680
+ .line-wrapping[data-v-dbc85839]:focus-within .cm-content {
1672
1681
  white-space: break-spaces;
1673
1682
  word-break: break-all;
1674
1683
  min-height: fit-content;
@@ -1763,12 +1772,12 @@
1763
1772
  color: var(--scalar-color-1);
1764
1773
  }
1765
1774
 
1766
- .code-input-lite[data-v-4dfd05a3] {
1775
+ .code-input-lite[data-v-b22775cd] {
1767
1776
  align-items: center;
1768
1777
  display: flex;
1769
1778
  }
1770
1779
 
1771
- .code-input-lite__editor[data-v-4dfd05a3] {
1780
+ .code-input-lite__editor[data-v-b22775cd] {
1772
1781
  font: inherit;
1773
1782
  letter-spacing: inherit;
1774
1783
  min-width: 0;
@@ -1786,11 +1795,11 @@
1786
1795
  overflow: auto hidden;
1787
1796
  }
1788
1797
 
1789
- .code-input-lite__editor[data-v-4dfd05a3]::-webkit-scrollbar {
1798
+ .code-input-lite__editor[data-v-b22775cd]::-webkit-scrollbar {
1790
1799
  display: none;
1791
1800
  }
1792
1801
 
1793
- .code-input-lite--empty .code-input-lite__editor[data-v-4dfd05a3]:not(:focus):before {
1802
+ .code-input-lite--empty .code-input-lite__editor[data-v-b22775cd]:not(:focus):before {
1794
1803
  content: attr(data-placeholder);
1795
1804
  color: var(--scalar-color-3);
1796
1805
  pointer-events: none;
@@ -1802,7 +1811,7 @@
1802
1811
  left: .5em;
1803
1812
  }
1804
1813
 
1805
- .code-input-lite--error .code-input-lite__editor[data-v-4dfd05a3] {
1814
+ .code-input-lite--error .code-input-lite__editor[data-v-b22775cd] {
1806
1815
  outline: 1px solid var(--scalar-color-red);
1807
1816
  }
1808
1817
 
@@ -1866,22 +1875,22 @@
1866
1875
  }
1867
1876
  }
1868
1877
 
1869
- [data-v-13500378] .code-input-lite__editor {
1878
+ [data-v-8c8a738b] .code-input-lite__editor {
1870
1879
  font-family: var(--scalar-font);
1871
1880
  font-size: var(--scalar-small);
1872
1881
  background-color: #0000;
1873
1882
  padding: 5px 8px;
1874
1883
  }
1875
1884
 
1876
- [data-v-13500378] .scalar-pill:not(:last-of-type) {
1885
+ [data-v-8c8a738b] .scalar-pill:not(:last-of-type) {
1877
1886
  margin-right: .15em;
1878
1887
  }
1879
1888
 
1880
- [data-v-13500378] .scalar-pill:not(:first-of-type) {
1889
+ [data-v-8c8a738b] .scalar-pill:not(:first-of-type) {
1881
1890
  margin-left: .5px;
1882
1891
  }
1883
1892
 
1884
- [data-v-928dfb0c] .cm-content {
1893
+ [data-v-d1ae5565] .cm-content {
1885
1894
  font-size: var(--scalar-small);
1886
1895
  }
1887
1896
 
@@ -1945,58 +1954,62 @@ input[data-v-a6f4752a]::placeholder {
1945
1954
  scrollbar-width: none;
1946
1955
  }
1947
1956
 
1948
- .request-section-content[data-v-bfd0db87] {
1957
+ .request-section-content[data-v-5d6c8262] {
1949
1958
  --scalar-border-width: .5px;
1950
1959
  }
1951
1960
 
1952
- .request-section-content-filter[data-v-bfd0db87] {
1961
+ .request-section-content-filter[data-v-5d6c8262] {
1953
1962
  box-shadow: 0 -10px 0 10px var(--scalar-background-1);
1954
1963
  }
1955
1964
 
1956
- .request-item:focus-within .request-meta-buttons[data-v-bfd0db87] {
1965
+ .request-item:focus-within .request-meta-buttons[data-v-5d6c8262] {
1957
1966
  opacity: 1;
1958
1967
  }
1959
1968
 
1960
- .group-hover-input[data-v-bfd0db87] {
1969
+ .group-hover-input[data-v-5d6c8262] {
1961
1970
  border-width: var(--scalar-border-width);
1962
1971
  border-color: #0000;
1963
1972
  }
1964
1973
 
1965
- .group:hover .group-hover-input[data-v-bfd0db87] {
1974
+ .group:hover .group-hover-input[data-v-5d6c8262] {
1966
1975
  background: var(--scalar-background-1);
1967
1976
  }
1968
1977
 
1969
1978
  @supports (color: color-mix(in lab, red, red)) {
1970
- .group:hover .group-hover-input[data-v-bfd0db87] {
1979
+ .group:hover .group-hover-input[data-v-5d6c8262] {
1971
1980
  background: color-mix(in srgb, var(--scalar-background-1), var(--scalar-background-2));
1972
1981
  }
1973
1982
  }
1974
1983
 
1975
- .group:hover .group-hover-input[data-v-bfd0db87] {
1984
+ .group:hover .group-hover-input[data-v-5d6c8262] {
1976
1985
  border-color: var(--scalar-border-color);
1977
1986
  }
1978
1987
 
1979
- .group-hover-input[data-v-bfd0db87]:focus {
1988
+ .group-hover-input[data-v-5d6c8262]:focus {
1980
1989
  border-color: var(--scalar-border-color) !important;
1981
1990
  background: none !important;
1982
1991
  }
1983
1992
 
1984
- [data-v-8c1df828] .cm-editor {
1993
+ [data-v-6e055eb2] .cm-editor {
1985
1994
  font-size: var(--scalar-small);
1986
1995
  background-color: #0000;
1987
1996
  outline: none;
1988
1997
  }
1989
1998
 
1990
- [data-v-8c1df828] .cm-gutters {
1999
+ [data-v-6e055eb2] .cm-gutters {
1991
2000
  background-color: var(--scalar-background-1);
1992
2001
  border-radius: var(--scalar-radius) 0 0 var(--scalar-radius);
1993
2002
  }
1994
2003
 
1995
- [data-v-8c1df828] .cm-scroller {
2004
+ [data-v-6e055eb2] .cm-scroller {
1996
2005
  min-width: 100%;
1997
2006
  overflow: auto;
1998
2007
  }
1999
2008
 
2009
+ [data-v-6e055eb2] .cm-lineWrapping .cm-line {
2010
+ word-break: break-all;
2011
+ }
2012
+
2000
2013
  .light-mode .bg-preview[data-v-a10b4008] {
2001
2014
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E");
2002
2015
  }
@@ -2059,12 +2072,12 @@ input[data-v-a6f4752a]::placeholder {
2059
2072
  opacity: 0;
2060
2073
  }
2061
2074
 
2062
- .animate-response-heading .response-heading[data-v-7a7c6611] {
2075
+ .animate-response-heading .response-heading[data-v-b969ac76] {
2063
2076
  opacity: 1;
2064
- animation: .2s ease-in-out forwards push-response-7a7c6611;
2077
+ animation: .2s ease-in-out forwards push-response-b969ac76;
2065
2078
  }
2066
2079
 
2067
- @keyframes push-response-7a7c6611 {
2080
+ @keyframes push-response-b969ac76 {
2068
2081
  from {
2069
2082
  opacity: 1;
2070
2083
  transform: translateY(0);
@@ -2076,12 +2089,12 @@ input[data-v-a6f4752a]::placeholder {
2076
2089
  }
2077
2090
  }
2078
2091
 
2079
- .animate-response-heading .animate-response-children[data-v-7a7c6611] {
2092
+ .animate-response-heading .animate-response-children[data-v-b969ac76] {
2080
2093
  opacity: 0;
2081
- animation: .2s ease-in-out 50ms forwards response-spans-7a7c6611;
2094
+ animation: .2s ease-in-out 50ms forwards response-spans-b969ac76;
2082
2095
  }
2083
2096
 
2084
- @keyframes response-spans-7a7c6611 {
2097
+ @keyframes response-spans-b969ac76 {
2085
2098
  from {
2086
2099
  opacity: 0;
2087
2100
  transform: translateY(4px);
@@ -2093,14 +2106,14 @@ input[data-v-a6f4752a]::placeholder {
2093
2106
  }
2094
2107
  }
2095
2108
 
2096
- .description[data-v-649f9a0d] .markdown {
2109
+ .description[data-v-9775eaaf] .markdown {
2097
2110
  font-weight: var(--scalar-semibold);
2098
2111
  color: var(--scalar-color--1);
2099
2112
  padding: 0;
2100
2113
  display: block;
2101
2114
  }
2102
2115
 
2103
- .description[data-v-649f9a0d] .markdown > :first-child {
2116
+ .description[data-v-9775eaaf] .markdown > :first-child {
2104
2117
  margin-top: 0;
2105
2118
  }
2106
2119
 
@@ -2112,58 +2125,58 @@ input[data-v-a6f4752a]::placeholder {
2112
2125
  background: var(--scalar-background-2);
2113
2126
  }
2114
2127
 
2115
- [data-v-c414dc68] .cm-editor {
2128
+ [data-v-1f68de05] .cm-editor {
2116
2129
  outline: none;
2117
2130
  width: 100%;
2118
2131
  height: 100%;
2119
2132
  }
2120
2133
 
2121
- [data-v-c414dc68] .cm-line {
2134
+ [data-v-1f68de05] .cm-line {
2122
2135
  padding: 0;
2123
2136
  }
2124
2137
 
2125
- [data-v-c414dc68] .cm-content {
2138
+ [data-v-1f68de05] .cm-content {
2126
2139
  font-size: var(--scalar-small);
2127
2140
  align-items: center;
2128
2141
  padding: 0;
2129
2142
  display: flex;
2130
2143
  }
2131
2144
 
2132
- .scroll-timeline-x[data-v-c414dc68] {
2145
+ .scroll-timeline-x[data-v-1f68de05] {
2133
2146
  -ms-overflow-style: none;
2134
2147
  -webkit-mask-image: linear-gradient(to right, #0000 0, #000 6px calc(100% - 24px), #0000 100%);
2135
2148
  mask-image: linear-gradient(to right, #0000 0, #000 6px calc(100% - 24px), #0000 100%);
2136
2149
  }
2137
2150
 
2138
- .scroll-timeline-x-hidden[data-v-c414dc68] {
2151
+ .scroll-timeline-x-hidden[data-v-1f68de05] {
2139
2152
  overflow-x: auto;
2140
2153
  }
2141
2154
 
2142
- .scroll-timeline-x-hidden[data-v-c414dc68] .cm-scroller {
2155
+ .scroll-timeline-x-hidden[data-v-1f68de05] .cm-scroller {
2143
2156
  scrollbar-width: none;
2144
2157
  -ms-overflow-style: none;
2145
2158
  padding-right: 20px;
2146
2159
  overflow: auto;
2147
2160
  }
2148
2161
 
2149
- .scroll-timeline-x-hidden[data-v-c414dc68]::-webkit-scrollbar {
2162
+ .scroll-timeline-x-hidden[data-v-1f68de05]::-webkit-scrollbar {
2150
2163
  width: 0;
2151
2164
  height: 0;
2152
2165
  display: none;
2153
2166
  }
2154
2167
 
2155
- .scroll-timeline-x-hidden[data-v-c414dc68] .cm-scroller::-webkit-scrollbar {
2168
+ .scroll-timeline-x-hidden[data-v-1f68de05] .cm-scroller::-webkit-scrollbar {
2156
2169
  width: 0;
2157
2170
  height: 0;
2158
2171
  display: none;
2159
2172
  }
2160
2173
 
2161
- .scroll-timeline-x-address[data-v-c414dc68] {
2174
+ .scroll-timeline-x-address[data-v-1f68de05] {
2162
2175
  scrollbar-width: none;
2163
2176
  line-height: 27px;
2164
2177
  }
2165
2178
 
2166
- .scroll-timeline-x-address[data-v-c414dc68]:after {
2179
+ .scroll-timeline-x-address[data-v-1f68de05]:after {
2167
2180
  content: "";
2168
2181
  cursor: text;
2169
2182
  width: 24px;
@@ -2172,45 +2185,45 @@ input[data-v-a6f4752a]::placeholder {
2172
2185
  right: 0;
2173
2186
  }
2174
2187
 
2175
- .scroll-timeline-x-address[data-v-c414dc68]:empty:before {
2188
+ .scroll-timeline-x-address[data-v-1f68de05]:empty:before {
2176
2189
  content: "Enter URL or cURL request";
2177
2190
  color: var(--scalar-color-3);
2178
2191
  pointer-events: none;
2179
2192
  }
2180
2193
 
2181
- .address-bar-bg-states[data-v-c414dc68] {
2194
+ .address-bar-bg-states[data-v-1f68de05] {
2182
2195
  --scalar-address-bar-bg: var(--scalar-background-1);
2183
2196
  }
2184
2197
 
2185
2198
  @supports (color: color-mix(in lab, red, red)) {
2186
- .address-bar-bg-states[data-v-c414dc68] {
2199
+ .address-bar-bg-states[data-v-1f68de05] {
2187
2200
  --scalar-address-bar-bg: color-mix(in srgb,
2188
2201
  var(--scalar-background-1),
2189
2202
  var(--scalar-background-2));
2190
2203
  }
2191
2204
  }
2192
2205
 
2193
- .address-bar-bg-states[data-v-c414dc68] {
2206
+ .address-bar-bg-states[data-v-1f68de05] {
2194
2207
  background: var(--scalar-address-bar-bg);
2195
2208
  }
2196
2209
 
2197
- .address-bar-bg-states[data-v-c414dc68]:has(.cm-focused) {
2210
+ .address-bar-bg-states[data-v-1f68de05]:has(.cm-focused) {
2198
2211
  --scalar-address-bar-bg: var(--scalar-background-1);
2199
2212
  border-color: var(--scalar-border-color);
2200
2213
  outline-width: 1px;
2201
2214
  outline-style: solid;
2202
2215
  }
2203
2216
 
2204
- .address-bar-bg-states:has(.cm-focused) .fade-left[data-v-c414dc68], .address-bar-bg-states:has(.cm-focused) .fade-right[data-v-c414dc68] {
2217
+ .address-bar-bg-states:has(.cm-focused) .fade-left[data-v-1f68de05], .address-bar-bg-states:has(.cm-focused) .fade-right[data-v-1f68de05] {
2205
2218
  --scalar-address-bar-bg: var(--scalar-background-1);
2206
2219
  }
2207
2220
 
2208
- .app-exit-button[data-v-3769522e] {
2221
+ .app-exit-button[data-v-821957c1] {
2209
2222
  color: #fff;
2210
2223
  background: #0000001a;
2211
2224
  }
2212
2225
 
2213
- .app-exit-button[data-v-3769522e]:hover {
2226
+ .app-exit-button[data-v-821957c1]:hover {
2214
2227
  background: #ffffff1a;
2215
2228
  }
2216
2229
 
@@ -2344,7 +2357,7 @@ input[data-v-a6f4752a]::placeholder {
2344
2357
  line-height: normal;
2345
2358
  }
2346
2359
 
2347
- .ref-search-meta[data-v-d1af4404] {
2360
+ .ref-search-meta[data-v-89ab8a2d] {
2348
2361
  background: var(--scalar-background-1);
2349
2362
  border-bottom-left-radius: var(--scalar-radius-lg);
2350
2363
  border-bottom-right-radius: var(--scalar-radius-lg);
@@ -3748,7 +3761,7 @@ input[data-v-a6f4752a]::placeholder {
3748
3761
  opacity: 0;
3749
3762
  }
3750
3763
 
3751
- .scalar-app .group-hover\/item\:opacity-100:is(:where(.group\/item):hover *), .scalar-app .group-hover\/params\:opacity-100:is(:where(.group\/params):hover *) {
3764
+ .scalar-app .group-hover\/code-block\:opacity-100:is(:where(.group\/code-block):hover *), .scalar-app .group-hover\/input\:opacity-100:is(:where(.group\/input):hover *), .scalar-app .group-hover\/item\:opacity-100:is(:where(.group\/item):hover *), .scalar-app .group-hover\/params\:opacity-100:is(:where(.group\/params):hover *) {
3752
3765
  opacity: 1;
3753
3766
  }
3754
3767
 
@@ -3775,6 +3788,10 @@ input[data-v-a6f4752a]::placeholder {
3775
3788
  outline-width: 1px;
3776
3789
  }
3777
3790
 
3791
+ .scalar-app .group-has-focus-visible\/code-block\:opacity-100:is(:where(.group\/code-block):has(:focus-visible) *), .scalar-app .group-has-focus-visible\/input\:opacity-100:is(:where(.group\/input):has(:focus-visible) *) {
3792
+ opacity: 1;
3793
+ }
3794
+
3778
3795
  .scalar-app .group-has-\[\.cm-focused\]\:z-1:is(:where(.group):has(.cm-focused) *), .scalar-app .group-has-\[\.code-input-lite__editor\:focus\]\:z-1:is(:where(.group):has(:is(.code-input-lite editor:focus)) *) {
3779
3796
  z-index: 1;
3780
3797
  }
@@ -5648,7 +5665,7 @@ div + .userMessage[data-v-6573ec87] {
5648
5665
  width: 100%;
5649
5666
  }
5650
5667
 
5651
- .docSettings[data-v-01a25619] {
5668
+ .docSettings[data-v-5134b4f8] {
5652
5669
  display: flex;
5653
5670
  flex-direction: column;
5654
5671
  gap: 12px;
@@ -5656,7 +5673,7 @@ div + .userMessage[data-v-6573ec87] {
5656
5673
  font-size: var(--scalar-font-size-3);
5657
5674
  max-height: 600px;
5658
5675
  }
5659
- .documentName[data-v-01a25619] {
5676
+ .documentName[data-v-5134b4f8] {
5660
5677
  font-weight: var(--scalar-semibold);
5661
5678
  }
5662
5679
 
@@ -2,7 +2,7 @@ import type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference';
2
2
  import type { AuthStore } from '@scalar/workspace-store/entities/auth';
3
3
  import type { WorkspaceEventBus } from '@scalar/workspace-store/events';
4
4
  import type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments';
5
- import type { OpenApiDocument, ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
5
+ import type { OpenApiDocument, ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
6
6
  type __VLS_Props = {
7
7
  options: Pick<ApiReferenceConfigurationRaw, 'authentication' | 'persistAuth' | 'proxyUrl'>;
8
8
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Auth.vue.js","names":[],"sources":["../../../src/views/Settings/Auth.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AuthSelector } from '@scalar/api-client/blocks/scalar-auth-selector-block'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport {\n getSecurityRequirements,\n getSelectedSecurity,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type {\n OpenApiDocument,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { useFocusWithin } from '@vueuse/core'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport { useState } from '@/state/state'\n\nconst { document, name, environment, eventBus, options, authStore } =\n defineProps<{\n options: Pick<\n ApiReferenceConfigurationRaw,\n 'authentication' | 'persistAuth' | 'proxyUrl'\n >\n name: string\n authStore: AuthStore\n document: OpenApiDocument | undefined\n eventBus: WorkspaceEventBus\n selectedServer: ServerObject | null\n environment: XScalarEnvironment\n }>()\n\nconst { workspaceStore } = useState()\n\n/** Compute what the security requirements should be for the document */\nconst securityRequirements = computed(() =>\n getSecurityRequirements(document?.security),\n)\n\n/** Merge the security schemes with the authentication config and the auth store */\nconst securitySchemes = computed(() =>\n mergeSecurity(\n document?.components?.securitySchemes ?? {},\n options.authentication?.securitySchemes,\n authStore,\n name,\n ),\n)\n\n/** The selected security keys for the document */\nconst selectedSecurity = computed(() =>\n getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName: name,\n }),\n undefined,\n securityRequirements.value,\n securitySchemes.value,\n options.authentication?.preferredSecurityScheme,\n ),\n)\n\nconst focusRef = shallowRef()\nconst { focused } = useFocusWithin(focusRef)\n\nwatch(focused, (isFocused) => {\n if (!isFocused) {\n return\n }\n\n workspaceStore.update('x-scalar-active-document', name)\n})\n</script>\n<template>\n <div\n ref=\"focusRef\"\n tabindex=\"0\">\n <AuthSelector\n v-if=\"Object.keys(securitySchemes).length\"\n :authStore\n :documentSlug=\"name\"\n :environment\n :eventBus\n isReadOnly\n isStatic\n layout=\"reference\"\n :meta=\"{ type: 'document' }\"\n :persistAuth=\"options.persistAuth\"\n :proxyUrl=\"options.proxyUrl ?? ''\"\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :server=\"selectedServer\"\n title=\"Authentication\" />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"Auth.vue.js","names":[],"sources":["../../../src/views/Settings/Auth.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AuthSelector } from '@scalar/api-client/blocks/scalar-auth-selector-block'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport {\n getSecurityRequirements,\n getSelectedSecurity,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type {\n OpenApiDocument,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { useFocusWithin } from '@vueuse/core'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport { useState } from '@/state/state'\n\nconst { document, name, environment, eventBus, options, authStore } =\n defineProps<{\n options: Pick<\n ApiReferenceConfigurationRaw,\n 'authentication' | 'persistAuth' | 'proxyUrl'\n >\n name: string\n authStore: AuthStore\n document: OpenApiDocument | undefined\n eventBus: WorkspaceEventBus\n selectedServer: ServerObject | null\n environment: XScalarEnvironment\n }>()\n\nconst { workspaceStore } = useState()\n\n/** Compute what the security requirements should be for the document */\nconst securityRequirements = computed(() =>\n getSecurityRequirements(document?.security),\n)\n\n/** Merge the security schemes with the authentication config and the auth store */\nconst securitySchemes = computed(() =>\n mergeSecurity(\n document?.components?.securitySchemes ?? {},\n options.authentication?.securitySchemes,\n authStore,\n name,\n ),\n)\n\n/** The selected security keys for the document */\nconst selectedSecurity = computed(() =>\n getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName: name,\n }),\n undefined,\n securityRequirements.value,\n securitySchemes.value,\n options.authentication?.preferredSecurityScheme,\n ),\n)\n\nconst focusRef = shallowRef()\nconst { focused } = useFocusWithin(focusRef)\n\nwatch(focused, (isFocused) => {\n if (!isFocused) {\n return\n }\n\n workspaceStore.update('x-scalar-active-document', name)\n})\n</script>\n<template>\n <div\n ref=\"focusRef\"\n tabindex=\"0\">\n <AuthSelector\n v-if=\"Object.keys(securitySchemes).length\"\n :authStore\n :documentSlug=\"name\"\n :environment\n :eventBus\n isReadOnly\n isStatic\n layout=\"reference\"\n :meta=\"{ type: 'document' }\"\n :persistAuth=\"options.persistAuth\"\n :proxyUrl=\"options.proxyUrl ?? ''\"\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :server=\"selectedServer\"\n title=\"Authentication\" />\n </div>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"Auth.vue.script.js","names":[],"sources":["../../../src/views/Settings/Auth.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AuthSelector } from '@scalar/api-client/blocks/scalar-auth-selector-block'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport {\n getSecurityRequirements,\n getSelectedSecurity,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type {\n OpenApiDocument,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { useFocusWithin } from '@vueuse/core'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport { useState } from '@/state/state'\n\nconst { document, name, environment, eventBus, options, authStore } =\n defineProps<{\n options: Pick<\n ApiReferenceConfigurationRaw,\n 'authentication' | 'persistAuth' | 'proxyUrl'\n >\n name: string\n authStore: AuthStore\n document: OpenApiDocument | undefined\n eventBus: WorkspaceEventBus\n selectedServer: ServerObject | null\n environment: XScalarEnvironment\n }>()\n\nconst { workspaceStore } = useState()\n\n/** Compute what the security requirements should be for the document */\nconst securityRequirements = computed(() =>\n getSecurityRequirements(document?.security),\n)\n\n/** Merge the security schemes with the authentication config and the auth store */\nconst securitySchemes = computed(() =>\n mergeSecurity(\n document?.components?.securitySchemes ?? {},\n options.authentication?.securitySchemes,\n authStore,\n name,\n ),\n)\n\n/** The selected security keys for the document */\nconst selectedSecurity = computed(() =>\n getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName: name,\n }),\n undefined,\n securityRequirements.value,\n securitySchemes.value,\n options.authentication?.preferredSecurityScheme,\n ),\n)\n\nconst focusRef = shallowRef()\nconst { focused } = useFocusWithin(focusRef)\n\nwatch(focused, (isFocused) => {\n if (!isFocused) {\n return\n }\n\n workspaceStore.update('x-scalar-active-document', name)\n})\n</script>\n<template>\n <div\n ref=\"focusRef\"\n tabindex=\"0\">\n <AuthSelector\n v-if=\"Object.keys(securitySchemes).length\"\n :authStore\n :documentSlug=\"name\"\n :environment\n :eventBus\n isReadOnly\n isStatic\n layout=\"reference\"\n :meta=\"{ type: 'document' }\"\n :persistAuth=\"options.persistAuth\"\n :proxyUrl=\"options.proxyUrl ?? ''\"\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :server=\"selectedServer\"\n title=\"Authentication\" />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAkCA,MAAM,EAAE,mBAAmB,SAAS;;EAGpC,MAAM,uBAAuB,eAC3B,wBAAwB,QAAA,UAAU,QAAQ,CAC5C;;EAGA,MAAM,kBAAkB,eACtB,cACE,QAAA,UAAU,YAAY,mBAAmB,CAAC,GAC1C,QAAA,QAAQ,gBAAgB,iBACxB,QAAA,WACA,QAAA,IACF,CACF;;EAGA,MAAM,mBAAmB,eACvB,oBACE,QAAA,UAAU,uBAAuB;GAC/B,MAAM;GACN,cAAc,QAAA;EAChB,CAAC,GACD,KAAA,GACA,qBAAqB,OACrB,gBAAgB,OAChB,QAAA,QAAQ,gBAAgB,uBAC1B,CACF;EAEA,MAAM,WAAW,WAAW;EAC5B,MAAM,EAAE,YAAY,eAAe,QAAQ;EAE3C,MAAM,UAAU,cAAc;GAC5B,IAAI,CAAC,WACH;GAGF,eAAe,OAAO,4BAA4B,QAAA,IAAI;EACxD,CAAC;;uBAGC,mBAoBM,OAAA;aAnBA;IAAJ,KAAI;IACJ,UAAS;OAED,OAAO,KAAK,gBAAA,KAAe,CAAA,CAAE,UAAA,UAAA,GADrC,YAgB2B,MAAA,YAAA,GAAA;;IAdxB,WAAA,QAAA;IACA,cAAc,QAAA;IACd,aAAA,QAAA;IACA,UAAA,QAAA;IACD,YAAA;IACA,UAAA;IACA,QAAO;IACN,MAAM,EAAA,MAAA,WAAA;IACN,aAAa,QAAA,QAAQ;IACrB,UAAU,QAAA,QAAQ,YAAQ;IAC1B,sBAAA,qBAAA;IACA,iBAAA,gBAAA;IACA,kBAAA,iBAAA;IACA,QAAQ,QAAA;IACT,OAAM"}
1
+ {"version":3,"file":"Auth.vue.script.js","names":[],"sources":["../../../src/views/Settings/Auth.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AuthSelector } from '@scalar/api-client/blocks/scalar-auth-selector-block'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport {\n getSecurityRequirements,\n getSelectedSecurity,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type {\n OpenApiDocument,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { useFocusWithin } from '@vueuse/core'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport { useState } from '@/state/state'\n\nconst { document, name, environment, eventBus, options, authStore } =\n defineProps<{\n options: Pick<\n ApiReferenceConfigurationRaw,\n 'authentication' | 'persistAuth' | 'proxyUrl'\n >\n name: string\n authStore: AuthStore\n document: OpenApiDocument | undefined\n eventBus: WorkspaceEventBus\n selectedServer: ServerObject | null\n environment: XScalarEnvironment\n }>()\n\nconst { workspaceStore } = useState()\n\n/** Compute what the security requirements should be for the document */\nconst securityRequirements = computed(() =>\n getSecurityRequirements(document?.security),\n)\n\n/** Merge the security schemes with the authentication config and the auth store */\nconst securitySchemes = computed(() =>\n mergeSecurity(\n document?.components?.securitySchemes ?? {},\n options.authentication?.securitySchemes,\n authStore,\n name,\n ),\n)\n\n/** The selected security keys for the document */\nconst selectedSecurity = computed(() =>\n getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName: name,\n }),\n undefined,\n securityRequirements.value,\n securitySchemes.value,\n options.authentication?.preferredSecurityScheme,\n ),\n)\n\nconst focusRef = shallowRef()\nconst { focused } = useFocusWithin(focusRef)\n\nwatch(focused, (isFocused) => {\n if (!isFocused) {\n return\n }\n\n workspaceStore.update('x-scalar-active-document', name)\n})\n</script>\n<template>\n <div\n ref=\"focusRef\"\n tabindex=\"0\">\n <AuthSelector\n v-if=\"Object.keys(securitySchemes).length\"\n :authStore\n :documentSlug=\"name\"\n :environment\n :eventBus\n isReadOnly\n isStatic\n layout=\"reference\"\n :meta=\"{ type: 'document' }\"\n :persistAuth=\"options.persistAuth\"\n :proxyUrl=\"options.proxyUrl ?? ''\"\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :server=\"selectedServer\"\n title=\"Authentication\" />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAkCA,MAAM,EAAE,mBAAmB,SAAS;;EAGpC,MAAM,uBAAuB,eAC3B,wBAAwB,QAAA,UAAU,QAAQ,CAC5C;;EAGA,MAAM,kBAAkB,eACtB,cACE,QAAA,UAAU,YAAY,mBAAmB,CAAC,GAC1C,QAAA,QAAQ,gBAAgB,iBACxB,QAAA,WACA,QAAA,IACF,CACF;;EAGA,MAAM,mBAAmB,eACvB,oBACE,QAAA,UAAU,uBAAuB;GAC/B,MAAM;GACN,cAAc,QAAA;EAChB,CAAC,GACD,KAAA,GACA,qBAAqB,OACrB,gBAAgB,OAChB,QAAA,QAAQ,gBAAgB,uBAC1B,CACF;EAEA,MAAM,WAAW,WAAW;EAC5B,MAAM,EAAE,YAAY,eAAe,QAAQ;EAE3C,MAAM,UAAU,cAAc;GAC5B,IAAI,CAAC,WACH;GAGF,eAAe,OAAO,4BAA4B,QAAA,IAAI;EACxD,CAAC;;uBAGC,mBAoBM,OAAA;aAnBA;IAAJ,KAAI;IACJ,UAAS;OAED,OAAO,KAAK,gBAAA,KAAe,CAAA,CAAE,UAAA,UAAA,GADrC,YAgB2B,MAAA,YAAA,GAAA;;IAdxB,WAAA,QAAA;IACA,cAAc,QAAA;IACd,aAAA,QAAA;IACA,UAAA,QAAA;IACD,YAAA;IACA,UAAA;IACA,QAAO;IACN,MAAM,EAAA,MAAA,WAAA;IACN,aAAa,QAAA,QAAQ;IACrB,UAAU,QAAA,QAAQ,YAAQ;IAC1B,sBAAA,qBAAA;IACA,iBAAA,gBAAA;IACA,kBAAA,iBAAA;IACA,QAAQ,QAAA;IACT,OAAM"}
@@ -1,4 +1,4 @@
1
- import type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
1
+ import type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
2
2
  type __VLS_Props = {
3
3
  document: OpenApiDocument;
4
4
  name: string;
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import DocSettings_vue_vue_type_script_setup_true_lang_default from "./DocSettings.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Settings/DocSettings.vue
5
- var DocSettings_default = /*#__PURE__*/ _plugin_vue_export_helper_default(DocSettings_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-01a25619"]]);
5
+ var DocSettings_default = /*#__PURE__*/ _plugin_vue_export_helper_default(DocSettings_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5134b4f8"]]);
6
6
  //#endregion
7
7
  export { DocSettings_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"DocSettings.vue.js","names":[],"sources":["../../../src/views/Settings/DocSettings.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n getActiveEnvironment,\n getSelectedServer,\n getServers,\n} from '@scalar/workspace-store/request-example'\nimport type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed } from 'vue'\n\nimport ServerSelector from '@/components/ServerSelector.vue'\nimport { useState } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { document, name } = defineProps<{\n document: OpenApiDocument\n name: string\n}>()\n\nconst { workspaceStore, config, eventBus } = useState()\n\nconst environment = computed(\n () => getActiveEnvironment(workspaceStore, document).environment,\n)\n\nconst selectedServer = computed(() => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(document, null, null, servers)\n})\n\nconst securitySchemes = computed(\n () => document.components?.securitySchemes ?? {},\n)\n</script>\n\n<template>\n <div class=\"docSettings\">\n <div>\n <Auth\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name\n :options=\"config\"\n :securitySchemes\n :selectedServer />\n </div>\n <div>\n <ServerSelector\n :eventBus\n :selectedServer\n :servers=\"document.servers ?? []\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.docSettings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 12px;\n font-size: var(--scalar-font-size-3);\n max-height: 600px;\n}\n\n.documentName {\n font-weight: var(--scalar-semibold);\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"DocSettings.vue.js","names":[],"sources":["../../../src/views/Settings/DocSettings.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n getActiveEnvironment,\n getSelectedServer,\n getServers,\n} from '@scalar/workspace-store/request-example'\nimport type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed } from 'vue'\n\nimport ServerSelector from '@/components/ServerSelector.vue'\nimport { useState } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { document, name } = defineProps<{\n document: OpenApiDocument\n name: string\n}>()\n\nconst { workspaceStore, config, eventBus } = useState()\n\nconst environment = computed(\n () => getActiveEnvironment(workspaceStore, document).environment,\n)\n\nconst selectedServer = computed(() => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(document, null, null, servers)\n})\n\nconst securitySchemes = computed(\n () => document.components?.securitySchemes ?? {},\n)\n</script>\n\n<template>\n <div class=\"docSettings\">\n <div>\n <Auth\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name\n :options=\"config\"\n :securitySchemes\n :selectedServer />\n </div>\n <div>\n <ServerSelector\n :eventBus\n :selectedServer\n :servers=\"document.servers ?? []\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.docSettings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 12px;\n font-size: var(--scalar-font-size-3);\n max-height: 600px;\n}\n\n.documentName {\n font-weight: var(--scalar-semibold);\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"DocSettings.vue.script.js","names":[],"sources":["../../../src/views/Settings/DocSettings.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n getActiveEnvironment,\n getSelectedServer,\n getServers,\n} from '@scalar/workspace-store/request-example'\nimport type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed } from 'vue'\n\nimport ServerSelector from '@/components/ServerSelector.vue'\nimport { useState } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { document, name } = defineProps<{\n document: OpenApiDocument\n name: string\n}>()\n\nconst { workspaceStore, config, eventBus } = useState()\n\nconst environment = computed(\n () => getActiveEnvironment(workspaceStore, document).environment,\n)\n\nconst selectedServer = computed(() => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(document, null, null, servers)\n})\n\nconst securitySchemes = computed(\n () => document.components?.securitySchemes ?? {},\n)\n</script>\n\n<template>\n <div class=\"docSettings\">\n <div>\n <Auth\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name\n :options=\"config\"\n :securitySchemes\n :selectedServer />\n </div>\n <div>\n <ServerSelector\n :eventBus\n :selectedServer\n :servers=\"document.servers ?? []\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.docSettings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 12px;\n font-size: var(--scalar-font-size-3);\n max-height: 600px;\n}\n\n.documentName {\n font-weight: var(--scalar-semibold);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;EAkBA,MAAM,EAAE,gBAAgB,QAAQ,aAAa,SAAS;EAEtD,MAAM,cAAc,eACZ,qBAAqB,gBAAgB,QAAA,QAAQ,CAAC,CAAC,WACvD;EAEA,MAAM,iBAAiB,eAAe;GACpC,MAAM,UAAU,WAAW,QAAA,SAAS,SAAS,EAC3C,aAAa,QAAA,SAAS,gCACxB,CAAC;GAED,OAAO,kBAAkB,QAAA,UAAU,MAAM,MAAM,OAAO;EACxD,CAAC;EAED,MAAM,kBAAkB,eAChB,QAAA,SAAS,YAAY,mBAAmB,CAAC,CACjD;;uBAIE,mBAkBM,OAlBN,YAkBM,CAjBJ,mBAUM,OAAA,MAAA,CATJ,YAQoB,cAAA;IAPjB,WAAW,MAAA,cAAA,CAAc,CAAC;IAC1B,UAAA,QAAA;IACA,aAAA,YAAA;IACA,UAAA,MAAA,QAAA;IACA,MAAA,QAAA;IACA,SAAS,MAAA,MAAA;IACT,iBAAA,gBAAA;IACA,gBAAA,eAAA;;;;;;;;;;SAEL,mBAKM,OAAA,MAAA,CAJJ,YAGsC,wBAAA;IAFnC,UAAA,MAAA,QAAA;IACA,gBAAA,eAAA;IACA,SAAS,QAAA,SAAS,WAAO,CAAA"}
1
+ {"version":3,"file":"DocSettings.vue.script.js","names":[],"sources":["../../../src/views/Settings/DocSettings.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n getActiveEnvironment,\n getSelectedServer,\n getServers,\n} from '@scalar/workspace-store/request-example'\nimport type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed } from 'vue'\n\nimport ServerSelector from '@/components/ServerSelector.vue'\nimport { useState } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { document, name } = defineProps<{\n document: OpenApiDocument\n name: string\n}>()\n\nconst { workspaceStore, config, eventBus } = useState()\n\nconst environment = computed(\n () => getActiveEnvironment(workspaceStore, document).environment,\n)\n\nconst selectedServer = computed(() => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(document, null, null, servers)\n})\n\nconst securitySchemes = computed(\n () => document.components?.securitySchemes ?? {},\n)\n</script>\n\n<template>\n <div class=\"docSettings\">\n <div>\n <Auth\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name\n :options=\"config\"\n :securitySchemes\n :selectedServer />\n </div>\n <div>\n <ServerSelector\n :eventBus\n :selectedServer\n :servers=\"document.servers ?? []\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.docSettings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 12px;\n font-size: var(--scalar-font-size-3);\n max-height: 600px;\n}\n\n.documentName {\n font-weight: var(--scalar-semibold);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;EAkBA,MAAM,EAAE,gBAAgB,QAAQ,aAAa,SAAS;EAEtD,MAAM,cAAc,eACZ,qBAAqB,gBAAgB,QAAA,QAAQ,CAAC,CAAC,WACvD;EAEA,MAAM,iBAAiB,eAAe;GACpC,MAAM,UAAU,WAAW,QAAA,SAAS,SAAS,EAC3C,aAAa,QAAA,SAAS,gCACxB,CAAC;GAED,OAAO,kBAAkB,QAAA,UAAU,MAAM,MAAM,OAAO;EACxD,CAAC;EAED,MAAM,kBAAkB,eAChB,QAAA,SAAS,YAAY,mBAAmB,CAAC,CACjD;;uBAIE,mBAkBM,OAlBN,YAkBM,CAjBJ,mBAUM,OAAA,MAAA,CATJ,YAQoB,cAAA;IAPjB,WAAW,MAAA,cAAA,CAAc,CAAC;IAC1B,UAAA,QAAA;IACA,aAAA,YAAA;IACA,UAAA,MAAA,QAAA;IACA,MAAA,QAAA;IACA,SAAS,MAAA,MAAA;IACT,iBAAA,gBAAA;IACA,gBAAA,eAAA;;;;;;;;;;SAEL,mBAKM,OAAA,MAAA,CAJJ,YAGsC,wBAAA;IAFnC,UAAA,MAAA,QAAA;IACA,gBAAA,eAAA;IACA,SAAS,QAAA,SAAS,WAAO,CAAA"}
@@ -1260,7 +1260,7 @@ div + .userMessage[data-v-6573ec87] {
1260
1260
  width: 100%;
1261
1261
  }
1262
1262
 
1263
- .docSettings[data-v-01a25619] {
1263
+ .docSettings[data-v-5134b4f8] {
1264
1264
  display: flex;
1265
1265
  flex-direction: column;
1266
1266
  gap: 12px;
@@ -1268,7 +1268,7 @@ div + .userMessage[data-v-6573ec87] {
1268
1268
  font-size: var(--scalar-font-size-3);
1269
1269
  max-height: 600px;
1270
1270
  }
1271
- .documentName[data-v-01a25619] {
1271
+ .documentName[data-v-5134b4f8] {
1272
1272
  font-weight: var(--scalar-semibold);
1273
1273
  }
1274
1274
 
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "git+https://github.com/scalar/scalar.git",
11
11
  "directory": "packages/agent-chat"
12
12
  },
13
- "version": "0.12.30",
13
+ "version": "0.12.32",
14
14
  "engines": {
15
15
  "node": ">=22"
16
16
  },
@@ -46,36 +46,36 @@
46
46
  ],
47
47
  "dependencies": {
48
48
  "@ai-sdk/vue": "3.0.33",
49
+ "@scalar/api-client": "3.19.1",
50
+ "@scalar/components": "0.29.3",
51
+ "@scalar/helpers": "0.12.0",
52
+ "@scalar/icons": "0.7.6",
53
+ "@scalar/json-magic": "0.14.0",
54
+ "@scalar/openapi-types": "0.9.6",
55
+ "@scalar/schemas": "0.10.0",
56
+ "@scalar/themes": "0.18.0",
57
+ "@scalar/types": "0.20.0",
58
+ "@scalar/use-toasts": "0.10.5",
59
+ "@scalar/validation": "0.6.3",
60
+ "@scalar/workspace-store": "0.62.0",
49
61
  "@vueuse/core": "13.9.0",
50
62
  "ai": "6.0.33",
51
63
  "js-base64": "^3.9.2",
52
64
  "neverpanic": "0.0.8",
53
65
  "truncate-json": "3.0.1",
54
- "vue": "^3.5.40",
55
- "@scalar/api-client": "3.18.0",
56
- "@scalar/icons": "0.7.6",
57
- "@scalar/json-magic": "0.13.4",
58
- "@scalar/helpers": "0.11.3",
59
- "@scalar/components": "0.29.1",
60
- "@scalar/openapi-types": "0.9.5",
61
- "@scalar/schemas": "0.9.0",
62
- "@scalar/themes": "0.17.4",
63
- "@scalar/types": "0.19.0",
64
- "@scalar/use-toasts": "0.10.5",
65
- "@scalar/workspace-store": "0.60.0",
66
- "@scalar/validation": "0.6.3"
66
+ "vue": "^3.5.40"
67
67
  },
68
68
  "devDependencies": {
69
+ "@scalar/sidebar": "0.11.3",
69
70
  "@tailwindcss/cli": "^4.3.3",
70
71
  "@tailwindcss/vite": "^4.3.3",
71
72
  "@types/jsdom": "28.0.1",
72
73
  "@vitejs/plugin-vue": "^6.0.8",
73
- "hono": "^4.12.7",
74
+ "hono": "^4.13.7",
74
75
  "jsdom": "27.4.0",
75
76
  "tailwindcss": "^4.3.3",
76
77
  "vite": "8.1.5",
77
- "vitest": "4.1.10",
78
- "@scalar/sidebar": "0.11.1"
78
+ "vitest": "4.1.10"
79
79
  },
80
80
  "scripts": {
81
81
  "build": "vite build && pnpm build:styles && vue-tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && shx cp package.json dist",