@websublime/vite-plugin-open-api-devtools 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelinePage-CMchXIlE.js","sources":["../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/check.js","../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/circle-check-big.js","../../../node_modules/.pnpm/lucide-vue-next@0.513.0_vue@3.5.27_typescript@5.9.3_/node_modules/lucide-vue-next/dist/esm/icons/copy.js","../src/stores/timeline.ts","../src/components/TimelineDetail.vue","../src/components/TimelineEntry.vue","../src/pages/TimelinePage.vue"],"sourcesContent":["/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Check = createLucideIcon(\"check\", [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]);\n\nexport { Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheckBig = createLucideIcon(\"circle-check-big\", [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","/**\n * @license lucide-vue-next v0.513.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Copy = createLucideIcon(\"copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * Timeline Store\n *\n * What: Pinia store for managing request/response timeline data\n * How: Receives and stores timeline events from the server via WebSocket\n * Why: Provides reactive access to timeline data for the Timeline Page\n *\n * @module stores/timeline\n */\n\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\n/**\n * HTTP method type for timeline entries\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'TRACE';\n\n/**\n * Request log entry from the server\n */\nexport interface RequestLogEntry {\n id: string;\n method: string;\n path: string;\n operationId: string;\n timestamp: number;\n headers: Record<string, string>;\n query: Record<string, string | string[]>;\n body?: unknown;\n}\n\n/**\n * Response log entry from the server\n */\nexport interface ResponseLogEntry {\n id: string;\n requestId: string;\n status: number;\n duration: number;\n headers: Record<string, string>;\n body: unknown;\n simulated: boolean;\n}\n\n/**\n * Combined timeline entry with request and optional response\n */\nexport interface TimelineEntry {\n id: string;\n request: RequestLogEntry;\n response: ResponseLogEntry | null;\n status: number | null;\n duration: number | null;\n simulated: boolean;\n}\n\n/**\n * Timeline data from server\n */\nexport interface TimelineData {\n entries: Array<{ type: 'request' | 'response'; data: RequestLogEntry | ResponseLogEntry }>;\n count: number;\n total: number;\n}\n\n/**\n * Filter options for timeline entries\n */\nexport interface TimelineFilter {\n methods: HttpMethod[];\n statusCodes: ('1xx' | '2xx' | '3xx' | '4xx' | '5xx')[];\n searchQuery: string;\n simulatedOnly: boolean | null;\n}\n\n/**\n * Timeline store for request/response tracking\n *\n * Provides:\n * - Timeline entry storage and retrieval\n * - Real-time updates via WebSocket events\n * - Search and filter functionality\n * - Selected entry tracking for detail view\n * - Timeline limit management\n */\nexport const useTimelineStore = defineStore('timeline', () => {\n // ==========================================================================\n // State\n // ==========================================================================\n\n /** All timeline entries (request + response pairs) */\n const entries = ref<TimelineEntry[]>([]);\n\n /** Loading state */\n const isLoading = ref(false);\n\n /** Error state */\n const error = ref<string | null>(null);\n\n /** Active filters */\n const filter = ref<TimelineFilter>({\n methods: [],\n statusCodes: [],\n searchQuery: '',\n simulatedOnly: null,\n });\n\n /** Currently selected entry ID */\n const selectedEntryId = ref<string | null>(null);\n\n /** Maximum number of entries to keep */\n const maxEntries = ref(500);\n\n /** Buffer for responses that arrived before their requests */\n const responseBuffer = new Map<string, ResponseLogEntry>();\n\n // ==========================================================================\n // Getters / Computed\n // ==========================================================================\n\n /**\n * Get status category from status code\n */\n function getStatusCategory(status: number): '1xx' | '2xx' | '3xx' | '4xx' | '5xx' {\n if (status < 200) return '1xx';\n if (status < 300) return '2xx';\n if (status < 400) return '3xx';\n if (status < 500) return '4xx';\n return '5xx';\n }\n\n /**\n * Filtered entries based on search and filters\n */\n const filteredEntries = computed(() => {\n let result = entries.value;\n\n // Apply search query (matches path or operationId)\n if (filter.value.searchQuery.trim()) {\n const query = filter.value.searchQuery.toLowerCase().trim();\n result = result.filter((entry) => {\n return (\n entry.request.path.toLowerCase().includes(query) ||\n entry.request.operationId.toLowerCase().includes(query)\n );\n });\n }\n\n // Apply method filter\n if (filter.value.methods.length > 0) {\n result = result.filter((entry) =>\n filter.value.methods.includes(entry.request.method.toUpperCase() as HttpMethod),\n );\n }\n\n // Apply status code filter\n if (filter.value.statusCodes.length > 0) {\n result = result.filter((entry) => {\n if (entry.status === null) return false;\n const category = getStatusCategory(entry.status);\n return filter.value.statusCodes.includes(category);\n });\n }\n\n // Apply simulated filter\n if (filter.value.simulatedOnly !== null) {\n result = result.filter((entry) => entry.simulated === filter.value.simulatedOnly);\n }\n\n return result;\n });\n\n /**\n * Currently selected entry\n */\n const selectedEntry = computed(() => {\n if (!selectedEntryId.value) return null;\n return entries.value.find((e) => e.id === selectedEntryId.value) ?? null;\n });\n\n /**\n * Total number of entries (including pending responses)\n */\n const totalCount = computed(() => entries.value.length);\n\n /**\n * Count of entries with responses\n */\n const completedCount = computed(() => entries.value.filter((e) => e.response !== null).length);\n\n /**\n * Count of pending requests (no response yet)\n */\n const pendingCount = computed(() => entries.value.filter((e) => e.response === null).length);\n\n /**\n * Count of entries by status category\n */\n const statusCounts = computed(() => {\n const counts = {\n '1xx': 0,\n '2xx': 0,\n '3xx': 0,\n '4xx': 0,\n '5xx': 0,\n };\n\n for (const entry of entries.value) {\n if (entry.status !== null) {\n const category = getStatusCategory(entry.status);\n counts[category]++;\n }\n }\n\n return counts;\n });\n\n /**\n * Average response duration in milliseconds\n */\n const averageDuration = computed(() => {\n const completedEntries = entries.value.filter((e) => e.duration !== null);\n if (completedEntries.length === 0) return 0;\n\n const totalDuration = completedEntries.reduce((sum, e) => sum + (e.duration ?? 0), 0);\n return Math.round(totalDuration / completedEntries.length);\n });\n\n // ==========================================================================\n // Actions\n // ==========================================================================\n\n /**\n * Add a request to the timeline\n */\n function addRequest(request: RequestLogEntry): void {\n const entry: TimelineEntry = {\n id: request.id,\n request,\n response: null,\n status: null,\n duration: null,\n simulated: false,\n };\n\n // Check if there's a buffered response for this request\n const bufferedResponse = responseBuffer.get(request.id);\n if (bufferedResponse) {\n mergeResponse(entry, bufferedResponse);\n // Clear consumed buffered response\n responseBuffer.delete(request.id);\n }\n\n // Add to beginning of array (newest first)\n entries.value.unshift(entry);\n\n // Trim to max entries\n if (entries.value.length > maxEntries.value) {\n entries.value = entries.value.slice(0, maxEntries.value);\n }\n }\n\n /**\n * Add a response to an existing request\n */\n function addResponse(response: ResponseLogEntry): void {\n const entry = entries.value.find((e) => e.id === response.requestId);\n if (entry) {\n // Entry exists, merge immediately\n mergeResponse(entry, response);\n // Clear from buffer if it was buffered\n responseBuffer.delete(response.requestId);\n } else {\n // Entry doesn't exist yet, buffer the response\n responseBuffer.set(response.requestId, response);\n\n // Prevent unbounded buffer growth: create stub entry if buffer exceeds threshold\n // This ensures orphaned responses don't cause memory leaks in real-time scenarios\n if (responseBuffer.size > 100) {\n const stubEntry = createStubEntry(response);\n entries.value.unshift(stubEntry);\n responseBuffer.delete(response.requestId);\n\n // Trim to max entries\n if (entries.value.length > maxEntries.value) {\n entries.value = entries.value.slice(0, maxEntries.value);\n }\n }\n }\n }\n\n /**\n * Merge a response into an entry\n */\n function mergeResponse(entry: TimelineEntry, response: ResponseLogEntry): void {\n entry.response = response;\n entry.status = response.status;\n entry.duration = response.duration;\n entry.simulated = response.simulated;\n }\n\n /**\n * Create a stub entry for an orphaned response\n */\n function createStubEntry(response: ResponseLogEntry): TimelineEntry {\n // Create a minimal request stub for the orphaned response\n const stubRequest: RequestLogEntry = {\n id: response.requestId,\n method: 'UNKNOWN',\n path: '/unknown',\n operationId: 'unknown',\n timestamp: Date.now(), // Use current time as fallback\n headers: {},\n query: {},\n body: undefined,\n };\n\n return {\n id: response.requestId,\n request: stubRequest,\n response,\n status: response.status,\n duration: response.duration,\n simulated: response.simulated,\n };\n }\n\n /**\n * Process buffered responses and merge with existing entries or create stubs\n */\n function processBufferedResponses(requestMap: Map<string, TimelineEntry>): void {\n for (const [requestId, response] of responseBuffer) {\n const entry = requestMap.get(requestId);\n if (entry) {\n mergeResponse(entry, response);\n responseBuffer.delete(requestId);\n } else {\n // No matching request found, create stub entry\n requestMap.set(requestId, createStubEntry(response));\n responseBuffer.delete(requestId);\n }\n }\n }\n\n /**\n * Process incoming responses and merge, buffer, or create stub entries\n */\n function processIncomingResponses(\n requestMap: Map<string, TimelineEntry>,\n incomingResponses: Map<string, ResponseLogEntry>,\n ): void {\n for (const [requestId, response] of incomingResponses) {\n const entry = requestMap.get(requestId);\n if (entry) {\n mergeResponse(entry, response);\n } else {\n // Buffer the response for potential future request\n // Note: During initial load, we'll create stubs later\n responseBuffer.set(requestId, response);\n }\n }\n }\n\n /**\n * Create stub entries for any remaining buffered responses\n * This ensures no response is lost even if its request never arrives\n */\n function createStubsForOrphanedResponses(requestMap: Map<string, TimelineEntry>): void {\n for (const [requestId, response] of responseBuffer) {\n if (!requestMap.has(requestId)) {\n requestMap.set(requestId, createStubEntry(response));\n responseBuffer.delete(requestId);\n }\n }\n }\n\n /**\n * Set timeline data from server response\n * Used when fetching initial timeline data\n */\n function setTimelineData(data: TimelineData): void {\n const requestMap = new Map<string, TimelineEntry>();\n const incomingResponses = new Map<string, ResponseLogEntry>();\n\n // First pass: collect all requests and responses\n for (const item of data.entries) {\n if (item.type === 'request') {\n const request = item.data as RequestLogEntry;\n requestMap.set(request.id, {\n id: request.id,\n request,\n response: null,\n status: null,\n duration: null,\n simulated: false,\n });\n } else if (item.type === 'response') {\n const response = item.data as ResponseLogEntry;\n incomingResponses.set(response.requestId, response);\n }\n }\n\n // Second pass: merge responses with requests\n processBufferedResponses(requestMap);\n processIncomingResponses(requestMap, incomingResponses);\n\n // Third pass: create stub entries for any remaining orphaned responses\n // This ensures no response is lost even if its request never arrives\n createStubsForOrphanedResponses(requestMap);\n\n // Convert map to array and sort by timestamp (newest first)\n const sorted = Array.from(requestMap.values()).sort(\n (a, b) => b.request.timestamp - a.request.timestamp,\n );\n\n // Apply maxEntries limit\n entries.value = sorted.slice(0, maxEntries.value);\n\n error.value = null;\n }\n\n /**\n * Clear all timeline entries\n */\n function clearTimeline(): void {\n entries.value = [];\n selectedEntryId.value = null;\n responseBuffer.clear();\n }\n\n /**\n * Set loading state\n */\n function setLoading(loading: boolean): void {\n isLoading.value = loading;\n }\n\n /**\n * Set error state\n */\n function setError(errorMessage: string): void {\n error.value = errorMessage;\n isLoading.value = false;\n }\n\n /**\n * Clear error state\n */\n function clearError(): void {\n error.value = null;\n }\n\n /**\n * Set search query\n */\n function setSearchQuery(query: string): void {\n filter.value.searchQuery = query;\n }\n\n /**\n * Toggle method filter\n */\n function toggleMethodFilter(method: HttpMethod): void {\n const index = filter.value.methods.indexOf(method);\n if (index === -1) {\n filter.value.methods.push(method);\n } else {\n filter.value.methods.splice(index, 1);\n }\n }\n\n /**\n * Toggle status code filter\n */\n function toggleStatusFilter(status: '1xx' | '2xx' | '3xx' | '4xx' | '5xx'): void {\n const index = filter.value.statusCodes.indexOf(status);\n if (index === -1) {\n filter.value.statusCodes.push(status);\n } else {\n filter.value.statusCodes.splice(index, 1);\n }\n }\n\n /**\n * Set simulated filter\n */\n function setSimulatedFilter(simulated: boolean | null): void {\n filter.value.simulatedOnly = simulated;\n }\n\n /**\n * Clear all filters\n */\n function clearFilters(): void {\n filter.value = {\n methods: [],\n statusCodes: [],\n searchQuery: '',\n simulatedOnly: null,\n };\n }\n\n /**\n * Check if any filter is active\n */\n function hasActiveFilters(): boolean {\n return (\n filter.value.searchQuery.trim() !== '' ||\n filter.value.methods.length > 0 ||\n filter.value.statusCodes.length > 0 ||\n filter.value.simulatedOnly !== null\n );\n }\n\n /**\n * Select an entry by ID\n */\n function selectEntry(id: string | null): void {\n selectedEntryId.value = id;\n }\n\n /**\n * Set maximum entries limit\n */\n function setMaxEntries(limit: number): void {\n // Clamp limit to a safe minimum\n const clamped = Math.max(1, limit);\n maxEntries.value = clamped;\n\n // Trim if necessary\n if (entries.value.length > clamped) {\n entries.value = entries.value.slice(0, clamped);\n }\n }\n\n // ==========================================================================\n // Return\n // ==========================================================================\n\n return {\n // State\n entries,\n isLoading,\n error,\n filter,\n selectedEntryId,\n maxEntries,\n\n // Getters\n filteredEntries,\n selectedEntry,\n totalCount,\n completedCount,\n pendingCount,\n statusCounts,\n averageDuration,\n\n // Actions\n addRequest,\n addResponse,\n setTimelineData,\n clearTimeline,\n setLoading,\n setError,\n clearError,\n setSearchQuery,\n toggleMethodFilter,\n toggleStatusFilter,\n setSimulatedFilter,\n clearFilters,\n hasActiveFilters,\n selectEntry,\n setMaxEntries,\n };\n});\n","<!--\n TimelineDetail.vue - Timeline Entry Detail Panel\n\n What: Displays full request and response details for a selected timeline entry\n How: Shows headers, query params, body content in organized collapsible sections\n Why: Allows developers to inspect API traffic in detail for debugging\n-->\n\n<script setup lang=\"ts\">\nimport { Check, ChevronDown, ChevronRight, Clock, Copy, Zap } from 'lucide-vue-next';\n\nimport { computed, ref } from 'vue';\n\nimport type { TimelineEntry } from '@/stores/timeline';\n\nimport { getMethodLabel } from '@/utils/format';\n\n/**\n * Component props\n */\ninterface Props {\n /** The timeline entry to display */\n entry: TimelineEntry | null;\n}\n\nconst props = defineProps<Props>();\n\n/**\n * Section expansion state\n */\nconst expandedSections = ref({\n requestHeaders: true,\n requestQuery: true,\n requestBody: true,\n responseHeaders: true,\n responseBody: true,\n});\n\n/**\n * Copy feedback state\n */\nconst copiedField = ref<string | null>(null);\n\n/**\n * Format timestamp for display\n */\nconst formattedTimestamp = computed(() => {\n if (!props.entry) return '';\n const date = new Date(props.entry.request.timestamp);\n return date.toLocaleString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3,\n hour12: false,\n });\n});\n\n/**\n * Format duration for display\n */\nconst formattedDuration = computed(() => {\n if (props.entry?.duration == null) return 'pending...';\n if (props.entry.duration < 1000) {\n return `${props.entry.duration}ms`;\n }\n return `${(props.entry.duration / 1000).toFixed(2)}s`;\n});\n\n/**\n * Get status badge class based on status code\n */\nconst statusClass = computed(() => {\n if (!props.entry?.status) return 'status-badge--pending';\n if (props.entry.status < 200) return 'status-badge--1xx';\n if (props.entry.status < 300) return 'status-badge--2xx';\n if (props.entry.status < 400) return 'status-badge--3xx';\n if (props.entry.status < 500) return 'status-badge--4xx';\n return 'status-badge--5xx';\n});\n\n/**\n * Check if request has query parameters\n */\nconst hasQueryParams = computed(() => {\n if (!props.entry?.request.query) return false;\n return Object.keys(props.entry.request.query).length > 0;\n});\n\n/**\n * Check if request has headers\n */\nconst hasRequestHeaders = computed(() => {\n if (!props.entry?.request.headers) return false;\n return Object.keys(props.entry.request.headers).length > 0;\n});\n\n/**\n * Check if request has body\n */\nconst hasRequestBody = computed(() => {\n return props.entry?.request.body !== undefined && props.entry?.request.body !== null;\n});\n\n/**\n * Check if response has headers\n */\nconst hasResponseHeaders = computed(() => {\n if (!props.entry?.response?.headers) return false;\n return Object.keys(props.entry.response.headers).length > 0;\n});\n\n/**\n * Check if response has body\n */\nconst hasResponseBody = computed(() => {\n return props.entry?.response?.body !== undefined && props.entry?.response?.body !== null;\n});\n\n/**\n * Format JSON for display\n */\nfunction formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Toggle section expansion\n */\nfunction toggleSection(section: keyof typeof expandedSections.value): void {\n expandedSections.value[section] = !expandedSections.value[section];\n}\n\n/**\n * Copy text to clipboard\n */\nasync function copyToClipboard(text: string, fieldId: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n copiedField.value = fieldId;\n setTimeout(() => {\n copiedField.value = null;\n }, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n}\n\n/**\n * Copy full entry as JSON\n */\nasync function copyFullEntry(): Promise<void> {\n if (!props.entry) return;\n const data = {\n request: props.entry.request,\n response: props.entry.response,\n };\n await copyToClipboard(JSON.stringify(data, null, 2), 'full');\n}\n</script>\n\n<template>\n <div class=\"timeline-detail\">\n <!-- Empty state -->\n <div v-if=\"!entry\" class=\"timeline-detail__empty\">\n <Clock :size=\"48\" class=\"timeline-detail__empty-icon\" />\n <h3 class=\"timeline-detail__empty-title\">Select an entry</h3>\n <p class=\"timeline-detail__empty-description\">\n Click on a timeline entry to view its details.\n </p>\n </div>\n\n <!-- Entry details -->\n <div v-else class=\"timeline-detail__content\">\n <!-- Header with summary -->\n <div class=\"timeline-detail__header\">\n <div class=\"timeline-detail__summary\">\n <span :class=\"['method-badge', `method-badge--${entry.request.method.toLowerCase()}`]\">\n {{ getMethodLabel(entry.request.method) }}\n </span>\n <span class=\"timeline-detail__path font-mono\">{{ entry.request.path }}</span>\n </div>\n\n <div class=\"timeline-detail__meta\">\n <span v-if=\"entry.status !== null\" :class=\"['status-badge', statusClass]\">\n {{ entry.status }}\n </span>\n <span v-else class=\"status-badge status-badge--pending\">pending</span>\n\n <span class=\"timeline-detail__duration\">\n <Clock :size=\"14\" />\n {{ formattedDuration }}\n </span>\n\n <span v-if=\"entry.simulated\" class=\"timeline-detail__simulated\" title=\"Simulated response\">\n <Zap :size=\"14\" />\n Simulated\n </span>\n </div>\n\n <div class=\"timeline-detail__actions\">\n <button\n type=\"button\"\n class=\"btn btn--ghost btn--sm\"\n title=\"Copy as JSON\"\n @click=\"copyFullEntry\"\n >\n <component :is=\"copiedField === 'full' ? Check : Copy\" :size=\"14\" />\n {{ copiedField === 'full' ? 'Copied!' : 'Copy JSON' }}\n </button>\n </div>\n </div>\n\n <!-- Info section -->\n <div class=\"timeline-detail__info\">\n <div class=\"timeline-detail__info-item\">\n <span class=\"timeline-detail__info-label\">Timestamp</span>\n <span class=\"timeline-detail__info-value font-mono\">{{ formattedTimestamp }}</span>\n </div>\n <div class=\"timeline-detail__info-item\">\n <span class=\"timeline-detail__info-label\">Operation ID</span>\n <span class=\"timeline-detail__info-value font-mono\">{{ entry.request.operationId }}</span>\n </div>\n <div class=\"timeline-detail__info-item\">\n <span class=\"timeline-detail__info-label\">Request ID</span>\n <span class=\"timeline-detail__info-value font-mono\">{{ entry.id }}</span>\n </div>\n </div>\n\n <!-- Request section -->\n <div class=\"timeline-detail__section\">\n <h3 class=\"timeline-detail__section-title\">Request</h3>\n\n <!-- Query Parameters -->\n <div v-if=\"hasQueryParams\" class=\"timeline-detail__subsection\">\n <button\n type=\"button\"\n class=\"timeline-detail__subsection-header\"\n :aria-expanded=\"expandedSections.requestQuery\"\n aria-controls=\"requestQuery-panel\"\n @click=\"toggleSection('requestQuery')\"\n >\n <component\n :is=\"expandedSections.requestQuery ? ChevronDown : ChevronRight\"\n :size=\"16\"\n />\n <span>Query Parameters</span>\n <span class=\"text-muted\">({{ Object.keys(entry.request.query).length }})</span>\n </button>\n <div\n id=\"requestQuery-panel\"\n v-show=\"expandedSections.requestQuery\"\n class=\"timeline-detail__subsection-content\"\n >\n <div\n v-for=\"(value, key) in entry.request.query\"\n :key=\"key\"\n class=\"timeline-detail__kv-row\"\n >\n <span class=\"timeline-detail__kv-key font-mono\">{{ key }}</span>\n <span class=\"timeline-detail__kv-value font-mono\">\n {{ Array.isArray(value) ? value.join(', ') : value }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Request Headers -->\n <div v-if=\"hasRequestHeaders\" class=\"timeline-detail__subsection\">\n <button\n type=\"button\"\n class=\"timeline-detail__subsection-header\"\n :aria-expanded=\"expandedSections.requestHeaders\"\n aria-controls=\"requestHeaders-panel\"\n @click=\"toggleSection('requestHeaders')\"\n >\n <component\n :is=\"expandedSections.requestHeaders ? ChevronDown : ChevronRight\"\n :size=\"16\"\n />\n <span>Headers</span>\n <span class=\"text-muted\">({{ Object.keys(entry.request.headers).length }})</span>\n </button>\n <div\n id=\"requestHeaders-panel\"\n v-show=\"expandedSections.requestHeaders\"\n class=\"timeline-detail__subsection-content\"\n >\n <div\n v-for=\"(value, key) in entry.request.headers\"\n :key=\"key\"\n class=\"timeline-detail__kv-row\"\n >\n <span class=\"timeline-detail__kv-key font-mono\">{{ key }}</span>\n <span class=\"timeline-detail__kv-value font-mono\">{{ value }}</span>\n </div>\n </div>\n </div>\n\n <!-- Request Body -->\n <div v-if=\"hasRequestBody\" class=\"timeline-detail__subsection\">\n <div class=\"timeline-detail__subsection-header\" role=\"group\">\n <button\n type=\"button\"\n class=\"timeline-detail__subsection-toggle\"\n :aria-expanded=\"expandedSections.requestBody\"\n aria-controls=\"requestBody-panel\"\n @click=\"toggleSection('requestBody')\"\n >\n <component\n :is=\"expandedSections.requestBody ? ChevronDown : ChevronRight\"\n :size=\"16\"\n />\n <span>Body</span>\n </button>\n <button\n type=\"button\"\n class=\"btn btn--ghost btn--icon btn--sm\"\n title=\"Copy body\"\n @click.stop=\"copyToClipboard(formatJson(entry.request.body), 'reqBody')\"\n >\n <component :is=\"copiedField === 'reqBody' ? Check : Copy\" :size=\"12\" />\n </button>\n </div>\n <div\n id=\"requestBody-panel\"\n v-show=\"expandedSections.requestBody\"\n class=\"timeline-detail__subsection-content\"\n >\n <pre class=\"timeline-detail__json\">{{ formatJson(entry.request.body) }}</pre>\n </div>\n </div>\n </div>\n\n <!-- Response section -->\n <div v-if=\"entry.response\" class=\"timeline-detail__section\">\n <h3 class=\"timeline-detail__section-title\">Response</h3>\n\n <!-- Response Headers -->\n <div v-if=\"hasResponseHeaders\" class=\"timeline-detail__subsection\">\n <button\n type=\"button\"\n class=\"timeline-detail__subsection-header\"\n :aria-expanded=\"expandedSections.responseHeaders\"\n aria-controls=\"responseHeaders-panel\"\n @click=\"toggleSection('responseHeaders')\"\n >\n <component\n :is=\"expandedSections.responseHeaders ? ChevronDown : ChevronRight\"\n :size=\"16\"\n />\n <span>Headers</span>\n <span class=\"text-muted\">({{ Object.keys(entry.response.headers).length }})</span>\n </button>\n <div\n id=\"responseHeaders-panel\"\n v-show=\"expandedSections.responseHeaders\"\n class=\"timeline-detail__subsection-content\"\n >\n <div\n v-for=\"(value, key) in entry.response.headers\"\n :key=\"key\"\n class=\"timeline-detail__kv-row\"\n >\n <span class=\"timeline-detail__kv-key font-mono\">{{ key }}</span>\n <span class=\"timeline-detail__kv-value font-mono\">{{ value }}</span>\n </div>\n </div>\n </div>\n\n <!-- Response Body -->\n <div v-if=\"hasResponseBody\" class=\"timeline-detail__subsection\">\n <div class=\"timeline-detail__subsection-header\" role=\"group\">\n <button\n type=\"button\"\n class=\"timeline-detail__subsection-toggle\"\n :aria-expanded=\"expandedSections.responseBody\"\n aria-controls=\"responseBody-panel\"\n @click=\"toggleSection('responseBody')\"\n >\n <component\n :is=\"expandedSections.responseBody ? ChevronDown : ChevronRight\"\n :size=\"16\"\n />\n <span>Body</span>\n </button>\n <button\n type=\"button\"\n class=\"btn btn--ghost btn--icon btn--sm\"\n title=\"Copy body\"\n @click.stop=\"copyToClipboard(formatJson(entry.response.body), 'resBody')\"\n >\n <component :is=\"copiedField === 'resBody' ? Check : Copy\" :size=\"12\" />\n </button>\n </div>\n <div\n id=\"responseBody-panel\"\n v-show=\"expandedSections.responseBody\"\n class=\"timeline-detail__subsection-content\"\n >\n <pre class=\"timeline-detail__json\">{{ formatJson(entry.response.body) }}</pre>\n </div>\n </div>\n </div>\n\n <!-- Pending response state -->\n <div v-else class=\"timeline-detail__section timeline-detail__section--pending\">\n <h3 class=\"timeline-detail__section-title\">Response</h3>\n <div class=\"timeline-detail__pending\">\n <Clock :size=\"24\" class=\"timeline-detail__pending-icon\" />\n <span class=\"text-muted\">Waiting for response...</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.timeline-detail {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n/* Empty state */\n.timeline-detail__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: var(--devtools-space-xl);\n text-align: center;\n}\n\n.timeline-detail__empty-icon {\n color: var(--devtools-text-muted);\n opacity: 0.5;\n margin-bottom: var(--devtools-space-md);\n}\n\n.timeline-detail__empty-title {\n font-size: var(--font-size-3);\n font-weight: var(--font-weight-6);\n color: var(--devtools-text);\n margin: 0 0 var(--devtools-space-sm) 0;\n}\n\n.timeline-detail__empty-description {\n font-size: var(--font-size-1);\n color: var(--devtools-text-muted);\n margin: 0;\n}\n\n/* Content */\n.timeline-detail__content {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow-y: auto;\n}\n\n/* Header */\n.timeline-detail__header {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-sm);\n padding: var(--devtools-space-md);\n background-color: var(--devtools-surface);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.timeline-detail__summary {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n}\n\n.timeline-detail__path {\n font-size: var(--font-size-2);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text);\n word-break: break-all;\n}\n\n.timeline-detail__meta {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-md);\n}\n\n.timeline-detail__duration {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n}\n\n.timeline-detail__simulated {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n font-size: var(--font-size-0);\n color: var(--devtools-warning);\n}\n\n.timeline-detail__actions {\n display: flex;\n gap: var(--devtools-space-sm);\n}\n\n/* Info section */\n.timeline-detail__info {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-md);\n background-color: var(--devtools-surface-elevated);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.timeline-detail__info-item {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n.timeline-detail__info-label {\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.timeline-detail__info-value {\n font-size: var(--font-size-1);\n color: var(--devtools-text);\n}\n\n/* Section */\n.timeline-detail__section {\n padding: var(--devtools-space-md);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.timeline-detail__section:last-child {\n border-bottom: none;\n}\n\n.timeline-detail__section-title {\n font-size: var(--font-size-1);\n font-weight: var(--font-weight-6);\n color: var(--devtools-text);\n margin: 0 0 var(--devtools-space-md) 0;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n/* Subsection */\n.timeline-detail__subsection {\n margin-bottom: var(--devtools-space-sm);\n}\n\n.timeline-detail__subsection:last-child {\n margin-bottom: 0;\n}\n\n.timeline-detail__subsection-header {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n width: 100%;\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n background-color: var(--devtools-surface);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-sm);\n}\n\n.timeline-detail__subsection-toggle {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n flex: 1;\n padding: 0;\n background: none;\n border: none;\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-1);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text);\n text-align: left;\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.timeline-detail__subsection-toggle:hover {\n color: var(--devtools-text-hover);\n}\n\n.timeline-detail__subsection-content {\n margin-top: var(--devtools-space-xs);\n padding: var(--devtools-space-sm);\n background-color: var(--devtools-surface);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-sm);\n}\n\n/* Key-value rows */\n.timeline-detail__kv-row {\n display: grid;\n grid-template-columns: minmax(120px, auto) 1fr;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-xs) 0;\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.timeline-detail__kv-row:last-child {\n border-bottom: none;\n}\n\n.timeline-detail__kv-key {\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text-muted);\n word-break: break-all;\n}\n\n.timeline-detail__kv-value {\n font-size: var(--font-size-0);\n color: var(--devtools-text);\n word-break: break-all;\n}\n\n/* JSON display */\n.timeline-detail__json {\n margin: 0;\n padding: var(--devtools-space-sm);\n background-color: var(--devtools-bg);\n border-radius: var(--devtools-radius-sm);\n font-family: var(--devtools-font-mono);\n font-size: var(--font-size-0);\n color: var(--devtools-text);\n white-space: pre-wrap;\n word-break: break-all;\n overflow-x: auto;\n}\n\n/* Status badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n padding: 2px var(--devtools-space-sm);\n border-radius: var(--devtools-radius-sm);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n font-family: var(--devtools-font-mono);\n}\n\n.status-badge--pending {\n background-color: color-mix(in srgb, var(--devtools-text-muted) 15%, transparent);\n color: var(--devtools-text-muted);\n}\n\n.status-badge--1xx {\n background-color: color-mix(in srgb, var(--devtools-info) 15%, transparent);\n color: var(--devtools-info);\n}\n\n.status-badge--2xx {\n background-color: color-mix(in srgb, var(--devtools-success) 15%, transparent);\n color: var(--devtools-success);\n}\n\n.status-badge--3xx {\n background-color: color-mix(in srgb, var(--devtools-info) 15%, transparent);\n color: var(--devtools-info);\n}\n\n.status-badge--4xx {\n background-color: color-mix(in srgb, var(--devtools-warning) 15%, transparent);\n color: var(--devtools-warning);\n}\n\n.status-badge--5xx {\n background-color: color-mix(in srgb, var(--devtools-error) 15%, transparent);\n color: var(--devtools-error);\n}\n\n/* Pending response */\n.timeline-detail__pending {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--devtools-space-sm);\n padding: var(--devtools-space-lg);\n}\n\n.timeline-detail__pending-icon {\n color: var(--devtools-text-muted);\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n</style>\n","<!--\n TimelineEntry.vue - Timeline Entry Component\n\n What: Displays a single request/response entry in the timeline\n How: Shows method, path, status, duration with color-coded badges\n Why: Provides consistent visualization of API traffic in the timeline list\n-->\n\n<script setup lang=\"ts\">\nimport { AlertTriangle, CheckCircle, Clock, Zap } from 'lucide-vue-next';\nimport { computed } from 'vue';\n\nimport type { TimelineEntry } from '@/stores/timeline';\n\nimport { getMethodLabel } from '@/utils/format';\n\n/**\n * Component props\n */\ninterface Props {\n /** The timeline entry to display */\n entry: TimelineEntry;\n /** Whether this entry is currently selected */\n isSelected?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isSelected: false,\n});\n\n/**\n * Component events\n */\nconst emit = defineEmits<{\n /** Emitted when the entry is clicked */\n (e: 'select', id: string): void;\n}>();\n\n/**\n * Format timestamp for display\n */\nconst formattedTime = computed(() => {\n const date = new Date(props.entry.request.timestamp);\n return date.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3,\n });\n});\n\n/**\n * Format duration for display\n */\nconst formattedDuration = computed(() => {\n if (props.entry.duration === null) {\n return 'pending...';\n }\n if (props.entry.duration < 1000) {\n return `${props.entry.duration}ms`;\n }\n return `${(props.entry.duration / 1000).toFixed(2)}s`;\n});\n\n/**\n * Get status badge class based on status code\n */\nconst statusClass = computed(() => {\n if (props.entry.status === null) return 'status-badge--pending';\n if (props.entry.status < 200) return 'status-badge--1xx';\n if (props.entry.status < 300) return 'status-badge--2xx';\n if (props.entry.status < 400) return 'status-badge--3xx';\n if (props.entry.status < 500) return 'status-badge--4xx';\n return 'status-badge--5xx';\n});\n\n/**\n * Status icon component based on status code\n */\nconst statusIcon = computed(() => {\n if (props.entry.status === null) return Clock;\n if (props.entry.status < 400) return CheckCircle;\n return AlertTriangle;\n});\n\n/**\n * Whether the response is pending\n */\nconst isPending = computed(() => props.entry.response === null);\n\n/**\n * Handle entry click\n */\nfunction handleClick(): void {\n emit('select', props.entry.id);\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n :class=\"[\n 'timeline-entry',\n { 'timeline-entry--selected': isSelected },\n { 'timeline-entry--pending': isPending },\n { 'timeline-entry--simulated': entry.simulated }\n ]\"\n @click=\"handleClick\"\n >\n <!-- Timestamp -->\n <div class=\"timeline-entry__time font-mono text-muted\">\n {{ formattedTime }}\n </div>\n\n <!-- Method badge -->\n <div class=\"timeline-entry__method\">\n <span :class=\"['method-badge', `method-badge--${entry.request.method.toLowerCase()}`]\">\n {{ getMethodLabel(entry.request.method) }}\n </span>\n </div>\n\n <!-- Path -->\n <div class=\"timeline-entry__path font-mono\">\n {{ entry.request.path }}\n </div>\n\n <!-- Status badge -->\n <div class=\"timeline-entry__status\">\n <span v-if=\"entry.status !== null\" :class=\"['status-badge', statusClass]\">\n <component :is=\"statusIcon\" :size=\"12\" />\n {{ entry.status }}\n </span>\n <span v-else class=\"status-badge status-badge--pending\">\n <Clock :size=\"12\" />\n pending\n </span>\n </div>\n\n <!-- Duration -->\n <div class=\"timeline-entry__duration font-mono text-muted\">\n {{ formattedDuration }}\n </div>\n\n <!-- Simulated indicator -->\n <div v-if=\"entry.simulated\" class=\"timeline-entry__simulated\" title=\"Simulated response\">\n <Zap :size=\"14\" />\n </div>\n </button>\n</template>\n\n<style scoped>\n.timeline-entry {\n display: grid;\n grid-template-columns: 100px 80px 1fr auto 80px auto;\n align-items: center;\n gap: var(--devtools-space-md);\n width: 100%;\n padding: var(--devtools-space-sm) var(--devtools-space-md);\n background: var(--devtools-surface);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-sm);\n font-family: var(--devtools-font-sans);\n text-align: left;\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.timeline-entry:hover {\n background-color: var(--devtools-surface-elevated);\n border-color: var(--devtools-border-hover);\n}\n\n.timeline-entry:focus {\n outline: none;\n}\n\n.timeline-entry:focus-visible {\n outline: 2px solid var(--devtools-primary);\n outline-offset: -2px;\n}\n\n.timeline-entry--selected {\n background-color: color-mix(in srgb, var(--devtools-primary) 10%, transparent);\n border-color: var(--devtools-primary);\n}\n\n.timeline-entry--selected:hover {\n background-color: color-mix(in srgb, var(--devtools-primary) 15%, transparent);\n}\n\n.timeline-entry--pending {\n opacity: 0.7;\n}\n\n.timeline-entry--simulated {\n border-left: 3px solid var(--devtools-warning);\n}\n\n/* Time column */\n.timeline-entry__time {\n font-size: var(--font-size-0);\n}\n\n/* Path column */\n.timeline-entry__path {\n font-size: var(--font-size-1);\n color: var(--devtools-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Status column */\n.timeline-entry__status {\n display: flex;\n align-items: center;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n padding: 2px var(--devtools-space-sm);\n border-radius: var(--devtools-radius-sm);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n font-family: var(--devtools-font-mono);\n}\n\n.status-badge--pending {\n background-color: color-mix(in srgb, var(--devtools-text-muted) 15%, transparent);\n color: var(--devtools-text-muted);\n}\n\n.status-badge--1xx {\n background-color: color-mix(in srgb, var(--devtools-info) 15%, transparent);\n color: var(--devtools-info);\n}\n\n.status-badge--2xx {\n background-color: color-mix(in srgb, var(--devtools-success) 15%, transparent);\n color: var(--devtools-success);\n}\n\n.status-badge--3xx {\n background-color: color-mix(in srgb, var(--devtools-info) 15%, transparent);\n color: var(--devtools-info);\n}\n\n.status-badge--4xx {\n background-color: color-mix(in srgb, var(--devtools-warning) 15%, transparent);\n color: var(--devtools-warning);\n}\n\n.status-badge--5xx {\n background-color: color-mix(in srgb, var(--devtools-error) 15%, transparent);\n color: var(--devtools-error);\n}\n\n/* Duration column */\n.timeline-entry__duration {\n font-size: var(--font-size-0);\n text-align: right;\n}\n\n/* Simulated indicator */\n.timeline-entry__simulated {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--devtools-warning);\n}\n</style>\n","<!--\n TimelinePage.vue - Request/Response Timeline Page\n\n What: Displays a real-time timeline of API requests and responses\n How: Subscribes to WebSocket events and displays request/response logs with filtering\n Why: Allows developers to monitor and debug API traffic in real-time\n-->\n\n<script setup lang=\"ts\">\nimport { ChevronDown, ChevronUp, Clock, Filter, Search, Trash2, X } from 'lucide-vue-next';\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue';\n\nimport TimelineDetail from '@/components/TimelineDetail.vue';\nimport TimelineEntryComponent from '@/components/TimelineEntry.vue';\nimport { useWebSocket } from '@/composables/useWebSocket';\nimport {\n type HttpMethod,\n type RequestLogEntry,\n type ResponseLogEntry,\n type TimelineData,\n useTimelineStore,\n} from '@/stores/timeline';\n\n// Store and WebSocket\nconst timelineStore = useTimelineStore();\nconst { send, on, connected } = useWebSocket();\n\n// Local UI state\nconst showFilters = ref(false);\nconst searchInputRef = ref<HTMLInputElement | null>(null);\n\n// HTTP methods for filter\nconst httpMethods: HttpMethod[] = [\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n 'TRACE',\n];\n\n// Status categories for filter\nconst statusCategories = ['2xx', '3xx', '4xx', '5xx'] as const;\n\n/**\n * Fetch timeline data when connected\n */\nfunction fetchTimeline(): void {\n if (connected.value) {\n timelineStore.setLoading(true);\n send({ type: 'get:timeline' });\n }\n}\n\n/**\n * Handle timeline data from server\n */\nfunction handleTimelineData(data: TimelineData): void {\n timelineStore.setTimelineData(data);\n timelineStore.setLoading(false);\n}\n\n/**\n * Handle incoming request event\n */\nfunction handleRequest(data: RequestLogEntry): void {\n timelineStore.addRequest(data);\n}\n\n/**\n * Handle incoming response event\n */\nfunction handleResponse(data: ResponseLogEntry): void {\n timelineStore.addResponse(data);\n}\n\n/**\n * Handle timeline cleared event\n */\nfunction handleTimelineCleared(): void {\n timelineStore.clearTimeline();\n}\n\n/**\n * Clear timeline on server and locally\n */\nfunction clearTimeline(): void {\n send({ type: 'clear:timeline' });\n timelineStore.clearTimeline();\n}\n\n/**\n * Handle entry selection\n */\nfunction handleSelectEntry(id: string): void {\n timelineStore.selectEntry(id);\n}\n\n/**\n * Handle search input\n */\nfunction handleSearchInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n timelineStore.setSearchQuery(target.value);\n}\n\n/**\n * Clear search\n */\nfunction clearSearch(): void {\n timelineStore.setSearchQuery('');\n searchInputRef.value?.focus();\n}\n\n/**\n * Toggle method filter\n */\nfunction toggleMethod(method: HttpMethod): void {\n timelineStore.toggleMethodFilter(method);\n}\n\n/**\n * Check if method is active in filter\n */\nfunction isMethodActive(method: HttpMethod): boolean {\n return timelineStore.filter.methods.includes(method);\n}\n\n/**\n * Toggle status filter\n */\nfunction toggleStatus(status: '1xx' | '2xx' | '3xx' | '4xx' | '5xx'): void {\n timelineStore.toggleStatusFilter(status);\n}\n\n/**\n * Check if status is active in filter\n */\nfunction isStatusActive(status: '1xx' | '2xx' | '3xx' | '4xx' | '5xx'): boolean {\n return timelineStore.filter.statusCodes.includes(status);\n}\n\n/**\n * Toggle simulated filter\n */\nfunction toggleSimulatedFilter(): void {\n const current = timelineStore.filter.simulatedOnly;\n timelineStore.setSimulatedFilter(current === true ? null : true);\n}\n\n/**\n * Clear all filters\n */\nfunction clearAllFilters(): void {\n timelineStore.clearFilters();\n}\n\n/**\n * Toggle filter panel visibility\n */\nfunction toggleFilters(): void {\n showFilters.value = !showFilters.value;\n}\n\n/**\n * Computed: Has active filters\n */\nconst hasActiveFilters = computed(() => timelineStore.hasActiveFilters());\n\n/**\n * Computed: Filter badge count\n */\nconst filterBadgeCount = computed(() => {\n return (\n timelineStore.filter.methods.length +\n timelineStore.filter.statusCodes.length +\n (timelineStore.filter.simulatedOnly !== null ? 1 : 0)\n );\n});\n\n// Event cleanup functions for WebSocket subscriptions\nlet unsubTimeline: (() => void) | null = null;\nlet unsubRequest: (() => void) | null = null;\nlet unsubResponse: (() => void) | null = null;\nlet unsubCleared: (() => void) | null = null;\n\n// Subscribe to timeline events and setup cleanup\nonMounted(() => {\n // Subscribe to WebSocket events\n unsubTimeline = on<TimelineData>('timeline', handleTimelineData);\n unsubRequest = on<RequestLogEntry>('request', handleRequest);\n unsubResponse = on<ResponseLogEntry>('response', handleResponse);\n unsubCleared = on('timeline:cleared', handleTimelineCleared);\n\n // Fetch timeline when already connected\n if (connected.value) {\n fetchTimeline();\n }\n});\n\n// Cleanup event subscriptions on unmount\nonUnmounted(() => {\n unsubTimeline?.();\n unsubRequest?.();\n unsubResponse?.();\n unsubCleared?.();\n});\n\n// Re-fetch when connection is established\nwatch(connected, (isConnected) => {\n if (isConnected) {\n fetchTimeline();\n }\n});\n</script>\n\n<template>\n <div class=\"timeline-page\">\n <!-- Toolbar -->\n <div class=\"timeline-toolbar\">\n <!-- Search -->\n <div class=\"timeline-search\">\n <Search :size=\"16\" class=\"timeline-search__icon\" />\n <input\n ref=\"searchInputRef\"\n type=\"text\"\n class=\"timeline-search__input input\"\n placeholder=\"Search by path or operation...\"\n :value=\"timelineStore.filter.searchQuery\"\n @input=\"handleSearchInput\"\n />\n <button\n v-if=\"timelineStore.filter.searchQuery\"\n type=\"button\"\n class=\"timeline-search__clear btn btn--ghost btn--icon\"\n title=\"Clear search\"\n @click=\"clearSearch\"\n >\n <X :size=\"14\" />\n </button>\n </div>\n\n <!-- Filter toggle -->\n <button\n type=\"button\"\n :class=\"[\n 'timeline-filter-toggle btn btn--secondary',\n { 'timeline-filter-toggle--active': hasActiveFilters }\n ]\"\n :aria-expanded=\"showFilters\"\n @click=\"toggleFilters\"\n >\n <Filter :size=\"16\" />\n <span>Filters</span>\n <span v-if=\"filterBadgeCount > 0\" class=\"timeline-filter-toggle__badge\">\n {{ filterBadgeCount }}\n </span>\n <component :is=\"showFilters ? ChevronUp : ChevronDown\" :size=\"14\" />\n </button>\n\n <!-- Stats -->\n <div class=\"timeline-stats\">\n <span class=\"timeline-stats__item\">\n {{ timelineStore.filteredEntries.length }} requests\n </span>\n <span v-if=\"timelineStore.averageDuration > 0\" class=\"timeline-stats__separator\">|</span>\n <span v-if=\"timelineStore.averageDuration > 0\" class=\"timeline-stats__item\">\n avg {{ timelineStore.averageDuration }}ms\n </span>\n </div>\n\n <!-- Clear button -->\n <button\n type=\"button\"\n class=\"btn btn--secondary btn--icon\"\n title=\"Clear timeline\"\n :disabled=\"timelineStore.entries.length === 0\"\n @click=\"clearTimeline\"\n >\n <Trash2 :size=\"16\" />\n </button>\n </div>\n\n <!-- Filter panel -->\n <div v-if=\"showFilters\" class=\"timeline-filters\">\n <!-- Method filters -->\n <div class=\"timeline-filters__section\">\n <h4 class=\"timeline-filters__title\">Methods</h4>\n <div class=\"timeline-filters__methods\">\n <button\n v-for=\"method in httpMethods\"\n :key=\"method\"\n type=\"button\"\n :class=\"[\n 'method-badge',\n `method-badge--${method.toLowerCase()}`,\n { 'method-badge--inactive': !isMethodActive(method) && timelineStore.filter.methods.length > 0 }\n ]\"\n @click=\"toggleMethod(method)\"\n >\n {{ method }}\n </button>\n </div>\n </div>\n\n <!-- Status filters -->\n <div class=\"timeline-filters__section\">\n <h4 class=\"timeline-filters__title\">Status</h4>\n <div class=\"timeline-filters__status\">\n <button\n v-for=\"status in statusCategories\"\n :key=\"status\"\n type=\"button\"\n :class=\"[\n 'timeline-filters__status-btn',\n `timeline-filters__status-btn--${status}`,\n { 'timeline-filters__status-btn--active': isStatusActive(status) }\n ]\"\n @click=\"toggleStatus(status)\"\n >\n {{ status }}\n <span class=\"timeline-filters__status-count\">\n ({{ timelineStore.statusCounts[status] }})\n </span>\n </button>\n </div>\n </div>\n\n <!-- Simulated filter -->\n <div class=\"timeline-filters__section\">\n <h4 class=\"timeline-filters__title\">Type</h4>\n <div class=\"timeline-filters__type\">\n <button\n type=\"button\"\n :class=\"[\n 'timeline-filters__status-btn',\n { 'timeline-filters__status-btn--active': timelineStore.filter.simulatedOnly }\n ]\"\n @click=\"toggleSimulatedFilter\"\n >\n Simulated only\n </button>\n </div>\n </div>\n\n <!-- Clear filters -->\n <div v-if=\"hasActiveFilters\" class=\"timeline-filters__actions\">\n <button\n type=\"button\"\n class=\"btn btn--ghost\"\n @click=\"clearAllFilters\"\n >\n <X :size=\"14\" />\n Clear all filters\n </button>\n </div>\n </div>\n\n <!-- Main content -->\n <div class=\"timeline-content\">\n <!-- Loading state -->\n <div v-if=\"timelineStore.isLoading\" class=\"timeline-loading\">\n <div class=\"timeline-loading__spinner\" />\n <span class=\"text-muted\">Loading timeline...</span>\n </div>\n\n <!-- Error state -->\n <div v-else-if=\"timelineStore.error\" class=\"timeline-error\">\n <p class=\"timeline-error__message\">{{ timelineStore.error }}</p>\n <button type=\"button\" class=\"btn btn--primary\" @click=\"fetchTimeline\">\n Retry\n </button>\n </div>\n\n <!-- Empty state -->\n <div v-else-if=\"timelineStore.entries.length === 0\" class=\"timeline-empty empty-state\">\n <Clock :size=\"48\" class=\"empty-state__icon\" />\n <h3 class=\"empty-state__title\">No requests yet</h3>\n <p class=\"empty-state__description\">\n API requests will appear here in real-time as they are made.\n </p>\n </div>\n\n <!-- No results state -->\n <div v-else-if=\"timelineStore.filteredEntries.length === 0\" class=\"timeline-empty empty-state\">\n <Search :size=\"48\" class=\"empty-state__icon\" />\n <h3 class=\"empty-state__title\">No matching requests</h3>\n <p class=\"empty-state__description\">\n Try adjusting your search or filters.\n </p>\n <button\n v-if=\"hasActiveFilters\"\n type=\"button\"\n class=\"btn btn--secondary\"\n @click=\"clearAllFilters\"\n >\n Clear filters\n </button>\n </div>\n\n <!-- Split panel layout -->\n <template v-else>\n <!-- Timeline list panel -->\n <div class=\"timeline-list-panel\">\n <div class=\"timeline-list\">\n <TimelineEntryComponent\n v-for=\"entry in timelineStore.filteredEntries\"\n :key=\"entry.id\"\n :entry=\"entry\"\n :is-selected=\"timelineStore.selectedEntryId === entry.id\"\n @select=\"handleSelectEntry\"\n />\n </div>\n </div>\n\n <!-- Timeline detail panel -->\n <div class=\"timeline-detail-panel\">\n <TimelineDetail :entry=\"timelineStore.selectedEntry\" />\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style scoped>\n.timeline-page {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n/* Toolbar */\n.timeline-toolbar {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-md);\n background-color: var(--devtools-surface);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.timeline-search {\n position: relative;\n flex: 1;\n max-width: 400px;\n}\n\n.timeline-search__icon {\n position: absolute;\n left: var(--devtools-space-sm);\n top: 50%;\n transform: translateY(-50%);\n color: var(--devtools-text-muted);\n pointer-events: none;\n}\n\n.timeline-search__input {\n padding-left: calc(var(--devtools-space-sm) + 24px);\n padding-right: calc(var(--devtools-space-sm) + 24px);\n}\n\n.timeline-search__clear {\n position: absolute;\n right: var(--devtools-space-xs);\n top: 50%;\n transform: translateY(-50%);\n padding: var(--devtools-space-xs);\n}\n\n.timeline-filter-toggle {\n flex-shrink: 0;\n}\n\n.timeline-filter-toggle--active {\n background-color: color-mix(in srgb, var(--devtools-primary) 15%, transparent);\n border-color: var(--devtools-primary);\n color: var(--devtools-primary);\n}\n\n.timeline-filter-toggle__badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 var(--devtools-space-xs);\n background-color: var(--devtools-primary);\n color: var(--devtools-text-inverted);\n border-radius: 9px;\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-6);\n}\n\n.timeline-stats {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n margin-left: auto;\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n}\n\n.timeline-stats__separator {\n opacity: 0.5;\n}\n\n/* Filter panel */\n.timeline-filters {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--devtools-space-lg);\n padding: var(--devtools-space-md);\n background-color: var(--devtools-surface-elevated);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.timeline-filters__section {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-sm);\n}\n\n.timeline-filters__title {\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-6);\n color: var(--devtools-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin: 0;\n}\n\n.timeline-filters__methods {\n display: flex;\n flex-wrap: wrap;\n gap: var(--devtools-space-xs);\n}\n\n.timeline-filters__methods .method-badge {\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.timeline-filters__methods .method-badge--inactive {\n opacity: 0.4;\n}\n\n.timeline-filters__status {\n display: flex;\n gap: var(--devtools-space-sm);\n}\n\n.timeline-filters__type {\n display: flex;\n gap: var(--devtools-space-sm);\n}\n\n.timeline-filters__status-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n background-color: var(--devtools-surface);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-sm);\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.timeline-filters__status-btn:hover {\n background-color: var(--devtools-surface-elevated);\n color: var(--devtools-text);\n}\n\n.timeline-filters__status-btn--active {\n background-color: color-mix(in srgb, var(--devtools-primary) 15%, transparent);\n border-color: var(--devtools-primary);\n color: var(--devtools-primary);\n}\n\n.timeline-filters__status-btn--2xx.timeline-filters__status-btn--active {\n background-color: color-mix(in srgb, var(--devtools-success) 15%, transparent);\n border-color: var(--devtools-success);\n color: var(--devtools-success);\n}\n\n.timeline-filters__status-btn--3xx.timeline-filters__status-btn--active {\n background-color: color-mix(in srgb, var(--devtools-info) 15%, transparent);\n border-color: var(--devtools-info);\n color: var(--devtools-info);\n}\n\n.timeline-filters__status-btn--4xx.timeline-filters__status-btn--active {\n background-color: color-mix(in srgb, var(--devtools-warning) 15%, transparent);\n border-color: var(--devtools-warning);\n color: var(--devtools-warning);\n}\n\n.timeline-filters__status-btn--5xx.timeline-filters__status-btn--active {\n background-color: color-mix(in srgb, var(--devtools-error) 15%, transparent);\n border-color: var(--devtools-error);\n color: var(--devtools-error);\n}\n\n.timeline-filters__status-count {\n font-size: var(--font-size-00);\n opacity: 0.7;\n}\n\n.timeline-filters__actions {\n display: flex;\n align-items: flex-end;\n margin-left: auto;\n}\n\n/* Main content */\n.timeline-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n/* Loading state */\n.timeline-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n gap: var(--devtools-space-md);\n}\n\n.timeline-loading__spinner {\n width: 32px;\n height: 32px;\n border: 3px solid var(--devtools-border);\n border-top-color: var(--devtools-primary);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Error state */\n.timeline-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-xl);\n}\n\n.timeline-error__message {\n color: var(--devtools-error);\n margin: 0;\n}\n\n/* Empty state */\n.timeline-empty {\n width: 100%;\n}\n\n/* Split panels */\n.timeline-list-panel {\n width: 50%;\n min-width: 300px;\n max-width: 600px;\n border-right: 1px solid var(--devtools-border);\n background-color: var(--devtools-bg);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.timeline-list {\n flex: 1;\n overflow-y: auto;\n padding: var(--devtools-space-sm);\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n.timeline-detail-panel {\n flex: 1;\n overflow: hidden;\n background-color: var(--devtools-bg);\n}\n</style>\n"],"names":["Check","createLucideIcon","CircleCheckBig","Copy","useTimelineStore","defineStore","entries","ref","isLoading","error","filter","selectedEntryId","maxEntries","responseBuffer","getStatusCategory","status","filteredEntries","computed","result","query","entry","category","selectedEntry","e","totalCount","completedCount","pendingCount","statusCounts","counts","averageDuration","completedEntries","totalDuration","sum","addRequest","request","bufferedResponse","mergeResponse","addResponse","response","stubEntry","createStubEntry","stubRequest","processBufferedResponses","requestMap","requestId","processIncomingResponses","incomingResponses","createStubsForOrphanedResponses","setTimelineData","data","item","sorted","a","b","clearTimeline","setLoading","loading","setError","errorMessage","clearError","setSearchQuery","toggleMethodFilter","method","index","toggleStatusFilter","setSimulatedFilter","simulated","clearFilters","hasActiveFilters","selectEntry","id","setMaxEntries","limit","clamped","props","__props","expandedSections","copiedField","formattedTimestamp","formattedDuration","statusClass","hasQueryParams","hasRequestHeaders","hasRequestBody","hasResponseHeaders","hasResponseBody","formatJson","value","toggleSection","section","copyToClipboard","text","fieldId","err","copyFullEntry","_openBlock","_createElementBlock","_hoisted_1","_hoisted_3","_createElementVNode","_hoisted_4","_hoisted_5","_toDisplayString","_unref","getMethodLabel","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_createVNode","Clock","_createTextVNode","_hoisted_10","Zap","_hoisted_11","_createBlock","_resolveDynamicComponent","_hoisted_12","_hoisted_13","_cache","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","ChevronDown","ChevronRight","_hoisted_22","_withDirectives","_hoisted_23","_Fragment","_renderList","key","_hoisted_24","_hoisted_25","_vShow","_hoisted_26","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_withModifiers","$event","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_2","emit","__emit","formattedTime","statusIcon","CheckCircle","AlertTriangle","isPending","handleClick","_normalizeClass","timelineStore","send","on","connected","useWebSocket","showFilters","searchInputRef","httpMethods","statusCategories","fetchTimeline","handleTimelineData","handleRequest","handleResponse","handleTimelineCleared","handleSelectEntry","handleSearchInput","event","target","clearSearch","toggleMethod","isMethodActive","toggleStatus","isStatusActive","toggleSimulatedFilter","current","clearAllFilters","toggleFilters","filterBadgeCount","unsubTimeline","unsubRequest","unsubResponse","unsubCleared","onMounted","onUnmounted","watch","isConnected","Search","X","Filter","ChevronUp","Trash2","_hoisted_21","_hoisted_27","TimelineEntryComponent","TimelineDetail"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -0,0 +1 @@
1
+ .app[data-v-513332df]{display:flex;flex-direction:column;min-height:100vh;background-color:var(--devtools-bg)}.app-header[data-v-513332df]{display:flex;align-items:center;justify-content:space-between;height:var(--devtools-header-height);padding:0 var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border);position:sticky;top:0;z-index:100}.app-header__brand[data-v-513332df]{display:flex;align-items:center;gap:var(--devtools-space-sm)}.app-header__logo[data-v-513332df]{color:var(--devtools-primary)}.app-header__title[data-v-513332df]{font-weight:var(--font-weight-6);font-size:var(--font-size-1);color:var(--devtools-text)}.app-header__status[data-v-513332df]{display:flex;align-items:center}.app-nav[data-v-513332df]{display:flex;align-items:center;gap:var(--devtools-space-xs);height:100%}.app-nav__tab[data-v-513332df]{display:flex;align-items:center;gap:var(--devtools-space-xs);height:100%;padding:0 var(--devtools-space-md);background:none;border:none;border-bottom:2px solid transparent;color:var(--devtools-text-muted);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);font-weight:var(--font-weight-5);cursor:pointer;transition:all var(--devtools-transition-fast)}.app-nav__tab[data-v-513332df]:hover{color:var(--devtools-text);background-color:var(--devtools-surface-elevated)}.app-nav__tab[data-v-513332df]:focus{outline:none}.app-nav__tab[data-v-513332df]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px;background-color:var(--devtools-surface-elevated)}@media(forced-colors:active){.app-nav__tab[data-v-513332df]:focus-visible{outline:3px solid CanvasText;outline-offset:2px}}.app-nav__tab--active[data-v-513332df]{color:var(--devtools-primary);border-bottom-color:var(--devtools-primary)}.app-nav__tab--active[data-v-513332df]:focus-visible{outline-color:var(--devtools-primary-hover)}.app-nav__icon[data-v-513332df]{flex-shrink:0}.app-nav__label[data-v-513332df]{white-space:nowrap}.connection-status[data-v-513332df]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.connection-status__icon[data-v-513332df]{opacity:.7}.app-main[data-v-513332df]{flex:1;display:flex;flex-direction:column;overflow:hidden}.fade-enter-active[data-v-513332df],.fade-leave-active[data-v-513332df]{transition:opacity var(--devtools-transition-normal)}.fade-enter-from[data-v-513332df],.fade-leave-to[data-v-513332df]{opacity:0}:where(html){--font-sans:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--font-serif:ui-serif,serif;--font-mono:Dank Mono,Operator Mono,Inconsolata,Fira Mono,ui-monospace,SF Mono,Monaco,Droid Sans Mono,Source Code Pro,monospace;--font-weight-1:100;--font-weight-2:200;--font-weight-3:300;--font-weight-4:400;--font-weight-5:500;--font-weight-6:600;--font-weight-7:700;--font-weight-8:800;--font-weight-9:900;--font-lineheight-00:.95;--font-lineheight-0:1.1;--font-lineheight-1:1.25;--font-lineheight-2:1.375;--font-lineheight-3:1.5;--font-lineheight-4:1.75;--font-lineheight-5:2;--font-letterspacing-0:-.05em;--font-letterspacing-1:.025em;--font-letterspacing-2:.05em;--font-letterspacing-3:.075em;--font-letterspacing-4:.15em;--font-letterspacing-5:.5em;--font-letterspacing-6:.75em;--font-letterspacing-7:1em;--font-size-00:.5rem;--font-size-0:.75rem;--font-size-1:1rem;--font-size-2:1.1rem;--font-size-3:1.25rem;--font-size-4:1.5rem;--font-size-5:2rem;--font-size-6:2.5rem;--font-size-7:3rem;--font-size-8:3.5rem;--font-size-fluid-0:clamp(.75rem,2vw,1rem);--font-size-fluid-1:clamp(1rem,4vw,1.5rem);--font-size-fluid-2:clamp(1.5rem,6vw,2.5rem);--font-size-fluid-3:clamp(2rem,9vw,3.5rem);--size-000:-.5rem;--size-00:-.25rem;--size-1:.25rem;--size-2:.5rem;--size-3:1rem;--size-4:1.25rem;--size-5:1.5rem;--size-6:1.75rem;--size-7:2rem;--size-8:3rem;--size-9:4rem;--size-10:5rem;--size-11:7.5rem;--size-12:10rem;--size-13:15rem;--size-14:20rem;--size-15:30rem;--size-fluid-1:clamp(.5rem,1vw,1rem);--size-fluid-2:clamp(1rem,2vw,1.5rem);--size-fluid-3:clamp(1.5rem,3vw,2rem);--size-fluid-4:clamp(2rem,4vw,3rem);--size-fluid-5:clamp(4rem,5vw,5rem);--size-fluid-6:clamp(5rem,7vw,7.5rem);--size-fluid-7:clamp(7.5rem,10vw,10rem);--size-fluid-8:clamp(10rem,20vw,15rem);--size-fluid-9:clamp(15rem,30vw,20rem);--size-fluid-10:clamp(20rem,40vw,30rem);--size-content-1:20ch;--size-content-2:45ch;--size-content-3:60ch;--size-header-1:20ch;--size-header-2:25ch;--size-header-3:35ch;--size-xxs:240px;--size-xs:360px;--size-sm:480px;--size-md:768px;--size-lg:1024px;--size-xl:1440px;--size-xxl:1920px;--size-relative-000:-.5ch;--size-relative-00:-.25ch;--size-relative-1:.25ch;--size-relative-2:.5ch;--size-relative-3:1ch;--size-relative-4:1.25ch;--size-relative-5:1.5ch;--size-relative-6:1.75ch;--size-relative-7:2ch;--size-relative-8:3ch;--size-relative-9:4ch;--size-relative-10:5ch;--size-relative-11:7.5ch;--size-relative-12:10ch;--size-relative-13:15ch;--size-relative-14:20ch;--size-relative-15:30ch;--ease-1:cubic-bezier(.25,0,.5,1);--ease-2:cubic-bezier(.25,0,.4,1);--ease-3:cubic-bezier(.25,0,.3,1);--ease-4:cubic-bezier(.25,0,.2,1);--ease-5:cubic-bezier(.25,0,.1,1);--ease-in-1:cubic-bezier(.25,0,1,1);--ease-in-2:cubic-bezier(.5,0,1,1);--ease-in-3:cubic-bezier(.7,0,1,1);--ease-in-4:cubic-bezier(.9,0,1,1);--ease-in-5:cubic-bezier(1,0,1,1);--ease-out-1:cubic-bezier(0,0,.75,1);--ease-out-2:cubic-bezier(0,0,.5,1);--ease-out-3:cubic-bezier(0,0,.3,1);--ease-out-4:cubic-bezier(0,0,.1,1);--ease-out-5:cubic-bezier(0,0,0,1);--ease-in-out-1:cubic-bezier(.1,0,.9,1);--ease-in-out-2:cubic-bezier(.3,0,.7,1);--ease-in-out-3:cubic-bezier(.5,0,.5,1);--ease-in-out-4:cubic-bezier(.7,0,.3,1);--ease-in-out-5:cubic-bezier(.9,0,.1,1);--ease-elastic-out-1:cubic-bezier(.5,.75,.75,1.25);--ease-elastic-out-2:cubic-bezier(.5,1,.75,1.25);--ease-elastic-out-3:cubic-bezier(.5,1.25,.75,1.25);--ease-elastic-out-4:cubic-bezier(.5,1.5,.75,1.25);--ease-elastic-out-5:cubic-bezier(.5,1.75,.75,1.25);--ease-elastic-in-1:cubic-bezier(.5,-.25,.75,1);--ease-elastic-in-2:cubic-bezier(.5,-.5,.75,1);--ease-elastic-in-3:cubic-bezier(.5,-.75,.75,1);--ease-elastic-in-4:cubic-bezier(.5,-1,.75,1);--ease-elastic-in-5:cubic-bezier(.5,-1.25,.75,1);--ease-elastic-in-out-1:cubic-bezier(.5,-.1,.1,1.5);--ease-elastic-in-out-2:cubic-bezier(.5,-.3,.1,1.5);--ease-elastic-in-out-3:cubic-bezier(.5,-.5,.1,1.5);--ease-elastic-in-out-4:cubic-bezier(.5,-.7,.1,1.5);--ease-elastic-in-out-5:cubic-bezier(.5,-.9,.1,1.5);--ease-step-1:steps(2);--ease-step-2:steps(3);--ease-step-3:steps(4);--ease-step-4:steps(7);--ease-step-5:steps(10);--ease-elastic-1:var(--ease-elastic-out-1);--ease-elastic-2:var(--ease-elastic-out-2);--ease-elastic-3:var(--ease-elastic-out-3);--ease-elastic-4:var(--ease-elastic-out-4);--ease-elastic-5:var(--ease-elastic-out-5);--ease-squish-1:var(--ease-elastic-in-out-1);--ease-squish-2:var(--ease-elastic-in-out-2);--ease-squish-3:var(--ease-elastic-in-out-3);--ease-squish-4:var(--ease-elastic-in-out-4);--ease-squish-5:var(--ease-elastic-in-out-5);--ease-spring-1:linear(0,.006,.025 2.8%,.101 6.1%,.539 18.9%,.721 25.3%,.849 31.5%,.937 38.1%,.968 41.8%,.991 45.7%,1.006 50.1%,1.015 55%,1.017 63.9%,1.001);--ease-spring-2:linear(0,.007,.029 2.2%,.118 4.7%,.625 14.4%,.826 19%,.902,.962,1.008 26.1%,1.041 28.7%,1.064 32.1%,1.07 36%,1.061 40.5%,1.015 53.4%,.999 61.6%,.995 71.2%,1);--ease-spring-3:linear(0,.009,.035 2.1%,.141 4.4%,.723 12.9%,.938 16.7%,1.017,1.077,1.121,1.149 24.3%,1.159,1.163,1.161,1.154 29.9%,1.129 32.8%,1.051 39.6%,1.017 43.1%,.991,.977 51%,.974 53.8%,.975 57.1%,.997 69.8%,1.003 76.9%,1);--ease-spring-4:linear(0,.009,.037 1.7%,.153 3.6%,.776 10.3%,1.001,1.142 16%,1.185,1.209 19%,1.215 19.9% 20.8%,1.199,1.165 25%,1.056 30.3%,1.008 33%,.973,.955 39.2%,.953 41.1%,.957 43.3%,.998 53.3%,1.009 59.1% 63.7%,.998 78.9%,1);--ease-spring-5:linear(0,.01,.04 1.6%,.161 3.3%,.816 9.4%,1.046,1.189 14.4%,1.231,1.254 17%,1.259,1.257 18.6%,1.236,1.194 22.3%,1.057 27%,.999 29.4%,.955 32.1%,.942,.935 34.9%,.933,.939 38.4%,1 47.3%,1.011,1.017 52.6%,1.016 56.4%,1 65.2%,.996 70.2%,1.001 87.2%,1);--ease-bounce-1:linear(0,.004,.016,.035,.063,.098,.141,.191,.25,.316,.391 36.8%,.563,.766,1 58.8%,.946,.908 69.1%,.895,.885,.879,.878,.879,.885,.895,.908 89.7%,.946,1);--ease-bounce-2:linear(0,.004,.016,.035,.063,.098,.141 15.1%,.25,.391,.562,.765,1,.892 45.2%,.849,.815,.788,.769,.757,.753,.757,.769,.788,.815,.85,.892 75.2%,1 80.2%,.973,.954,.943,.939,.943,.954,.973,1);--ease-bounce-3:linear(0,.004,.016,.035,.062,.098,.141 11.4%,.25,.39,.562,.764,1 30.3%,.847 34.8%,.787,.737,.699,.672,.655,.65,.656,.672,.699,.738,.787,.847 61.7%,1 66.2%,.946,.908,.885 74.2%,.879,.878,.879,.885 79.5%,.908,.946,1 87.4%,.981,.968,.96,.957,.96,.968,.981,1);--ease-bounce-4:linear(0,.004,.016 3%,.062,.141,.25,.391,.562 18.2%,1 24.3%,.81,.676 32.3%,.629,.595,.575,.568,.575,.595,.629,.676 48.2%,.811,1 56.2%,.918,.86,.825,.814,.825,.86,.918,1 77.2%,.94 80.6%,.925,.92,.925,.94 87.5%,1 90.9%,.974,.965,.974,1);--ease-bounce-5:linear(0,.004,.016 2.5%,.063,.141,.25 10.1%,.562,1 20.2%,.783,.627,.534 30.9%,.511,.503,.511,.534 38%,.627,.782,1 48.7%,.892,.815,.769 56.3%,.757,.753,.757,.769 61.3%,.815,.892,1 68.8%,.908 72.4%,.885,.878,.885,.908 79.4%,1 83%,.954 85.5%,.943,.939,.943,.954 90.5%,1 93%,.977,.97,.977,1);--layer-1:1;--layer-2:2;--layer-3:3;--layer-4:4;--layer-5:5;--layer-important:2147483647;--shadow-color:220 3% 15%;--shadow-strength:1%;--inner-shadow-highlight:inset 0 -.5px 0 0 #fff,inset 0 .5px 0 0 rgba(0,0,0,.067);--shadow-1:0 1px 2px -1px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%));--shadow-2:0 3px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 7px 14px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%));--shadow-3:0 -1px 3px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 1px 2px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 2px 5px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 4px 12px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 12px 15px -5px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--shadow-4:0 -2px 5px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 1px 1px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 2px 2px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 5px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 9px 9px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 16px 16px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 6%));--shadow-5:0 -1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 2px 1px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 5px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 10px 10px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 20px 20px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 40px 40px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--shadow-6:0 -1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 2%)),0 3px 2px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 7px 5px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 3%)),0 12px 10px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 4%)),0 22px 18px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 5%)),0 41px 33px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 6%)),0 100px 80px -2px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 7%));--inner-shadow-0:inset 0 0 0 1px hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%));--inner-shadow-1:inset 0 1px 2px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-2:inset 0 1px 4px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-3:inset 0 2px 8px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--inner-shadow-4:inset 0 2px 14px 0 hsl(var(--shadow-color)/calc(var(--shadow-strength) + 9%)),var(--inner-shadow-highlight);--ratio-square:1;--ratio-landscape:4/3;--ratio-portrait:3/4;--ratio-widescreen:16/9;--ratio-ultrawide:18/5;--ratio-golden:1.618/1;--gray-0:#f8f9fa;--gray-1:#f1f3f5;--gray-2:#e9ecef;--gray-3:#dee2e6;--gray-4:#ced4da;--gray-5:#adb5bd;--gray-6:#868e96;--gray-7:#495057;--gray-8:#343a40;--gray-9:#212529;--gray-10:#16191d;--gray-11:#0d0f12;--gray-12:#030507;--stone-0:#f8fafb;--stone-1:#f2f4f6;--stone-2:#ebedef;--stone-3:#e0e4e5;--stone-4:#d1d6d8;--stone-5:#b1b6b9;--stone-6:#979b9d;--stone-7:#7e8282;--stone-8:#666968;--stone-9:#50514f;--stone-10:#3a3a37;--stone-11:#252521;--stone-12:#121210;--red-0:#fff5f5;--red-1:#ffe3e3;--red-2:#ffc9c9;--red-3:#ffa8a8;--red-4:#ff8787;--red-5:#ff6b6b;--red-6:#fa5252;--red-7:#f03e3e;--red-8:#e03131;--red-9:#c92a2a;--red-10:#b02525;--red-11:#962020;--red-12:#7d1a1a;--pink-0:#fff0f6;--pink-1:#ffdeeb;--pink-2:#fcc2d7;--pink-3:#faa2c1;--pink-4:#f783ac;--pink-5:#f06595;--pink-6:#e64980;--pink-7:#d6336c;--pink-8:#c2255c;--pink-9:#a61e4d;--pink-10:#8c1941;--pink-11:#731536;--pink-12:#59102a;--purple-0:#f8f0fc;--purple-1:#f3d9fa;--purple-2:#eebefa;--purple-3:#e599f7;--purple-4:#da77f2;--purple-5:#cc5de8;--purple-6:#be4bdb;--purple-7:#ae3ec9;--purple-8:#9c36b5;--purple-9:#862e9c;--purple-10:#702682;--purple-11:#5a1e69;--purple-12:#44174f;--violet-0:#f3f0ff;--violet-1:#e5dbff;--violet-2:#d0bfff;--violet-3:#b197fc;--violet-4:#9775fa;--violet-5:#845ef7;--violet-6:#7950f2;--violet-7:#7048e8;--violet-8:#6741d9;--violet-9:#5f3dc4;--violet-10:#5235ab;--violet-11:#462d91;--violet-12:#3a2578;--indigo-0:#edf2ff;--indigo-1:#dbe4ff;--indigo-2:#bac8ff;--indigo-3:#91a7ff;--indigo-4:#748ffc;--indigo-5:#5c7cfa;--indigo-6:#4c6ef5;--indigo-7:#4263eb;--indigo-8:#3b5bdb;--indigo-9:#364fc7;--indigo-10:#2f44ad;--indigo-11:#283a94;--indigo-12:#21307a;--blue-0:#e7f5ff;--blue-1:#d0ebff;--blue-2:#a5d8ff;--blue-3:#74c0fc;--blue-4:#4dabf7;--blue-5:#339af0;--blue-6:#228be6;--blue-7:#1c7ed6;--blue-8:#1971c2;--blue-9:#1864ab;--blue-10:#145591;--blue-11:#114678;--blue-12:#0d375e;--cyan-0:#e3fafc;--cyan-1:#c5f6fa;--cyan-2:#99e9f2;--cyan-3:#66d9e8;--cyan-4:#3bc9db;--cyan-5:#22b8cf;--cyan-6:#15aabf;--cyan-7:#1098ad;--cyan-8:#0c8599;--cyan-9:#0b7285;--cyan-10:#095c6b;--cyan-11:#074652;--cyan-12:#053038;--teal-0:#e6fcf5;--teal-1:#c3fae8;--teal-2:#96f2d7;--teal-3:#63e6be;--teal-4:#38d9a9;--teal-5:#20c997;--teal-6:#12b886;--teal-7:#0ca678;--teal-8:#099268;--teal-9:#087f5b;--teal-10:#066649;--teal-11:#054d37;--teal-12:#033325;--green-0:#ebfbee;--green-1:#d3f9d8;--green-2:#b2f2bb;--green-3:#8ce99a;--green-4:#69db7c;--green-5:#51cf66;--green-6:#40c057;--green-7:#37b24d;--green-8:#2f9e44;--green-9:#2b8a3e;--green-10:#237032;--green-11:#1b5727;--green-12:#133d1b;--lime-0:#f4fce3;--lime-1:#e9fac8;--lime-2:#d8f5a2;--lime-3:#c0eb75;--lime-4:#a9e34b;--lime-5:#94d82d;--lime-6:#82c91e;--lime-7:#74b816;--lime-8:#66a80f;--lime-9:#5c940d;--lime-10:#4c7a0b;--lime-11:#3c6109;--lime-12:#2c4706;--yellow-0:#fff9db;--yellow-1:#fff3bf;--yellow-2:#ffec99;--yellow-3:#ffe066;--yellow-4:#ffd43b;--yellow-5:#fcc419;--yellow-6:#fab005;--yellow-7:#f59f00;--yellow-8:#f08c00;--yellow-9:#e67700;--yellow-10:#b35c00;--yellow-11:#804200;--yellow-12:#663500;--orange-0:#fff4e6;--orange-1:#ffe8cc;--orange-2:#ffd8a8;--orange-3:#ffc078;--orange-4:#ffa94d;--orange-5:#ff922b;--orange-6:#fd7e14;--orange-7:#f76707;--orange-8:#e8590c;--orange-9:#d9480f;--orange-10:#bf400d;--orange-11:#99330b;--orange-12:#802b09;--choco-0:#fff8dc;--choco-1:#fce1bc;--choco-2:#f7ca9e;--choco-3:#f1b280;--choco-4:#e99b62;--choco-5:#df8545;--choco-6:#d46e25;--choco-7:#bd5f1b;--choco-8:#a45117;--choco-9:#8a4513;--choco-10:#703a13;--choco-11:#572f12;--choco-12:#3d210d;--brown-0:#faf4eb;--brown-1:#ede0d1;--brown-2:#e0cab7;--brown-3:#d3b79e;--brown-4:#c5a285;--brown-5:#b78f6d;--brown-6:#a87c56;--brown-7:#956b47;--brown-8:#825b3a;--brown-9:#6f4b2d;--brown-10:#5e3a21;--brown-11:#4e2b15;--brown-12:#422412;--sand-0:#f8fafb;--sand-1:#e6e4dc;--sand-2:#d5cfbd;--sand-3:#c2b9a0;--sand-4:#aea58c;--sand-5:#9a9178;--sand-6:#867c65;--sand-7:#736a53;--sand-8:#5f5746;--sand-9:#4b4639;--sand-10:#38352d;--sand-11:#252521;--sand-12:#121210;--camo-0:#f9fbe7;--camo-1:#e8ed9c;--camo-2:#d2df4e;--camo-3:#c2ce34;--camo-4:#b5bb2e;--camo-5:#a7a827;--camo-6:#999621;--camo-7:#8c851c;--camo-8:#7e7416;--camo-9:#6d6414;--camo-10:#5d5411;--camo-11:#4d460e;--camo-12:#36300a;--jungle-0:#ecfeb0;--jungle-1:#def39a;--jungle-2:#d0e884;--jungle-3:#c2dd6e;--jungle-4:#b5d15b;--jungle-5:#a8c648;--jungle-6:#9bbb36;--jungle-7:#8fb024;--jungle-8:#84a513;--jungle-9:#7a9908;--jungle-10:#658006;--jungle-11:#516605;--jungle-12:#3d4d04;--gradient-1:linear-gradient(to bottom right,#1f005c,#5b0060,#870160,#ac255e,#ca485c,#e16b5c,#f39060,#ffb56b);--gradient-2:linear-gradient(to bottom right,#48005c,#8300e2,#a269ff);--gradient-3:radial-gradient(circle at top right,#0ff,rgba(0,255,255,0)),radial-gradient(circle at bottom left,#ff1492,rgba(255,20,146,0));--gradient-4:linear-gradient(to bottom right,#00f5a0,#00d9f5);--gradient-5:conic-gradient(from -270deg at 75% 110%,#f0f,#fffaf0);--gradient-6:conic-gradient(from -90deg at top left,#000,#fff);--gradient-7:linear-gradient(to bottom right,#72c6ef,#004e8f);--gradient-8:conic-gradient(from 90deg at 50% 0%,#111,50%,#222,#111);--gradient-9:conic-gradient(from .5turn at bottom center,#add8e6,#fff);--gradient-10:conic-gradient(from 90deg at 40% -25%,gold,#f79d03,#ee6907,#e6390a,#de0d0d,#d61039,#cf1261,#c71585,#cf1261,#d61039,#de0d0d,#ee6907,#f79d03,gold,gold,gold);--gradient-11:conic-gradient(at bottom left,#ff1493,cyan);--gradient-12:conic-gradient(from 90deg at 25% -10%,#ff4500,#d3f340,#7bee85,#afeeee,#7bee85);--gradient-13:radial-gradient(circle at 50% 200%,#000142,#3b0083,#b300c3,#ff059f,#ff4661,#ffad86,#fff3c7);--gradient-14:conic-gradient(at top right,lime,cyan);--gradient-15:linear-gradient(to bottom right,#c7d2fe,#fecaca,#fef3c7);--gradient-16:radial-gradient(circle at 50% -250%,#374151,#111827,#000);--gradient-17:conic-gradient(from -90deg at 50% -25%,blue,#8a2be2);--gradient-18:linear-gradient(0deg,rgba(255,0,0,.8),rgba(255,0,0,0) 75%),linear-gradient(60deg,rgba(255,255,0,.8),rgba(255,255,0,0) 75%),linear-gradient(120deg,rgba(0,255,0,.8),rgba(0,255,0,0) 75%),linear-gradient(180deg,rgba(0,255,255,.8),rgba(0,255,255,0) 75%),linear-gradient(240deg,rgba(0,0,255,.8),rgba(0,0,255,0) 75%),linear-gradient(300deg,rgba(255,0,255,.8),rgba(255,0,255,0) 75%);--gradient-19:linear-gradient(to bottom right,#ffe259,#ffa751);--gradient-20:conic-gradient(from -135deg at -10% center,orange,#ff7715,#ff522a,#ff3f47,#ff5482,#ff69b4);--gradient-21:conic-gradient(from -90deg at 25% 115%,red,#f06,#f0c,#c0f,#60f,#00f,#00f,#00f,#00f);--gradient-22:linear-gradient(to bottom right,#acb6e5,#86fde8);--gradient-23:linear-gradient(to bottom right,#536976,#292e49);--gradient-24:conic-gradient(from .5turn at 0% 0%,#00c476,10%,#82b0ff,90%,#00c476);--gradient-25:conic-gradient(at 125% 50%,#b78cf7,#ff7c94,#ffcf0d,#ff7c94,#b78cf7);--gradient-26:linear-gradient(to bottom right,#9796f0,#fbc7d4);--gradient-27:conic-gradient(from .5turn at bottom left,#ff1493,#639);--gradient-28:conic-gradient(from -90deg at 50% 105%,#fff,orchid);--gradient-29:radial-gradient(circle at top right,#bfb3ff,rgba(191,179,255,0)),radial-gradient(circle at bottom left,#86acf9,rgba(134,172,249,0));--gradient-30:radial-gradient(circle at top right,#00ff80,rgba(0,255,128,0)),radial-gradient(circle at bottom left,#adffd6,rgba(173,255,214,0));--noise-1:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.005' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-2:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 300 300' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.05' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-3:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.25' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-4:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 2056 2056' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-5:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 2056 2056' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.75' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)'/%3E%3C/svg%3E");--noise-filter-1:contrast(300%) brightness(100%);--noise-filter-2:contrast(200%) brightness(150%);--noise-filter-3:contrast(200%) brightness(250%);--noise-filter-4:contrast(200%) brightness(500%);--noise-filter-5:contrast(200%) brightness(1000%);--animation-fade-in:fade-in .5s var(--ease-3);--animation-fade-in-bloom:fade-in-bloom 2s var(--ease-3);--animation-fade-out:fade-out .5s var(--ease-3);--animation-fade-out-bloom:fade-out-bloom 2s var(--ease-3);--animation-scale-up:scale-up .5s var(--ease-3);--animation-scale-down:scale-down .5s var(--ease-3);--animation-slide-out-up:slide-out-up .5s var(--ease-3);--animation-slide-out-down:slide-out-down .5s var(--ease-3);--animation-slide-out-right:slide-out-right .5s var(--ease-3);--animation-slide-out-left:slide-out-left .5s var(--ease-3);--animation-slide-in-up:slide-in-up .5s var(--ease-3);--animation-slide-in-down:slide-in-down .5s var(--ease-3);--animation-slide-in-right:slide-in-right .5s var(--ease-3);--animation-slide-in-left:slide-in-left .5s var(--ease-3);--animation-shake-x:shake-x .75s var(--ease-out-5);--animation-shake-y:shake-y .75s var(--ease-out-5);--animation-spin:spin 2s linear infinite;--animation-ping:ping 5s var(--ease-out-3) infinite;--animation-blink:blink 1s var(--ease-out-3) infinite;--animation-float:float 3s var(--ease-in-out-3) infinite;--animation-bounce:bounce 2s var(--ease-squish-2) infinite;--animation-pulse:pulse 2s var(--ease-out-3) infinite;--border-size-1:1px;--border-size-2:2px;--border-size-3:5px;--border-size-4:10px;--border-size-5:25px;--radius-1:2px;--radius-2:5px;--radius-3:1rem;--radius-4:2rem;--radius-5:4rem;--radius-6:8rem;--radius-round:1e5px;--radius-blob-1:30% 70% 70% 30%/53% 30% 70% 47%;--radius-blob-2:53% 47% 34% 66%/63% 46% 54% 37%;--radius-blob-3:37% 63% 56% 44%/49% 56% 44% 51%;--radius-blob-4:63% 37% 37% 63%/43% 37% 63% 57%;--radius-blob-5:49% 51% 48% 52%/57% 44% 56% 43%;--radius-conditional-1:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-1));--radius-conditional-2:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-2));--radius-conditional-3:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-3));--radius-conditional-4:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-4));--radius-conditional-5:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-5));--radius-conditional-6:clamp(0px, calc(100vw - 100%) * 1e5,var(--radius-6))}@media(prefers-color-scheme:dark){:where(html){--shadow-color:220 40% 2%;--shadow-strength:25%;--inner-shadow-highlight:inset 0 -.5px 0 0 hsla(0,0%,100%,.067),inset 0 .5px 0 0 rgba(0,0,0,.467)}}@keyframes fade-in{to{opacity:1}}@keyframes fade-in-bloom{0%{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(2) blur(10px);opacity:1}to{filter:brightness(1) blur(0);opacity:1}}@keyframes fade-out{to{opacity:0}}@keyframes fade-out-bloom{to{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(2) blur(10px);opacity:1}0%{filter:brightness(1) blur(0);opacity:1}}@keyframes scale-up{to{transform:scale(1.25)}}@keyframes scale-down{to{transform:scale(.75)}}@keyframes slide-out-up{to{transform:translateY(-100%)}}@keyframes slide-out-down{to{transform:translateY(100%)}}@keyframes slide-out-right{to{transform:translate(100%)}}@keyframes slide-out-left{to{transform:translate(-100%)}}@keyframes slide-in-up{0%{transform:translateY(100%)}}@keyframes slide-in-down{0%{transform:translateY(-100%)}}@keyframes slide-in-right{0%{transform:translate(-100%)}}@keyframes slide-in-left{0%{transform:translate(100%)}}@keyframes shake-x{0%,to{transform:translate(0)}20%{transform:translate(-5%)}40%{transform:translate(5%)}60%{transform:translate(-5%)}80%{transform:translate(5%)}}@keyframes shake-y{0%,to{transform:translateY(0)}20%{transform:translateY(-5%)}40%{transform:translateY(5%)}60%{transform:translateY(-5%)}80%{transform:translateY(5%)}}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{90%,to{opacity:0;transform:scale(2)}}@keyframes blink{0%,to{opacity:1}50%{opacity:.5}}@keyframes float{50%{transform:translateY(-25%)}}@keyframes bounce{25%{transform:translateY(-20%)}40%{transform:translateY(-3%)}0%,60%,to{transform:translateY(0)}}@keyframes pulse{50%{transform:scale(.9)}}@media(prefers-color-scheme:dark){@keyframes fade-in-bloom{0%{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(.5) blur(10px);opacity:1}to{filter:brightness(1) blur(0);opacity:1}}}@media(prefers-color-scheme:dark){@keyframes fade-out-bloom{to{filter:brightness(1) blur(20px);opacity:0}10%{filter:brightness(.5) blur(10px);opacity:1}0%{filter:brightness(1) blur(0);opacity:1}}}:where(:root){color-scheme:light;--palette-hue:270;--palette-hue-rotate-by:-5;--palette-chroma:.1;--link:oklch(50% 100% var(--palette-hue));--link-visited:oklch(50% 100% calc(var(--palette-hue)*1.2));--surface-1:white;--surface-2:var(--color-1);--surface-3:var(--color-3);--surface-document:var(--color-4);--well-1:var(--color-5);--well-2:var(--color-6);--text-1:var(--color-16);--text-2:var(--color-12);--scrollthumb-color:var(--text-2)}:where(:root) :where(dialog){background-color:var(--surface-1)}:where(:root) :where(button,.btn){--_highlight:var(--_highlight-light);--_bg:var(--_bg-light);--_ink-shadow:var(--_ink-shadow-light)}:where(:root) :where(button,.btn) :where([type=reset]){--_text:var(--red-6,#fa5252);--_border:var(--red-3,#ffa8a8)}:where(:root) :where(button,.btn,input:is([type=button],[type=submit],[type=reset]))[disabled]{box-shadow:none}:where(:root) :where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:var(--surface-2)}@media(prefers-color-scheme:dark){:where(:root){color-scheme:dark;--link:oklch(90% 80% var(--palette-hue));--link-visited:oklch(90% 80% calc(var(--palette-hue)*1.2));--surface-1:var(--color-11);--surface-2:var(--color-12);--surface-3:var(--color-13);--surface-document:var(--color-14);--well-1:var(--color-15);--well-2:var(--color-16);--text-1:var(--color-1);--text-2:var(--color-5);--scrollthumb-color:var(--text-2)}}:where(:root){scrollbar-color:var(--scrollthumb-color)transparent;accent-color:var(--brand,var(--link));caret-color:var(--brand,var(--link));color:var(--text-1);background-color:var(--surface-document)}:where(a[href]){color:var(--brand,var(--link))}:where(a[href]):where(:visited){color:var(--link-visited)}:focus-visible{outline-color:var(--brand,var(--link))}*,:before,:after{box-sizing:border-box}:where(:root){--transition-focus:outline-offset .145s var(--ease-2)}@supports (transition-timing-function:linear(0,1)){:where(:root){--transition-focus:outline-offset .145s var(--ease-spring-3)}}:where(:not(dialog)){margin:0}:where(:not(fieldset,progress,meter)){background-repeat:no-repeat;background-origin:border-box;border-style:solid;border-width:0}:where(html){font-family:var(--font-sans);-webkit-text-size-adjust:none;block-size:100%;line-height:1.5}@media(prefers-reduced-motion:no-preference){:where(html){scroll-behavior:smooth}}@media(prefers-reduced-motion:no-preference){:where(:focus-visible){transition:var(--transition-focus)}:where(:not(:active):focus-visible){transition-duration:.25s}}:where(:not(:active):focus-visible){outline-offset:5px}:where(body){min-block-size:100%}:where(h1,h2,h3,h4,h5,h6){line-height:1.25;font-weight:var(--font-weight-9);text-wrap:balance}:where(h1){font-size:var(--font-size-8);max-inline-size:var(--size-header-1)}:where(h2){font-size:var(--font-size-6);max-inline-size:var(--size-header-2)}:where(h3){font-size:var(--font-size-5)}:where(h4){font-size:var(--font-size-4)}:where(h5){font-size:var(--font-size-3)}:where(h3,h4,h5,h6,dt){max-inline-size:var(--size-header-3)}:where(p,ul,ol,dl,h6){font-size:var(--font-size-2)}:where(a,u,ins,abbr){text-underline-offset:1px}@supports ((-moz-appearance:none)){:where(a,u,ins,abbr){text-underline-offset:2px}}:where(a[href],area,button,input:not([type=text],[type=email],[type=number],[type=password],[type=""],[type=tel],[type=url]),label[for],select,summary,[tabindex]:not([tabindex*="-"])){cursor:pointer}:where(a[href],area,button,input,label[for],select,summary,textarea,[tabindex]:not([tabindex*="-"])){touch-action:manipulation;-webkit-tap-highlight-color:transparent}:where(a):where([href]){-webkit-text-decoration-color:var(--link);text-decoration-color:var(--link)}:where(a):where([href]):where(:visited){-webkit-text-decoration-color:var(--link-visited);text-decoration-color:var(--link-visited)}:where(a):where(:not(:hover)){-webkit-text-decoration:inherit;text-decoration:inherit}:where(img,svg,video,canvas,audio,iframe,embed,object){display:block}:where(img,svg,video){block-size:auto;max-inline-size:100%}:where(input,button,textarea,select){font:inherit;font-size:inherit;color:inherit;letter-spacing:inherit}:where(input[type=file])::-webkit-file-upload-button{font:inherit;font-size:inherit;color:inherit;letter-spacing:inherit}::placeholder{color:var(--color-8);opacity:.75}:where(input:not([type=range]),textarea){padding-inline:var(--size-2);padding-block:var(--size-1)}:where(select){padding-inline:var(--size-4)0;padding-block:var(--size-2);field-sizing:content}:where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:var(--well-1);border-radius:var(--radius-2)}:where(textarea){resize:block;field-sizing:content;min-block-size:3rlh;min-inline-size:var(--size-content-1);max-inline-size:var(--size-content-2);min-block-size:3lh;max-block-size:80svh}:where(input[type=checkbox],input[type=radio]){background-color:var(--well-1);block-size:var(--size-3);inline-size:var(--size-3)}:where(svg:not([width])){inline-size:var(--size-10)}:where(code,kbd,samp,pre){font-family:var(--font-mono)}:where(:not(pre)>code,kbd){white-space:nowrap}:where(pre){white-space:pre;writing-mode:lr;direction:ltr;min-inline-size:0;max-inline-size:max-content}:where(:not(pre)>code){padding:var(--size-1)var(--size-2);background:var(--surface-2);border-radius:var(--radius-2);writing-mode:lr}:where(kbd,var){padding:var(--size-1)var(--size-2);border-width:var(--border-size-1);border-color:var(--surface-4);border-radius:var(--radius-2)}:where(mark){border-radius:var(--radius-2);padding-inline:var(--size-1)}:where(ol,ul){padding-inline-start:var(--size-8)}:where(li){padding-inline-start:var(--size-2)}:where(li,dd,figcaption){max-inline-size:var(--size-content-2)}:where(p){max-inline-size:var(--size-content-3);text-wrap:pretty}:where(dt,summary){font-weight:var(--font-weight-7)}:where(dt:not(:first-of-type)){margin-block-start:var(--size-5)}:where(small){font-size:max(.5em,var(--font-size-0));max-inline-size:var(--size-content-1)}:where(hr){margin-block:var(--size-fluid-5);height:var(--border-size-2);background-color:var(--surface-3)}:where(figure){gap:var(--size-2);place-items:center;display:grid}:where(figure)>:where(figcaption){font-size:var(--font-size-1);text-wrap:balance}:where(blockquote,:not(blockquote)>cite){border-inline-start-width:var(--border-size-3)}:where(blockquote){gap:var(--size-3);padding-block:var(--size-3);padding-inline:var(--size-4);max-inline-size:var(--size-content-2);display:grid}:where(:not(blockquote)>cite){padding-inline-start:var(--size-2)}:where(summary){background:var(--surface-3);padding:var(--size-2)var(--size-3);margin:calc(var(--size-2)*-1)calc(var(--size-3)*-1);border-radius:var(--radius-2)}:where(details){padding-inline:var(--size-3);padding-block:var(--size-2);background:var(--surface-2);border-radius:var(--radius-2)}:where(details[open]>summary){margin-bottom:var(--size-2);border-end-end-radius:0;border-end-start-radius:0}:where(fieldset){border-radius:var(--radius-2);border:var(--border-size-1)solid var(--surface-4)}:where(del){background:var(--red-9,#c92a2a);color:var(--red-2,#ffc9c9)}:where(ins){background:var(--green-9,#2b8a3e);color:var(--green-1,#d3f9d8)}:where(abbr){-webkit-text-decoration-color:var(--blue-5,#339af0);text-decoration-color:var(--blue-5,#339af0)}:where(dialog){background-color:var(--surface-1);color:inherit;border-radius:var(--radius-3);box-shadow:var(--shadow-6)}:where(dialog)::backdrop{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}:where(html:has(dialog[open])){overflow:hidden}:where(menu){gap:var(--size-3);padding-inline-start:0;display:flex}:where(sup){font-size:.5em}:where(table){border:1px solid var(--surface-2);background:var(--surface-2);border-radius:var(--radius-3);--nice-inner-radius:calc(var(--radius-3) - 2px);width:-moz-fit-content;width:fit-content}:where(table:not(:has(tfoot)) tr:last-child td:first-child){border-bottom-left-radius:var(--nice-inner-radius)}:where(table:not(:has(tfoot)) tr:last-child td:last-child){border-bottom-right-radius:var(--nice-inner-radius)}:where(table thead th:first-child){border-top-left-radius:var(--nice-inner-radius)}:where(table thead th:last-child){border-top-right-radius:var(--nice-inner-radius)}:where(tfoot th:first-of-type){border-end-start-radius:var(--nice-inner-radius)}:where(tfoot th:last-of-type){border-end-end-radius:var(--nice-inner-radius)}:where(th){color:var(--text-1);background-color:var(--surface-2)}:where(table :is(a,button,[contenteditable]):focus-visible){outline-offset:-2px}:where(td){background:var(--surface-1);max-inline-size:var(--size-content-2);text-wrap:pretty}:where(td,th){text-align:left;padding:var(--size-2)}:where(:is(td,th):not([align])){text-align:center}:where(thead){border-collapse:collapse}:where(table tr:hover td),:where(tbody tr:nth-child(2n):hover td){background-color:var(--color-10)}@media(prefers-color-scheme:light){:is(:where(table tr:hover td),:where(tbody tr:nth-child(2n):hover td)){background-color:#fff}}:where(table>caption){margin:var(--size-3)}:where(tfoot button){padding-block:var(--size-1);padding-inline:var(--size-3)}@media(prefers-color-scheme:dark){:where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:#171a1c}:where(dialog){background-color:var(--surface-2)}:where(html){--shadow-strength:10%;--shadow-color:220 40% 2%}::placeholder{color:var(--color-6)}}:root{--devtools-primary: var(--blue-6);--devtools-primary-hover: var(--blue-7);--devtools-primary-active: var(--blue-8);--devtools-success: var(--green-6);--devtools-warning: var(--yellow-6);--devtools-error: var(--red-6);--devtools-info: var(--cyan-6);--devtools-bg: var(--gray-0);--devtools-surface: var(--gray-1);--devtools-surface-elevated: var(--gray-2);--devtools-border: var(--gray-4);--devtools-text: var(--gray-9);--devtools-text-muted: var(--gray-6);--devtools-text-inverted: var(--gray-0);--method-get: var(--green-6);--method-post: var(--blue-6);--method-put: var(--orange-6);--method-patch: var(--yellow-6);--method-delete: var(--red-6);--method-options: var(--gray-6);--method-head: var(--cyan-6);--status-1xx: var(--gray-6);--status-2xx: var(--green-6);--status-3xx: var(--blue-6);--status-4xx: var(--orange-6);--status-5xx: var(--red-6);--devtools-space-xs: var(--size-1);--devtools-space-sm: var(--size-2);--devtools-space-md: var(--size-3);--devtools-space-lg: var(--size-4);--devtools-space-xl: var(--size-5);--devtools-font-mono: var(--font-mono);--devtools-font-sans: var(--font-sans);--devtools-radius-sm: var(--radius-2);--devtools-radius-md: var(--radius-3);--devtools-radius-lg: var(--radius-4);--devtools-shadow-sm: var(--shadow-2);--devtools-shadow-md: var(--shadow-3);--devtools-shadow-lg: var(--shadow-4);--devtools-transition-fast: .15s var(--ease-3);--devtools-transition-normal: .2s var(--ease-3);--devtools-transition-slow: .3s var(--ease-3);--devtools-header-height: 48px;--devtools-sidebar-width: 280px}@media(prefers-color-scheme:dark){:root:not(.light):not(.dark){--devtools-bg: var(--gray-9);--devtools-surface: var(--gray-8);--devtools-surface-elevated: var(--gray-7);--devtools-border: var(--gray-6);--devtools-text: var(--gray-1);--devtools-text-muted: var(--gray-4);--devtools-text-inverted: var(--gray-9)}}.light{--devtools-bg: var(--gray-0);--devtools-surface: var(--gray-1);--devtools-surface-elevated: var(--gray-2);--devtools-border: var(--gray-4);--devtools-text: var(--gray-9);--devtools-text-muted: var(--gray-6);--devtools-text-inverted: var(--gray-0)}.dark{--devtools-bg: var(--gray-9);--devtools-surface: var(--gray-8);--devtools-surface-elevated: var(--gray-7);--devtools-border: var(--gray-6);--devtools-text: var(--gray-1);--devtools-text-muted: var(--gray-4);--devtools-text-inverted: var(--gray-9)}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;padding:0;min-height:100vh;font-family:var(--devtools-font-sans);background-color:var(--devtools-bg);color:var(--devtools-text)}#app{min-height:100vh;display:flex;flex-direction:column}.font-mono{font-family:var(--devtools-font-mono)}.text-muted{color:var(--devtools-text-muted)}.method-badge{display:inline-flex;align-items:center;justify-content:center;padding:var(--devtools-space-xs) var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-mono);font-size:var(--font-size-0);font-weight:var(--font-weight-6);text-transform:uppercase;min-width:60px}.method-badge--get{background-color:color-mix(in srgb,var(--method-get) 15%,transparent);color:var(--method-get)}.method-badge--post{background-color:color-mix(in srgb,var(--method-post) 15%,transparent);color:var(--method-post)}.method-badge--put{background-color:color-mix(in srgb,var(--method-put) 15%,transparent);color:var(--method-put)}.method-badge--patch{background-color:color-mix(in srgb,var(--method-patch) 15%,transparent);color:var(--method-patch)}.method-badge--delete{background-color:color-mix(in srgb,var(--method-delete) 15%,transparent);color:var(--method-delete)}.method-badge--options{background-color:color-mix(in srgb,var(--method-options) 15%,transparent);color:var(--method-options)}.method-badge--head{background-color:color-mix(in srgb,var(--method-head) 15%,transparent);color:var(--method-head)}.status-badge{display:inline-flex;align-items:center;justify-content:center;padding:var(--devtools-space-xs) var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-mono);font-size:var(--font-size-0);font-weight:var(--font-weight-5);min-width:40px}.status-badge--1xx{background-color:color-mix(in srgb,var(--status-1xx) 15%,transparent);color:var(--status-1xx)}.status-badge--2xx{background-color:color-mix(in srgb,var(--status-2xx) 15%,transparent);color:var(--status-2xx)}.status-badge--3xx{background-color:color-mix(in srgb,var(--status-3xx) 15%,transparent);color:var(--status-3xx)}.status-badge--4xx{background-color:color-mix(in srgb,var(--status-4xx) 15%,transparent);color:var(--status-4xx)}.status-badge--5xx{background-color:color-mix(in srgb,var(--status-5xx) 15%,transparent);color:var(--status-5xx)}.connection-status{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0)}.connection-status__dot{width:8px;height:8px;border-radius:50%}.connection-status__dot--connected{background-color:var(--devtools-success);box-shadow:0 0 6px var(--devtools-success)}.connection-status__dot--disconnected{background-color:var(--devtools-error)}.connection-status__dot--connecting{background-color:var(--devtools-warning);animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.card{background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-md);padding:var(--devtools-space-md)}.card--elevated{background-color:var(--devtools-surface-elevated);box-shadow:var(--devtools-shadow-sm)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-sm) var(--devtools-space-md);border:none;border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-1);font-weight:var(--font-weight-5);cursor:pointer;transition:all var(--devtools-transition-fast)}.btn--primary{background-color:var(--devtools-primary);color:var(--devtools-text-inverted)}.btn--primary:hover{background-color:var(--devtools-primary-hover)}.btn--primary:active{background-color:var(--devtools-primary-active)}.btn--secondary{background-color:var(--devtools-surface-elevated);color:var(--devtools-text);border:1px solid var(--devtools-border)}.btn--secondary:hover{background-color:var(--devtools-border)}.btn--ghost{background-color:transparent;color:var(--devtools-text)}.btn--ghost:hover{background-color:var(--devtools-surface)}.btn--icon{padding:var(--devtools-space-sm)}.btn:disabled{opacity:.5;cursor:not-allowed}.input{display:block;width:100%;padding:var(--devtools-space-sm) var(--devtools-space-md);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-1);color:var(--devtools-text);transition:border-color var(--devtools-transition-fast)}.input:focus{outline:2px solid transparent;outline-color:var(--devtools-primary);border-color:var(--devtools-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--devtools-primary) 25%,transparent)}.input::placeholder{color:var(--devtools-text-muted)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--devtools-surface)}::-webkit-scrollbar-thumb{background:var(--devtools-border);border-radius:var(--devtools-radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--devtools-text-muted)}.flex{display:flex}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-xs{gap:var(--devtools-space-xs)}.gap-sm{gap:var(--devtools-space-sm)}.gap-md{gap:var(--devtools-space-md)}.gap-lg{gap:var(--devtools-space-lg)}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--devtools-space-xl);color:var(--devtools-text-muted);text-align:center}.empty-state__icon{width:48px;height:48px;margin-bottom:var(--devtools-space-md);opacity:.5}.empty-state__title{font-size:var(--font-size-3);font-weight:var(--font-weight-5);margin:0 0 var(--devtools-space-sm)}.empty-state__description{font-size:var(--font-size-1);margin:0}.endpoint-detail[data-v-c66a0f52]{display:flex;flex-direction:column;height:100%;overflow:hidden}.endpoint-detail__empty[data-v-c66a0f52]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:var(--devtools-space-xl);text-align:center}.endpoint-detail__empty-icon[data-v-c66a0f52]{color:var(--devtools-text-muted);opacity:.5;margin-bottom:var(--devtools-space-md)}.endpoint-detail__empty-title[data-v-c66a0f52]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);margin:0 0 var(--devtools-space-sm)}.endpoint-detail__empty-text[data-v-c66a0f52]{font-size:var(--font-size-1);margin:0}.endpoint-detail__content[data-v-c66a0f52]{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:var(--devtools-space-md)}.endpoint-detail__header[data-v-c66a0f52]{display:flex;align-items:center;gap:var(--devtools-space-md);margin-bottom:var(--devtools-space-md);padding-bottom:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border)}.endpoint-detail__path[data-v-c66a0f52]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);margin:0;word-break:break-all}.method-badge--large[data-v-c66a0f52]{font-size:var(--font-size-0);padding:var(--devtools-space-sm) var(--devtools-space-md);min-width:70px}.endpoint-detail__status[data-v-c66a0f52]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-sm);margin-bottom:var(--devtools-space-md)}.endpoint-detail__status-item[data-v-c66a0f52]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5)}.endpoint-detail__status-item--handler[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.endpoint-detail__status-item--seed[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.endpoint-detail__status-item--security[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.endpoint-detail__status-item--auto[data-v-c66a0f52]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.endpoint-detail__sections[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-md)}.endpoint-detail__section[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.endpoint-detail__section-title[data-v-c66a0f52]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.endpoint-detail__section-content[data-v-c66a0f52]{font-size:var(--font-size-1);color:var(--devtools-text);margin:0;line-height:var(--font-lineheight-3)}.endpoint-detail__description[data-v-c66a0f52]{white-space:pre-wrap}.endpoint-detail__tags[data-v-c66a0f52]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.endpoint-detail__tag[data-v-c66a0f52]{display:inline-flex;align-items:center;padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);color:var(--devtools-text)}.endpoint-detail__security[data-v-c66a0f52]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.endpoint-detail__security-item[data-v-c66a0f52]{display:flex;flex-direction:column;gap:2px;padding:var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border-radius:var(--devtools-radius-sm)}.endpoint-detail__security-name[data-v-c66a0f52]{font-size:var(--font-size-1);font-weight:var(--font-weight-5)}.endpoint-detail__security-scopes[data-v-c66a0f52]{font-size:var(--font-size-0)}.endpoint-list[data-v-554ffe63]{display:flex;flex-direction:column;height:100%;overflow:hidden}.endpoint-list__empty[data-v-554ffe63]{display:flex;align-items:center;justify-content:center;padding:var(--devtools-space-lg)}.endpoint-list__groups[data-v-554ffe63]{flex:1;overflow-y:auto;padding:var(--devtools-space-xs)}.endpoint-group[data-v-554ffe63]{margin-bottom:var(--devtools-space-xs)}.endpoint-group__header[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-xs);width:100%;padding:var(--devtools-space-sm) var(--devtools-space-sm);background:none;border:none;border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-1);font-weight:var(--font-weight-5);color:var(--devtools-text);text-align:left;cursor:pointer;transition:background-color var(--devtools-transition-fast)}.endpoint-group__header[data-v-554ffe63]:hover{background-color:var(--devtools-surface-elevated)}.endpoint-group__header[data-v-554ffe63]:focus{outline:none}.endpoint-group__header[data-v-554ffe63]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.endpoint-group__chevron[data-v-554ffe63]{flex-shrink:0;color:var(--devtools-text-muted)}.endpoint-group__tag[data-v-554ffe63]{flex:1;text-transform:capitalize}.endpoint-group__count[data-v-554ffe63]{font-size:var(--font-size-0);font-weight:var(--font-weight-4)}.endpoint-group__items[data-v-554ffe63]{padding-left:var(--devtools-space-md)}.endpoint-item[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-sm);width:100%;padding:var(--devtools-space-xs) var(--devtools-space-sm);background:none;border:none;border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);text-align:left;cursor:pointer;transition:background-color var(--devtools-transition-fast)}.endpoint-item[data-v-554ffe63]:hover{background-color:var(--devtools-surface-elevated)}.endpoint-item[data-v-554ffe63]:focus{outline:none}.endpoint-item[data-v-554ffe63]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.endpoint-item--selected[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.endpoint-item--selected[data-v-554ffe63]:hover{background-color:color-mix(in srgb,var(--devtools-primary) 20%,transparent)}.endpoint-item__path[data-v-554ffe63]{flex:1;font-size:var(--font-size-0);color:var(--devtools-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.endpoint-item__indicators[data-v-554ffe63]{display:flex;align-items:center;gap:var(--devtools-space-xs)}.endpoint-item__indicator[data-v-554ffe63]{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:var(--devtools-radius-sm)}.endpoint-item__indicator--handler[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.endpoint-item__indicator--seed[data-v-554ffe63]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.routes-page[data-v-bdd419e3]{display:flex;flex-direction:column;height:100%;overflow:hidden}.routes-toolbar[data-v-bdd419e3]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.routes-search[data-v-bdd419e3]{position:relative;flex:1;max-width:400px}.routes-search__icon[data-v-bdd419e3]{position:absolute;left:var(--devtools-space-sm);top:50%;transform:translateY(-50%);color:var(--devtools-text-muted);pointer-events:none}.routes-search__input[data-v-bdd419e3]{padding-left:calc(var(--devtools-space-sm) + 24px);padding-right:calc(var(--devtools-space-sm) + 24px)}.routes-search__clear[data-v-bdd419e3]{position:absolute;right:var(--devtools-space-xs);top:50%;transform:translateY(-50%);padding:var(--devtools-space-xs)}.routes-filter-toggle[data-v-bdd419e3]{flex-shrink:0}.routes-filter-toggle--active[data-v-bdd419e3]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.routes-filter-toggle__badge[data-v-bdd419e3]{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--devtools-space-xs);background-color:var(--devtools-primary);color:var(--devtools-text-inverted);border-radius:9px;font-size:var(--font-size-0);font-weight:var(--font-weight-6)}.routes-stats[data-v-bdd419e3]{display:flex;align-items:center;gap:var(--devtools-space-sm);margin-left:auto;font-size:var(--font-size-0);color:var(--devtools-text-muted)}.routes-stats__separator[data-v-bdd419e3]{opacity:.5}.routes-filters[data-v-bdd419e3]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--devtools-space-lg);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.routes-filters__section[data-v-bdd419e3]{display:flex;flex-direction:column;gap:var(--devtools-space-sm)}.routes-filters__title[data-v-bdd419e3]{font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.routes-filters__methods[data-v-bdd419e3]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.routes-filters__methods .method-badge[data-v-bdd419e3]{cursor:pointer;transition:all var(--devtools-transition-fast)}.routes-filters__methods .method-badge--inactive[data-v-bdd419e3]{opacity:.4}.routes-filters__status[data-v-bdd419e3]{display:flex;gap:var(--devtools-space-sm)}.routes-filters__status-btn[data-v-bdd419e3]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);color:var(--devtools-text-muted);cursor:pointer;transition:all var(--devtools-transition-fast)}.routes-filters__status-btn[data-v-bdd419e3]:hover{background-color:var(--devtools-surface-elevated);color:var(--devtools-text)}.routes-filters__status-btn--active[data-v-bdd419e3]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.routes-filters__actions[data-v-bdd419e3]{display:flex;align-items:flex-end;margin-left:auto}.routes-content[data-v-bdd419e3]{flex:1;display:flex;overflow:hidden}.routes-loading[data-v-bdd419e3]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md)}.routes-loading__spinner[data-v-bdd419e3]{width:32px;height:32px;border:3px solid var(--devtools-border);border-top-color:var(--devtools-primary);border-radius:50%;animation:spin-bdd419e3 1s linear infinite}@keyframes spin-bdd419e3{to{transform:rotate(360deg)}}.routes-error[data-v-bdd419e3]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md);padding:var(--devtools-space-xl)}.routes-error__message[data-v-bdd419e3]{color:var(--devtools-error);margin:0}.routes-empty[data-v-bdd419e3]{width:100%}.routes-list-panel[data-v-bdd419e3]{width:var(--devtools-sidebar-width);min-width:200px;max-width:400px;border-right:1px solid var(--devtools-border);background-color:var(--devtools-surface);overflow:hidden}.routes-detail-panel[data-v-bdd419e3]{flex:1;overflow:hidden;background-color:var(--devtools-bg)}.timeline-detail[data-v-b4bdd2d2]{display:flex;flex-direction:column;height:100%;overflow:hidden}.timeline-detail__empty[data-v-b4bdd2d2]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:var(--devtools-space-xl);text-align:center}.timeline-detail__empty-icon[data-v-b4bdd2d2]{color:var(--devtools-text-muted);opacity:.5;margin-bottom:var(--devtools-space-md)}.timeline-detail__empty-title[data-v-b4bdd2d2]{font-size:var(--font-size-3);font-weight:var(--font-weight-6);color:var(--devtools-text);margin:0 0 var(--devtools-space-sm) 0}.timeline-detail__empty-description[data-v-b4bdd2d2]{font-size:var(--font-size-1);color:var(--devtools-text-muted);margin:0}.timeline-detail__content[data-v-b4bdd2d2]{display:flex;flex-direction:column;height:100%;overflow-y:auto}.timeline-detail__header[data-v-b4bdd2d2]{display:flex;flex-direction:column;gap:var(--devtools-space-sm);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.timeline-detail__summary[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-sm)}.timeline-detail__path[data-v-b4bdd2d2]{font-size:var(--font-size-2);font-weight:var(--font-weight-5);color:var(--devtools-text);word-break:break-all}.timeline-detail__meta[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-md)}.timeline-detail__duration[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.timeline-detail__simulated[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-warning)}.timeline-detail__actions[data-v-b4bdd2d2]{display:flex;gap:var(--devtools-space-sm)}.timeline-detail__info[data-v-b4bdd2d2]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.timeline-detail__info-item[data-v-b4bdd2d2]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.timeline-detail__info-label[data-v-b4bdd2d2]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em}.timeline-detail__info-value[data-v-b4bdd2d2]{font-size:var(--font-size-1);color:var(--devtools-text)}.timeline-detail__section[data-v-b4bdd2d2]{padding:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border)}.timeline-detail__section[data-v-b4bdd2d2]:last-child{border-bottom:none}.timeline-detail__section-title[data-v-b4bdd2d2]{font-size:var(--font-size-1);font-weight:var(--font-weight-6);color:var(--devtools-text);margin:0 0 var(--devtools-space-md) 0;text-transform:uppercase;letter-spacing:.05em}.timeline-detail__subsection[data-v-b4bdd2d2]{margin-bottom:var(--devtools-space-sm)}.timeline-detail__subsection[data-v-b4bdd2d2]:last-child{margin-bottom:0}.timeline-detail__subsection-header[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);width:100%;padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm)}.timeline-detail__subsection-toggle[data-v-b4bdd2d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);flex:1;padding:0;background:none;border:none;font-family:var(--devtools-font-sans);font-size:var(--font-size-1);font-weight:var(--font-weight-5);color:var(--devtools-text);text-align:left;cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-detail__subsection-toggle[data-v-b4bdd2d2]:hover{color:var(--devtools-text-hover)}.timeline-detail__subsection-content[data-v-b4bdd2d2]{margin-top:var(--devtools-space-xs);padding:var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm)}.timeline-detail__kv-row[data-v-b4bdd2d2]{display:grid;grid-template-columns:minmax(120px,auto) 1fr;gap:var(--devtools-space-md);padding:var(--devtools-space-xs) 0;border-bottom:1px solid var(--devtools-border)}.timeline-detail__kv-row[data-v-b4bdd2d2]:last-child{border-bottom:none}.timeline-detail__kv-key[data-v-b4bdd2d2]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text-muted);word-break:break-all}.timeline-detail__kv-value[data-v-b4bdd2d2]{font-size:var(--font-size-0);color:var(--devtools-text);word-break:break-all}.timeline-detail__json[data-v-b4bdd2d2]{margin:0;padding:var(--devtools-space-sm);background-color:var(--devtools-bg);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-mono);font-size:var(--font-size-0);color:var(--devtools-text);white-space:pre-wrap;word-break:break-all;overflow-x:auto}.status-badge[data-v-b4bdd2d2]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:2px var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5);font-family:var(--devtools-font-mono)}.status-badge--pending[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.status-badge--1xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--2xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.status-badge--3xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--4xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.status-badge--5xx[data-v-b4bdd2d2]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);color:var(--devtools-error)}.timeline-detail__pending[data-v-b4bdd2d2]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--devtools-space-sm);padding:var(--devtools-space-lg)}.timeline-detail__pending-icon[data-v-b4bdd2d2]{color:var(--devtools-text-muted);animation:pulse-b4bdd2d2 2s ease-in-out infinite}@keyframes pulse-b4bdd2d2{0%,to{opacity:1}50%{opacity:.5}}.timeline-entry[data-v-a073dbdf]{display:grid;grid-template-columns:100px 80px 1fr auto 80px auto;align-items:center;gap:var(--devtools-space-md);width:100%;padding:var(--devtools-space-sm) var(--devtools-space-md);background:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);text-align:left;cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-entry[data-v-a073dbdf]:hover{background-color:var(--devtools-surface-elevated);border-color:var(--devtools-border-hover)}.timeline-entry[data-v-a073dbdf]:focus{outline:none}.timeline-entry[data-v-a073dbdf]:focus-visible{outline:2px solid var(--devtools-primary);outline-offset:-2px}.timeline-entry--selected[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-primary) 10%,transparent);border-color:var(--devtools-primary)}.timeline-entry--selected[data-v-a073dbdf]:hover{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.timeline-entry--pending[data-v-a073dbdf]{opacity:.7}.timeline-entry--simulated[data-v-a073dbdf]{border-left:3px solid var(--devtools-warning)}.timeline-entry__time[data-v-a073dbdf]{font-size:var(--font-size-0)}.timeline-entry__path[data-v-a073dbdf]{font-size:var(--font-size-1);color:var(--devtools-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline-entry__status[data-v-a073dbdf]{display:flex;align-items:center}.status-badge[data-v-a073dbdf]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:2px var(--devtools-space-sm);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);font-weight:var(--font-weight-5);font-family:var(--devtools-font-mono)}.status-badge--pending[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-text-muted) 15%,transparent);color:var(--devtools-text-muted)}.status-badge--1xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--2xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);color:var(--devtools-success)}.status-badge--3xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);color:var(--devtools-info)}.status-badge--4xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);color:var(--devtools-warning)}.status-badge--5xx[data-v-a073dbdf]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);color:var(--devtools-error)}.timeline-entry__duration[data-v-a073dbdf]{font-size:var(--font-size-0);text-align:right}.timeline-entry__simulated[data-v-a073dbdf]{display:flex;align-items:center;justify-content:center;color:var(--devtools-warning)}.timeline-page[data-v-a5c73778]{display:flex;flex-direction:column;height:100%;overflow:hidden}.timeline-toolbar[data-v-a5c73778]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-md);background-color:var(--devtools-surface);border-bottom:1px solid var(--devtools-border)}.timeline-search[data-v-a5c73778]{position:relative;flex:1;max-width:400px}.timeline-search__icon[data-v-a5c73778]{position:absolute;left:var(--devtools-space-sm);top:50%;transform:translateY(-50%);color:var(--devtools-text-muted);pointer-events:none}.timeline-search__input[data-v-a5c73778]{padding-left:calc(var(--devtools-space-sm) + 24px);padding-right:calc(var(--devtools-space-sm) + 24px)}.timeline-search__clear[data-v-a5c73778]{position:absolute;right:var(--devtools-space-xs);top:50%;transform:translateY(-50%);padding:var(--devtools-space-xs)}.timeline-filter-toggle[data-v-a5c73778]{flex-shrink:0}.timeline-filter-toggle--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.timeline-filter-toggle__badge[data-v-a5c73778]{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 var(--devtools-space-xs);background-color:var(--devtools-primary);color:var(--devtools-text-inverted);border-radius:9px;font-size:var(--font-size-0);font-weight:var(--font-weight-6)}.timeline-stats[data-v-a5c73778]{display:flex;align-items:center;gap:var(--devtools-space-sm);margin-left:auto;font-size:var(--font-size-0);color:var(--devtools-text-muted)}.timeline-stats__separator[data-v-a5c73778]{opacity:.5}.timeline-filters[data-v-a5c73778]{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--devtools-space-lg);padding:var(--devtools-space-md);background-color:var(--devtools-surface-elevated);border-bottom:1px solid var(--devtools-border)}.timeline-filters__section[data-v-a5c73778]{display:flex;flex-direction:column;gap:var(--devtools-space-sm)}.timeline-filters__title[data-v-a5c73778]{font-size:var(--font-size-0);font-weight:var(--font-weight-6);color:var(--devtools-text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0}.timeline-filters__methods[data-v-a5c73778]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.timeline-filters__methods .method-badge[data-v-a5c73778]{cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-filters__methods .method-badge--inactive[data-v-a5c73778]{opacity:.4}.timeline-filters__status[data-v-a5c73778],.timeline-filters__type[data-v-a5c73778]{display:flex;gap:var(--devtools-space-sm)}.timeline-filters__status-btn[data-v-a5c73778]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);color:var(--devtools-text-muted);cursor:pointer;transition:all var(--devtools-transition-fast)}.timeline-filters__status-btn[data-v-a5c73778]:hover{background-color:var(--devtools-surface-elevated);color:var(--devtools-text)}.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);border-color:var(--devtools-primary);color:var(--devtools-primary)}.timeline-filters__status-btn--2xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-success) 15%,transparent);border-color:var(--devtools-success);color:var(--devtools-success)}.timeline-filters__status-btn--3xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-info) 15%,transparent);border-color:var(--devtools-info);color:var(--devtools-info)}.timeline-filters__status-btn--4xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-warning) 15%,transparent);border-color:var(--devtools-warning);color:var(--devtools-warning)}.timeline-filters__status-btn--5xx.timeline-filters__status-btn--active[data-v-a5c73778]{background-color:color-mix(in srgb,var(--devtools-error) 15%,transparent);border-color:var(--devtools-error);color:var(--devtools-error)}.timeline-filters__status-count[data-v-a5c73778]{font-size:var(--font-size-00);opacity:.7}.timeline-filters__actions[data-v-a5c73778]{display:flex;align-items:flex-end;margin-left:auto}.timeline-content[data-v-a5c73778]{flex:1;display:flex;overflow:hidden}.timeline-loading[data-v-a5c73778]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md)}.timeline-loading__spinner[data-v-a5c73778]{width:32px;height:32px;border:3px solid var(--devtools-border);border-top-color:var(--devtools-primary);border-radius:50%;animation:spin-a5c73778 1s linear infinite}@keyframes spin-a5c73778{to{transform:rotate(360deg)}}.timeline-error[data-v-a5c73778]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:var(--devtools-space-md);padding:var(--devtools-space-xl)}.timeline-error__message[data-v-a5c73778]{color:var(--devtools-error);margin:0}.timeline-empty[data-v-a5c73778]{width:100%}.timeline-list-panel[data-v-a5c73778]{width:50%;min-width:300px;max-width:600px;border-right:1px solid var(--devtools-border);background-color:var(--devtools-bg);overflow:hidden;display:flex;flex-direction:column}.timeline-list[data-v-a5c73778]{flex:1;overflow-y:auto;padding:var(--devtools-space-sm);display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.timeline-detail-panel[data-v-a5c73778]{flex:1;overflow:hidden;background-color:var(--devtools-bg)}.models-page[data-v-6373fe56]{display:grid;grid-template-columns:240px 1fr;height:100%;overflow:hidden}.models-sidebar[data-v-6373fe56]{display:flex;flex-direction:column;background-color:var(--devtools-surface);border-right:1px solid var(--devtools-border);overflow:hidden}.models-sidebar__header[data-v-6373fe56]{display:flex;align-items:center;gap:var(--devtools-space-sm);padding:var(--devtools-space-md);font-weight:var(--font-weight-6);font-size:var(--font-size-1);border-bottom:1px solid var(--devtools-border)}.models-sidebar__list[data-v-6373fe56]{flex:1;overflow-y:auto;padding:var(--devtools-space-xs)}.models-sidebar__item[data-v-6373fe56]{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--devtools-space-sm) var(--devtools-space-md);background:none;border:none;border-radius:var(--devtools-radius-sm);color:var(--devtools-text);font-family:var(--devtools-font-sans);font-size:var(--font-size-1);cursor:pointer;transition:background-color var(--devtools-transition-fast)}.models-sidebar__item[data-v-6373fe56]:hover{background-color:var(--devtools-surface-elevated)}.models-sidebar__item--active[data-v-6373fe56]{background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent);color:var(--devtools-primary)}.models-sidebar__name[data-v-6373fe56]{font-family:var(--devtools-font-mono)}.models-sidebar__count[data-v-6373fe56]{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:20px;padding:0 var(--devtools-space-xs);background-color:var(--devtools-surface-elevated);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.models-content[data-v-6373fe56]{display:flex;flex-direction:column;padding:var(--devtools-space-md);overflow:hidden}.models-toolbar[data-v-6373fe56]{display:flex;align-items:center;justify-content:space-between;gap:var(--devtools-space-md);margin-bottom:var(--devtools-space-md)}.models-toolbar__title[data-v-6373fe56]{display:flex;align-items:center;gap:var(--devtools-space-sm);font-size:var(--font-size-2);font-weight:var(--font-weight-6)}.models-toolbar__actions[data-v-6373fe56]{display:flex;align-items:center;gap:var(--devtools-space-sm)}.models-data[data-v-6373fe56]{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:var(--devtools-space-sm)}.models-data__item[data-v-6373fe56]{padding:var(--devtools-space-sm)}.models-data__json[data-v-6373fe56]{margin:0;padding:var(--devtools-space-sm);background-color:var(--devtools-bg);border-radius:var(--devtools-radius-sm);font-size:var(--font-size-0);line-height:var(--font-lineheight-3);overflow-x:auto;white-space:pre-wrap;word-break:break-all}.simulator-page[data-v-cf6df4d2]{display:flex;flex-direction:column;gap:var(--devtools-space-lg);height:100%;padding:var(--devtools-space-md);overflow-y:auto}.simulator-form[data-v-cf6df4d2]{flex-shrink:0}.simulator-form__header[data-v-cf6df4d2]{display:flex;align-items:center;gap:var(--devtools-space-sm);padding-bottom:var(--devtools-space-md);margin-bottom:var(--devtools-space-md);border-bottom:1px solid var(--devtools-border);font-weight:var(--font-weight-6);font-size:var(--font-size-1)}.simulator-form__body[data-v-cf6df4d2]{display:flex;flex-direction:column;gap:var(--devtools-space-md)}.simulator-form__row[data-v-cf6df4d2]{display:flex;gap:var(--devtools-space-sm)}.simulator-form__method[data-v-cf6df4d2]{width:100px;flex-shrink:0}.simulator-form__path[data-v-cf6df4d2]{flex:1}.simulator-presets[data-v-cf6df4d2]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.simulator-preset[data-v-cf6df4d2]{display:inline-flex;align-items:center;gap:var(--devtools-space-xs);padding:var(--devtools-space-xs) var(--devtools-space-sm);background-color:var(--devtools-surface-elevated);border:1px solid var(--devtools-border);border-radius:var(--devtools-radius-sm);font-family:var(--devtools-font-sans);font-size:var(--font-size-0);cursor:pointer;transition:all var(--devtools-transition-fast)}.simulator-preset[data-v-cf6df4d2]:hover{background-color:var(--devtools-border)}.simulator-preset--selected[data-v-cf6df4d2]{border-color:var(--devtools-primary);background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.simulator-preset--delay[data-v-cf6df4d2]{color:var(--devtools-warning)}.simulator-preset--error[data-v-cf6df4d2]{color:var(--devtools-error)}.simulator-preset__label[data-v-cf6df4d2]{color:var(--devtools-text)}.simulator-active[data-v-cf6df4d2]{flex:1;display:flex;flex-direction:column;min-height:0}.simulator-active__header[data-v-cf6df4d2]{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--devtools-space-md)}.simulator-active__title[data-v-cf6df4d2]{font-weight:var(--font-weight-6);font-size:var(--font-size-1)}.simulator-active__list[data-v-cf6df4d2]{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.simulator-simulation[data-v-cf6df4d2]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-sm) var(--devtools-space-md)}.simulator-simulation__info[data-v-cf6df4d2]{display:flex;align-items:center;gap:var(--devtools-space-sm);flex:1}.simulator-simulation__path[data-v-cf6df4d2]{font-size:var(--font-size-1);color:var(--devtools-text)}.simulator-simulation__preset[data-v-cf6df4d2]{display:flex;align-items:center;gap:var(--devtools-space-xs);font-size:var(--font-size-0);color:var(--devtools-text-muted)}.text-warning[data-v-cf6df4d2]{color:var(--devtools-warning)}.text-error[data-v-cf6df4d2]{color:var(--devtools-error)}
@@ -0,0 +1,9 @@
1
+ import "pinia";
2
+ import "vue";
3
+ import { b as a, a as r, u as m } from "./main-AUiFaD93.js";
4
+ export {
5
+ a as bootstrap,
6
+ r as useTheme,
7
+ m as useWebSocket
8
+ };
9
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}