@copilotkitnext/web-inspector 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/styles/generated.css","../src/lib/context-helpers.ts","../src/lib/persistence.ts"],"sourcesContent":["import { LitElement, css, html, nothing, unsafeCSS } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport tailwindStyles from \"./styles/generated.css\";\nimport logoMarkUrl from \"./assets/logo-mark.svg\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { icons } from \"lucide\";\nimport type { CopilotKitCore, CopilotKitCoreSubscriber } from \"@copilotkitnext/core\";\nimport type { AbstractAgent, AgentSubscriber } from \"@ag-ui/client\";\nimport type { Anchor, ContextKey, ContextState, Position, Size } from \"./lib/types\";\nimport {\n applyAnchorPosition as applyAnchorPositionHelper,\n centerContext as centerContextHelper,\n constrainToViewport,\n keepPositionWithinViewport,\n updateAnchorFromPosition as updateAnchorFromPositionHelper,\n updateSizeFromElement,\n clampSize as clampSizeToViewport,\n} from \"./lib/context-helpers\";\nimport {\n loadInspectorState,\n saveInspectorState,\n type PersistedState,\n isValidAnchor,\n isValidPosition,\n isValidSize,\n} from \"./lib/persistence\";\n\nexport const WEB_INSPECTOR_TAG = \"web-inspector\" as const;\n\ntype LucideIconName = keyof typeof icons;\n\ntype MenuKey = \"ag-ui-events\" | \"agents\" | \"frontend-tools\" | \"agent-context\";\n\ntype MenuItem = {\n key: MenuKey;\n label: string;\n icon: LucideIconName;\n};\n\nconst EDGE_MARGIN = 16;\nconst DRAG_THRESHOLD = 6;\nconst MIN_WINDOW_WIDTH = 260;\nconst MIN_WINDOW_HEIGHT = 200;\nconst COOKIE_NAME = \"copilotkit_inspector_state\";\nconst COOKIE_MAX_AGE_SECONDS = 60 * 60 * 24 * 30; // 30 days\nconst DEFAULT_BUTTON_SIZE: Size = { width: 48, height: 48 };\nconst DEFAULT_WINDOW_SIZE: Size = { width: 320, height: 380 };\nconst MAX_AGENT_EVENTS = 200;\nconst MAX_TOTAL_EVENTS = 500;\n\ntype InspectorEvent = {\n id: string;\n agentId: string;\n type: string;\n timestamp: number;\n payload: unknown;\n};\n\nexport class WebInspectorElement extends LitElement {\n static properties = {\n core: { attribute: false },\n } as const;\n\n private _core: CopilotKitCore | null = null;\n private coreSubscriber: CopilotKitCoreSubscriber | null = null;\n private coreUnsubscribe: (() => void) | null = null;\n private agentSubscriptions: Map<string, () => void> = new Map();\n private agentEvents: Map<string, InspectorEvent[]> = new Map();\n private flattenedEvents: InspectorEvent[] = [];\n private eventCounter = 0;\n\n private pointerId: number | null = null;\n private dragStart: Position | null = null;\n private dragOffset: Position = { x: 0, y: 0 };\n private isDragging = false;\n private pointerContext: ContextKey | null = null;\n private isOpen = false;\n private draggedDuringInteraction = false;\n private ignoreNextButtonClick = false;\n private selectedMenu: MenuKey = \"ag-ui-events\";\n private contextMenuOpen = false;\n\n get core(): CopilotKitCore | null {\n return this._core;\n }\n\n set core(value: CopilotKitCore | null) {\n const oldValue = this._core;\n if (oldValue === value) {\n return;\n }\n\n this.detachFromCore();\n\n this._core = value ?? null;\n this.requestUpdate(\"core\", oldValue);\n\n if (this._core) {\n this.attachToCore(this._core);\n }\n }\n\n private readonly contextState: Record<ContextKey, ContextState> = {\n button: {\n position: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n size: { ...DEFAULT_BUTTON_SIZE },\n anchor: { horizontal: \"right\", vertical: \"bottom\" },\n anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n },\n window: {\n position: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n size: { ...DEFAULT_WINDOW_SIZE },\n anchor: { horizontal: \"right\", vertical: \"bottom\" },\n anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n },\n };\n\n private hasCustomPosition: Record<ContextKey, boolean> = {\n button: false,\n window: false,\n };\n\n private resizePointerId: number | null = null;\n private resizeStart: Position | null = null;\n private resizeInitialSize: { width: number; height: number } | null = null;\n private isResizing = false;\n\n private readonly menuItems: MenuItem[] = [\n { key: \"ag-ui-events\", label: \"AG-UI Events\", icon: \"Zap\" },\n { key: \"agents\", label: \"Agents\", icon: \"Bot\" },\n { key: \"frontend-tools\", label: \"Frontend Tools\", icon: \"Hammer\" },\n { key: \"agent-context\", label: \"Agent Context\", icon: \"FileText\" },\n ];\n\n private attachToCore(core: CopilotKitCore): void {\n this.coreSubscriber = {\n onAgentsChanged: ({ agents }) => {\n this.processAgentsChanged(agents);\n },\n } satisfies CopilotKitCoreSubscriber;\n\n this.coreUnsubscribe = core.subscribe(this.coreSubscriber);\n this.processAgentsChanged(core.agents);\n }\n\n private detachFromCore(): void {\n if (this.coreUnsubscribe) {\n this.coreUnsubscribe();\n this.coreUnsubscribe = null;\n }\n this.coreSubscriber = null;\n this.teardownAgentSubscriptions();\n }\n\n private teardownAgentSubscriptions(): void {\n for (const unsubscribe of this.agentSubscriptions.values()) {\n unsubscribe();\n }\n this.agentSubscriptions.clear();\n this.agentEvents.clear();\n this.flattenedEvents = [];\n this.eventCounter = 0;\n }\n\n private processAgentsChanged(agents: Readonly<Record<string, AbstractAgent>>): void {\n const seenAgentIds = new Set<string>();\n\n for (const agent of Object.values(agents)) {\n if (!agent?.agentId) {\n continue;\n }\n seenAgentIds.add(agent.agentId);\n this.subscribeToAgent(agent);\n }\n\n for (const agentId of Array.from(this.agentSubscriptions.keys())) {\n if (!seenAgentIds.has(agentId)) {\n this.unsubscribeFromAgent(agentId);\n this.agentEvents.delete(agentId);\n }\n }\n\n this.updateContextOptions(seenAgentIds);\n this.requestUpdate();\n }\n\n private subscribeToAgent(agent: AbstractAgent): void {\n if (!agent.agentId) {\n return;\n }\n\n const agentId = agent.agentId;\n\n this.unsubscribeFromAgent(agentId);\n\n const subscriber: AgentSubscriber = {\n onRunStartedEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RUN_STARTED\", event);\n },\n onRunFinishedEvent: ({ event, result }) => {\n this.recordAgentEvent(agentId, \"RUN_FINISHED\", { event, result });\n },\n onRunErrorEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RUN_ERROR\", event);\n },\n onTextMessageStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_START\", event);\n },\n onTextMessageContentEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_CONTENT\", { event, textMessageBuffer });\n },\n onTextMessageEndEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_END\", { event, textMessageBuffer });\n },\n onToolCallStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_START\", event);\n },\n onToolCallArgsEvent: ({ event, toolCallBuffer, toolCallName, partialToolCallArgs }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_ARGS\", { event, toolCallBuffer, toolCallName, partialToolCallArgs });\n },\n onToolCallEndEvent: ({ event, toolCallArgs, toolCallName }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_END\", { event, toolCallArgs, toolCallName });\n },\n onToolCallResultEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_RESULT\", event);\n },\n onStateSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_SNAPSHOT\", event);\n },\n onStateDeltaEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_DELTA\", event);\n },\n onMessagesSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"MESSAGES_SNAPSHOT\", event);\n },\n onRawEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RAW_EVENT\", event);\n },\n onCustomEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"CUSTOM_EVENT\", event);\n },\n };\n\n const { unsubscribe } = agent.subscribe(subscriber);\n this.agentSubscriptions.set(agentId, unsubscribe);\n\n if (!this.agentEvents.has(agentId)) {\n this.agentEvents.set(agentId, []);\n }\n }\n\n private unsubscribeFromAgent(agentId: string): void {\n const unsubscribe = this.agentSubscriptions.get(agentId);\n if (unsubscribe) {\n unsubscribe();\n this.agentSubscriptions.delete(agentId);\n }\n }\n\n private recordAgentEvent(agentId: string, type: string, payload: unknown): void {\n const eventId = `${agentId}:${++this.eventCounter}`;\n const event: InspectorEvent = {\n id: eventId,\n agentId,\n type,\n timestamp: Date.now(),\n payload,\n };\n\n const currentAgentEvents = this.agentEvents.get(agentId) ?? [];\n const nextAgentEvents = [event, ...currentAgentEvents].slice(0, MAX_AGENT_EVENTS);\n this.agentEvents.set(agentId, nextAgentEvents);\n\n this.flattenedEvents = [event, ...this.flattenedEvents].slice(0, MAX_TOTAL_EVENTS);\n this.requestUpdate();\n }\n\n private updateContextOptions(agentIds: Set<string>): void {\n const nextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ...Array.from(agentIds)\n .sort((a, b) => a.localeCompare(b))\n .map((id) => ({ key: id, label: id })),\n ];\n\n const optionsChanged =\n this.contextOptions.length !== nextOptions.length ||\n this.contextOptions.some((option, index) => option.key !== nextOptions[index]?.key);\n\n if (optionsChanged) {\n this.contextOptions = nextOptions;\n }\n\n if (!nextOptions.some((option) => option.key === this.selectedContext)) {\n this.selectedContext = \"all-agents\";\n this.expandedRows.clear();\n }\n }\n\n private getEventsForSelectedContext(): InspectorEvent[] {\n if (this.selectedContext === \"all-agents\") {\n return this.flattenedEvents;\n }\n\n return this.agentEvents.get(this.selectedContext) ?? [];\n }\n\n private getEventBadgeClasses(type: string): string {\n const base = \"font-mono text-[10px] font-medium inline-flex items-center rounded-sm px-1.5 py-0.5 border\";\n\n if (type.startsWith(\"RUN_\")) {\n return `${base} bg-blue-50 text-blue-700 border-blue-200`;\n }\n\n if (type.startsWith(\"TEXT_MESSAGE\")) {\n return `${base} bg-emerald-50 text-emerald-700 border-emerald-200`;\n }\n\n if (type.startsWith(\"TOOL_CALL\")) {\n return `${base} bg-amber-50 text-amber-700 border-amber-200`;\n }\n\n if (type.startsWith(\"STATE\")) {\n return `${base} bg-violet-50 text-violet-700 border-violet-200`;\n }\n\n if (type.startsWith(\"MESSAGES\")) {\n return `${base} bg-sky-50 text-sky-700 border-sky-200`;\n }\n\n if (type === \"RUN_ERROR\") {\n return `${base} bg-rose-50 text-rose-700 border-rose-200`;\n }\n\n return `${base} bg-gray-100 text-gray-600 border-gray-200`;\n }\n\n private stringifyPayload(payload: unknown, pretty: boolean): string {\n try {\n if (payload === undefined) {\n return pretty ? \"undefined\" : \"undefined\";\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n return JSON.stringify(payload, null, pretty ? 2 : 0) ?? \"\";\n } catch (error) {\n console.warn(\"Failed to stringify inspector payload\", error);\n return String(payload);\n }\n }\n\n static styles = [\n unsafeCSS(tailwindStyles),\n css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 2147483646;\n display: block;\n will-change: transform;\n }\n\n .console-button {\n transition:\n transform 160ms ease,\n opacity 160ms ease;\n }\n\n .resize-handle {\n touch-action: none;\n user-select: none;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n window.addEventListener(\"pointerdown\", this.handleGlobalPointerDown as EventListener);\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"resize\", this.handleResize);\n window.removeEventListener(\"pointerdown\", this.handleGlobalPointerDown as EventListener);\n }\n this.detachFromCore();\n }\n\n firstUpdated(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n this.measureContext(\"button\");\n this.measureContext(\"window\");\n\n this.contextState.button.anchor = { horizontal: \"right\", vertical: \"bottom\" };\n this.contextState.button.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.contextState.window.anchor = { horizontal: \"right\", vertical: \"bottom\" };\n this.contextState.window.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.hydrateStateFromCookie();\n\n this.applyAnchorPosition(\"button\");\n\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n\n this.updateHostTransform(\"button\");\n }\n\n render() {\n return this.isOpen ? this.renderWindow() : this.renderButton();\n }\n\n private renderButton() {\n const buttonClasses = [\n \"console-button\",\n \"group\",\n \"pointer-events-auto\",\n \"inline-flex\",\n \"h-12\",\n \"w-12\",\n \"items-center\",\n \"justify-center\",\n \"rounded-full\",\n \"border\",\n \"border-white/20\",\n \"bg-slate-950/95\",\n \"text-xs\",\n \"font-medium\",\n \"text-white\",\n \"ring-1\",\n \"ring-white/10\",\n \"backdrop-blur-md\",\n \"transition\",\n \"hover:border-white/30\",\n \"hover:bg-slate-900/95\",\n \"hover:scale-105\",\n \"focus-visible:outline\",\n \"focus-visible:outline-2\",\n \"focus-visible:outline-offset-2\",\n \"focus-visible:outline-rose-500\",\n \"touch-none\",\n \"select-none\",\n this.isDragging ? \"cursor-grabbing\" : \"cursor-grab\",\n ].join(\" \");\n\n return html`\n <button\n class=${buttonClasses}\n type=\"button\"\n aria-label=\"Web Inspector\"\n data-drag-context=\"button\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n @click=${this.handleButtonClick}\n >\n <img src=${logoMarkUrl} alt=\"\" class=\"h-7 w-7\" loading=\"lazy\" />\n </button>\n `;\n }\n\n private renderWindow() {\n const windowState = this.contextState.window;\n const windowStyles = {\n width: `${Math.round(windowState.size.width)}px`,\n height: `${Math.round(windowState.size.height)}px`,\n minWidth: `${MIN_WINDOW_WIDTH}px`,\n minHeight: `${MIN_WINDOW_HEIGHT}px`,\n };\n const contextDropdown = this.renderContextDropdown();\n const hasContextDropdown = contextDropdown !== nothing;\n\n return html`\n <section\n class=\"inspector-window pointer-events-auto relative flex flex-col overflow-hidden rounded-xl border border-gray-200 bg-white text-gray-900 shadow-lg\"\n style=${styleMap(windowStyles)}\n >\n <div class=\"flex flex-1 overflow-hidden bg-white text-gray-800\">\n <nav\n class=\"flex w-56 shrink-0 flex-col justify-between border-r border-gray-200 bg-gray-50/50 px-3 pb-3 pt-3 text-xs\"\n aria-label=\"Inspector sections\"\n >\n <div class=\"flex flex-col gap-4 overflow-y-auto\">\n <div\n class=\"flex items-center gap-2 pl-1 touch-none select-none ${this.isDragging && this.pointerContext === 'window' ? 'cursor-grabbing' : 'cursor-grab'}\"\n data-drag-context=\"window\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n >\n <span\n class=\"flex h-8 w-8 items-center justify-center rounded-lg bg-gray-900 text-white pointer-events-none\"\n >\n ${this.renderIcon(\"Building2\")}\n </span>\n <div class=\"flex flex-1 flex-col leading-tight pointer-events-none\">\n <span class=\"text-sm font-semibold text-gray-900\">Acme Inc</span>\n <span class=\"text-[10px] text-gray-500\">Enterprise</span>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-2 pt-2\">\n <div class=\"px-1 text-[10px] font-semibold uppercase tracking-wider text-gray-400\">Platform</div>\n <div class=\"flex flex-col gap-0.5\">\n ${this.menuItems.map(({ key, label, icon }) => {\n const isSelected = this.selectedMenu === key;\n const buttonClasses = [\n \"group flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-xs transition focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-300\",\n isSelected\n ? \"bg-gray-900 text-white\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n ].join(\" \");\n\n const badgeClasses = isSelected\n ? \"bg-gray-800 text-white\"\n : \"bg-white border border-gray-200 text-gray-500 group-hover:border-gray-300 group-hover:text-gray-700\";\n\n return html`\n <button\n type=\"button\"\n class=${buttonClasses}\n aria-pressed=${isSelected}\n @click=${() => this.handleMenuSelect(key)}\n >\n <span\n class=\"flex h-6 w-6 items-center justify-center rounded ${badgeClasses}\"\n aria-hidden=\"true\"\n >\n ${this.renderIcon(icon)}\n </span>\n <span class=\"flex-1\">${label}</span>\n <span class=\"text-gray-400 opacity-60\">${this.renderIcon(\"ChevronRight\")}</span>\n </button>\n `;\n })}\n </div>\n </div>\n </div>\n\n <div\n class=\"relative flex items-center rounded-lg border border-gray-200 bg-white px-2 py-2 text-left text-xs text-gray-700 cursor-pointer hover:bg-gray-50 transition\"\n >\n <span\n class=\"w-6 h-6 flex items-center justify-center overflow-hidden rounded bg-gray-100 text-[10px] font-semibold text-gray-700\"\n >\n JS\n </span>\n <div class=\"pl-2 flex flex-1 flex-col leading-tight\">\n <span class=\"font-medium text-gray-900\">John Snow</span>\n <span class=\"text-[10px] text-gray-500\">john@snow.com</span>\n </div>\n <span class=\"text-gray-300\">${this.renderIcon(\"ChevronRight\")}</span>\n </div>\n </nav>\n <div class=\"relative flex flex-1 flex-col overflow-hidden\">\n <div\n class=\"drag-handle flex items-center justify-between border-b border-gray-200 px-4 py-3 touch-none select-none ${this.isDragging && this.pointerContext === 'window' ? 'cursor-grabbing' : 'cursor-grab'}\"\n data-drag-context=\"window\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n >\n <div class=\"flex items-center gap-2 text-xs text-gray-500\">\n <span class=\"text-gray-400\">\n ${this.renderIcon(this.getSelectedMenu().icon)}\n </span>\n <div class=\"flex items-center text-xs text-gray-600\">\n <span class=\"pr-3\">${this.getSelectedMenu().label}</span>\n ${hasContextDropdown\n ? html`\n <span class=\"h-3 w-px bg-gray-200\"></span>\n <div class=\"pl-3\">${contextDropdown}</div>\n `\n : nothing}\n </div>\n </div>\n <button\n class=\"flex h-6 w-6 items-center justify-center rounded text-gray-400 transition hover:bg-gray-100 hover:text-gray-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\"\n type=\"button\"\n aria-label=\"Close Web Inspector\"\n @pointerdown=${this.handleClosePointerDown}\n @click=${this.handleCloseClick}\n >\n ${this.renderIcon(\"X\")}\n </button>\n </div>\n <div class=\"flex-1 overflow-auto\">\n ${this.renderMainContent()}\n <slot></slot>\n </div>\n </div>\n </div>\n <div\n class=\"resize-handle pointer-events-auto absolute bottom-1 right-1 flex h-5 w-5 cursor-nwse-resize items-center justify-center text-gray-400 transition hover:text-gray-600\"\n role=\"presentation\"\n aria-hidden=\"true\"\n @pointerdown=${this.handleResizePointerDown}\n @pointermove=${this.handleResizePointerMove}\n @pointerup=${this.handleResizePointerUp}\n @pointercancel=${this.handleResizePointerCancel}\n >\n <svg\n class=\"h-3 w-3\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-width=\"1.5\"\n >\n <path d=\"M5 15L15 5\" />\n <path d=\"M9 15L15 9\" />\n </svg>\n </div>\n </section>\n `;\n }\n\n private hydrateStateFromCookie(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(COOKIE_NAME);\n if (!persisted) {\n return;\n }\n\n const persistedButton = persisted.button;\n if (persistedButton) {\n if (isValidAnchor(persistedButton.anchor)) {\n this.contextState.button.anchor = persistedButton.anchor;\n }\n\n if (isValidPosition(persistedButton.anchorOffset)) {\n this.contextState.button.anchorOffset = persistedButton.anchorOffset;\n }\n\n if (typeof persistedButton.hasCustomPosition === \"boolean\") {\n this.hasCustomPosition.button = persistedButton.hasCustomPosition;\n }\n }\n\n const persistedWindow = persisted.window;\n if (persistedWindow) {\n if (isValidAnchor(persistedWindow.anchor)) {\n this.contextState.window.anchor = persistedWindow.anchor;\n }\n\n if (isValidPosition(persistedWindow.anchorOffset)) {\n this.contextState.window.anchorOffset = persistedWindow.anchorOffset;\n }\n\n if (isValidSize(persistedWindow.size)) {\n this.contextState.window.size = this.clampWindowSize(persistedWindow.size);\n }\n\n if (typeof persistedWindow.hasCustomPosition === \"boolean\") {\n this.hasCustomPosition.window = persistedWindow.hasCustomPosition;\n }\n }\n }\n\n private get activeContext(): ContextKey {\n return this.isOpen ? \"window\" : \"button\";\n }\n\n private handlePointerDown = (event: PointerEvent) => {\n const target = event.currentTarget as HTMLElement | null;\n const contextAttr = target?.dataset.dragContext;\n const context: ContextKey = contextAttr === \"window\" ? \"window\" : \"button\";\n\n this.pointerContext = context;\n this.measureContext(context);\n\n event.preventDefault();\n\n this.pointerId = event.pointerId;\n this.dragStart = { x: event.clientX, y: event.clientY };\n const state = this.contextState[context];\n this.dragOffset = {\n x: event.clientX - state.position.x,\n y: event.clientY - state.position.y,\n };\n this.isDragging = false;\n this.draggedDuringInteraction = false;\n this.ignoreNextButtonClick = false;\n\n target?.setPointerCapture?.(this.pointerId);\n };\n\n private handlePointerMove = (event: PointerEvent) => {\n if (this.pointerId !== event.pointerId || !this.dragStart || !this.pointerContext) {\n return;\n }\n\n const distance = Math.hypot(event.clientX - this.dragStart.x, event.clientY - this.dragStart.y);\n if (!this.isDragging && distance < DRAG_THRESHOLD) {\n return;\n }\n\n event.preventDefault();\n this.setDragging(true);\n this.draggedDuringInteraction = true;\n\n const desired: Position = {\n x: event.clientX - this.dragOffset.x,\n y: event.clientY - this.dragOffset.y,\n };\n\n const constrained = this.constrainToViewport(desired, this.pointerContext);\n this.contextState[this.pointerContext].position = constrained;\n this.updateHostTransform(this.pointerContext);\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.pointerId)) {\n target.releasePointerCapture(this.pointerId);\n }\n\n const context = this.pointerContext ?? this.activeContext;\n\n if (this.isDragging && this.pointerContext) {\n event.preventDefault();\n this.setDragging(false);\n this.updateAnchorFromPosition(this.pointerContext);\n if (this.pointerContext === \"window\") {\n this.hasCustomPosition.window = true;\n } else if (this.pointerContext === \"button\") {\n this.hasCustomPosition.button = true;\n if (this.draggedDuringInteraction) {\n this.ignoreNextButtonClick = true;\n }\n }\n this.applyAnchorPosition(this.pointerContext);\n } else if (context === \"button\" && !this.isOpen && !this.draggedDuringInteraction) {\n this.openInspector();\n }\n\n this.resetPointerTracking();\n };\n\n private handlePointerCancel = (event: PointerEvent) => {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.pointerId)) {\n target.releasePointerCapture(this.pointerId);\n }\n\n this.resetPointerTracking();\n };\n\n private handleButtonClick = (event: Event) => {\n if (this.isDragging) {\n event.preventDefault();\n return;\n }\n\n if (this.ignoreNextButtonClick) {\n event.preventDefault();\n this.ignoreNextButtonClick = false;\n return;\n }\n\n if (!this.isOpen) {\n event.preventDefault();\n this.openInspector();\n }\n };\n\n private handleClosePointerDown = (event: PointerEvent) => {\n event.stopPropagation();\n event.preventDefault();\n };\n\n private handleCloseClick = () => {\n this.closeInspector();\n };\n\n private handleResizePointerDown = (event: PointerEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n this.hasCustomPosition.window = true;\n this.isResizing = true;\n this.resizePointerId = event.pointerId;\n this.resizeStart = { x: event.clientX, y: event.clientY };\n this.resizeInitialSize = { ...this.contextState.window.size };\n\n const target = event.currentTarget as HTMLElement | null;\n target?.setPointerCapture?.(event.pointerId);\n };\n\n private handleResizePointerMove = (event: PointerEvent) => {\n if (!this.isResizing || this.resizePointerId !== event.pointerId || !this.resizeStart || !this.resizeInitialSize) {\n return;\n }\n\n event.preventDefault();\n\n const deltaX = event.clientX - this.resizeStart.x;\n const deltaY = event.clientY - this.resizeStart.y;\n const state = this.contextState.window;\n\n state.size = this.clampWindowSize({\n width: this.resizeInitialSize.width + deltaX,\n height: this.resizeInitialSize.height + deltaY,\n });\n this.keepPositionWithinViewport(\"window\");\n this.updateAnchorFromPosition(\"window\");\n this.requestUpdate();\n this.updateHostTransform(\"window\");\n };\n\n private handleResizePointerUp = (event: PointerEvent) => {\n if (this.resizePointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.resizePointerId)) {\n target.releasePointerCapture(this.resizePointerId);\n }\n\n this.updateAnchorFromPosition(\"window\");\n this.applyAnchorPosition(\"window\");\n this.resetResizeTracking();\n };\n\n private handleResizePointerCancel = (event: PointerEvent) => {\n if (this.resizePointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.resizePointerId)) {\n target.releasePointerCapture(this.resizePointerId);\n }\n\n this.updateAnchorFromPosition(\"window\");\n this.applyAnchorPosition(\"window\");\n this.resetResizeTracking();\n };\n\n private handleResize = () => {\n this.measureContext(\"button\");\n this.applyAnchorPosition(\"button\");\n\n this.measureContext(\"window\");\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n\n this.updateHostTransform();\n };\n\n private measureContext(context: ContextKey): void {\n const selector = context === \"window\" ? \".inspector-window\" : \".console-button\";\n const element = this.renderRoot?.querySelector(selector) as HTMLElement | null;\n if (!element) {\n return;\n }\n const fallback = context === \"window\" ? DEFAULT_WINDOW_SIZE : DEFAULT_BUTTON_SIZE;\n updateSizeFromElement(this.contextState[context], element, fallback);\n }\n\n private centerContext(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n centerContextHelper(this.contextState[context], viewport, EDGE_MARGIN);\n\n if (context === this.activeContext) {\n this.updateHostTransform(context);\n }\n\n this.hasCustomPosition[context] = false;\n this.persistState();\n }\n\n private ensureWindowPlacement(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (!this.hasCustomPosition.window) {\n this.centerContext(\"window\");\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(this.contextState.window, viewport, EDGE_MARGIN);\n updateAnchorFromPositionHelper(this.contextState.window, viewport, EDGE_MARGIN);\n this.updateHostTransform(\"window\");\n this.persistState();\n }\n\n private constrainToViewport(position: Position, context: ContextKey): Position {\n if (typeof window === \"undefined\") {\n return position;\n }\n\n const viewport = this.getViewportSize();\n return constrainToViewport(this.contextState[context], position, viewport, EDGE_MARGIN);\n }\n\n private keepPositionWithinViewport(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(this.contextState[context], viewport, EDGE_MARGIN);\n }\n\n private getViewportSize(): Size {\n if (typeof window === \"undefined\") {\n return { ...DEFAULT_WINDOW_SIZE };\n }\n\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n private persistState(): void {\n const state: PersistedState = {\n button: {\n anchor: this.contextState.button.anchor,\n anchorOffset: this.contextState.button.anchorOffset,\n hasCustomPosition: this.hasCustomPosition.button,\n },\n window: {\n anchor: this.contextState.window.anchor,\n anchorOffset: this.contextState.window.anchorOffset,\n size: {\n width: Math.round(this.contextState.window.size.width),\n height: Math.round(this.contextState.window.size.height),\n },\n hasCustomPosition: this.hasCustomPosition.window,\n },\n };\n saveInspectorState(COOKIE_NAME, state, COOKIE_MAX_AGE_SECONDS);\n }\n\n private clampWindowSize(size: Size): Size {\n if (typeof window === \"undefined\") {\n return {\n width: Math.max(MIN_WINDOW_WIDTH, size.width),\n height: Math.max(MIN_WINDOW_HEIGHT, size.height),\n };\n }\n\n const viewport = this.getViewportSize();\n return clampSizeToViewport(size, viewport, EDGE_MARGIN, MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT);\n }\n\n private updateHostTransform(context: ContextKey = this.activeContext): void {\n if (context !== this.activeContext) {\n return;\n }\n\n const { position } = this.contextState[context];\n this.style.transform = `translate3d(${position.x}px, ${position.y}px, 0)`;\n }\n\n private setDragging(value: boolean): void {\n if (this.isDragging !== value) {\n this.isDragging = value;\n this.requestUpdate();\n }\n }\n\n private updateAnchorFromPosition(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const viewport = this.getViewportSize();\n updateAnchorFromPositionHelper(this.contextState[context], viewport, EDGE_MARGIN);\n }\n\n private applyAnchorPosition(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const viewport = this.getViewportSize();\n applyAnchorPositionHelper(this.contextState[context], viewport, EDGE_MARGIN);\n this.updateHostTransform(context);\n this.persistState();\n }\n\n private resetResizeTracking(): void {\n this.resizePointerId = null;\n this.resizeStart = null;\n this.resizeInitialSize = null;\n this.isResizing = false;\n }\n\n private resetPointerTracking(): void {\n this.pointerId = null;\n this.dragStart = null;\n this.pointerContext = null;\n this.setDragging(false);\n this.draggedDuringInteraction = false;\n }\n\n private openInspector(): void {\n if (this.isOpen) {\n return;\n }\n\n this.isOpen = true;\n this.ensureWindowPlacement();\n this.requestUpdate();\n void this.updateComplete.then(() => {\n this.measureContext(\"window\");\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n });\n }\n\n private closeInspector(): void {\n if (!this.isOpen) {\n return;\n }\n\n this.isOpen = false;\n this.updateHostTransform(\"button\");\n this.requestUpdate();\n void this.updateComplete.then(() => {\n this.measureContext(\"button\");\n this.applyAnchorPosition(\"button\");\n });\n }\n\n private renderIcon(name: LucideIconName) {\n const iconNode = icons[name];\n if (!iconNode) {\n return nothing;\n }\n\n const svgAttrs: Record<string, string | number> = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"1.5\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n class: \"h-3.5 w-3.5\",\n };\n\n const svgMarkup = `<svg ${this.serializeAttributes(svgAttrs)}>${iconNode\n .map(([tag, attrs]) => `<${tag} ${this.serializeAttributes(attrs)} />`)\n .join(\"\")}</svg>`;\n\n return unsafeHTML(svgMarkup);\n }\n\n private serializeAttributes(attributes: Record<string, string | number | undefined>): string {\n return Object.entries(attributes)\n .filter(([key, value]) => key !== \"key\" && value !== undefined && value !== null && value !== \"\")\n .map(([key, value]) => `${key}=\"${String(value).replace(/\"/g, \"&quot;\")}\"`)\n .join(\" \");\n }\n\n private contextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ];\n\n private selectedContext = \"all-agents\";\n private expandedRows: Set<string> = new Set();\n\n private getSelectedMenu(): MenuItem {\n const found = this.menuItems.find((item) => item.key === this.selectedMenu);\n return found ?? this.menuItems[0]!;\n }\n\n private renderMainContent() {\n if (this.selectedMenu === \"ag-ui-events\") {\n return this.renderEventsTable();\n }\n\n // Default placeholder content for other sections\n return html`\n <div class=\"flex flex-col gap-3 p-4\">\n <div class=\"h-24 rounded-lg bg-gray-50\"></div>\n <div class=\"h-20 rounded-lg bg-gray-50\"></div>\n </div>\n `;\n }\n\n private renderEventsTable() {\n const events = this.getEventsForSelectedContext();\n\n if (events.length === 0) {\n return html`\n <div class=\"flex h-full items-center justify-center px-4 py-8 text-xs text-gray-500\">\n No events yet. Trigger an agent run to see live activity.\n </div>\n `;\n }\n\n return html`\n <div class=\"overflow-hidden\">\n <table class=\"w-full border-collapse text-xs\">\n <thead>\n <tr class=\"bg-white\">\n <th class=\"border-r border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Type\n </th>\n <th class=\"border-r border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Time\n </th>\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Payload\n </th>\n </tr>\n </thead>\n <tbody>\n ${events.map((event, index) => {\n const isLastRow = index === events.length - 1;\n const rowBg = index % 2 === 0 ? \"bg-white\" : \"bg-gray-50/50\";\n const badgeClasses = this.getEventBadgeClasses(event.type);\n const inlinePayload = this.stringifyPayload(event.payload, false) || \"—\";\n const prettyPayload = this.stringifyPayload(event.payload, true) || inlinePayload;\n const isExpanded = this.expandedRows.has(event.id);\n\n return html`\n <tr\n class=\"${rowBg} transition hover:bg-blue-50/50\"\n @click=${() => this.toggleRowExpansion(event.id)}\n >\n <td class=\"border-r ${!isLastRow ? 'border-b' : ''} border-gray-200 px-3 py-2\">\n <div class=\"flex flex-col gap-1\">\n <span class=${badgeClasses}>${event.type}</span>\n <span class=\"font-mono text-[10px] text-gray-400\">${event.agentId}</span>\n </div>\n </td>\n <td class=\"border-r ${!isLastRow ? 'border-b' : ''} border-gray-200 px-3 py-2 font-mono text-[11px] text-gray-600\">\n <span title=${new Date(event.timestamp).toLocaleString()}>\n ${new Date(event.timestamp).toLocaleTimeString()}\n </span>\n </td>\n <td class=\"${!isLastRow ? 'border-b' : ''} border-gray-200 px-3 py-2 font-mono text-[10px] text-gray-600 ${isExpanded ? '' : 'truncate max-w-xs'}\">\n ${isExpanded\n ? html`<pre class=\"m-0 whitespace-pre-wrap text-[10px] font-mono text-gray-600\">${prettyPayload}</pre>`\n : inlinePayload}\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n </div>\n `;\n }\n\n private renderContextDropdown() {\n if (this.selectedMenu !== \"ag-ui-events\") {\n return nothing;\n }\n\n const selectedLabel = this.contextOptions.find((opt) => opt.key === this.selectedContext)?.label ?? \"\";\n\n return html`\n <div class=\"relative\" data-context-dropdown-root=\"true\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1.5 rounded-md px-2 py-0.5 text-xs font-medium text-gray-600 transition hover:bg-gray-100 hover:text-gray-900\"\n @pointerdown=${this.handleContextDropdownToggle}\n >\n <span>${selectedLabel}</span>\n <span class=\"text-gray-400\">${this.renderIcon(\"ChevronDown\")}</span>\n </button>\n ${this.contextMenuOpen\n ? html`\n <div\n class=\"absolute left-0 z-50 mt-1.5 w-40 rounded-md border border-gray-200 bg-white py-1 shadow-md ring-1 ring-black/5\"\n data-context-dropdown-root=\"true\"\n >\n ${this.contextOptions.map(\n (option) => html`\n <button\n type=\"button\"\n class=\"flex w-full items-center justify-between px-3 py-1.5 text-left text-xs transition hover:bg-gray-50 focus:bg-gray-50 focus:outline-none\"\n data-context-dropdown-root=\"true\"\n @click=${() => this.handleContextOptionSelect(option.key)}\n >\n <span class=\"${option.key === this.selectedContext ? 'text-gray-900 font-medium' : 'text-gray-600'}\">${option.label}</span>\n ${option.key === this.selectedContext\n ? html`<span class=\"text-gray-500\">${this.renderIcon(\"Check\")}</span>`\n : nothing}\n </button>\n `,\n )}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n private handleMenuSelect(key: MenuKey): void {\n if (!this.menuItems.some((item) => item.key === key)) {\n return;\n }\n\n this.selectedMenu = key;\n this.contextMenuOpen = false;\n this.requestUpdate();\n }\n\n private handleContextDropdownToggle(event: PointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuOpen = !this.contextMenuOpen;\n this.requestUpdate();\n }\n\n private handleContextOptionSelect(key: string): void {\n if (!this.contextOptions.some((option) => option.key === key)) {\n return;\n }\n\n if (this.selectedContext !== key) {\n this.selectedContext = key;\n this.expandedRows.clear();\n }\n\n this.contextMenuOpen = false;\n this.requestUpdate();\n }\n\n private handleGlobalPointerDown = (event: PointerEvent): void => {\n if (!this.contextMenuOpen) {\n return;\n }\n\n const clickedDropdown = event.composedPath().some((node) => {\n return node instanceof HTMLElement && node.dataset?.contextDropdownRoot === \"true\";\n });\n\n if (!clickedDropdown) {\n this.contextMenuOpen = false;\n this.requestUpdate();\n }\n };\n\n private toggleRowExpansion(eventId: string): void {\n if (this.expandedRows.has(eventId)) {\n this.expandedRows.delete(eventId);\n } else {\n this.expandedRows.add(eventId);\n }\n this.requestUpdate();\n }\n}\n\nexport function defineWebInspector(): void {\n if (!customElements.get(WEB_INSPECTOR_TAG)) {\n customElements.define(WEB_INSPECTOR_TAG, WebInspectorElement);\n }\n}\n\ndefineWebInspector();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"web-inspector\": WebInspectorElement;\n }\n}\n","/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-700:oklch(50% .134 242.749);--color-blue-50:oklch(97% .014 254.604);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-700:oklch(48.8% .243 264.376);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-700:oklch(49.1% .27 292.581);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-700:oklch(51.4% .222 16.935);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wider:.05em;--leading-tight:1.25;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{font-family:var(--font-sans);color:var(--color-slate-900);background-color:#0000;display:block}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.static{position:static}.right-1{right:calc(var(--spacing)*1)}.bottom-1{bottom:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.z-50{z-index:50}.m-0{margin:calc(var(--spacing)*0)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.flex{display:flex}.inline-flex{display:inline-flex}.h-3{height:calc(var(--spacing)*3)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-12{height:calc(var(--spacing)*12)}.h-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.h-full{height:100%}.w-3{width:calc(var(--spacing)*3)}.w-3\\.5{width:calc(var(--spacing)*3.5)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-12{width:calc(var(--spacing)*12)}.w-40{width:calc(var(--spacing)*40)}.w-56{width:calc(var(--spacing)*56)}.w-full{width:100%}.w-px{width:1px}.max-w-xs{max-width:var(--container-xs)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-gray-200{border-color:var(--color-gray-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-sky-200{border-color:var(--color-sky-200)}.border-violet-200{border-color:var(--color-violet-200)}.border-white\\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-50\\/50{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\\/50{background-color:color-mix(in oklab,var(--color-gray-50)50%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-slate-950\\/95{background-color:#020618f2}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\\/95{background-color:color-mix(in oklab,var(--color-slate-950)95%,transparent)}}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pr-3{padding-right:calc(var(--spacing)*3)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.text-blue-700{color:var(--color-blue-700)}.text-emerald-700{color:var(--color-emerald-700)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-rose-700{color:var(--color-rose-700)}.text-sky-700{color:var(--color-sky-700)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-60{opacity:.6}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-black\\/5{--tw-ring-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.ring-black\\/5{--tw-ring-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.ring-white\\/10{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.ring-white\\/10{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\\:border-gray-300:is(:where(.group):hover *){border-color:var(--color-gray-300)}.group-hover\\:text-gray-700:is(:where(.group):hover *){color:var(--color-gray-700)}.hover\\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\\:border-white\\/30:hover{border-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\\:border-white\\/30:hover{border-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\\:bg-blue-50\\/50:hover{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-blue-50\\/50:hover{background-color:color-mix(in oklab,var(--color-blue-50)50%,transparent)}}.hover\\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\\:bg-slate-900\\/95:hover{background-color:#0f172bf2}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-slate-900\\/95:hover{background-color:color-mix(in oklab,var(--color-slate-900)95%,transparent)}}.hover\\:text-gray-600:hover{color:var(--color-gray-600)}.hover\\:text-gray-900:hover{color:var(--color-gray-900)}}.focus\\:bg-gray-50:focus{background-color:var(--color-gray-50)}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\\:outline-gray-300:focus-visible{outline-color:var(--color-gray-300)}.focus-visible\\:outline-gray-400:focus-visible{outline-color:var(--color-gray-400)}.focus-visible\\:outline-rose-500:focus-visible{outline-color:var(--color-rose-500)}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}","import type { Anchor, ContextState, Position, Size } from './types';\n\nexport function updateSizeFromElement(\n state: ContextState,\n element: HTMLElement,\n fallback: Size,\n): void {\n const rect = element.getBoundingClientRect();\n state.size = {\n width: rect.width || fallback.width,\n height: rect.height || fallback.height,\n };\n}\n\nexport function clampSize(\n size: Size,\n viewport: Size,\n edgeMargin: number,\n minWidth: number,\n minHeight: number,\n): Size {\n const maxWidth = Math.max(minWidth, viewport.width - edgeMargin * 2);\n const maxHeight = Math.max(minHeight, viewport.height - edgeMargin * 2);\n\n return {\n width: clamp(size.width, minWidth, maxWidth),\n height: clamp(size.height, minHeight, maxHeight),\n };\n}\n\nexport function constrainToViewport(\n state: ContextState,\n position: Position,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxX = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxY = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\n\n return {\n x: clamp(position.x, edgeMargin, maxX),\n y: clamp(position.y, edgeMargin, maxY),\n };\n}\n\nexport function keepPositionWithinViewport(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): void {\n state.position = constrainToViewport(state, state.position, viewport, edgeMargin);\n}\n\nexport function centerContext(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const centered: Position = {\n x: Math.round((viewport.width - state.size.width) / 2),\n y: Math.round((viewport.height - state.size.height) / 2),\n };\n\n state.position = constrainToViewport(state, centered, viewport, edgeMargin);\n updateAnchorFromPosition(state, viewport, edgeMargin);\n return state.position;\n}\n\nexport function updateAnchorFromPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): void {\n const centerX = state.position.x + state.size.width / 2;\n const centerY = state.position.y + state.size.height / 2;\n\n const horizontal: Anchor['horizontal'] = centerX < viewport.width / 2 ? 'left' : 'right';\n const vertical: Anchor['vertical'] = centerY < viewport.height / 2 ? 'top' : 'bottom';\n\n state.anchor = { horizontal, vertical };\n\n const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\n\n state.anchorOffset = {\n x:\n horizontal === 'left'\n ? clamp(state.position.x, edgeMargin, maxHorizontalOffset)\n : clamp(viewport.width - state.position.x - state.size.width, edgeMargin, maxHorizontalOffset),\n y:\n vertical === 'top'\n ? clamp(state.position.y, edgeMargin, maxVerticalOffset)\n : clamp(viewport.height - state.position.y - state.size.height, edgeMargin, maxVerticalOffset),\n };\n}\n\nexport function applyAnchorPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\n\n const horizontalOffset = clamp(state.anchorOffset.x, edgeMargin, maxHorizontalOffset);\n const verticalOffset = clamp(state.anchorOffset.y, edgeMargin, maxVerticalOffset);\n\n const x =\n state.anchor.horizontal === 'left'\n ? horizontalOffset\n : viewport.width - state.size.width - horizontalOffset;\n\n const y =\n state.anchor.vertical === 'top'\n ? verticalOffset\n : viewport.height - state.size.height - verticalOffset;\n\n state.anchorOffset = { x: horizontalOffset, y: verticalOffset };\n state.position = constrainToViewport(state, { x, y }, viewport, edgeMargin);\n return state.position;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(min, value), max);\n}\n","import type { Anchor, Position, Size } from './types';\n\nexport type PersistedContextState = {\n anchor?: Anchor;\n anchorOffset?: Position;\n size?: Size;\n hasCustomPosition?: boolean;\n};\n\nexport type PersistedState = {\n button?: Omit<PersistedContextState, 'size'>;\n window?: PersistedContextState;\n};\n\nexport function loadInspectorState(cookieName: string): PersistedState | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const prefix = `${cookieName}=`;\n const entry = document.cookie.split('; ').find((cookie) => cookie.startsWith(prefix));\n if (!entry) {\n return null;\n }\n\n const raw = entry.substring(prefix.length);\n if (!raw) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(decodeURIComponent(raw));\n if (parsed && typeof parsed === 'object') {\n return parsed as PersistedState;\n }\n } catch (error) {\n return null;\n }\n\n return null;\n}\n\nexport function saveInspectorState(\n cookieName: string,\n state: PersistedState,\n maxAgeSeconds: number,\n): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const encoded = encodeURIComponent(JSON.stringify(state));\n document.cookie = `${cookieName}=${encoded}; path=/; max-age=${maxAgeSeconds}; SameSite=Lax`;\n}\n\nexport function isValidAnchor(value: unknown): value is Anchor {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Anchor;\n return (\n (candidate.horizontal === 'left' || candidate.horizontal === 'right') &&\n (candidate.vertical === 'top' || candidate.vertical === 'bottom')\n );\n}\n\nexport function isValidPosition(value: unknown): value is Position {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Position;\n return isFiniteNumber(candidate.x) && isFiniteNumber(candidate.y);\n}\n\nexport function isValidSize(value: unknown): value is Size {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const candidate = value as Size;\n return isFiniteNumber(candidate.width) && isFiniteNumber(candidate.height);\n}\n\nexport function isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n"],"mappings":"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","names":[]}