{"version":3,"sources":["../src/components/dev-console/console-trigger.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { useAiContext } from \"../../context/ai-context\";\nimport { VnSDKIcon } from \"./icons\";\nimport { DeveloperConsoleModal } from \"./developer-console-modal\";\n\n// Storage key for hiding the Inspector trigger/modal\nconst INSPECTOR_HIDE_KEY = \"cpk:inspector:hidden\";\n\ninterface ConsoleTriggerProps {\n  position?: \"bottom-left\" | \"bottom-right\";\n}\n\nexport function ConsoleTrigger({ position = \"bottom-right\" }: ConsoleTriggerProps) {\n  const context = useAiContext();\n  const hasApiKey = Boolean(context.aiApiConfig.publicApiKey);\n  const [isModalOpen, setIsModalOpen] = useState(false);\n  const [isHovered, setIsHovered] = useState(false);\n  const [isDragging, setIsDragging] = useState(false);\n  const [buttonPosition, setButtonPosition] = useState<{ x: number; y: number } | null>(null);\n  const [mounted, setMounted] = useState(false);\n  const [isHidden, setIsHidden] = useState(false);\n\n  const dragRef = useRef<{\n    startX: number;\n    startY: number;\n    buttonX: number;\n    buttonY: number;\n  } | null>(null);\n  const buttonRef = useRef<HTMLButtonElement>(null);\n\n  // Initialize on client side only\n  useEffect(() => {\n    setMounted(true);\n    try {\n      const hidden =\n        typeof window !== \"undefined\" ? localStorage.getItem(INSPECTOR_HIDE_KEY) : null;\n      if (hidden === \"1\" || hidden === \"true\") {\n        setIsHidden(true);\n      }\n    } catch {\n      // ignore\n    }\n    if (typeof window !== \"undefined\" && !buttonPosition) {\n      const buttonSize = 60;\n      const margin = 24;\n\n      const initialPosition = {\n        x: margin,\n        y: window.innerHeight - buttonSize - margin,\n      };\n\n      setButtonPosition(initialPosition);\n    }\n  }, [position]);\n\n  const handleMouseDown = (e: React.MouseEvent) => {\n    e.preventDefault();\n    if (!buttonPosition) return;\n\n    dragRef.current = {\n      startX: e.clientX,\n      startY: e.clientY,\n      buttonX: buttonPosition.x,\n      buttonY: buttonPosition.y,\n    };\n    setIsDragging(true);\n  };\n\n  useEffect(() => {\n    if (!isDragging) return;\n\n    const handleMouseMove = (e: MouseEvent) => {\n      e.preventDefault();\n      e.stopPropagation();\n\n      if (!dragRef.current) return;\n\n      const deltaX = e.clientX - dragRef.current.startX;\n      const deltaY = e.clientY - dragRef.current.startY;\n\n      // Calculate new position\n      let newX = dragRef.current.buttonX + deltaX;\n      let newY = dragRef.current.buttonY + deltaY;\n\n      // Keep button within viewport bounds\n      newX = Math.max(0, Math.min(newX, window.innerWidth - 60));\n      newY = Math.max(0, Math.min(newY, window.innerHeight - 60));\n\n      setButtonPosition({ x: newX, y: newY });\n    };\n\n    const handleMouseUp = (e: MouseEvent) => {\n      e.preventDefault();\n      e.stopPropagation();\n      setIsDragging(false);\n      dragRef.current = null;\n    };\n\n    // Use capture phase to intercept events before they reach other handlers\n    document.addEventListener(\"mousemove\", handleMouseMove, { capture: true, passive: false });\n    document.addEventListener(\"mouseup\", handleMouseUp, { capture: true, passive: false });\n\n    return () => {\n      document.removeEventListener(\"mousemove\", handleMouseMove, { capture: true });\n      document.removeEventListener(\"mouseup\", handleMouseUp, { capture: true });\n    };\n  }, [isDragging]);\n\n  // Don't render until mounted and position is initialized\n  if (!mounted || !buttonPosition || isHidden) {\n    return null;\n  }\n\n  return (\n    <>\n      <button\n        ref={buttonRef}\n        onClick={(e) => {\n          if (!isDragging) {\n            // Modifier-click hides\n            if (e.metaKey || e.altKey) {\n              try {\n                localStorage.setItem(INSPECTOR_HIDE_KEY, \"1\");\n              } catch {}\n              setIsHidden(true);\n              return;\n            }\n            setIsModalOpen(true);\n          }\n        }}\n        onContextMenu={(e) => {\n          e.preventDefault();\n          try {\n            localStorage.setItem(INSPECTOR_HIDE_KEY, \"1\");\n          } catch {}\n          setIsHidden(true);\n        }}\n        onMouseDown={handleMouseDown}\n        onMouseEnter={() => setIsHovered(true)}\n        onMouseLeave={() => setIsHovered(false)}\n        style={{\n          position: \"fixed\",\n          left: `${buttonPosition.x}px`,\n          top: `${buttonPosition.y}px`,\n          zIndex: 2147483647,\n          width: \"60px\",\n          height: \"60px\",\n          background: isDragging ? \"#000000\" : isHovered ? \"#111111\" : \"#000000\",\n          color: \"white\",\n          borderRadius: \"50%\",\n          boxShadow: isDragging\n            ? \"0 8px 32px rgba(0, 0, 0, 0.6), 0 4px 16px rgba(0, 0, 0, 0.4)\"\n            : isHovered\n              ? \"0 12px 40px rgba(0, 0, 0, 0.7), 0 6px 20px rgba(0, 0, 0, 0.5)\"\n              : \"0 6px 20px rgba(0, 0, 0, 0.5), 0 3px 10px rgba(0, 0, 0, 0.3)\",\n          transition: isDragging ? \"none\" : \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          border: \"none\",\n          cursor: isDragging ? \"grabbing\" : \"grab\",\n          opacity: 1,\n          userSelect: \"none\",\n          transform: isDragging ? \"scale(1.05)\" : isHovered ? \"scale(1.1)\" : \"scale(1)\",\n          backdropFilter: \"blur(10px)\",\n          pointerEvents: \"auto\",\n          isolation: \"isolate\",\n        }}\n        title={\n          hasApiKey\n            ? \"Open Inspector (Drag to move)\"\n            : \"Inspector (License Key Required, Drag to move)\"\n        }\n      >\n        {/* Close (hide) control */}\n        <div\n          onClick={(e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            try {\n              localStorage.setItem(INSPECTOR_HIDE_KEY, \"1\");\n            } catch {\n              // ignore\n            }\n            setIsHidden(true);\n          }}\n          style={{\n            position: \"absolute\",\n            bottom: \"2px\",\n            right: \"2px\",\n            width: \"20px\",\n            height: \"20px\",\n            borderRadius: \"50%\",\n            background: \"#ffffff\",\n            color: \"#ef4444\",\n            fontSize: \"14px\",\n            lineHeight: \"18px\",\n            textAlign: \"center\",\n            boxShadow: \"0 2px 6px rgba(0,0,0,0.35)\",\n            cursor: \"pointer\",\n            border: \"1px solid #e5e7eb\",\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            zIndex: 1,\n          }}\n          title=\"Hide Inspector\"\n        >\n          ×\n        </div>\n        <div\n          style={{\n            width: \"28px\",\n            height: \"28px\",\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            filter: \"drop-shadow(0 2px 4px rgba(0,0,0,0.2))\",\n          }}\n        >\n          <VnSDKIcon />\n        </div>\n        {!hasApiKey && (\n          <div\n            style={{\n              position: \"absolute\",\n              top: \"-2px\",\n              right: \"-2px\",\n              width: \"18px\",\n              height: \"18px\",\n              background: \"linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%)\",\n              borderRadius: \"50%\",\n              display: \"flex\",\n              alignItems: \"center\",\n              justifyContent: \"center\",\n              boxShadow: \"0 2px 8px rgba(255, 107, 107, 0.4)\",\n              border: \"2px solid white\",\n            }}\n          >\n            <span style={{ fontSize: \"10px\", color: \"white\", fontWeight: \"bold\" }}>!</span>\n          </div>\n        )}\n      </button>\n\n      <DeveloperConsoleModal\n        isOpen={isModalOpen}\n        onClose={() => setIsModalOpen(false)}\n        hasApiKey={hasApiKey}\n      />\n    </>\n  );\n}\n"],"mappings":"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","names":["e"]}