@websublime/vite-plugin-open-api-devtools 0.7.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ModelsPage-C1LQvwFk.js +750 -0
- package/dist/ModelsPage-C1LQvwFk.js.map +1 -0
- package/dist/{RoutesPage-D3FSr2Y6.js → RoutesPage-BHmWMFsq.js} +4 -4
- package/dist/{RoutesPage-D3FSr2Y6.js.map → RoutesPage-BHmWMFsq.js.map} +1 -1
- package/dist/{SimulatorPage-CzJrwWzc.js → SimulatorPage-Bx1k15hK.js} +154 -149
- package/dist/SimulatorPage-Bx1k15hK.js.map +1 -0
- package/dist/{TimelinePage-HGh13pF3.js → TimelinePage-BNUW_r67.js} +7 -7
- package/dist/{TimelinePage-HGh13pF3.js.map → TimelinePage-BNUW_r67.js.map} +1 -1
- package/dist/{check-BLIoatWd.js → check-Crwhzuxr.js} +2 -2
- package/dist/{check-BLIoatWd.js.map → check-Crwhzuxr.js.map} +1 -1
- package/dist/devtools.css +1 -1
- package/dist/devtools.js +1 -1
- package/dist/devtools.umd.cjs +3 -3
- package/dist/devtools.umd.cjs.map +1 -1
- package/dist/{format-lBEBG5Y6.js → format-BjZBWUrM.js} +2 -2
- package/dist/{format-lBEBG5Y6.js.map → format-BjZBWUrM.js.map} +1 -1
- package/dist/{main-DKt7pJsx.js → main-ECCULvdl.js} +250 -250
- package/dist/main-ECCULvdl.js.map +1 -0
- package/dist/spa/assets/ModelsPage-BslYlawu.css +1 -0
- package/dist/spa/assets/ModelsPage-DQt9z3J2.js +4 -0
- package/dist/spa/assets/ModelsPage-DQt9z3J2.js.map +1 -0
- package/dist/spa/assets/RoutesPage-BP6-uw-k.js +2 -0
- package/dist/spa/assets/{RoutesPage-Bhnu6w5-.js.map → RoutesPage-BP6-uw-k.js.map} +1 -1
- package/dist/spa/assets/SimulatorPage-BH2KmZ_S.js +2 -0
- package/dist/spa/assets/SimulatorPage-BH2KmZ_S.js.map +1 -0
- package/dist/spa/assets/SimulatorPage-DGEq_rzM.css +1 -0
- package/dist/spa/assets/TimelinePage-BAbAB_--.js +2 -0
- package/dist/spa/assets/{TimelinePage-CwR-Coxj.js.map → TimelinePage-BAbAB_--.js.map} +1 -1
- package/dist/spa/assets/check-C0owz4na.js +2 -0
- package/dist/spa/assets/{check-DxJBRQqh.js.map → check-C0owz4na.js.map} +1 -1
- package/dist/spa/assets/{format-B1udViy3.js → format-C4BPxS33.js} +2 -2
- package/dist/spa/assets/{format-B1udViy3.js.map → format-C4BPxS33.js.map} +1 -1
- package/dist/spa/assets/index-CFIFFTBf.css +1 -0
- package/dist/spa/assets/index-rRRRtsjM.js +3 -0
- package/dist/spa/assets/index-rRRRtsjM.js.map +1 -0
- package/dist/spa/assets/{registry-Z11QUkpV.js → registry-DjJcdO1T.js} +2 -2
- package/dist/spa/assets/{registry-Z11QUkpV.js.map → registry-DjJcdO1T.js.map} +1 -1
- package/dist/spa/assets/{trash-2-CDyKV6GB.js → trash-2-CR2SZgyU.js} +2 -2
- package/dist/spa/assets/{trash-2-CDyKV6GB.js.map → trash-2-CR2SZgyU.js.map} +1 -1
- package/dist/spa/assets/{triangle-alert-CAGaIjAo.js → triangle-alert-BMgTQ4dT.js} +2 -2
- package/dist/spa/assets/{triangle-alert-CAGaIjAo.js.map → triangle-alert-BMgTQ4dT.js.map} +1 -1
- package/dist/spa/assets/{vue-vendor-CtA47il-.js → vue-vendor-Bkktf9yg.js} +2 -2
- package/dist/spa/assets/{vue-vendor-CtA47il-.js.map → vue-vendor-Bkktf9yg.js.map} +1 -1
- package/dist/spa/assets/x-qSQxHLmz.js +2 -0
- package/dist/spa/assets/{x-zxrccEon.js.map → x-qSQxHLmz.js.map} +1 -1
- package/dist/spa/index.html +3 -3
- package/dist/{trash-2-RxS9jzWT.js → trash-2-DkjAUIEq.js} +2 -2
- package/dist/{trash-2-RxS9jzWT.js.map → trash-2-DkjAUIEq.js.map} +1 -1
- package/dist/{triangle-alert-gLhIcFT5.js → triangle-alert-BUAaw7Jx.js} +2 -2
- package/dist/{triangle-alert-gLhIcFT5.js.map → triangle-alert-BUAaw7Jx.js.map} +1 -1
- package/dist/{x-UqfnjULc.js → x-CMARYnCH.js} +2 -2
- package/dist/{x-UqfnjULc.js.map → x-CMARYnCH.js.map} +1 -1
- package/package.json +11 -11
- package/dist/ModelsPage-CSuUHUuV.js +0 -629
- package/dist/ModelsPage-CSuUHUuV.js.map +0 -1
- package/dist/SimulatorPage-CzJrwWzc.js.map +0 -1
- package/dist/main-DKt7pJsx.js.map +0 -1
- package/dist/spa/assets/ModelsPage-DQN_XP0u.css +0 -1
- package/dist/spa/assets/ModelsPage-DqYHHuAQ.js +0 -4
- package/dist/spa/assets/ModelsPage-DqYHHuAQ.js.map +0 -1
- package/dist/spa/assets/RoutesPage-Bhnu6w5-.js +0 -2
- package/dist/spa/assets/SimulatorPage-B1voZDRi.css +0 -1
- package/dist/spa/assets/SimulatorPage-ROKoAmUT.js +0 -2
- package/dist/spa/assets/SimulatorPage-ROKoAmUT.js.map +0 -1
- package/dist/spa/assets/TimelinePage-CwR-Coxj.js +0 -2
- package/dist/spa/assets/check-DxJBRQqh.js +0 -2
- package/dist/spa/assets/index-9_6u4UTF.css +0 -1
- package/dist/spa/assets/index-GQ9qRqEi.js +0 -3
- package/dist/spa/assets/index-GQ9qRqEi.js.map +0 -1
- package/dist/spa/assets/useWebSocket-C2ttWF5T.js +0 -2
- package/dist/spa/assets/useWebSocket-C2ttWF5T.js.map +0 -1
- package/dist/spa/assets/x-zxrccEon.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelsPage-DqYHHuAQ.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/circle-alert.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/refresh-cw.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/save.js","../../../src/stores/models.ts","../../../src/components/JsonEditor.vue","../../../src/composables/useNotifications.ts","../../../src/pages/ModelsPage.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 CircleAlert = createLucideIcon(\"circle-alert\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n]);\n\nexport { CircleAlert as default };\n//# sourceMappingURL=circle-alert.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 RefreshCw = createLucideIcon(\"refresh-cw\", [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n]);\n\nexport { RefreshCw as default };\n//# sourceMappingURL=refresh-cw.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 Save = createLucideIcon(\"save\", [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n]);\n\nexport { Save as default };\n//# sourceMappingURL=save.js.map\n","/**\n * Models Store - Store Data Management\n *\n * What: Manages in-memory store data for viewing and editing mock data\n * How: Fetches data from /_api/store endpoints and sends WebSocket commands\n * Why: Provides centralized state management for the Models page\n *\n * API Endpoints Used:\n * - GET /_api/store - List all schemas\n * - GET /_api/store/:schema - Get items for a schema\n * - POST /_api/store/:schema - Bulk replace items\n * - DELETE /_api/store/:schema - Clear schema data\n *\n * WebSocket Commands:\n * - reseed - Trigger reseed of all schemas\n */\n\nimport { defineStore } from 'pinia';\nimport type { ComputedRef, Ref } from 'vue';\nimport { computed, ref, toRaw } from 'vue';\n\n/**\n * Safe clone helper that handles Vue reactive/proxy values\n * Attempts structuredClone with toRaw, falls back to JSON serialization\n */\nfunction safeClone<T>(value: T): T {\n try {\n return structuredClone(toRaw(value));\n } catch {\n return JSON.parse(JSON.stringify(value)) as T;\n }\n}\n\n/**\n * Schema metadata from the server\n */\nexport interface SchemaInfo {\n /** Schema name from OpenAPI components */\n name: string;\n /** Number of items in the store for this schema */\n count: number;\n /** ID field name for this schema */\n idField: string;\n}\n\n/**\n * Schema data response from the server\n */\nexport interface SchemaData {\n /** Schema name */\n schema: string;\n /** Number of items */\n count: number;\n /** ID field name */\n idField: string;\n /** Array of data items */\n items: unknown[];\n}\n\n/**\n * Store state data\n */\nexport interface ModelsData {\n /** List of available schemas */\n schemas: SchemaInfo[];\n /** Currently selected schema name */\n selectedSchema: string | null;\n /** Items for the currently selected schema */\n currentItems: unknown[];\n /** Loading state */\n loading: boolean;\n /** Error message if any */\n error: string | null;\n /** Editing state - whether data has been modified */\n isDirty: boolean;\n}\n\n/**\n * Models store for managing store data\n */\nexport const useModelsStore = defineStore('models', () => {\n // ==========================================================================\n // State\n // ==========================================================================\n\n /** List of available schemas with metadata */\n const schemas: Ref<SchemaInfo[]> = ref([]);\n\n /** Currently selected schema name */\n const selectedSchema: Ref<string | null> = ref(null);\n\n /** Items for the currently selected schema */\n const currentItems: Ref<unknown[]> = ref([]);\n\n /** Original items (before editing) for dirty detection */\n const originalItems: Ref<unknown[]> = ref([]);\n\n /** Loading state */\n const loading: Ref<boolean> = ref(false);\n\n /** Error message */\n const error: Ref<string | null> = ref(null);\n\n // ==========================================================================\n // Computed\n // ==========================================================================\n\n /**\n * Currently selected schema metadata\n */\n const currentSchema: ComputedRef<SchemaInfo | null> = computed(() => {\n if (!selectedSchema.value) return null;\n return schemas.value.find((s) => s.name === selectedSchema.value) ?? null;\n });\n\n /**\n * Dirty state flag - updated by functions that mutate state\n */\n const isDirtyFlag: Ref<boolean> = ref(false);\n\n /**\n * Whether the current data has been modified\n */\n const isDirty: ComputedRef<boolean> = computed(() => isDirtyFlag.value);\n\n /**\n * Total number of schemas\n */\n const schemaCount: ComputedRef<number> = computed(() => schemas.value.length);\n\n /**\n * Total number of items across all schemas\n */\n const totalItems: ComputedRef<number> = computed(() => {\n return schemas.value.reduce((sum, schema) => sum + schema.count, 0);\n });\n\n // ==========================================================================\n // Actions\n // ==========================================================================\n\n /**\n * Fetch the list of schemas from the server\n */\n async function fetchSchemas(): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const response = await fetch('/_api/store');\n if (!response.ok) {\n throw new Error(`Failed to fetch schemas: ${response.statusText}`);\n }\n\n const data = await response.json();\n schemas.value = data.schemas ?? [];\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to fetch schemas';\n console.error('[ModelsStore] Error fetching schemas:', err);\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Select a schema and fetch its data\n */\n async function selectSchemaByName(schemaName: string): Promise<void> {\n if (selectedSchema.value === schemaName) return;\n\n selectedSchema.value = schemaName;\n await fetchSchemaData(schemaName);\n }\n\n /**\n * Fetch data for a specific schema\n */\n async function fetchSchemaData(schemaName: string): Promise<void> {\n loading.value = true;\n error.value = null;\n\n try {\n const response = await fetch(`/_api/store/${encodeURIComponent(schemaName)}`);\n if (!response.ok) {\n throw new Error(`Failed to fetch schema data: ${response.statusText}`);\n }\n\n const data: SchemaData = await response.json();\n const items = data.items ?? [];\n // Clone items to avoid shared references between current and original\n currentItems.value = safeClone(items);\n originalItems.value = safeClone(items);\n isDirtyFlag.value = false;\n\n // Update schema count in the list\n const schemaIndex = schemas.value.findIndex((s) => s.name === schemaName);\n if (schemaIndex !== -1) {\n schemas.value[schemaIndex].count = data.count;\n }\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to fetch schema data';\n console.error('[ModelsStore] Error fetching schema data:', err);\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Update the current items (for editing)\n */\n function updateItems(items: unknown): void {\n // Validate that items is an array\n if (!Array.isArray(items)) {\n error.value = 'Invalid data: Expected an array of items';\n console.error('[ModelsStore] updateItems received non-array value:', typeof items);\n return;\n }\n\n currentItems.value = items;\n // Clear any previous validation errors\n error.value = null;\n // Mark as dirty since items were updated\n isDirtyFlag.value = true;\n }\n\n /**\n * Save the current items to the server\n */\n async function saveItems(): Promise<boolean> {\n if (!selectedSchema.value) {\n error.value = 'No schema selected';\n return false;\n }\n\n loading.value = true;\n error.value = null;\n\n try {\n const response = await fetch(`/_api/store/${encodeURIComponent(selectedSchema.value)}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(currentItems.value),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Failed to save items: ${response.statusText}`);\n }\n\n const result = await response.json();\n\n // Update original items to match saved items\n originalItems.value = safeClone(currentItems.value);\n isDirtyFlag.value = false;\n\n // Update schema count\n const schemaIndex = schemas.value.findIndex((s) => s.name === selectedSchema.value);\n if (schemaIndex !== -1) {\n schemas.value[schemaIndex].count = result.created ?? currentItems.value.length;\n }\n\n return true;\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to save items';\n console.error('[ModelsStore] Error saving items:', err);\n return false;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Clear all items for the current schema\n */\n async function clearSchema(): Promise<boolean> {\n if (!selectedSchema.value) {\n error.value = 'No schema selected';\n return false;\n }\n\n loading.value = true;\n error.value = null;\n\n try {\n const response = await fetch(`/_api/store/${encodeURIComponent(selectedSchema.value)}`, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error(`Failed to clear schema: ${response.statusText}`);\n }\n\n // Update local state\n currentItems.value = [];\n originalItems.value = [];\n isDirtyFlag.value = false;\n\n // Update schema count\n const schemaIndex = schemas.value.findIndex((s) => s.name === selectedSchema.value);\n if (schemaIndex !== -1) {\n schemas.value[schemaIndex].count = 0;\n }\n\n return true;\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to clear schema';\n console.error('[ModelsStore] Error clearing schema:', err);\n return false;\n } finally {\n loading.value = false;\n }\n }\n\n /**\n * Discard changes and revert to original items\n */\n function discardChanges(): void {\n currentItems.value = safeClone(originalItems.value);\n isDirtyFlag.value = false;\n }\n\n /**\n * Refresh the current schema data from the server\n */\n async function refresh(): Promise<void> {\n if (selectedSchema.value) {\n await fetchSchemaData(selectedSchema.value);\n } else {\n await fetchSchemas();\n }\n }\n\n /**\n * Reset the store state\n */\n function reset(): void {\n schemas.value = [];\n selectedSchema.value = null;\n currentItems.value = [];\n originalItems.value = [];\n loading.value = false;\n error.value = null;\n isDirtyFlag.value = false;\n }\n\n /**\n * Handle store update from WebSocket event\n */\n function handleStoreUpdate(data: { schema: string; action: string; count: number }): void {\n const schemaIndex = schemas.value.findIndex((s) => s.name === data.schema);\n if (schemaIndex !== -1) {\n schemas.value[schemaIndex].count = data.count;\n }\n\n // If the updated schema is currently selected, refresh it only if no unsaved changes\n if (selectedSchema.value === data.schema) {\n if (!isDirty.value) {\n fetchSchemaData(data.schema);\n } else {\n // Don't auto-refresh when there are unsaved changes\n console.warn(\n `[ModelsStore] Skipping auto-refresh for schema \"${data.schema}\" - unsaved changes exist`,\n );\n }\n }\n }\n\n /**\n * Handle reseed completion from WebSocket event\n */\n function handleReseedComplete(data: { success: boolean; schemas: string[] }): void {\n if (data.success) {\n // Refresh schema list\n fetchSchemas();\n\n // Refresh current schema data only if no unsaved changes\n if (selectedSchema.value) {\n if (!isDirty.value) {\n fetchSchemaData(selectedSchema.value);\n } else {\n console.warn(\n `[ModelsStore] Skipping auto-refresh after reseed for schema \"${selectedSchema.value}\" - unsaved changes exist`,\n );\n }\n }\n }\n }\n\n // ==========================================================================\n // Return store interface\n // ==========================================================================\n\n return {\n // State\n schemas,\n selectedSchema,\n currentItems,\n loading,\n error,\n\n // Computed\n currentSchema,\n isDirty,\n schemaCount,\n totalItems,\n\n // Actions\n fetchSchemas,\n selectSchemaByName,\n fetchSchemaData,\n updateItems,\n saveItems,\n clearSchema,\n discardChanges,\n refresh,\n reset,\n handleStoreUpdate,\n handleReseedComplete,\n };\n});\n\nexport type ModelsStore = ReturnType<typeof useModelsStore>;\n","<!--\n JsonEditor.vue - JSON Editor Component\n\n What: Editable JSON textarea with syntax highlighting and validation\n How: Uses a textarea with syntax validation and formatting utilities\n Why: Allows developers to edit mock data in a user-friendly interface\n\n Features:\n - Real-time JSON validation\n - Syntax error display\n - Format/prettify button\n - Line numbers\n - Monospace font\n-->\n\n<script setup lang=\"ts\">\nimport { AlertCircle, Check } from 'lucide-vue-next';\nimport { computed, ref, watch } from 'vue';\n\n/**\n * Component props\n */\ninterface Props {\n /** JSON data to edit (will be stringified) */\n modelValue: unknown;\n /** Whether the editor is read-only */\n readonly?: boolean;\n /** Placeholder text when empty */\n placeholder?: string;\n /** Minimum height in pixels */\n minHeight?: number;\n}\n\n/**\n * Component emits\n */\ninterface Emits {\n (e: 'update:modelValue', value: unknown): void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n readonly: false,\n placeholder: 'Enter JSON data...',\n minHeight: 200,\n});\n\nconst emit = defineEmits<Emits>();\n\n// ==========================================================================\n// State\n// ==========================================================================\n\n/** Current text content */\nconst text = ref<string>('');\n\n/** JSON validation error */\nconst validationError = ref<string | null>(null);\n\n/** Whether JSON is valid */\nconst isValid = computed(() => validationError.value === null);\n\n/** Line count for line numbers */\nconst lineCount = computed(() => {\n return text.value.split('\\n').length;\n});\n\n/** Line numbers array */\nconst lineNumbers = computed(() => {\n return Array.from({ length: lineCount.value }, (_, i) => i + 1);\n});\n\n// ==========================================================================\n// Initialization\n// ==========================================================================\n\n/**\n * Initialize text from modelValue\n */\nfunction initializeText(): void {\n try {\n text.value = JSON.stringify(props.modelValue, null, 2);\n validationError.value = null;\n } catch (err) {\n text.value = '';\n validationError.value = 'Invalid initial value';\n }\n}\n\n// Initialize on mount\ninitializeText();\n\n// Watch for external changes to modelValue\nwatch(\n () => props.modelValue,\n () => {\n // Only update if the parsed value differs (avoid cursor jumps during typing)\n try {\n const currentParsed = JSON.parse(text.value);\n if (JSON.stringify(currentParsed) !== JSON.stringify(props.modelValue)) {\n initializeText();\n }\n } catch {\n // If current text is invalid, always update\n initializeText();\n }\n },\n);\n\n// ==========================================================================\n// Actions\n// ==========================================================================\n\n/**\n * Handle text input\n */\nfunction handleInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n text.value = target.value;\n validateAndEmit();\n}\n\n/**\n * Validate JSON and emit update\n */\nfunction validateAndEmit(): void {\n if (text.value.trim() === '') {\n validationError.value = null;\n emit('update:modelValue', []);\n return;\n }\n\n try {\n const parsed = JSON.parse(text.value);\n validationError.value = null;\n emit('update:modelValue', parsed);\n } catch (err) {\n if (err instanceof Error) {\n // Extract line/column info from error message\n const match = err.message.match(/position (\\d+)/);\n if (match) {\n const position = Number.parseInt(match[1], 10);\n const lines = text.value.substring(0, position).split('\\n');\n const line = lines.length;\n const column = lines[lines.length - 1].length + 1;\n validationError.value = `Line ${line}, Column ${column}: ${err.message}`;\n } else {\n validationError.value = err.message;\n }\n } else {\n validationError.value = 'Invalid JSON';\n }\n }\n}\n\n/**\n * Format/prettify the JSON\n */\nfunction formatJson(): void {\n try {\n const parsed = JSON.parse(text.value);\n text.value = JSON.stringify(parsed, null, 2);\n validationError.value = null;\n emit('update:modelValue', parsed);\n } catch {\n // If invalid, do nothing\n }\n}\n\n/**\n * Handle Tab key for indentation\n */\nfunction handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Tab') {\n event.preventDefault();\n const target = event.target as HTMLTextAreaElement;\n const start = target.selectionStart;\n const end = target.selectionEnd;\n\n // Insert 2 spaces\n const newText = `${text.value.substring(0, start)} ${text.value.substring(end)}`;\n text.value = newText;\n\n // Move cursor\n setTimeout(() => {\n target.selectionStart = target.selectionEnd = start + 2;\n }, 0);\n\n validateAndEmit();\n }\n}\n\n// ==========================================================================\n// Expose methods\n// ==========================================================================\n\ndefineExpose({\n formatJson,\n isValid,\n});\n</script>\n\n<template>\n <div class=\"json-editor\">\n <!-- Editor Container -->\n <div class=\"json-editor__container\">\n <!-- Line Numbers -->\n <div class=\"json-editor__lines\" aria-hidden=\"true\">\n <div\n v-for=\"lineNum in lineNumbers\"\n :key=\"lineNum\"\n class=\"json-editor__line-number\"\n >\n {{ lineNum }}\n </div>\n </div>\n\n <!-- Textarea -->\n <textarea\n :value=\"text\"\n :readonly=\"readonly\"\n :placeholder=\"placeholder\"\n :style=\"{ minHeight: `${minHeight}px` }\"\n class=\"json-editor__textarea\"\n spellcheck=\"false\"\n @input=\"handleInput\"\n @keydown=\"handleKeyDown\"\n />\n </div>\n\n <!-- Status Bar -->\n <div class=\"json-editor__status\">\n <div class=\"json-editor__status-left\">\n <!-- Validation Status -->\n <div v-if=\"isValid\" class=\"json-editor__valid\">\n <Check :size=\"14\" />\n <span>Valid JSON</span>\n </div>\n <div v-else-if=\"validationError\" class=\"json-editor__error\">\n <AlertCircle :size=\"14\" />\n <span>{{ validationError }}</span>\n </div>\n </div>\n\n <div class=\"json-editor__status-right\">\n <!-- Line Count -->\n <span class=\"json-editor__info\">{{ lineCount }} lines</span>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.json-editor {\n display: flex;\n flex-direction: column;\n background-color: var(--devtools-surface);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-md);\n overflow: hidden;\n}\n\n/* Editor Container */\n.json-editor__container {\n display: flex;\n overflow: auto;\n flex: 1;\n}\n\n/* Line Numbers */\n.json-editor__lines {\n display: flex;\n flex-direction: column;\n padding: var(--devtools-space-sm) var(--devtools-space-xs);\n background-color: var(--devtools-surface-elevated);\n border-right: 1px solid var(--devtools-border);\n user-select: none;\n flex-shrink: 0;\n}\n\n.json-editor__line-number {\n height: 1.5em;\n line-height: 1.5;\n text-align: right;\n font-family: var(--devtools-font-mono);\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n min-width: 2ch;\n padding-right: var(--devtools-space-xs);\n}\n\n/* Textarea */\n.json-editor__textarea {\n flex: 1;\n padding: var(--devtools-space-sm);\n background-color: var(--devtools-surface);\n color: var(--devtools-text);\n border: none;\n outline: none;\n resize: vertical;\n font-family: var(--devtools-font-mono);\n font-size: var(--font-size-0);\n line-height: 1.5;\n tab-size: 2;\n white-space: pre;\n overflow-wrap: normal;\n overflow-x: auto;\n}\n\n.json-editor__textarea::placeholder {\n color: var(--devtools-text-muted);\n opacity: 0.6;\n}\n\n.json-editor__textarea:focus {\n outline: 2px solid var(--devtools-primary);\n outline-offset: -2px;\n}\n\n.json-editor__textarea[readonly] {\n background-color: var(--devtools-surface-elevated);\n cursor: not-allowed;\n opacity: 0.7;\n}\n\n/* Status Bar */\n.json-editor__status {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-xs) var(--devtools-space-sm);\n background-color: var(--devtools-surface-elevated);\n border-top: 1px solid var(--devtools-border);\n font-size: var(--font-size-0);\n}\n\n.json-editor__status-left,\n.json-editor__status-right {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n}\n\n/* Validation Indicators */\n.json-editor__valid {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n color: var(--devtools-success);\n}\n\n.json-editor__error {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-xs);\n color: var(--devtools-error);\n}\n\n.json-editor__info {\n color: var(--devtools-text-muted);\n}\n\n/* Dark mode adjustments */\n@media (prefers-color-scheme: dark) {\n .json-editor__textarea {\n color: #e2e8f0;\n }\n\n .json-editor__textarea::placeholder {\n color: #64748b;\n }\n}\n</style>\n","/**\n * Notifications Composable\n *\n * What: Provides consistent user feedback mechanism for the DevTools\n * How: Manages toast notifications and confirmation modals\n * Why: Replaces inconsistent alert()/confirm()/console.log() usage\n *\n * Features:\n * - Toast notifications for success/error/info messages\n * - Confirmation modals with custom messages\n * - Auto-dismiss for toast notifications\n * - Centralized state management\n */\n\nimport { reactive, ref } from 'vue';\n\n/**\n * Toast notification types\n */\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\n/**\n * Toast notification\n */\nexport interface Toast {\n id: string;\n type: ToastType;\n message: string;\n duration: number;\n timestamp: number;\n}\n\n/**\n * Confirmation dialog state\n */\nexport interface ConfirmDialog {\n visible: boolean;\n title: string;\n message: string;\n confirmText: string;\n cancelText: string;\n onConfirm: (() => void) | null;\n onCancel: (() => void) | null;\n}\n\n// ==========================================================================\n// Global State\n// ==========================================================================\n\nconst toasts = ref<Toast[]>([]);\nconst confirmDialog = reactive<ConfirmDialog>({\n visible: false,\n title: '',\n message: '',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n onConfirm: null,\n onCancel: null,\n});\n\n// Track active timeout IDs to prevent orphaned timers\nconst timeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\n// Track pending confirm dialog promise resolver\nlet pendingResolve: ((value: boolean) => void) | null = null;\n\n// ==========================================================================\n// Helper Functions\n// ==========================================================================\n\nlet toastIdCounter = 0;\n\nfunction generateToastId(): string {\n return `toast-${Date.now()}-${toastIdCounter++}`;\n}\n\nfunction addToast(type: ToastType, message: string, duration = 3000): string {\n const id = generateToastId();\n const toast: Toast = {\n id,\n type,\n message,\n duration,\n timestamp: Date.now(),\n };\n\n toasts.value.push(toast);\n\n // Auto-dismiss\n if (duration > 0) {\n const timeoutId = setTimeout(() => {\n removeToast(id);\n timeouts.delete(id);\n }, duration);\n timeouts.set(id, timeoutId);\n }\n\n return id;\n}\n\nfunction removeToast(id: string): void {\n // Clear the timeout if it exists\n const timeoutId = timeouts.get(id);\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeouts.delete(id);\n }\n\n // Remove the toast from the array\n const index = toasts.value.findIndex((t) => t.id === id);\n if (index !== -1) {\n toasts.value.splice(index, 1);\n }\n}\n\n// ==========================================================================\n// Composable\n// ==========================================================================\n\n/**\n * Notifications composable\n *\n * Provides methods for showing toast notifications and confirmation dialogs\n */\nexport function useNotifications() {\n /**\n * Show a success toast notification\n */\n function success(message: string, duration?: number): string {\n return addToast('success', message, duration);\n }\n\n /**\n * Show an error toast notification\n */\n function error(message: string, duration?: number): string {\n return addToast('error', message, duration);\n }\n\n /**\n * Show an info toast notification\n */\n function info(message: string, duration?: number): string {\n return addToast('info', message, duration);\n }\n\n /**\n * Show a warning toast notification\n */\n function warning(message: string, duration?: number): string {\n return addToast('warning', message, duration);\n }\n\n /**\n * Show a confirmation dialog\n *\n * @returns Promise that resolves to true if confirmed, false if cancelled\n */\n function confirm(\n message: string,\n options?: {\n title?: string;\n confirmText?: string;\n cancelText?: string;\n },\n ): Promise<boolean> {\n return new Promise((resolve) => {\n // Resolve any pending dialog with false (cancelled) before opening new one\n if (pendingResolve) {\n pendingResolve(false);\n pendingResolve = null;\n }\n\n // Store the new resolve reference\n pendingResolve = resolve;\n\n confirmDialog.visible = true;\n confirmDialog.title = options?.title || 'Confirm';\n confirmDialog.message = message;\n confirmDialog.confirmText = options?.confirmText || 'Confirm';\n confirmDialog.cancelText = options?.cancelText || 'Cancel';\n\n confirmDialog.onConfirm = () => {\n confirmDialog.visible = false;\n if (pendingResolve) {\n pendingResolve(true);\n pendingResolve = null;\n }\n };\n\n confirmDialog.onCancel = () => {\n confirmDialog.visible = false;\n if (pendingResolve) {\n pendingResolve(false);\n pendingResolve = null;\n }\n };\n });\n }\n\n /**\n * Close the confirmation dialog\n */\n function closeConfirm(): void {\n confirmDialog.visible = false;\n if (pendingResolve) {\n pendingResolve(false);\n pendingResolve = null;\n }\n }\n\n /**\n * Manually dismiss a toast by ID\n */\n function dismiss(id: string): void {\n removeToast(id);\n }\n\n /**\n * Clear all toasts\n */\n function clearAll(): void {\n // Clear all active timeouts\n for (const timeoutId of timeouts.values()) {\n clearTimeout(timeoutId);\n }\n timeouts.clear();\n toasts.value = [];\n }\n\n return {\n // State\n toasts,\n confirmDialog,\n\n // Toast methods\n success,\n error,\n info,\n warning,\n dismiss,\n clearAll,\n\n // Confirm methods\n confirm,\n closeConfirm,\n };\n}\n","<!--\n ModelsPage.vue - Store Data Editor Page\n\n What: Displays and allows editing of in-memory store data organized by schema\n How: Fetches store data from models store and displays in an editable JSON view\n Why: Allows developers to inspect and modify mock data during development\n\n Features:\n - Schema listing sidebar with item counts\n - JSON editor with syntax validation\n - Save, discard, clear, and reseed actions\n - Real-time updates via WebSocket\n - Dirty state tracking\n-->\n<script setup lang=\"ts\">\nimport { Database, RefreshCw, Save, Trash2, X } from 'lucide-vue-next';\nimport { nextTick, onMounted, ref, watch } from 'vue';\n// biome-ignore lint/style/useImportType: Component needs to be available at runtime\nimport JsonEditor from '@/components/JsonEditor.vue';\nimport { useNotifications } from '@/composables/useNotifications';\nimport { useWebSocket } from '@/composables/useWebSocket';\nimport { useModelsStore } from '@/stores';\n\n// ==========================================================================\n// Store & Composables\n// ==========================================================================\n\nconst modelsStore = useModelsStore();\nconst { send, on, connected } = useWebSocket();\nconst { success, error: notifyError, confirm } = useNotifications();\n\n// ==========================================================================\n// State\n// ==========================================================================\n\n/** Reference to the JSON editor component */\nconst jsonEditorRef = ref<InstanceType<typeof JsonEditor> | null>(null);\n\n/** Confirmation dialog state */\nconst showClearConfirm = ref(false);\n\n// ==========================================================================\n// Lifecycle\n// ==========================================================================\n\nonMounted(async () => {\n // Load schemas on mount\n try {\n await modelsStore.fetchSchemas();\n\n // Select first schema if available\n if (modelsStore.schemas.length > 0 && !modelsStore.selectedSchema) {\n await modelsStore.selectSchemaByName(modelsStore.schemas[0].name);\n }\n } catch (err) {\n // Error is already set in the store, but ensure it's visible\n if (!modelsStore.error) {\n modelsStore.error = err instanceof Error ? err.message : 'Failed to load schemas';\n }\n }\n});\n\n// ==========================================================================\n// WebSocket Event Handlers\n// ==========================================================================\n\n// Handle store updates from WebSocket\non('store:updated', (data) => {\n // Validate payload structure\n const payload = data as any;\n if (\n typeof data !== 'object' ||\n data === null ||\n typeof payload.schema !== 'string' ||\n typeof payload.action !== 'string' ||\n typeof payload.count !== 'number'\n ) {\n console.warn('[ModelsPage] Invalid store:updated payload:', data);\n return;\n }\n\n modelsStore.handleStoreUpdate(data as { schema: string; action: string; count: number });\n});\n\n// Handle reseed completion\non('reseeded', (data) => {\n // Validate payload structure\n const payload = data as any;\n if (\n typeof data !== 'object' ||\n data === null ||\n typeof payload.success !== 'boolean' ||\n !Array.isArray(payload.schemas)\n ) {\n console.warn('[ModelsPage] Invalid reseeded payload:', data);\n return;\n }\n\n modelsStore.handleReseedComplete(data as { success: boolean; schemas: string[] });\n});\n\n// ==========================================================================\n// Watchers\n// ==========================================================================\n\n// Format JSON when schema changes\nwatch(\n () => modelsStore.selectedSchema,\n async () => {\n if (jsonEditorRef.value && modelsStore.currentItems.length > 0) {\n // Wait for next tick to ensure editor is updated\n await nextTick();\n jsonEditorRef.value?.formatJson();\n }\n },\n);\n\n// ==========================================================================\n// Actions\n// ==========================================================================\n\n/**\n * Select a schema and fetch its data\n */\nasync function selectSchema(schemaName: string): Promise<void> {\n if (modelsStore.isDirty) {\n const confirmed = await confirm(\n 'You have unsaved changes. Are you sure you want to switch schemas?',\n {\n title: 'Unsaved Changes',\n confirmText: 'Switch Schema',\n cancelText: 'Cancel',\n },\n );\n if (!confirmed) return;\n }\n\n await modelsStore.selectSchemaByName(schemaName);\n}\n\n/**\n * Save the current items to the server\n */\nasync function saveItems(): Promise<void> {\n if (!jsonEditorRef.value?.isValid) {\n notifyError('Cannot save invalid JSON. Please fix the errors first.');\n return;\n }\n\n const saved = await modelsStore.saveItems();\n if (saved) {\n success('Items saved successfully');\n } else {\n // Show error to user if save failed\n const errorMessage = modelsStore.error || 'Failed to save items';\n notifyError(errorMessage);\n }\n}\n\n/**\n * Discard changes and revert to original\n */\nasync function discardChanges(): Promise<void> {\n if (!modelsStore.isDirty) return;\n\n const confirmed = await confirm('Discard all changes and revert to saved data?', {\n title: 'Discard Changes',\n confirmText: 'Discard',\n cancelText: 'Cancel',\n });\n if (confirmed) {\n modelsStore.discardChanges();\n success('Changes discarded');\n }\n}\n\n/**\n * Clear all items for the current schema\n */\nasync function clearSchema(): Promise<void> {\n showClearConfirm.value = false;\n\n try {\n const cleared = await modelsStore.clearSchema();\n if (cleared) {\n success('Schema cleared successfully');\n } else {\n // Show error to user if clear failed\n const errorMessage = modelsStore.error || 'Failed to clear schema';\n notifyError(errorMessage);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to clear schema';\n notifyError(errorMessage);\n }\n}\n\n/**\n * Trigger reseed via WebSocket\n */\nasync function reseedAll(): Promise<void> {\n if (!connected.value) {\n notifyError('WebSocket not connected. Cannot trigger reseed.');\n return;\n }\n\n const confirmed = await confirm(\n 'This will regenerate all seed data and replace existing items. Continue?',\n {\n title: 'Reseed All Schemas',\n confirmText: 'Reseed',\n cancelText: 'Cancel',\n },\n );\n if (!confirmed) return;\n\n send({ type: 'reseed' });\n success('Reseed command sent');\n}\n\n/**\n * Handle JSON editor value updates\n */\nfunction onJsonEditorUpdate(value: unknown): void {\n modelsStore.updateItems(value);\n}\n</script>\n\n<template>\n <div class=\"models-page\">\n <!-- Schema Sidebar -->\n <aside class=\"models-sidebar\">\n <div class=\"models-sidebar__header\">\n <Database :size=\"18\" />\n <span>Schemas</span>\n <span class=\"models-sidebar__badge\">{{ modelsStore.schemaCount }}</span>\n </div>\n\n <!-- Loading State -->\n <div v-if=\"modelsStore.loading && modelsStore.schemas.length === 0\" class=\"models-sidebar__loading\">\n <div class=\"spinner\" />\n <span>Loading...</span>\n </div>\n\n <!-- Schema List -->\n <div v-else class=\"models-sidebar__list\">\n <button\n v-for=\"schema in modelsStore.schemas\"\n :key=\"schema.name\"\n :class=\"[\n 'models-sidebar__item',\n { 'models-sidebar__item--active': modelsStore.selectedSchema === schema.name },\n ]\"\n @click=\"selectSchema(schema.name)\"\n >\n <span class=\"models-sidebar__name\">{{ schema.name }}</span>\n <span class=\"models-sidebar__count\">{{ schema.count }}</span>\n </button>\n </div>\n\n <!-- Footer Stats -->\n <div class=\"models-sidebar__footer\">\n <div class=\"models-sidebar__stat\">\n <span class=\"text-muted\">Total Items:</span>\n <span class=\"font-mono\">{{ modelsStore.totalItems }}</span>\n </div>\n </div>\n </aside>\n\n <!-- Data Panel -->\n <main class=\"models-content\">\n <template v-if=\"modelsStore.selectedSchema\">\n <!-- Toolbar -->\n <div class=\"models-toolbar\">\n <div class=\"models-toolbar__title\">\n <span class=\"font-mono\">{{ modelsStore.selectedSchema }}</span>\n <span class=\"text-muted\">({{ modelsStore.currentItems.length }} items)</span>\n <span\n v-if=\"modelsStore.isDirty\"\n class=\"models-toolbar__badge models-toolbar__badge--warning\"\n >\n Unsaved\n </span>\n </div>\n\n <div class=\"models-toolbar__actions\">\n <!-- Discard Button -->\n <button\n v-if=\"modelsStore.isDirty\"\n class=\"btn btn--ghost\"\n title=\"Discard changes\"\n @click=\"discardChanges\"\n >\n <X :size=\"16\" />\n <span>Discard</span>\n </button>\n\n <!-- Save Button -->\n <button\n :disabled=\"!modelsStore.isDirty || modelsStore.loading\"\n class=\"btn btn--primary\"\n title=\"Save changes\"\n @click=\"saveItems\"\n >\n <Save :size=\"16\" />\n <span>Save</span>\n </button>\n\n <!-- Clear Button -->\n <button\n class=\"btn btn--danger\"\n title=\"Clear all items\"\n @click=\"showClearConfirm = true\"\n >\n <Trash2 :size=\"16\" />\n <span>Clear</span>\n </button>\n\n <!-- Reseed Button -->\n <button\n :disabled=\"!connected\"\n class=\"btn btn--secondary\"\n title=\"Reseed all schemas with generated data\"\n @click=\"reseedAll\"\n >\n <RefreshCw :size=\"16\" />\n <span>Reseed All</span>\n </button>\n </div>\n </div>\n\n <!-- Error Display -->\n <div v-if=\"modelsStore.error\" class=\"models-error\">\n <span>⚠️ {{ modelsStore.error }}</span>\n </div>\n\n <!-- JSON Editor -->\n <div class=\"models-editor\">\n <JsonEditor\n ref=\"jsonEditorRef\"\n :model-value=\"modelsStore.currentItems\"\n :readonly=\"modelsStore.loading\"\n :min-height=\"400\"\n @update:model-value=\"onJsonEditorUpdate\"\n />\n </div>\n\n <!-- Loading Overlay -->\n <div v-if=\"modelsStore.loading\" class=\"models-loading-overlay\">\n <div class=\"spinner\" />\n <span>Loading...</span>\n </div>\n </template>\n\n <!-- Empty State or Error -->\n <div v-else class=\"empty-state\">\n <!-- Show error if present and no schema selected -->\n <div v-if=\"modelsStore.error\" class=\"models-error\">\n <span>⚠️ {{ modelsStore.error }}</span>\n </div>\n <template v-else>\n <Database :size=\"48\" class=\"empty-state__icon\" />\n <h3 class=\"empty-state__title\">Select a schema</h3>\n <p class=\"empty-state__description\">\n Choose a schema from the sidebar to view and edit its data.\n </p>\n </template>\n </div>\n </main>\n\n <!-- Clear Confirmation Modal -->\n <Teleport to=\"body\">\n <div v-if=\"showClearConfirm\" class=\"modal-overlay\" @click=\"showClearConfirm = false\">\n <div class=\"modal\" @click.stop>\n <div class=\"modal__header\">\n <h3>Clear Schema Data</h3>\n </div>\n <div class=\"modal__body\">\n <p>\n Are you sure you want to clear all items for\n <strong>{{ modelsStore.selectedSchema }}</strong>?\n </p>\n <p class=\"text-muted\">This action cannot be undone.</p>\n </div>\n <div class=\"modal__footer\">\n <button class=\"btn btn--ghost\" @click=\"showClearConfirm = false\">\n Cancel\n </button>\n <button class=\"btn btn--danger\" @click=\"clearSchema\">\n Clear Schema\n </button>\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style scoped>\n.models-page {\n display: grid;\n grid-template-columns: 240px 1fr;\n height: 100%;\n overflow: hidden;\n}\n\n/* Sidebar */\n.models-sidebar {\n display: flex;\n flex-direction: column;\n background-color: var(--devtools-surface);\n border-right: 1px solid var(--devtools-border);\n overflow: hidden;\n}\n\n.models-sidebar__header {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n padding: var(--devtools-space-md);\n font-weight: var(--font-weight-6);\n font-size: var(--font-size-1);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.models-sidebar__badge {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 var(--devtools-space-xs);\n background-color: var(--devtools-primary);\n color: white;\n border-radius: var(--devtools-radius-sm);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-6);\n}\n\n.models-sidebar__loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-xl);\n color: var(--devtools-text-muted);\n}\n\n.models-sidebar__list {\n flex: 1;\n overflow-y: auto;\n padding: var(--devtools-space-xs);\n}\n\n.models-sidebar__item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--devtools-space-sm) var(--devtools-space-md);\n background: none;\n border: none;\n border-radius: var(--devtools-radius-sm);\n color: var(--devtools-text);\n font-family: var(--devtools-font-sans);\n font-size: var(--font-size-1);\n cursor: pointer;\n transition: background-color var(--devtools-transition-fast);\n}\n\n.models-sidebar__item:hover {\n background-color: var(--devtools-surface-elevated);\n}\n\n.models-sidebar__item--active {\n background-color: color-mix(in srgb, var(--devtools-primary) 15%, transparent);\n color: var(--devtools-primary);\n}\n\n.models-sidebar__name {\n font-family: var(--devtools-font-mono);\n}\n\n.models-sidebar__count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 var(--devtools-space-xs);\n background-color: var(--devtools-surface-elevated);\n border-radius: var(--devtools-radius-sm);\n font-size: var(--font-size-0);\n color: var(--devtools-text-muted);\n}\n\n.models-sidebar__footer {\n padding: var(--devtools-space-md);\n border-top: 1px solid var(--devtools-border);\n}\n\n.models-sidebar__stat {\n display: flex;\n justify-content: space-between;\n font-size: var(--font-size-0);\n}\n\n/* Content Area */\n.models-content {\n position: relative;\n display: flex;\n flex-direction: column;\n padding: var(--devtools-space-md);\n overflow: hidden;\n}\n\n/* Toolbar */\n.models-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--devtools-space-md);\n margin-bottom: var(--devtools-space-md);\n}\n\n.models-toolbar__title {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n font-size: var(--font-size-2);\n font-weight: var(--font-weight-6);\n}\n\n.models-toolbar__badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: var(--devtools-radius-sm);\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n}\n\n.models-toolbar__badge--warning {\n background-color: color-mix(in srgb, #f59e0b 20%, transparent);\n color: #f59e0b;\n}\n\n.models-toolbar__actions {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n}\n\n/* Error Display */\n.models-error {\n padding: var(--devtools-space-sm) var(--devtools-space-md);\n margin-bottom: var(--devtools-space-md);\n background-color: color-mix(in srgb, var(--devtools-error) 10%, transparent);\n border: 1px solid var(--devtools-error);\n border-radius: var(--devtools-radius-sm);\n color: var(--devtools-error);\n font-size: var(--font-size-0);\n}\n\n/* Editor */\n.models-editor {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* Loading Overlay */\n.models-loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--devtools-space-md);\n background-color: color-mix(in srgb, var(--devtools-bg) 80%, transparent);\n backdrop-filter: blur(2px);\n z-index: 10;\n}\n\n/* Modal */\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n}\n\n.modal {\n min-width: 400px;\n background-color: var(--devtools-surface);\n border: 1px solid var(--devtools-border);\n border-radius: var(--devtools-radius-md);\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);\n}\n\n.modal__header {\n padding: var(--devtools-space-md);\n border-bottom: 1px solid var(--devtools-border);\n}\n\n.modal__header h3 {\n margin: 0;\n font-size: var(--font-size-2);\n font-weight: var(--font-weight-6);\n}\n\n.modal__body {\n padding: var(--devtools-space-md);\n}\n\n.modal__body p {\n margin: 0 0 var(--devtools-space-sm) 0;\n}\n\n.modal__body p:last-child {\n margin-bottom: 0;\n}\n\n.modal__footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--devtools-space-sm);\n padding: var(--devtools-space-md);\n border-top: 1px solid var(--devtools-border);\n}\n\n/* Spinner */\n.spinner {\n width: 24px;\n height: 24px;\n border: 3px solid var(--devtools-border);\n border-top-color: var(--devtools-primary);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n"],"names":["CircleAlert","createLucideIcon","RefreshCw","Save","safeClone","value","toRaw","useModelsStore","defineStore","schemas","ref","selectedSchema","currentItems","originalItems","loading","error","currentSchema","computed","s","isDirtyFlag","isDirty","schemaCount","totalItems","sum","schema","fetchSchemas","response","data","err","selectSchemaByName","schemaName","fetchSchemaData","items","schemaIndex","updateItems","saveItems","errorData","result","clearSchema","discardChanges","refresh","reset","handleStoreUpdate","handleReseedComplete","props","__props","emit","__emit","text","validationError","isValid","lineCount","lineNumbers","_","i","initializeText","watch","currentParsed","handleInput","event","target","validateAndEmit","parsed","match","position","lines","line","column","formatJson","handleKeyDown","start","end","newText","__expose","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_Fragment","_renderList","lineNum","_hoisted_5","_hoisted_6","_hoisted_7","_createVNode","_unref","Check","_cache","_hoisted_8","AlertCircle","_hoisted_9","_hoisted_10","_toDisplayString","toasts","confirmDialog","reactive","timeouts","pendingResolve","toastIdCounter","generateToastId","addToast","type","message","duration","id","toast","timeoutId","removeToast","index","t","useNotifications","success","info","warning","confirm","options","resolve","closeConfirm","dismiss","clearAll","modelsStore","send","on","connected","useWebSocket","notifyError","jsonEditorRef","showClearConfirm","onMounted","payload","nextTick","selectSchema","errorMessage","reseedAll","onJsonEditorUpdate","Database","_hoisted_4","_normalizeClass","$event","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","X","Trash2","_hoisted_22","_hoisted_23","JsonEditor","_hoisted_24","_hoisted_25","_hoisted_26","_createBlock","_Teleport","_hoisted_27","_hoisted_28"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{g as q,C as B,a as Z,S as T,F as Y,b as tt}from"./format-B1udViy3.js";import{c as $,_ as F,R as et}from"./index-GQ9qRqEi.js";import{d as E,b as o,f as l,e as t,u as e,n as f,t as c,s as u,g as H,v as x,F as b,r as C,o as n,x as st,i as G,j as P,y as nt,z as ot,A as it,B as at,C as V}from"./vue-vendor-CtA47il-.js";import{u as dt}from"./useWebSocket-C2ttWF5T.js";import{u as lt}from"./registry-Z11QUkpV.js";import{X as j}from"./x-zxrccEon.js";const R=$("code",[["path",{d:"m16 18 6-6-6-6",key:"eg8j8"}],["path",{d:"m8 6-6 6 6 6",key:"ppft3o"}]]);const M=$("file-json",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1",key:"1oajmo"}],["path",{d:"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1",key:"mpwhp6"}]]);const rt=$("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);const ct=$("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);const w=$("sprout",[["path",{d:"M7 20h10",key:"e6iznv"}],["path",{d:"M10 20c5.5-2.5.8-6.4 3-10",key:"161w41"}],["path",{d:"M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z",key:"9gtqwd"}],["path",{d:"M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z",key:"bkxnd2"}]]);const ut=$("tag",[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]]),pt={class:"endpoint-detail"},_t={key:0,class:"endpoint-detail__empty"},ht={key:1,class:"endpoint-detail__content"},yt={class:"endpoint-detail__header"},mt={class:"endpoint-detail__path font-mono"},gt={class:"endpoint-detail__status"},vt={key:0,class:"endpoint-detail__status-item endpoint-detail__status-item--handler"},ft={key:1,class:"endpoint-detail__status-item endpoint-detail__status-item--seed"},kt={key:2,class:"endpoint-detail__status-item endpoint-detail__status-item--security"},bt={key:3,class:"endpoint-detail__status-item endpoint-detail__status-item--auto"},$t={class:"endpoint-detail__sections"},St={class:"endpoint-detail__section"},Ct={class:"endpoint-detail__section-content font-mono"},zt={key:0,class:"endpoint-detail__section"},xt={class:"endpoint-detail__section-title"},Mt={class:"endpoint-detail__tags"},Ht={key:1,class:"endpoint-detail__section"},Ft={class:"endpoint-detail__section-content"},Et={key:2,class:"endpoint-detail__section"},Rt={class:"endpoint-detail__section-content endpoint-detail__description"},wt={key:3,class:"endpoint-detail__section"},It={class:"endpoint-detail__section-title"},Dt={class:"endpoint-detail__section-content font-mono"},Lt={key:4,class:"endpoint-detail__section"},Nt={class:"endpoint-detail__section-title"},At={class:"endpoint-detail__security"},Tt={class:"endpoint-detail__security-name font-mono"},Vt={class:"endpoint-detail__security-scopes text-muted"},jt=E({__name:"EndpointDetail",props:{endpoint:{}},setup(d){const s=d,k=H(()=>s.endpoint?.security&&s.endpoint.security.length>0),m=H(()=>s.endpoint?.security?s.endpoint.security.map(y=>({name:y.name,scopes:y.scopes.length>0?y.scopes.join(", "):"No scopes"})):[]);return(y,i)=>(n(),o("div",pt,[d.endpoint?(n(),o("div",ht,[t("header",yt,[t("span",{class:f(["method-badge","method-badge--large",`method-badge--${d.endpoint.method}`])},c(e(q)(d.endpoint.method)),3),t("h2",mt,c(d.endpoint.path),1)]),t("div",gt,[d.endpoint.hasHandler?(n(),o("div",vt,[l(e(R),{size:14}),i[2]||(i[2]=t("span",null,"Has custom handler",-1))])):u("",!0),d.endpoint.hasSeed?(n(),o("div",ft,[l(e(w),{size:14}),i[3]||(i[3]=t("span",null,"Has seed data",-1))])):u("",!0),k.value?(n(),o("div",kt,[l(e(rt),{size:14}),i[4]||(i[4]=t("span",null,"Requires authentication",-1))])):u("",!0),!d.endpoint.hasHandler&&!d.endpoint.hasSeed?(n(),o("div",bt,[l(e(M),{size:14}),i[5]||(i[5]=t("span",null,"Auto-generated response",-1))])):u("",!0)]),t("div",$t,[t("section",St,[i[6]||(i[6]=t("h3",{class:"endpoint-detail__section-title"},"Operation",-1)),t("p",Ct,c(d.endpoint.operationId),1)]),d.endpoint.tags.length>0?(n(),o("section",zt,[t("h3",xt,[l(e(ut),{size:14}),i[7]||(i[7]=x(" Tags ",-1))]),t("div",Mt,[(n(!0),o(b,null,C(d.endpoint.tags,_=>(n(),o("span",{key:_,class:"endpoint-detail__tag"},c(_),1))),128))])])):u("",!0),d.endpoint.summary?(n(),o("section",Ht,[i[8]||(i[8]=t("h3",{class:"endpoint-detail__section-title"},"Summary",-1)),t("p",Ft,c(d.endpoint.summary),1)])):u("",!0),d.endpoint.description?(n(),o("section",Et,[i[9]||(i[9]=t("h3",{class:"endpoint-detail__section-title"},"Description",-1)),t("p",Rt,c(d.endpoint.description),1)])):u("",!0),d.endpoint.responseSchema?(n(),o("section",wt,[t("h3",It,[l(e(M),{size:14}),i[10]||(i[10]=x(" Response Schema ",-1))]),t("p",Dt,c(d.endpoint.responseSchema),1)])):u("",!0),k.value?(n(),o("section",Lt,[t("h3",Nt,[l(e(ct),{size:14}),i[11]||(i[11]=x(" Security ",-1))]),t("div",At,[(n(!0),o(b,null,C(m.value,_=>(n(),o("div",{key:_.name,class:"endpoint-detail__security-item"},[t("span",Tt,c(_.name),1),t("span",Vt,c(_.scopes),1)]))),128))])])):u("",!0)])])):(n(),o("div",_t,[l(e(M),{size:48,class:"endpoint-detail__empty-icon"}),i[0]||(i[0]=t("h3",{class:"endpoint-detail__empty-title"},"No endpoint selected",-1)),i[1]||(i[1]=t("p",{class:"endpoint-detail__empty-text text-muted"}," Select an endpoint from the list to view its details ",-1))]))]))}}),qt=F(jt,[["__scopeId","data-v-c66a0f52"]]),Bt={class:"endpoint-list"},Gt={key:0,class:"endpoint-list__empty"},Pt={key:1,class:"endpoint-list__groups"},Qt=["aria-expanded","aria-controls","onClick"],Kt={class:"endpoint-group__tag"},Ut={class:"endpoint-group__count text-muted"},Ot=["id","aria-label"],Jt=["aria-selected","onClick"],Wt={class:"endpoint-item__path font-mono"},Xt={class:"endpoint-item__indicators"},Zt={key:0,class:"endpoint-item__indicator endpoint-item__indicator--handler",title:"Has custom handler"},Yt={key:1,class:"endpoint-item__indicator endpoint-item__indicator--seed",title:"Has seed data"},te=E({__name:"EndpointList",props:{groups:{},selectedKey:{}},emits:["select","toggle-group"],setup(d,{emit:s}){const k=d,m=s;function y(g){m("select",g.key)}function i(g){m("toggle-group",g)}function _(g){return k.selectedKey===g.key}return(g,v)=>(n(),o("div",Bt,[d.groups.length===0?(n(),o("div",Gt,[...v[0]||(v[0]=[t("p",{class:"text-muted"},"No endpoints found",-1)])])):(n(),o("div",Pt,[(n(!0),o(b,null,C(d.groups,p=>(n(),o("div",{key:p.tag,class:"endpoint-group"},[t("button",{type:"button",class:"endpoint-group__header","aria-expanded":p.isExpanded,"aria-controls":`group-${p.tag}`,onClick:h=>i(p.tag)},[(n(),G(P(p.isExpanded?e(B):e(Z)),{size:16,class:"endpoint-group__chevron"})),t("span",Kt,c(p.tag),1),t("span",Ut," ("+c(p.endpoints.length)+") ",1)],8,Qt),st(t("div",{id:`group-${p.tag}`,class:"endpoint-group__items",role:"group","aria-label":`${p.tag} endpoints`},[(n(!0),o(b,null,C(p.endpoints,h=>(n(),o("button",{key:h.key,type:"button",class:f(["endpoint-item",{"endpoint-item--selected":_(h)}]),"aria-selected":_(h),onClick:I=>y(h)},[t("span",{class:f(["method-badge",`method-badge--${h.method}`])},c(e(q)(h.method)),3),t("span",Wt,c(h.path),1),t("div",Xt,[h.hasHandler?(n(),o("span",Zt,[l(e(R),{size:12})])):u("",!0),h.hasSeed?(n(),o("span",Yt,[l(e(w),{size:12})])):u("",!0)])],10,Jt))),128))],8,Ot),[[nt,p.isExpanded]])]))),128))]))]))}}),ee=F(te,[["__scopeId","data-v-554ffe63"]]),se={class:"routes-page"},ne={class:"routes-toolbar"},oe={class:"routes-search"},ie=["value"],ae=["aria-expanded"],de={key:0,class:"routes-filter-toggle__badge"},le={class:"routes-stats"},re={class:"routes-stats__item"},ce={class:"routes-stats__item"},ue={key:0,class:"routes-filters"},pe={class:"routes-filters__section"},_e={class:"routes-filters__methods"},he=["onClick"],ye={class:"routes-filters__section"},me={class:"routes-filters__status"},ge={key:0,class:"routes-filters__actions"},ve={class:"routes-content"},fe={key:0,class:"routes-loading"},ke={key:1,class:"routes-error"},be={class:"routes-error__message"},$e={key:2,class:"routes-empty empty-state"},Se={key:3,class:"routes-empty empty-state"},Ce={class:"routes-list-panel"},ze={class:"routes-detail-panel"},xe=E({__name:"RoutesPage",setup(d){const s=lt(),{send:k,on:m,connected:y}=dt(),i=V(!1),_=V(null),g=["get","post","put","patch","delete","options","head","trace"];function v(){y.value&&(s.setLoading(!0),k({type:"get:registry"}))}function p(r){s.setRegistryData(r),s.setLoading(!1)}function h(r){s.selectEndpoint(r)}function I(r){s.toggleGroup(r)}function Q(r){const a=r.target;s.setSearchQuery(a.value)}function K(){s.setSearchQuery(""),_.value?.focus()}function U(r){s.toggleMethodFilter(r)}function O(r){return s.filter.methods.includes(r)}function J(){const r=s.filter.hasHandler;s.setHandlerFilter(r===!0?null:!0)}function W(){const r=s.filter.hasSeed;s.setSeedFilter(r===!0?null:!0)}function D(){s.clearFilters()}function X(){i.value=!i.value}const z=H(()=>s.hasActiveFilters());let L=null,N=null,A=null;return ot(()=>{L=m("registry",p),N=m("handlers:updated",()=>v()),A=m("seeds:updated",()=>v()),y.value&&v()}),it(()=>{L?.(),N?.(),A?.()}),at(y,r=>{r&&v()}),(r,a)=>(n(),o("div",se,[t("div",ne,[t("div",oe,[l(e(T),{size:16,class:"routes-search__icon"}),t("input",{ref_key:"searchInputRef",ref:_,type:"text",class:"routes-search__input input",placeholder:"Search endpoints...",value:e(s).searchQuery,onInput:Q},null,40,ie),e(s).searchQuery?(n(),o("button",{key:0,type:"button",class:"routes-search__clear btn btn--ghost btn--icon",title:"Clear search",onClick:K},[l(e(j),{size:14})])):u("",!0)]),t("button",{type:"button",class:f(["routes-filter-toggle btn btn--secondary",{"routes-filter-toggle--active":z.value}]),"aria-expanded":i.value,onClick:X},[l(e(Y),{size:16}),a[0]||(a[0]=t("span",null,"Filters",-1)),z.value?(n(),o("span",de,c(e(s).filter.methods.length+(e(s).filter.hasHandler?1:0)+(e(s).filter.hasSeed?1:0)),1)):u("",!0),(n(),G(P(i.value?e(tt):e(B)),{size:14}))],10,ae),t("div",le,[t("span",re,c(e(s).filteredEndpoints.length)+" endpoints ",1),a[1]||(a[1]=t("span",{class:"routes-stats__separator"},"|",-1)),t("span",ce,c(e(s).allTags.length)+" tags ",1)])]),i.value?(n(),o("div",ue,[t("div",pe,[a[2]||(a[2]=t("h4",{class:"routes-filters__title"},"Methods",-1)),t("div",_e,[(n(),o(b,null,C(g,S=>t("button",{key:S,type:"button",class:f(["method-badge",`method-badge--${S}`,{"method-badge--inactive":!O(S)&&e(s).filter.methods.length>0}]),onClick:Me=>U(S)},c(S.toUpperCase()),11,he)),64))])]),t("div",ye,[a[5]||(a[5]=t("h4",{class:"routes-filters__title"},"Status",-1)),t("div",me,[t("button",{type:"button",class:f(["routes-filters__status-btn",{"routes-filters__status-btn--active":e(s).filter.hasHandler}]),onClick:J},[l(e(R),{size:14}),a[3]||(a[3]=t("span",null,"Has Handler",-1))],2),t("button",{type:"button",class:f(["routes-filters__status-btn",{"routes-filters__status-btn--active":e(s).filter.hasSeed}]),onClick:W},[l(e(w),{size:14}),a[4]||(a[4]=t("span",null,"Has Seed",-1))],2)])]),z.value?(n(),o("div",ge,[t("button",{type:"button",class:"btn btn--ghost",onClick:D},[l(e(j),{size:14}),a[6]||(a[6]=x(" Clear all filters ",-1))])])):u("",!0)])):u("",!0),t("div",ve,[e(s).isLoading?(n(),o("div",fe,[...a[7]||(a[7]=[t("div",{class:"routes-loading__spinner"},null,-1),t("span",{class:"text-muted"},"Loading endpoints...",-1)])])):e(s).error?(n(),o("div",ke,[t("p",be,c(e(s).error),1),t("button",{type:"button",class:"btn btn--primary",onClick:v}," Retry ")])):e(s).endpoints.length===0?(n(),o("div",$e,[l(e(et),{size:48,class:"empty-state__icon"}),a[8]||(a[8]=t("h3",{class:"empty-state__title"},"No endpoints found",-1)),a[9]||(a[9]=t("p",{class:"empty-state__description"}," No API endpoints are available. Make sure your OpenAPI spec is loaded. ",-1))])):e(s).filteredEndpoints.length===0?(n(),o("div",Se,[l(e(T),{size:48,class:"empty-state__icon"}),a[10]||(a[10]=t("h3",{class:"empty-state__title"},"No matching endpoints",-1)),a[11]||(a[11]=t("p",{class:"empty-state__description"}," Try adjusting your search or filters. ",-1)),z.value?(n(),o("button",{key:0,type:"button",class:"btn btn--secondary",onClick:D}," Clear filters ")):u("",!0)])):(n(),o(b,{key:4},[t("div",Ce,[l(ee,{groups:e(s).groupedEndpoints,"selected-key":e(s).selectedEndpointKey,onSelect:h,onToggleGroup:I},null,8,["groups","selected-key"])]),t("div",ze,[l(qt,{endpoint:e(s).selectedEndpoint},null,8,["endpoint"])])],64))])]))}}),De=F(xe,[["__scopeId","data-v-bdd419e3"]]);export{De as default};
|
|
2
|
-
//# sourceMappingURL=RoutesPage-Bhnu6w5-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.simulator-page[data-v-e5fd28b0]{display:flex;flex-direction:column;gap:var(--devtools-space-lg);height:100%;padding:var(--devtools-space-md);overflow-y:auto}.simulator-form[data-v-e5fd28b0]{flex-shrink:0}.simulator-form__header[data-v-e5fd28b0]{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-e5fd28b0]{display:flex;flex-direction:column;gap:var(--devtools-space-md)}.simulator-form__row[data-v-e5fd28b0]{display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.simulator-form__row[data-v-e5fd28b0]:has(.simulator-form__method){flex-direction:row;gap:var(--devtools-space-sm)}.simulator-form__label[data-v-e5fd28b0]{font-size:var(--font-size-0);font-weight:var(--font-weight-5);color:var(--devtools-text)}.simulator-form__method[data-v-e5fd28b0]{width:100px;flex-shrink:0}.simulator-form__path[data-v-e5fd28b0]{flex:1}.simulator-presets[data-v-e5fd28b0]{display:flex;flex-wrap:wrap;gap:var(--devtools-space-xs)}.simulator-preset[data-v-e5fd28b0]{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-e5fd28b0]:hover{background-color:var(--devtools-border)}.simulator-preset--selected[data-v-e5fd28b0]{border-color:var(--devtools-primary);background-color:color-mix(in srgb,var(--devtools-primary) 15%,transparent)}.simulator-preset--delay[data-v-e5fd28b0]{color:var(--devtools-warning)}.simulator-preset--error[data-v-e5fd28b0]{color:var(--devtools-error)}.simulator-preset--empty[data-v-e5fd28b0]{color:var(--devtools-text-muted)}.simulator-preset__label[data-v-e5fd28b0]{color:var(--devtools-text)}.simulator-active[data-v-e5fd28b0]{flex:1;display:flex;flex-direction:column;min-height:0}.simulator-active__header[data-v-e5fd28b0]{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--devtools-space-md)}.simulator-active__title[data-v-e5fd28b0]{font-weight:var(--font-weight-6);font-size:var(--font-size-1)}.simulator-active__list[data-v-e5fd28b0]{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:var(--devtools-space-xs)}.simulator-simulation[data-v-e5fd28b0]{display:flex;align-items:center;gap:var(--devtools-space-md);padding:var(--devtools-space-sm) var(--devtools-space-md)}.simulator-simulation__info[data-v-e5fd28b0]{display:flex;align-items:center;gap:var(--devtools-space-sm);flex:1}.simulator-simulation__path[data-v-e5fd28b0]{font-size:var(--font-size-1);color:var(--devtools-text)}.simulator-simulation__preset[data-v-e5fd28b0]{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-e5fd28b0]{color:var(--devtools-warning)}.text-error[data-v-e5fd28b0]{color:var(--devtools-error)}.text-muted[data-v-e5fd28b0]{color:var(--devtools-text-muted)}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{D as X,g as f,C as y,d as Y,z as ee,A as te,b as d,e as l,f as R,u,s as x,x as D,L as B,F as $,r as U,t as b,M as se,n as q,i as O,j as G,o as r}from"./vue-vendor-CtA47il-.js";import{u as oe}from"./useWebSocket-C2ttWF5T.js";import{u as ae}from"./registry-Z11QUkpV.js";import{c as le,Z as W,C as Z,_ as ne}from"./index-GQ9qRqEi.js";import{T as j}from"./triangle-alert-CAGaIjAo.js";import{T as K}from"./trash-2-CDyKV6GB.js";const ie=le("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),V=[{id:"slow-network",label:"Slow Network",description:"3000ms delay (3G simulation)",type:"delay",status:200,delay:3e3},{id:"server-error",label:"Server Error",description:"Returns HTTP 500",type:"error",status:500,body:{error:"Internal Server Error",message:"Simulated server error"}},{id:"rate-limit",label:"Rate Limited",description:"Returns HTTP 429",type:"error",status:429,body:{error:"Too Many Requests",message:"Rate limit exceeded"}},{id:"not-found",label:"Not Found",description:"Returns HTTP 404",type:"error",status:404,body:{error:"Not Found",message:"Resource not found"}},{id:"request-timeout",label:"Request Timeout",description:"30000ms delay (simulates timeout)",type:"delay",status:200,delay:3e4},{id:"empty-response",label:"Empty Response",description:"Returns HTTP 200 with empty body",type:"empty",status:200,body:null},{id:"unauthorized",label:"Unauthorized",description:"Returns HTTP 401",type:"error",status:401,body:{error:"Unauthorized",message:"Authentication required"}}],re=X("simulation",()=>{const i=y(new Map),o=y(new Map),g=y(!1),c=y(null),h=f(()=>Array.from(i.value.values())),_=f(()=>i.value.size),T=f(()=>V),p=f(()=>i.value.size>0),S=f(()=>{const e={delay:[],error:[],empty:[]};for(const n of i.value.values()){const v=N(n);e[v].push(n)}return e});function N(e){const n=e.presetId?V.find(v=>v.id===e.presetId):null;return n?n.type:e.delay&&e.delay>0?"delay":e.body===null?"empty":"error"}function I(e){i.value.clear();for(const n of e)i.value.set(n.path,n);c.value=null}function C(e,n=!1){if(n){const v=i.value.get(e.path)||null;o.value.set(e.path,v)}i.value.set(e.path,e)}function P(e,n=!1){if(n){const v=i.value.get(e)||null;o.value.set(e,v)}return i.value.delete(e)}function E(){i.value.clear()}function F(e){return i.value.get(e)}function k(e){return i.value.has(e)}function M(e){return V.find(n=>n.id===e)}function H(e,n,v){const A=M(n);return A?{path:e,operationId:v,status:A.status,delay:A.delay,body:A.body,presetId:A.id}:(c.value=`Preset not found: ${n}`,null)}function L(e){g.value=e}function w(e){c.value=e,g.value=!1}function z(){c.value=null}function t(e){if(!o.value.has(e))return;const n=o.value.get(e);n==null?i.value.delete(e):i.value.set(e,n),o.value.delete(e)}function a(e){console.log("[Simulation] Added:",e.path)}function s(e){P(e.path),console.log("[Simulation] Removed:",e.path)}function m(e){E(),console.log("[Simulation] Cleared all:",e.count)}function J(e){e.success?(o.value.delete(e.path),console.log("[Simulation] Set successfully:",e.path)):(t(e.path),w(`Failed to set simulation for ${e.path}`)),L(!1)}function Q(e){e.success?(o.value.delete(e.path),console.log("[Simulation] Cleared successfully:",e.path)):(t(e.path),w(`Failed to clear simulation for ${e.path}`)),L(!1)}return{simulations:i,isLoading:g,error:c,activeSimulations:h,count:_,presets:T,hasActiveSimulations:p,simulationsByType:S,setSimulations:I,addSimulationLocal:C,removeSimulationLocal:P,clearSimulationsLocal:E,getSimulation:F,hasSimulation:k,getPreset:M,createSimulationFromPreset:H,setLoading:L,setError:w,clearError:z,rollbackSimulation:t,handleSimulationAdded:a,handleSimulationRemoved:s,handleSimulationsCleared:m,handleSimulationSet:J,handleSimulationCleared:Q}}),ue={class:"simulator-page"},de={class:"simulator-form card"},ce={class:"simulator-form__header"},me={class:"simulator-form__body"},pe={key:0,class:"simulator-form__row"},ve=["value"],fe={class:"simulator-form__row"},ye=["value"],he={class:"simulator-presets"},_e=["title","onClick"],Se={class:"simulator-preset__label"},be=["disabled"],ge={class:"simulator-active"},Te={class:"simulator-active__header"},ke={class:"simulator-active__title"},Ce=["disabled"],Pe={class:"simulator-active__list"},Ee={class:"simulator-simulation__info"},Le={class:"simulator-simulation__path font-mono"},we={class:"simulator-simulation__preset"},Ae={key:0,class:"text-muted"},Re=["disabled","onClick"],Ie={key:0,class:"empty-state"},Me=Y({__name:"SimulatorPage",setup(i){const o=re(),g=ae(),{send:c,on:h}=oe(),_=y(""),T=y("GET"),p=y(null),S=y(null),N=["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"];let I=[];const C=y(new Set),P=f(()=>g.endpoints.map(t=>({key:t.key,label:`${t.method.toUpperCase()} ${t.path}`,method:t.method.toUpperCase(),path:t.path,operationId:t.operationId}))),E=f(()=>{const t=_.value.trim()!=="",a=p.value!==null;return t&&a}),F=f(()=>o.activeSimulations.map(t=>{const a=t.presetId?o.getPreset(t.presetId):null;return{...t,preset:a}})),k=f(()=>o.count);function M(){if(!E.value||!p.value||!o.getPreset(p.value))return;const a=_.value.trim();if(!a.startsWith("/")){o.setError("Path must start with /");return}if(a.length>500){o.setError("Path is too long (max 500 characters)");return}if(!/^\/[\w\-/{}:.]*$/.test(a)){o.setError("Path contains invalid characters");return}const s=`${T.value.toLowerCase()}:${a}`,m=o.createSimulationFromPreset(s,p.value,void 0);m&&(o.addSimulationLocal(m,!0),o.setLoading(!0),c({type:"set:simulation",data:{path:m.path,status:m.status,delay:m.delay,body:m.body}}),_.value="",p.value=null,S.value=null)}function H(t){o.removeSimulationLocal(t,!0),o.setLoading(!0),c({type:"clear:simulation",data:{path:t}})}function L(){if(k.value!==0){for(const t of o.activeSimulations)C.value.add(t.path),o.removeSimulationLocal(t.path,!0),c({type:"clear:simulation",data:{path:t.path}});o.setLoading(!0)}}function w(){if(!S.value)return;const t=g.endpoints.find(a=>a.key===S.value);t&&(T.value=t.method.toUpperCase(),_.value=t.path)}function z(){S.value=null}return ee(()=>{I=[h("simulation:active",t=>{o.setSimulations(t.simulations)}),h("simulation:added",t=>{o.handleSimulationAdded(t)}),h("simulation:removed",t=>{o.handleSimulationRemoved(t)}),h("simulations:cleared",t=>{o.handleSimulationsCleared(t)}),h("simulation:set",t=>{o.handleSimulationSet(t)}),h("simulation:cleared",t=>{C.value.has(t.path)&&C.value.delete(t.path),o.handleSimulationCleared(t)})],c({type:"get:registry"})}),te(()=>{for(const t of I)t()}),(t,a)=>(r(),d("div",ue,[l("div",de,[l("div",ce,[R(u(W),{size:18}),a[3]||(a[3]=l("span",null,"Add Simulation",-1))]),l("div",me,[P.value.length>0?(r(),d("div",pe,[a[5]||(a[5]=l("label",{class:"simulator-form__label"},"Select Endpoint (optional):",-1)),D(l("select",{"onUpdate:modelValue":a[0]||(a[0]=s=>S.value=s),class:"input",onChange:w},[a[4]||(a[4]=l("option",{value:null},"Manual entry...",-1)),(r(!0),d($,null,U(P.value,s=>(r(),d("option",{key:s.key,value:s.key},b(s.label),9,ve))),128))],544),[[B,S.value]])])):x("",!0),l("div",fe,[D(l("select",{"onUpdate:modelValue":a[1]||(a[1]=s=>T.value=s),class:"simulator-form__method input",onChange:z},[(r(),d($,null,U(N,s=>l("option",{key:s,value:s},b(s),9,ye)),64))],544),[[B,T.value]]),D(l("input",{"onUpdate:modelValue":a[2]||(a[2]=s=>_.value=s),type:"text",class:"simulator-form__path input",placeholder:"/api/path",onInput:z},null,544),[[se,_.value]])]),l("div",he,[(r(!0),d($,null,U(u(o).presets,s=>(r(),d("button",{key:s.id,class:q(["simulator-preset",{"simulator-preset--selected":p.value===s.id},`simulator-preset--${s.type}`]),title:s.description,onClick:m=>p.value=s.id},[(r(),O(G(s.type==="delay"?u(Z):u(j)),{size:14})),l("span",Se,b(s.label),1)],10,_e))),128))]),l("button",{class:"btn btn--primary",disabled:!E.value||u(o).isLoading,onClick:M},[R(u(ie),{size:16}),a[6]||(a[6]=l("span",null,"Add Simulation",-1))],8,be)])]),l("div",ge,[l("div",Te,[l("span",ke," Active Simulations ("+b(k.value)+") ",1),k.value>0?(r(),d("button",{key:0,class:"btn btn--ghost",disabled:u(o).isLoading,onClick:L},[R(u(K),{size:14}),a[7]||(a[7]=l("span",null,"Clear All",-1))],8,Ce)):x("",!0)]),l("div",Pe,[(r(!0),d($,null,U(F.value,s=>(r(),d("div",{key:s.path,class:"simulator-simulation card"},[l("div",Ee,[l("span",Le,b(s.path),1)]),l("div",we,[(r(),O(G(s.preset?.type==="delay"?u(Z):u(j)),{size:14,class:q({"text-warning":s.preset?.type==="delay","text-error":s.preset?.type==="error","text-muted":s.preset?.type==="empty"})},null,8,["class"])),l("span",null,b(s.preset?.label||`HTTP ${s.status}`),1),s.delay?(r(),d("span",Ae," ("+b(s.delay)+"ms) ",1)):x("",!0)]),l("button",{class:"btn btn--ghost btn--icon",title:"Remove simulation",disabled:u(o).isLoading,onClick:m=>H(s.path)},[R(u(K),{size:14})],8,Re)]))),128)),k.value===0?(r(),d("div",Ie,[R(u(W),{size:48,class:"empty-state__icon"}),a[8]||(a[8]=l("h3",{class:"empty-state__title"},"No active simulations",-1)),a[9]||(a[9]=l("p",{class:"empty-state__description"}," Add a simulation above to test error handling and slow responses. ",-1))])):x("",!0)])])]))}}),He=ne(Me,[["__scopeId","data-v-e5fd28b0"]]);export{He as default};
|
|
2
|
-
//# sourceMappingURL=SimulatorPage-ROKoAmUT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SimulatorPage-ROKoAmUT.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/plus.js","../../../src/stores/simulation.ts","../../../src/pages/SimulatorPage.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 Plus = createLucideIcon(\"plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * Simulation Store\n *\n * What: Pinia store for managing error and delay simulations\n * How: Manages simulation state and communicates with server via WebSocket\n * Why: Enables developers to test error handling and loading states\n *\n * @module stores/simulation\n */\n\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\n/**\n * Simulation preset type\n */\nexport type SimulationPresetType = 'delay' | 'error' | 'empty';\n\n/**\n * Simulation preset definition\n */\nexport interface SimulationPreset {\n id: string;\n label: string;\n description: string;\n type: SimulationPresetType;\n status: number;\n delay?: number;\n body?: unknown;\n}\n\n/**\n * Active simulation state\n */\nexport interface ActiveSimulation {\n path: string;\n operationId?: string;\n status: number;\n delay?: number;\n body?: unknown;\n presetId?: string;\n}\n\n/**\n * Preset definitions matching PRD FR-104 requirements\n */\nexport const SIMULATION_PRESETS: SimulationPreset[] = [\n {\n id: 'slow-network',\n label: 'Slow Network',\n description: '3000ms delay (3G simulation)',\n type: 'delay',\n status: 200,\n delay: 3000,\n },\n {\n id: 'server-error',\n label: 'Server Error',\n description: 'Returns HTTP 500',\n type: 'error',\n status: 500,\n body: { error: 'Internal Server Error', message: 'Simulated server error' },\n },\n {\n id: 'rate-limit',\n label: 'Rate Limited',\n description: 'Returns HTTP 429',\n type: 'error',\n status: 429,\n body: { error: 'Too Many Requests', message: 'Rate limit exceeded' },\n },\n {\n id: 'not-found',\n label: 'Not Found',\n description: 'Returns HTTP 404',\n type: 'error',\n status: 404,\n body: { error: 'Not Found', message: 'Resource not found' },\n },\n {\n id: 'request-timeout',\n label: 'Request Timeout',\n description: '30000ms delay (simulates timeout)',\n type: 'delay',\n status: 200,\n delay: 30000,\n },\n {\n id: 'empty-response',\n label: 'Empty Response',\n description: 'Returns HTTP 200 with empty body',\n type: 'empty',\n status: 200,\n body: null,\n },\n {\n id: 'unauthorized',\n label: 'Unauthorized',\n description: 'Returns HTTP 401',\n type: 'error',\n status: 401,\n body: { error: 'Unauthorized', message: 'Authentication required' },\n },\n];\n\n/**\n * Simulation store for managing endpoint simulations\n *\n * Provides:\n * - Active simulations storage and retrieval\n * - Preset definitions and lookup\n * - WebSocket command integration\n * - Simulation count and status tracking\n */\nexport const useSimulationStore = defineStore('simulation', () => {\n // ==========================================================================\n // State\n // ==========================================================================\n\n /**\n * Active simulations keyed by path\n * One simulation per path (enforced by Map)\n */\n const simulations = ref<Map<string, ActiveSimulation>>(new Map());\n\n /**\n * Previous simulation state for rollback on failure\n * Keyed by path, stores the simulation before optimistic update\n */\n const previousSimulations = ref<Map<string, ActiveSimulation | null>>(new Map());\n\n /**\n * Loading state for async operations\n */\n const isLoading = ref(false);\n\n /**\n * Error state\n */\n const error = ref<string | null>(null);\n\n // ==========================================================================\n // Getters / Computed\n // ==========================================================================\n\n /**\n * All active simulations as an array\n */\n const activeSimulations = computed(() => {\n return Array.from(simulations.value.values());\n });\n\n /**\n * Count of active simulations\n */\n const count = computed(() => simulations.value.size);\n\n /**\n * Available presets\n */\n const presets = computed(() => SIMULATION_PRESETS);\n\n /**\n * Check if any simulations are active\n */\n const hasActiveSimulations = computed(() => simulations.value.size > 0);\n\n /**\n * Get simulations grouped by type\n */\n const simulationsByType = computed(() => {\n const grouped = {\n delay: [] as ActiveSimulation[],\n error: [] as ActiveSimulation[],\n empty: [] as ActiveSimulation[],\n };\n\n for (const simulation of simulations.value.values()) {\n const type = getSimulationType(simulation);\n grouped[type].push(simulation);\n }\n\n return grouped;\n });\n\n /**\n * Determine simulation type from simulation config\n */\n function getSimulationType(simulation: ActiveSimulation): SimulationPresetType {\n const preset = simulation.presetId\n ? SIMULATION_PRESETS.find((p) => p.id === simulation.presetId)\n : null;\n\n if (preset) {\n return preset.type;\n }\n\n if (simulation.delay && simulation.delay > 0) {\n return 'delay';\n }\n\n if (simulation.body === null) {\n return 'empty';\n }\n\n return 'error';\n }\n\n // ==========================================================================\n // Actions\n // ==========================================================================\n\n /**\n * Set active simulations from server (e.g., on 'simulation:active' event)\n */\n function setSimulations(newSimulations: ActiveSimulation[]): void {\n simulations.value.clear();\n for (const simulation of newSimulations) {\n simulations.value.set(simulation.path, simulation);\n }\n error.value = null;\n }\n\n /**\n * Add a new simulation locally\n * Note: This updates local state only. Use addSimulation() to sync with server.\n * @param storeForRollback - If true, stores previous state for rollback\n */\n function addSimulationLocal(simulation: ActiveSimulation, storeForRollback = false): void {\n if (storeForRollback) {\n // Store previous state (null if didn't exist)\n const previous = simulations.value.get(simulation.path) || null;\n previousSimulations.value.set(simulation.path, previous);\n }\n simulations.value.set(simulation.path, simulation);\n }\n\n /**\n * Remove a simulation locally by path\n * Note: This updates local state only. Use removeSimulation() to sync with server.\n * @param storeForRollback - If true, stores previous state for rollback\n */\n function removeSimulationLocal(path: string, storeForRollback = false): boolean {\n if (storeForRollback) {\n // Store previous state before removing\n const previous = simulations.value.get(path) || null;\n previousSimulations.value.set(path, previous);\n }\n return simulations.value.delete(path);\n }\n\n /**\n * Clear all simulations locally\n * Note: This updates local state only. Use clearSimulations() to sync with server.\n */\n function clearSimulationsLocal(): void {\n simulations.value.clear();\n }\n\n /**\n * Get a simulation by path\n */\n function getSimulation(path: string): ActiveSimulation | undefined {\n return simulations.value.get(path);\n }\n\n /**\n * Check if a simulation exists for a path\n */\n function hasSimulation(path: string): boolean {\n return simulations.value.has(path);\n }\n\n /**\n * Get a preset by ID\n */\n function getPreset(id: string): SimulationPreset | undefined {\n return SIMULATION_PRESETS.find((p) => p.id === id);\n }\n\n /**\n * Create a simulation from a preset\n */\n function createSimulationFromPreset(\n path: string,\n presetId: string,\n operationId?: string,\n ): ActiveSimulation | null {\n const preset = getPreset(presetId);\n if (!preset) {\n error.value = `Preset not found: ${presetId}`;\n return null;\n }\n\n return {\n path,\n operationId,\n status: preset.status,\n delay: preset.delay,\n body: preset.body,\n presetId: preset.id,\n };\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 * Rollback a simulation to its previous state\n * @param path - The path of the simulation to rollback\n */\n function rollbackSimulation(path: string): void {\n if (!previousSimulations.value.has(path)) {\n return;\n }\n\n const previous = previousSimulations.value.get(path);\n if (previous === null || previous === undefined) {\n // Was added optimistically, remove it\n simulations.value.delete(path);\n } else {\n // Restore previous state\n simulations.value.set(path, previous);\n }\n\n // Clear rollback data\n previousSimulations.value.delete(path);\n }\n\n /**\n * Handle simulation:added event from server\n */\n function handleSimulationAdded(data: { path: string }): void {\n // Server will send 'simulation:active' event with full state\n // This event is just a notification\n console.log('[Simulation] Added:', data.path);\n }\n\n /**\n * Handle simulation:removed event from server\n */\n function handleSimulationRemoved(data: { path: string }): void {\n removeSimulationLocal(data.path);\n console.log('[Simulation] Removed:', data.path);\n }\n\n /**\n * Handle simulations:cleared event from server\n */\n function handleSimulationsCleared(data: { count: number }): void {\n clearSimulationsLocal();\n console.log('[Simulation] Cleared all:', data.count);\n }\n\n /**\n * Handle simulation:set response from server\n */\n function handleSimulationSet(data: { path: string; success: boolean }): void {\n if (data.success) {\n // Clear rollback data on success\n previousSimulations.value.delete(data.path);\n console.log('[Simulation] Set successfully:', data.path);\n } else {\n // Rollback optimistic update on failure\n rollbackSimulation(data.path);\n setError(`Failed to set simulation for ${data.path}`);\n }\n setLoading(false);\n }\n\n /**\n * Handle simulation:cleared response from server\n */\n function handleSimulationCleared(data: { path: string; success: boolean }): void {\n if (data.success) {\n // Clear rollback data on success\n previousSimulations.value.delete(data.path);\n console.log('[Simulation] Cleared successfully:', data.path);\n } else {\n // Rollback optimistic removal on failure\n rollbackSimulation(data.path);\n setError(`Failed to clear simulation for ${data.path}`);\n }\n setLoading(false);\n }\n\n // ==========================================================================\n // Return\n // ==========================================================================\n\n return {\n // State\n simulations,\n isLoading,\n error,\n\n // Getters\n activeSimulations,\n count,\n presets,\n hasActiveSimulations,\n simulationsByType,\n\n // Actions\n setSimulations,\n addSimulationLocal,\n removeSimulationLocal,\n clearSimulationsLocal,\n getSimulation,\n hasSimulation,\n getPreset,\n createSimulationFromPreset,\n setLoading,\n setError,\n clearError,\n rollbackSimulation,\n\n // Event handlers\n handleSimulationAdded,\n handleSimulationRemoved,\n handleSimulationsCleared,\n handleSimulationSet,\n handleSimulationCleared,\n };\n});\n","<!--\n SimulatorPage.vue - Error Simulation Controls Page\n\n What: Provides controls for simulating various API error conditions\n How: Manages simulation state via simulation store and WebSocket commands\n Why: Allows developers to test error handling without modifying backend code\n-->\n\n<script setup lang=\"ts\">\nimport { AlertTriangle, Clock, Plus, Trash2, Zap } from 'lucide-vue-next';\nimport { computed, onMounted, onUnmounted, ref } from 'vue';\nimport { useWebSocket } from '../composables/useWebSocket';\nimport { useRegistryStore } from '../stores/registry';\nimport type { ActiveSimulation } from '../stores/simulation';\nimport { useSimulationStore } from '../stores/simulation';\n\n// ==========================================================================\n// Types\n// ==========================================================================\n\ninterface SimulationActiveEvent {\n simulations: ActiveSimulation[];\n}\n\ninterface SimulationPathEvent {\n path: string;\n}\n\ninterface SimulationsClearedEvent {\n count: number;\n}\n\ninterface SimulationSetEvent {\n path: string;\n success: boolean;\n}\n\ninterface SimulationClearedEvent {\n path: string;\n success: boolean;\n}\n\n// ==========================================================================\n// Composables\n// ==========================================================================\n\nconst simulationStore = useSimulationStore();\nconst registryStore = useRegistryStore();\nconst { send, on } = useWebSocket();\n\n// ==========================================================================\n// State\n// ==========================================================================\n\n/** Path input for new simulation */\nconst newSimulationPath = ref('');\n\n/** Method input for new simulation */\nconst newSimulationMethod = ref('GET');\n\n/** Selected preset ID */\nconst selectedPresetId = ref<string | null>(null);\n\n/** Selected endpoint key (for dropdown selection) */\nconst selectedEndpointKey = ref<string | null>(null);\n\n/** Available HTTP methods */\nconst httpMethods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'];\n\n/** WebSocket event unsubscribe functions (populated in onMounted) */\nlet unsubscribers: Array<() => void> = [];\n\n/** Simulations pending clear (for rollback on partial failures) */\nconst pendingClears = ref<Set<string>>(new Set());\n\n// ==========================================================================\n// Computed\n// ==========================================================================\n\n/**\n * Available endpoints for selection\n */\nconst availableEndpoints = computed(() => {\n return registryStore.endpoints.map((e) => ({\n key: e.key,\n label: `${e.method.toUpperCase()} ${e.path}`,\n method: e.method.toUpperCase(),\n path: e.path,\n operationId: e.operationId,\n }));\n});\n\n/**\n * Check if we can add a new simulation\n */\nconst canAddSimulation = computed(() => {\n const hasPath = newSimulationPath.value.trim() !== '';\n const hasPreset = selectedPresetId.value !== null;\n return hasPath && hasPreset;\n});\n\n/**\n * Active simulations for display\n */\nconst activeSimulations = computed(() => {\n return simulationStore.activeSimulations.map((sim) => {\n const preset = sim.presetId ? simulationStore.getPreset(sim.presetId) : null;\n return {\n ...sim,\n preset,\n };\n });\n});\n\n/**\n * Simulation count\n */\nconst simulationCount = computed(() => simulationStore.count);\n\n// ==========================================================================\n// Methods\n// ==========================================================================\n\n/**\n * Add a new simulation\n */\nfunction addSimulation(): void {\n if (!canAddSimulation.value || !selectedPresetId.value) return;\n\n const preset = simulationStore.getPreset(selectedPresetId.value);\n if (!preset) return;\n\n // Validate path input\n const trimmedPath = newSimulationPath.value.trim();\n\n // Path must start with /\n if (!trimmedPath.startsWith('/')) {\n simulationStore.setError('Path must start with /');\n return;\n }\n\n // Path must not be too long (reasonable limit)\n if (trimmedPath.length > 500) {\n simulationStore.setError('Path is too long (max 500 characters)');\n return;\n }\n\n // Path should only contain valid URL path characters\n if (!/^\\/[\\w\\-/{}:.]*$/.test(trimmedPath)) {\n simulationStore.setError('Path contains invalid characters');\n return;\n }\n\n // Combine method and path to create endpoint key (e.g., \"get:/pets\")\n const pathWithMethod = `${newSimulationMethod.value.toLowerCase()}:${trimmedPath}`;\n const simulation = simulationStore.createSimulationFromPreset(\n pathWithMethod,\n selectedPresetId.value,\n undefined,\n );\n\n if (!simulation) return;\n\n // Optimistically add to local state (store previous state for rollback)\n simulationStore.addSimulationLocal(simulation, true);\n simulationStore.setLoading(true);\n\n // Send command to server\n send({\n type: 'set:simulation',\n data: {\n path: simulation.path,\n status: simulation.status,\n delay: simulation.delay,\n body: simulation.body,\n },\n });\n\n // Reset form\n newSimulationPath.value = '';\n selectedPresetId.value = null;\n selectedEndpointKey.value = null;\n}\n\n/**\n * Remove an active simulation\n */\nfunction removeSimulation(path: string): void {\n // Optimistically remove from local state (store previous state for rollback)\n simulationStore.removeSimulationLocal(path, true);\n simulationStore.setLoading(true);\n\n // Send command to server\n send({\n type: 'clear:simulation',\n data: { path },\n });\n}\n\n/**\n * Clear all simulations\n */\nfunction clearAllSimulations(): void {\n if (simulationCount.value === 0) return;\n\n // Mark each simulation as pending clear and store for rollback\n for (const simulation of simulationStore.activeSimulations) {\n pendingClears.value.add(simulation.path);\n\n // Store previous state for rollback\n simulationStore.removeSimulationLocal(simulation.path, true);\n\n // Send clear command to server\n send({\n type: 'clear:simulation',\n data: { path: simulation.path },\n });\n }\n\n simulationStore.setLoading(true);\n\n // Note: Individual simulations will be removed from local state\n // only when we receive the corresponding \"simulation:cleared\" event\n // with success: true. Failed clears will be rolled back automatically.\n}\n\n/**\n * Handle endpoint selection from dropdown\n */\nfunction handleEndpointSelect(): void {\n if (!selectedEndpointKey.value) return;\n\n const endpoint = registryStore.endpoints.find((e) => e.key === selectedEndpointKey.value);\n if (!endpoint) return;\n\n newSimulationMethod.value = endpoint.method.toUpperCase();\n newSimulationPath.value = endpoint.path;\n}\n\n/**\n * Handle manual path/method input\n */\nfunction handleManualInput(): void {\n // Clear endpoint selection when user types manually\n selectedEndpointKey.value = null;\n}\n\n// ==========================================================================\n// Lifecycle\n// ==========================================================================\n\nonMounted(() => {\n // Subscribe to simulation events and collect unsubscribe functions\n unsubscribers = [\n on('simulation:active', (data: SimulationActiveEvent) => {\n simulationStore.setSimulations(data.simulations);\n }),\n\n on('simulation:added', (data: SimulationPathEvent) => {\n simulationStore.handleSimulationAdded(data);\n }),\n\n on('simulation:removed', (data: SimulationPathEvent) => {\n simulationStore.handleSimulationRemoved(data);\n }),\n\n on('simulations:cleared', (data: SimulationsClearedEvent) => {\n simulationStore.handleSimulationsCleared(data);\n }),\n\n on('simulation:set', (data: SimulationSetEvent) => {\n simulationStore.handleSimulationSet(data);\n }),\n\n on('simulation:cleared', (data: SimulationClearedEvent) => {\n // Remove from pending clears if it was part of clearAll\n if (pendingClears.value.has(data.path)) {\n pendingClears.value.delete(data.path);\n }\n\n // Delegate to store handler (handles success/failure and rollback)\n simulationStore.handleSimulationCleared(data);\n }),\n ];\n\n // Request current simulations from server\n send({ type: 'get:registry' });\n});\n\n// Cleanup on unmount to prevent memory leaks\nonUnmounted(() => {\n for (const unsub of unsubscribers) {\n unsub();\n }\n});\n</script>\n\n<template>\n <div class=\"simulator-page\">\n <!-- Add Simulation Form -->\n <div class=\"simulator-form card\">\n <div class=\"simulator-form__header\">\n <Zap :size=\"18\" />\n <span>Add Simulation</span>\n </div>\n\n <div class=\"simulator-form__body\">\n <!-- Endpoint Selector (optional) -->\n <div v-if=\"availableEndpoints.length > 0\" class=\"simulator-form__row\">\n <label class=\"simulator-form__label\">Select Endpoint (optional):</label>\n <select\n v-model=\"selectedEndpointKey\"\n class=\"input\"\n @change=\"handleEndpointSelect\"\n >\n <option :value=\"null\">Manual entry...</option>\n <option\n v-for=\"endpoint in availableEndpoints\"\n :key=\"endpoint.key\"\n :value=\"endpoint.key\"\n >\n {{ endpoint.label }}\n </option>\n </select>\n </div>\n\n <!-- Method and Path -->\n <div class=\"simulator-form__row\">\n <select\n v-model=\"newSimulationMethod\"\n class=\"simulator-form__method input\"\n @change=\"handleManualInput\"\n >\n <option v-for=\"method in httpMethods\" :key=\"method\" :value=\"method\">\n {{ method }}\n </option>\n </select>\n <input\n v-model=\"newSimulationPath\"\n type=\"text\"\n class=\"simulator-form__path input\"\n placeholder=\"/api/path\"\n @input=\"handleManualInput\"\n />\n </div>\n\n <!-- Preset Selection -->\n <div class=\"simulator-presets\">\n <button\n v-for=\"preset in simulationStore.presets\"\n :key=\"preset.id\"\n :class=\"[\n 'simulator-preset',\n { 'simulator-preset--selected': selectedPresetId === preset.id },\n `simulator-preset--${preset.type}`,\n ]\"\n :title=\"preset.description\"\n @click=\"selectedPresetId = preset.id\"\n >\n <component\n :is=\"preset.type === 'delay' ? Clock : AlertTriangle\"\n :size=\"14\"\n />\n <span class=\"simulator-preset__label\">{{ preset.label }}</span>\n </button>\n </div>\n\n <!-- Add Button -->\n <button\n class=\"btn btn--primary\"\n :disabled=\"!canAddSimulation || simulationStore.isLoading\"\n @click=\"addSimulation\"\n >\n <Plus :size=\"16\" />\n <span>Add Simulation</span>\n </button>\n </div>\n </div>\n\n <!-- Active Simulations -->\n <div class=\"simulator-active\">\n <div class=\"simulator-active__header\">\n <span class=\"simulator-active__title\">\n Active Simulations ({{ simulationCount }})\n </span>\n <button\n v-if=\"simulationCount > 0\"\n class=\"btn btn--ghost\"\n :disabled=\"simulationStore.isLoading\"\n @click=\"clearAllSimulations\"\n >\n <Trash2 :size=\"14\" />\n <span>Clear All</span>\n </button>\n </div>\n\n <div class=\"simulator-active__list\">\n <div\n v-for=\"simulation in activeSimulations\"\n :key=\"simulation.path\"\n class=\"simulator-simulation card\"\n >\n <div class=\"simulator-simulation__info\">\n <span class=\"simulator-simulation__path font-mono\">\n {{ simulation.path }}\n </span>\n </div>\n <div class=\"simulator-simulation__preset\">\n <component\n :is=\"simulation.preset?.type === 'delay' ? Clock : AlertTriangle\"\n :size=\"14\"\n :class=\"{\n 'text-warning': simulation.preset?.type === 'delay',\n 'text-error': simulation.preset?.type === 'error',\n 'text-muted': simulation.preset?.type === 'empty',\n }\"\n />\n <span>\n {{ simulation.preset?.label || `HTTP ${simulation.status}` }}\n </span>\n <span v-if=\"simulation.delay\" class=\"text-muted\">\n ({{ simulation.delay }}ms)\n </span>\n </div>\n <button\n class=\"btn btn--ghost btn--icon\"\n title=\"Remove simulation\"\n :disabled=\"simulationStore.isLoading\"\n @click=\"removeSimulation(simulation.path)\"\n >\n <Trash2 :size=\"14\" />\n </button>\n </div>\n\n <!-- Empty State -->\n <div v-if=\"simulationCount === 0\" class=\"empty-state\">\n <Zap :size=\"48\" class=\"empty-state__icon\" />\n <h3 class=\"empty-state__title\">No active simulations</h3>\n <p class=\"empty-state__description\">\n Add a simulation above to test error handling and slow responses.\n </p>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.simulator-page {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-lg);\n height: 100%;\n padding: var(--devtools-space-md);\n overflow-y: auto;\n}\n\n/* Form */\n.simulator-form {\n flex-shrink: 0;\n}\n\n.simulator-form__header {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n padding-bottom: var(--devtools-space-md);\n margin-bottom: var(--devtools-space-md);\n border-bottom: 1px solid var(--devtools-border);\n font-weight: var(--font-weight-6);\n font-size: var(--font-size-1);\n}\n\n.simulator-form__body {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-md);\n}\n\n.simulator-form__row {\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n.simulator-form__row:has(.simulator-form__method) {\n flex-direction: row;\n gap: var(--devtools-space-sm);\n}\n\n.simulator-form__label {\n font-size: var(--font-size-0);\n font-weight: var(--font-weight-5);\n color: var(--devtools-text);\n}\n\n.simulator-form__method {\n width: 100px;\n flex-shrink: 0;\n}\n\n.simulator-form__path {\n flex: 1;\n}\n\n/* Presets */\n.simulator-presets {\n display: flex;\n flex-wrap: wrap;\n gap: var(--devtools-space-xs);\n}\n\n.simulator-preset {\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-elevated);\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 cursor: pointer;\n transition: all var(--devtools-transition-fast);\n}\n\n.simulator-preset:hover {\n background-color: var(--devtools-border);\n}\n\n.simulator-preset--selected {\n border-color: var(--devtools-primary);\n background-color: color-mix(\n in srgb,\n var(--devtools-primary) 15%,\n transparent\n );\n}\n\n.simulator-preset--delay {\n color: var(--devtools-warning);\n}\n\n.simulator-preset--error {\n color: var(--devtools-error);\n}\n\n.simulator-preset--empty {\n color: var(--devtools-text-muted);\n}\n\n.simulator-preset__label {\n color: var(--devtools-text);\n}\n\n/* Active Simulations */\n.simulator-active {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.simulator-active__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--devtools-space-md);\n}\n\n.simulator-active__title {\n font-weight: var(--font-weight-6);\n font-size: var(--font-size-1);\n}\n\n.simulator-active__list {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--devtools-space-xs);\n}\n\n/* Simulation Item */\n.simulator-simulation {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-md);\n padding: var(--devtools-space-sm) var(--devtools-space-md);\n}\n\n.simulator-simulation__info {\n display: flex;\n align-items: center;\n gap: var(--devtools-space-sm);\n flex: 1;\n}\n\n.simulator-simulation__path {\n font-size: var(--font-size-1);\n color: var(--devtools-text);\n}\n\n.simulator-simulation__preset {\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/* Color utilities */\n.text-warning {\n color: var(--devtools-warning);\n}\n\n.text-error {\n color: var(--devtools-error);\n}\n\n.text-muted {\n color: var(--devtools-text-muted);\n}\n</style>\n"],"names":["Plus","createLucideIcon","SIMULATION_PRESETS","useSimulationStore","defineStore","simulations","ref","previousSimulations","isLoading","error","activeSimulations","computed","count","presets","hasActiveSimulations","simulationsByType","grouped","simulation","type","getSimulationType","preset","p","setSimulations","newSimulations","addSimulationLocal","storeForRollback","previous","removeSimulationLocal","path","clearSimulationsLocal","getSimulation","hasSimulation","getPreset","id","createSimulationFromPreset","presetId","operationId","setLoading","loading","setError","errorMessage","clearError","rollbackSimulation","handleSimulationAdded","data","handleSimulationRemoved","handleSimulationsCleared","handleSimulationSet","handleSimulationCleared","simulationStore","registryStore","useRegistryStore","send","on","useWebSocket","newSimulationPath","newSimulationMethod","selectedPresetId","selectedEndpointKey","httpMethods","unsubscribers","pendingClears","availableEndpoints","e","canAddSimulation","hasPath","hasPreset","sim","simulationCount","addSimulation","trimmedPath","pathWithMethod","removeSimulation","clearAllSimulations","handleEndpointSelect","endpoint","handleManualInput","onMounted","onUnmounted","unsub","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_createVNode","_unref","Zap","_cache","_hoisted_4","_hoisted_5","$event","_Fragment","_renderList","_toDisplayString","_hoisted_6","_hoisted_7","method","_hoisted_8","_hoisted_9","_normalizeClass","_createBlock","_resolveDynamicComponent","Clock","AlertTriangle","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","Trash2","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_23"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{D as pe,g as v,C as T,d as ue,b as u,f as x,e,u as a,n as z,t as c,s as k,v as M,i as $,j as S,x as V,y as W,F as A,r as j,E as ce,o,z as he,A as ge,B as be}from"./vue-vendor-CtA47il-.js";import{g as _e,C as N,a as Z,S as me,F as xe,b as ke}from"./format-B1udViy3.js";import{c as fe,C as P,Z as ve,_ as de}from"./index-GQ9qRqEi.js";import{C as oe}from"./check-DxJBRQqh.js";import{T as qe}from"./triangle-alert-CAGaIjAo.js";import{u as Ce}from"./useWebSocket-C2ttWF5T.js";import{X as ye}from"./x-zxrccEon.js";import{T as $e}from"./trash-2-CDyKV6GB.js";const Se=fe("circle-check-big",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);const re=fe("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["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"}]]),Te=pe("timeline",()=>{const n=T([]),s=T(!1),r=T(null),d=T({methods:[],statusCodes:[],searchQuery:"",simulatedOnly:null}),q=T(null),g=T(500),p=new Map;function R(t){return t<200?"1xx":t<300?"2xx":t<400?"3xx":t<500?"4xx":"5xx"}const H=v(()=>{let t=n.value;if(d.value.searchQuery.trim()){const i=d.value.searchQuery.toLowerCase().trim();t=t.filter(m=>m.request.path.toLowerCase().includes(i)||m.request.operationId.toLowerCase().includes(i))}return d.value.methods.length>0&&(t=t.filter(i=>d.value.methods.includes(i.request.method.toUpperCase()))),d.value.statusCodes.length>0&&(t=t.filter(i=>{if(i.status===null)return!1;const m=R(i.status);return d.value.statusCodes.includes(m)})),d.value.simulatedOnly!==null&&(t=t.filter(i=>i.simulated===d.value.simulatedOnly)),t}),B=v(()=>q.value?n.value.find(t=>t.id===q.value)??null:null),Q=v(()=>n.value.length),O=v(()=>n.value.filter(t=>t.response!==null).length),D=v(()=>n.value.filter(t=>t.response===null).length),w=v(()=>{const t={"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0};for(const i of n.value)if(i.status!==null){const m=R(i.status);t[m]++}return t}),L=v(()=>{const t=n.value.filter(m=>m.duration!==null);if(t.length===0)return 0;const i=t.reduce((m,E)=>m+(E.duration??0),0);return Math.round(i/t.length)});function U(t){const i={id:t.id,request:t,response:null,status:null,duration:null,simulated:!1},m=p.get(t.id);m&&(l(i,m),p.delete(t.id)),n.value.unshift(i),n.value.length>g.value&&(n.value=n.value.slice(0,g.value))}function b(t){const i=n.value.find(m=>m.id===t.requestId);if(i)l(i,t),p.delete(t.requestId);else if(p.set(t.requestId,t),p.size>100){const m=f(t);n.value.unshift(m),p.delete(t.requestId),n.value.length>g.value&&(n.value=n.value.slice(0,g.value))}}function l(t,i){t.response=i,t.status=i.status,t.duration=i.duration,t.simulated=i.simulated}function f(t){const i={id:t.requestId,method:"UNKNOWN",path:"/unknown",operationId:"unknown",timestamp:Date.now(),headers:{},query:{},body:void 0};return{id:t.requestId,request:i,response:t,status:t.status,duration:t.duration,simulated:t.simulated}}function C(t){for(const[i,m]of p){const E=t.get(i);E?(l(E,m),p.delete(i)):(t.set(i,f(m)),p.delete(i))}}function se(t,i){for(const[m,E]of i){const I=t.get(m);I?l(I,E):p.set(m,E)}}function ne(t){for(const[i,m]of p)t.has(i)||(t.set(i,f(m)),p.delete(i))}function ie(t){const i=new Map,m=new Map;for(const I of t.entries)if(I.type==="request"){const F=I.data;i.set(F.id,{id:F.id,request:F,response:null,status:null,duration:null,simulated:!1})}else if(I.type==="response"){const F=I.data;m.set(F.requestId,F)}C(i),se(i,m),ne(i);const E=Array.from(i.values()).sort((I,F)=>F.request.timestamp-I.request.timestamp);n.value=E.slice(0,g.value),r.value=null}function G(){n.value=[],q.value=null,p.clear()}function le(t){s.value=t}function J(t){r.value=t,s.value=!1}function K(){r.value=null}function X(t){d.value.searchQuery=t}function Y(t){const i=d.value.methods.indexOf(t);i===-1?d.value.methods.push(t):d.value.methods.splice(i,1)}function ee(t){const i=d.value.statusCodes.indexOf(t);i===-1?d.value.statusCodes.push(t):d.value.statusCodes.splice(i,1)}function te(t){d.value.simulatedOnly=t}function y(){d.value={methods:[],statusCodes:[],searchQuery:"",simulatedOnly:null}}function _(){return d.value.searchQuery.trim()!==""||d.value.methods.length>0||d.value.statusCodes.length>0||d.value.simulatedOnly!==null}function h(t){q.value=t}function ae(t){const i=Math.max(1,t);g.value=i,n.value.length>i&&(n.value=n.value.slice(0,i))}return{entries:n,isLoading:s,error:r,filter:d,selectedEntryId:q,maxEntries:g,filteredEntries:H,selectedEntry:B,totalCount:Q,completedCount:O,pendingCount:D,statusCounts:w,averageDuration:L,addRequest:U,addResponse:b,setTimelineData:ie,clearTimeline:G,setLoading:le,setError:J,clearError:K,setSearchQuery:X,toggleMethodFilter:Y,toggleStatusFilter:ee,setSimulatedFilter:te,clearFilters:y,hasActiveFilters:_,selectEntry:h,setMaxEntries:ae}}),Be={class:"timeline-detail"},we={key:0,class:"timeline-detail__empty"},Ee={key:1,class:"timeline-detail__content"},Ie={class:"timeline-detail__header"},ze={class:"timeline-detail__summary"},Re={class:"timeline-detail__path font-mono"},Oe={class:"timeline-detail__meta"},De={key:1,class:"status-badge status-badge--pending"},Fe={class:"timeline-detail__duration"},He={key:2,class:"timeline-detail__simulated",title:"Simulated response"},Qe={class:"timeline-detail__actions"},Le={class:"timeline-detail__info"},Ae={class:"timeline-detail__info-item"},Me={class:"timeline-detail__info-value font-mono"},Ne={class:"timeline-detail__info-item"},je={class:"timeline-detail__info-value font-mono"},Pe={class:"timeline-detail__info-item"},Ue={class:"timeline-detail__info-value font-mono"},Je={class:"timeline-detail__section"},Ve={key:0,class:"timeline-detail__subsection"},We=["aria-expanded"],Ze={class:"text-muted"},Ge={id:"requestQuery-panel",class:"timeline-detail__subsection-content"},Ke={class:"timeline-detail__kv-key font-mono"},Xe={class:"timeline-detail__kv-value font-mono"},Ye={key:1,class:"timeline-detail__subsection"},et=["aria-expanded"],tt={class:"text-muted"},st={id:"requestHeaders-panel",class:"timeline-detail__subsection-content"},nt={class:"timeline-detail__kv-key font-mono"},it={class:"timeline-detail__kv-value font-mono"},lt={key:2,class:"timeline-detail__subsection"},at={class:"timeline-detail__subsection-header",role:"group"},ot=["aria-expanded"],rt={id:"requestBody-panel",class:"timeline-detail__subsection-content"},ut={class:"timeline-detail__json"},dt={key:0,class:"timeline-detail__section"},ct={key:0,class:"timeline-detail__subsection"},mt=["aria-expanded"],yt={class:"text-muted"},_t={id:"responseHeaders-panel",class:"timeline-detail__subsection-content"},ft={class:"timeline-detail__kv-key font-mono"},vt={class:"timeline-detail__kv-value font-mono"},pt={key:1,class:"timeline-detail__subsection"},ht={class:"timeline-detail__subsection-header",role:"group"},gt=["aria-expanded"],bt={id:"responseBody-panel",class:"timeline-detail__subsection-content"},xt={class:"timeline-detail__json"},kt={key:1,class:"timeline-detail__section timeline-detail__section--pending"},qt={class:"timeline-detail__pending"},Ct=ue({__name:"TimelineDetail",props:{entry:{}},setup(n){const s=n,r=T({requestHeaders:!0,requestQuery:!0,requestBody:!0,responseHeaders:!0,responseBody:!0}),d=T(null),q=v(()=>s.entry?new Date(s.entry.request.timestamp).toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,hour12:!1}):""),g=v(()=>s.entry?.duration==null?"pending...":s.entry.duration<1e3?`${s.entry.duration}ms`:`${(s.entry.duration/1e3).toFixed(2)}s`),p=v(()=>s.entry?.status?s.entry.status<200?"status-badge--1xx":s.entry.status<300?"status-badge--2xx":s.entry.status<400?"status-badge--3xx":s.entry.status<500?"status-badge--4xx":"status-badge--5xx":"status-badge--pending"),R=v(()=>s.entry?.request.query?Object.keys(s.entry.request.query).length>0:!1),H=v(()=>s.entry?.request.headers?Object.keys(s.entry.request.headers).length>0:!1),B=v(()=>s.entry?.request.body!==void 0&&s.entry?.request.body!==null),Q=v(()=>s.entry?.response?.headers?Object.keys(s.entry.response.headers).length>0:!1),O=v(()=>s.entry?.response?.body!==void 0&&s.entry?.response?.body!==null);function D(b){try{return JSON.stringify(b,null,2)}catch{return String(b)}}function w(b){r.value[b]=!r.value[b]}async function L(b,l){try{await navigator.clipboard.writeText(b),d.value=l,setTimeout(()=>{d.value=null},2e3)}catch(f){console.error("Failed to copy:",f)}}async function U(){if(!s.entry)return;const b={request:s.entry.request,response:s.entry.response};await L(JSON.stringify(b,null,2),"full")}return(b,l)=>(o(),u("div",Be,[n.entry?(o(),u("div",Ee,[e("div",Ie,[e("div",ze,[e("span",{class:z(["method-badge",`method-badge--${n.entry.request.method.toLowerCase()}`])},c(a(_e)(n.entry.request.method)),3),e("span",Re,c(n.entry.request.path),1)]),e("div",Oe,[n.entry.status!==null?(o(),u("span",{key:0,class:z(["status-badge",p.value])},c(n.entry.status),3)):(o(),u("span",De,"pending")),e("span",Fe,[x(a(P),{size:14}),M(" "+c(g.value),1)]),n.entry.simulated?(o(),u("span",He,[x(a(ve),{size:14}),l[9]||(l[9]=M(" Simulated ",-1))])):k("",!0)]),e("div",Qe,[e("button",{type:"button",class:"btn btn--ghost btn--sm",title:"Copy as JSON",onClick:U},[(o(),$(S(d.value==="full"?a(oe):a(re)),{size:14})),M(" "+c(d.value==="full"?"Copied!":"Copy JSON"),1)])])]),e("div",Le,[e("div",Ae,[l[10]||(l[10]=e("span",{class:"timeline-detail__info-label"},"Timestamp",-1)),e("span",Me,c(q.value),1)]),e("div",Ne,[l[11]||(l[11]=e("span",{class:"timeline-detail__info-label"},"Operation ID",-1)),e("span",je,c(n.entry.request.operationId),1)]),e("div",Pe,[l[12]||(l[12]=e("span",{class:"timeline-detail__info-label"},"Request ID",-1)),e("span",Ue,c(n.entry.id),1)])]),e("div",Je,[l[16]||(l[16]=e("h3",{class:"timeline-detail__section-title"},"Request",-1)),R.value?(o(),u("div",Ve,[e("button",{type:"button",class:"timeline-detail__subsection-header","aria-expanded":r.value.requestQuery,"aria-controls":"requestQuery-panel",onClick:l[0]||(l[0]=f=>w("requestQuery"))},[(o(),$(S(r.value.requestQuery?a(N):a(Z)),{size:16})),l[13]||(l[13]=e("span",null,"Query Parameters",-1)),e("span",Ze,"("+c(Object.keys(n.entry.request.query).length)+")",1)],8,We),V(e("div",Ge,[(o(!0),u(A,null,j(n.entry.request.query,(f,C)=>(o(),u("div",{key:C,class:"timeline-detail__kv-row"},[e("span",Ke,c(C),1),e("span",Xe,c(Array.isArray(f)?f.join(", "):f),1)]))),128))],512),[[W,r.value.requestQuery]])])):k("",!0),H.value?(o(),u("div",Ye,[e("button",{type:"button",class:"timeline-detail__subsection-header","aria-expanded":r.value.requestHeaders,"aria-controls":"requestHeaders-panel",onClick:l[1]||(l[1]=f=>w("requestHeaders"))},[(o(),$(S(r.value.requestHeaders?a(N):a(Z)),{size:16})),l[14]||(l[14]=e("span",null,"Headers",-1)),e("span",tt,"("+c(Object.keys(n.entry.request.headers).length)+")",1)],8,et),V(e("div",st,[(o(!0),u(A,null,j(n.entry.request.headers,(f,C)=>(o(),u("div",{key:C,class:"timeline-detail__kv-row"},[e("span",nt,c(C),1),e("span",it,c(f),1)]))),128))],512),[[W,r.value.requestHeaders]])])):k("",!0),B.value?(o(),u("div",lt,[e("div",at,[e("button",{type:"button",class:"timeline-detail__subsection-toggle","aria-expanded":r.value.requestBody,"aria-controls":"requestBody-panel",onClick:l[2]||(l[2]=f=>w("requestBody"))},[(o(),$(S(r.value.requestBody?a(N):a(Z)),{size:16})),l[15]||(l[15]=e("span",null,"Body",-1))],8,ot),e("button",{type:"button",class:"btn btn--ghost btn--icon btn--sm",title:"Copy body",onClick:l[3]||(l[3]=ce(f=>L(D(n.entry.request.body),"reqBody"),["stop"]))},[(o(),$(S(d.value==="reqBody"?a(oe):a(re)),{size:12}))])]),V(e("div",rt,[e("pre",ut,c(D(n.entry.request.body)),1)],512),[[W,r.value.requestBody]])])):k("",!0)]),n.entry.response?(o(),u("div",dt,[l[19]||(l[19]=e("h3",{class:"timeline-detail__section-title"},"Response",-1)),Q.value?(o(),u("div",ct,[e("button",{type:"button",class:"timeline-detail__subsection-header","aria-expanded":r.value.responseHeaders,"aria-controls":"responseHeaders-panel",onClick:l[4]||(l[4]=f=>w("responseHeaders"))},[(o(),$(S(r.value.responseHeaders?a(N):a(Z)),{size:16})),l[17]||(l[17]=e("span",null,"Headers",-1)),e("span",yt,"("+c(Object.keys(n.entry.response.headers).length)+")",1)],8,mt),V(e("div",_t,[(o(!0),u(A,null,j(n.entry.response.headers,(f,C)=>(o(),u("div",{key:C,class:"timeline-detail__kv-row"},[e("span",ft,c(C),1),e("span",vt,c(f),1)]))),128))],512),[[W,r.value.responseHeaders]])])):k("",!0),O.value?(o(),u("div",pt,[e("div",ht,[e("button",{type:"button",class:"timeline-detail__subsection-toggle","aria-expanded":r.value.responseBody,"aria-controls":"responseBody-panel",onClick:l[5]||(l[5]=f=>w("responseBody"))},[(o(),$(S(r.value.responseBody?a(N):a(Z)),{size:16})),l[18]||(l[18]=e("span",null,"Body",-1))],8,gt),e("button",{type:"button",class:"btn btn--ghost btn--icon btn--sm",title:"Copy body",onClick:l[6]||(l[6]=ce(f=>L(D(n.entry.response.body),"resBody"),["stop"]))},[(o(),$(S(d.value==="resBody"?a(oe):a(re)),{size:12}))])]),V(e("div",bt,[e("pre",xt,c(D(n.entry.response.body)),1)],512),[[W,r.value.responseBody]])])):k("",!0)])):(o(),u("div",kt,[l[21]||(l[21]=e("h3",{class:"timeline-detail__section-title"},"Response",-1)),e("div",qt,[x(a(P),{size:24,class:"timeline-detail__pending-icon"}),l[20]||(l[20]=e("span",{class:"text-muted"},"Waiting for response...",-1))])]))])):(o(),u("div",we,[x(a(P),{size:48,class:"timeline-detail__empty-icon"}),l[7]||(l[7]=e("h3",{class:"timeline-detail__empty-title"},"Select an entry",-1)),l[8]||(l[8]=e("p",{class:"timeline-detail__empty-description"}," Click on a timeline entry to view its details. ",-1))]))]))}}),$t=de(Ct,[["__scopeId","data-v-b4bdd2d2"]]),St={class:"timeline-entry__time font-mono text-muted"},Tt={class:"timeline-entry__method"},Bt={class:"timeline-entry__path font-mono"},wt={class:"timeline-entry__status"},Et={key:1,class:"status-badge status-badge--pending"},It={class:"timeline-entry__duration font-mono text-muted"},zt={key:0,class:"timeline-entry__simulated",title:"Simulated response"},Rt=ue({__name:"TimelineEntry",props:{entry:{},isSelected:{type:Boolean,default:!1}},emits:["select"],setup(n,{emit:s}){const r=n,d=s,q=v(()=>new Date(r.entry.request.timestamp).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3})),g=v(()=>r.entry.duration===null?"pending...":r.entry.duration<1e3?`${r.entry.duration}ms`:`${(r.entry.duration/1e3).toFixed(2)}s`),p=v(()=>r.entry.status===null?"status-badge--pending":r.entry.status<200?"status-badge--1xx":r.entry.status<300?"status-badge--2xx":r.entry.status<400?"status-badge--3xx":r.entry.status<500?"status-badge--4xx":"status-badge--5xx"),R=v(()=>r.entry.status===null?P:r.entry.status<400?Se:qe),H=v(()=>r.entry.response===null);function B(){d("select",r.entry.id)}return(Q,O)=>(o(),u("button",{type:"button",class:z(["timeline-entry",{"timeline-entry--selected":n.isSelected},{"timeline-entry--pending":H.value},{"timeline-entry--simulated":n.entry.simulated}]),onClick:B},[e("div",St,c(q.value),1),e("div",Tt,[e("span",{class:z(["method-badge",`method-badge--${n.entry.request.method.toLowerCase()}`])},c(a(_e)(n.entry.request.method)),3)]),e("div",Bt,c(n.entry.request.path),1),e("div",wt,[n.entry.status!==null?(o(),u("span",{key:0,class:z(["status-badge",p.value])},[(o(),$(S(R.value),{size:12})),M(" "+c(n.entry.status),1)],2)):(o(),u("span",Et,[x(a(P),{size:12}),O[0]||(O[0]=M(" pending ",-1))]))]),e("div",It,c(g.value),1),n.entry.simulated?(o(),u("div",zt,[x(a(ve),{size:14})])):k("",!0)],2))}}),Ot=de(Rt,[["__scopeId","data-v-a073dbdf"]]),Dt={class:"timeline-page"},Ft={class:"timeline-toolbar"},Ht={class:"timeline-search"},Qt=["value"],Lt=["aria-expanded"],At={key:0,class:"timeline-filter-toggle__badge"},Mt={class:"timeline-stats"},Nt={class:"timeline-stats__item"},jt={key:0,class:"timeline-stats__separator"},Pt={key:1,class:"timeline-stats__item"},Ut=["disabled"],Jt={key:0,class:"timeline-filters"},Vt={class:"timeline-filters__section"},Wt={class:"timeline-filters__methods"},Zt=["onClick"],Gt={class:"timeline-filters__section"},Kt={class:"timeline-filters__status"},Xt=["onClick"],Yt={class:"timeline-filters__status-count"},es={class:"timeline-filters__section"},ts={class:"timeline-filters__type"},ss={key:0,class:"timeline-filters__actions"},ns={class:"timeline-content"},is={key:0,class:"timeline-loading"},ls={key:1,class:"timeline-error"},as={class:"timeline-error__message"},os={key:2,class:"timeline-empty empty-state"},rs={key:3,class:"timeline-empty empty-state"},us={class:"timeline-list-panel"},ds={class:"timeline-list"},cs={class:"timeline-detail-panel"},ms=ue({__name:"TimelinePage",setup(n){const s=Te(),{send:r,on:d,connected:q}=Ce(),g=T(!1),p=T(null),R=["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD","TRACE"],H=["2xx","3xx","4xx","5xx"];function B(){q.value&&(s.setLoading(!0),r({type:"get:timeline"}))}function Q(y){s.setTimelineData(y),s.setLoading(!1)}function O(y){s.addRequest(y)}function D(y){s.addResponse(y)}function w(){s.clearTimeline()}function L(){r({type:"clear:timeline"}),s.clearTimeline()}function U(y){s.selectEntry(y)}function b(y){const _=y.target;s.setSearchQuery(_.value)}function l(){s.setSearchQuery(""),p.value?.focus()}function f(y){s.toggleMethodFilter(y)}function C(y){return s.filter.methods.includes(y)}function se(y){s.toggleStatusFilter(y)}function ne(y){return s.filter.statusCodes.includes(y)}function ie(){const y=s.filter.simulatedOnly;s.setSimulatedFilter(y===!0?null:!0)}function G(){s.clearFilters()}function le(){g.value=!g.value}const J=v(()=>s.hasActiveFilters()),K=v(()=>s.filter.methods.length+s.filter.statusCodes.length+(s.filter.simulatedOnly!==null?1:0));let X=null,Y=null,ee=null,te=null;return he(()=>{X=d("timeline",Q),Y=d("request",O),ee=d("response",D),te=d("timeline:cleared",w),q.value&&B()}),ge(()=>{X?.(),Y?.(),ee?.(),te?.()}),be(q,y=>{y&&B()}),(y,_)=>(o(),u("div",Dt,[e("div",Ft,[e("div",Ht,[x(a(me),{size:16,class:"timeline-search__icon"}),e("input",{ref_key:"searchInputRef",ref:p,type:"text",class:"timeline-search__input input",placeholder:"Search by path or operation...",value:a(s).filter.searchQuery,onInput:b},null,40,Qt),a(s).filter.searchQuery?(o(),u("button",{key:0,type:"button",class:"timeline-search__clear btn btn--ghost btn--icon",title:"Clear search",onClick:l},[x(a(ye),{size:14})])):k("",!0)]),e("button",{type:"button",class:z(["timeline-filter-toggle btn btn--secondary",{"timeline-filter-toggle--active":J.value}]),"aria-expanded":g.value,onClick:le},[x(a(xe),{size:16}),_[0]||(_[0]=e("span",null,"Filters",-1)),K.value>0?(o(),u("span",At,c(K.value),1)):k("",!0),(o(),$(S(g.value?a(ke):a(N)),{size:14}))],10,Lt),e("div",Mt,[e("span",Nt,c(a(s).filteredEntries.length)+" requests ",1),a(s).averageDuration>0?(o(),u("span",jt,"|")):k("",!0),a(s).averageDuration>0?(o(),u("span",Pt," avg "+c(a(s).averageDuration)+"ms ",1)):k("",!0)]),e("button",{type:"button",class:"btn btn--secondary btn--icon",title:"Clear timeline",disabled:a(s).entries.length===0,onClick:L},[x(a($e),{size:16})],8,Ut)]),g.value?(o(),u("div",Jt,[e("div",Vt,[_[1]||(_[1]=e("h4",{class:"timeline-filters__title"},"Methods",-1)),e("div",Wt,[(o(),u(A,null,j(R,h=>e("button",{key:h,type:"button",class:z(["method-badge",`method-badge--${h.toLowerCase()}`,{"method-badge--inactive":!C(h)&&a(s).filter.methods.length>0}]),onClick:ae=>f(h)},c(h),11,Zt)),64))])]),e("div",Gt,[_[2]||(_[2]=e("h4",{class:"timeline-filters__title"},"Status",-1)),e("div",Kt,[(o(),u(A,null,j(H,h=>e("button",{key:h,type:"button",class:z(["timeline-filters__status-btn",`timeline-filters__status-btn--${h}`,{"timeline-filters__status-btn--active":ne(h)}]),onClick:ae=>se(h)},[M(c(h)+" ",1),e("span",Yt," ("+c(a(s).statusCounts[h])+") ",1)],10,Xt)),64))])]),e("div",es,[_[3]||(_[3]=e("h4",{class:"timeline-filters__title"},"Type",-1)),e("div",ts,[e("button",{type:"button",class:z(["timeline-filters__status-btn",{"timeline-filters__status-btn--active":a(s).filter.simulatedOnly}]),onClick:ie}," Simulated only ",2)])]),J.value?(o(),u("div",ss,[e("button",{type:"button",class:"btn btn--ghost",onClick:G},[x(a(ye),{size:14}),_[4]||(_[4]=M(" Clear all filters ",-1))])])):k("",!0)])):k("",!0),e("div",ns,[a(s).isLoading?(o(),u("div",is,[..._[5]||(_[5]=[e("div",{class:"timeline-loading__spinner"},null,-1),e("span",{class:"text-muted"},"Loading timeline...",-1)])])):a(s).error?(o(),u("div",ls,[e("p",as,c(a(s).error),1),e("button",{type:"button",class:"btn btn--primary",onClick:B}," Retry ")])):a(s).entries.length===0?(o(),u("div",os,[x(a(P),{size:48,class:"empty-state__icon"}),_[6]||(_[6]=e("h3",{class:"empty-state__title"},"No requests yet",-1)),_[7]||(_[7]=e("p",{class:"empty-state__description"}," API requests will appear here in real-time as they are made. ",-1))])):a(s).filteredEntries.length===0?(o(),u("div",rs,[x(a(me),{size:48,class:"empty-state__icon"}),_[8]||(_[8]=e("h3",{class:"empty-state__title"},"No matching requests",-1)),_[9]||(_[9]=e("p",{class:"empty-state__description"}," Try adjusting your search or filters. ",-1)),J.value?(o(),u("button",{key:0,type:"button",class:"btn btn--secondary",onClick:G}," Clear filters ")):k("",!0)])):(o(),u(A,{key:4},[e("div",us,[e("div",ds,[(o(!0),u(A,null,j(a(s).filteredEntries,h=>(o(),$(Ot,{key:h.id,entry:h,"is-selected":a(s).selectedEntryId===h.id,onSelect:U},null,8,["entry","is-selected"]))),128))])]),e("div",cs,[x($t,{entry:a(s).selectedEntry},null,8,["entry"])])],64))])]))}}),xs=de(ms,[["__scopeId","data-v-a5c73778"]]);export{xs as default};
|
|
2
|
-
//# sourceMappingURL=TimelinePage-CwR-Coxj.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RoutesPage-Bhnu6w5-.js","assets/format-B1udViy3.js","assets/vue-vendor-CtA47il-.js","assets/useWebSocket-C2ttWF5T.js","assets/registry-Z11QUkpV.js","assets/x-zxrccEon.js","assets/RoutesPage-BVXzvJ2S.css","assets/TimelinePage-CwR-Coxj.js","assets/check-DxJBRQqh.js","assets/triangle-alert-CAGaIjAo.js","assets/trash-2-CDyKV6GB.js","assets/TimelinePage-BDyp8kvu.css","assets/ModelsPage-DqYHHuAQ.js","assets/ModelsPage-DQN_XP0u.css","assets/SimulatorPage-ROKoAmUT.js","assets/SimulatorPage-B1voZDRi.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{h as E,c as S,a as $,d as j,b as y,e as d,f as k,u as g,F as N,r as V,g as w,i as b,n as M,t as P,j as C,w as x,k as q,l as U,m as Z,o as _,T as F,p as H,q as W}from"./vue-vendor-CtA47il-.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))c(t);new MutationObserver(t=>{for(const a of t)if(a.type==="childList")for(const i of a.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&c(i)}).observe(document,{childList:!0,subtree:!0});function r(t){const a={};return t.integrity&&(a.integrity=t.integrity),t.referrerPolicy&&(a.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?a.credentials="include":t.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function c(t){if(t.ep)return;t.ep=!0;const a=r(t);fetch(t.href,a)}})();const L=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),K=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(n,r,c)=>c?c.toUpperCase():r.toLowerCase()),G=e=>{const n=K(e);return n.charAt(0).toUpperCase()+n.slice(1)},J=(...e)=>e.filter((n,r,c)=>!!n&&n.trim()!==""&&c.indexOf(n)===r).join(" ").trim();var h={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const Q=({size:e,strokeWidth:n=2,absoluteStrokeWidth:r,color:c,iconNode:t,name:a,class:i,...l},{slots:p})=>E("svg",{...h,width:e||h.width,height:e||h.height,stroke:c||h.stroke,"stroke-width":r?Number(n)*24/Number(e):n,class:J("lucide",...a?[`lucide-${L(G(a))}-icon`,`lucide-${L(a)}`]:["lucide-icon"]),...l},[...t.map(o=>E(...o)),...p.default?[p.default()]:[]]);const f=(e,n)=>(r,{slots:c})=>E(Q,{...r,iconNode:n,name:e},c);const X=f("clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);const Y=f("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);const O=f("route",[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]]);const ee=f("wifi-off",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);const te=f("wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);const z=f("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),oe="modulepreload",ne=function(e){return"/_devtools/"+e},I={},v=function(n,r,c){let t=Promise.resolve();if(r&&r.length>0){let p=function(o){return Promise.all(o.map(u=>Promise.resolve(u).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),l=i?.nonce||i?.getAttribute("nonce");t=p(r.map(o=>{if(o=ne(o),o in I)return;I[o]=!0;const u=o.endsWith(".css"),m=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${o}"]${m}`))return;const s=document.createElement("link");if(s.rel=u?"stylesheet":oe,u||(s.as="script"),s.crossOrigin="",s.href=o,l&&s.setAttribute("nonce",l),document.head.appendChild(s),u)return new Promise((A,B)=>{s.addEventListener("load",A),s.addEventListener("error",()=>B(new Error(`Unable to preload CSS for ${o}`)))})}))}function a(i){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=i,window.dispatchEvent(l),!l.defaultPrevented)throw i}return t.then(i=>{for(const l of i||[])l.status==="rejected"&&a(l.reason);return n().catch(a)})},D=[{path:"/",redirect:"/routes"},{path:"/routes",name:"routes",component:()=>v(()=>import("./RoutesPage-Bhnu6w5-.js"),__vite__mapDeps([0,1,2,3,4,5,6])),meta:{title:"Routes",icon:"route"}},{path:"/timeline",name:"timeline",component:()=>v(()=>import("./TimelinePage-CwR-Coxj.js"),__vite__mapDeps([7,2,1,8,9,3,5,10,11])),meta:{title:"Timeline",icon:"clock"}},{path:"/models",name:"models",component:()=>v(()=>import("./ModelsPage-DqYHHuAQ.js"),__vite__mapDeps([12,2,8,3,5,10,13])),meta:{title:"Models",icon:"database"}},{path:"/simulator",name:"simulator",component:()=>v(()=>import("./SimulatorPage-ROKoAmUT.js"),__vite__mapDeps([14,2,3,4,9,10,15])),meta:{title:"Simulator",icon:"zap"}},{path:"/:pathMatch(.*)*",name:"not-found",redirect:"/routes"}],ae=S({history:$(),routes:D}),se={class:"app"},re={class:"app-header"},ce={class:"app-header__brand"},ie={class:"app-nav",role:"tablist","aria-label":"DevTools navigation"},le=["aria-selected","aria-current","aria-controls","onClick"],ue={class:"app-nav__label"},de={class:"app-header__status"},pe={class:"connection-status"},me={class:"connection-status__text"},_e={class:"app-main"},fe=j({__name:"App",setup(e){const n=U(),r=Z(),c=w(()=>D.filter(o=>o.name&&o.meta?.title).map(o=>({name:o.name,path:o.path,title:o.meta?.title,icon:o.meta?.icon}))),t=w(()=>n.name);function a(o){r.push(o)}const i={route:O,clock:X,database:Y,zap:z};function l(o){return i[o]??O}const p=w(()=>!1);return(o,u)=>{const m=q("router-view");return _(),y("div",se,[d("header",re,[d("div",ce,[k(g(z),{class:"app-header__logo",size:20}),u[0]||(u[0]=d("span",{class:"app-header__title"},"OpenAPI DevTools",-1))]),d("nav",ie,[(_(!0),y(N,null,V(c.value,s=>(_(),y("button",{key:s.name,role:"tab","aria-selected":t.value===s.name,"aria-current":t.value===s.name?"true":void 0,"aria-controls":`panel-${s.name}`,tabindex:0,class:M(["app-nav__tab",{"app-nav__tab--active":t.value===s.name}]),onClick:A=>a(s.path)},[(_(),b(C(l(s.icon)),{size:16,class:"app-nav__icon"})),d("span",ue,P(s.title),1)],10,le))),128))]),d("div",de,[d("div",pe,[d("span",{class:M(["connection-status__dot",p.value?"connection-status__dot--connected":"connection-status__dot--disconnected"])},null,2),d("span",me,P(p.value?"Connected":"Disconnected"),1),(_(),b(C(p.value?g(te):g(ee)),{size:14,class:"connection-status__icon"}))])])]),d("main",_e,[k(m,null,{default:x(({Component:s})=>[k(F,{name:"fade",mode:"out-in"},{default:x(()=>[(_(),b(C(s)))]),_:2},1024)]),_:1})])])}}}),he=(e,n)=>{const r=e.__vccOpts||e;for(const[c,t]of n)r[c]=t;return r},ve=he(fe,[["__scopeId","data-v-513332df"]]);let R=!1,T=null;function ye(){if(R)return T;const e=H(ve),n=W();return e.use(n),e.use(ae),e.mount("#app"),R=!0,T=e,e}typeof window<"u"&&document.getElementById("app")&&ye();export{X as C,Y as D,O as R,z as Z,he as _,f as c};
|
|
3
|
-
//# sourceMappingURL=index-GQ9qRqEi.js.map
|