{"version":3,"sources":["../src/components/ui/drawer.tsx","../src/lib/connection-string-parser.ts","../src/hooks/use-connection-form.ts","../src/hooks/use-mobile.ts","../src/components/ConnectionModal.tsx"],"names":["DrawerPrimitive","jsxs","jsx"],"mappings":"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","file":"chunk-AXFO3IQH.mjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Drawer as DrawerPrimitive } from \"vaul\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Drawer({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n  return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />;\n}\n\nfunction DrawerTrigger({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n  return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />;\n}\n\nfunction DrawerPortal({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n  return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />;\n}\n\nfunction DrawerClose({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n  return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />;\n}\n\nfunction DrawerOverlay({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n  return (\n    <DrawerPrimitive.Overlay\n      data-slot=\"drawer-overlay\"\n      className={cn(\n        \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DrawerContent({ className, children, ...props }: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n  return (\n    <DrawerPortal data-slot=\"drawer-portal\">\n      <DrawerOverlay />\n      <DrawerPrimitive.Content\n        data-slot=\"drawer-content\"\n        className={cn(\n          \"group/drawer-content bg-background fixed z-50 flex h-auto flex-col\",\n          \"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b\",\n          \"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t\",\n          \"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n          \"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm\",\n          className,\n        )}\n        {...props}\n      >\n        <div className=\"bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n        {children}\n      </DrawerPrimitive.Content>\n    </DrawerPortal>\n  );\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"drawer-header\"\n      className={cn(\n        \"flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n  return <div data-slot=\"drawer-footer\" className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)} {...props} />;\n}\n\nfunction DrawerTitle({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n  return (\n    <DrawerPrimitive.Title\n      data-slot=\"drawer-title\"\n      className={cn(\"text-foreground font-semibold\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction DrawerDescription({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n  return (\n    <DrawerPrimitive.Description\n      data-slot=\"drawer-description\"\n      className={cn(\"text-muted-foreground text-sm\", className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Drawer,\n  DrawerPortal,\n  DrawerOverlay,\n  DrawerTrigger,\n  DrawerClose,\n  DrawerContent,\n  DrawerHeader,\n  DrawerFooter,\n  DrawerTitle,\n  DrawerDescription,\n};\n","import { DatabaseType } from \"@/lib/types\";\n\nexport interface ParsedConnection {\n  type: DatabaseType;\n  host?: string;\n  port?: string;\n  user?: string;\n  password?: string;\n  database?: string;\n  connectionString?: string;\n}\n\n/**\n * Parse a database connection string URL into its components.\n * Supports: postgres://, postgresql://, mysql://, mongodb://, mongodb+srv://, redis://\n */\nexport function parseConnectionString(input: string): ParsedConnection | null {\n  const trimmed = input.trim();\n  if (!trimmed) return null;\n\n  // MongoDB connection strings\n  if (trimmed.startsWith(\"mongodb://\") || trimmed.startsWith(\"mongodb+srv://\")) {\n    return parseMongoDBString(trimmed);\n  }\n\n  // PostgreSQL\n  if (trimmed.startsWith(\"postgres://\") || trimmed.startsWith(\"postgresql://\")) {\n    return parseGenericURL(trimmed, \"postgres\", \"5432\");\n  }\n\n  // MySQL\n  if (trimmed.startsWith(\"mysql://\")) {\n    return parseGenericURL(trimmed, \"mysql\", \"3306\");\n  }\n\n  // Redis\n  if (trimmed.startsWith(\"redis://\") || trimmed.startsWith(\"rediss://\")) {\n    return parseGenericURL(trimmed, \"redis\", \"6379\");\n  }\n\n  // Oracle\n  if (trimmed.startsWith(\"oracle://\")) {\n    return parseGenericURL(trimmed, \"oracle\", \"1521\");\n  }\n\n  // MSSQL / SQL Server\n  if (trimmed.startsWith(\"mssql://\") || trimmed.startsWith(\"sqlserver://\")) {\n    return parseGenericURL(trimmed, \"mssql\", \"1433\");\n  }\n\n  // ADO.NET format: Server=host;Database=db;User Id=user;Password=pass;\n  if (/^Server\\s*=/i.test(trimmed)) {\n    return parseADONetString(trimmed);\n  }\n\n  return null;\n}\n\nfunction parseMongoDBString(uri: string): ParsedConnection {\n  const result: ParsedConnection = {\n    type: \"mongodb\",\n    connectionString: uri,\n  };\n\n  try {\n    // For mongodb+srv, we can't use URL directly for host/port\n    // but we can extract user/pass/database\n    const isSRV = uri.startsWith(\"mongodb+srv://\");\n\n    // Extract database from path\n    const withoutProtocol = uri.replace(/^mongodb(\\+srv)?:\\/\\//, \"\");\n    const atIndex = withoutProtocol.indexOf(\"@\");\n    const afterAuth = atIndex >= 0 ? withoutProtocol.slice(atIndex + 1) : withoutProtocol;\n\n    // Split host(s) from path\n    const slashIndex = afterAuth.indexOf(\"/\");\n    if (slashIndex >= 0) {\n      const pathPart = afterAuth.slice(slashIndex + 1);\n      const dbName = pathPart.split(\"?\")[0];\n      if (dbName) result.database = decodeURIComponent(dbName);\n    }\n\n    // Extract credentials\n    if (atIndex >= 0) {\n      const authPart = withoutProtocol.slice(0, atIndex);\n      const colonIndex = authPart.indexOf(\":\");\n      if (colonIndex >= 0) {\n        result.user = decodeURIComponent(authPart.slice(0, colonIndex));\n        result.password = decodeURIComponent(authPart.slice(colonIndex + 1));\n      } else {\n        result.user = decodeURIComponent(authPart);\n      }\n    }\n\n    // Extract host/port for non-SRV\n    if (!isSRV && slashIndex >= 0) {\n      const hostPart = afterAuth.slice(0, slashIndex);\n      const firstHost = hostPart.split(\",\")[0]; // take first host for replica sets\n      const [host, port] = firstHost.split(\":\");\n      if (host) result.host = host;\n      if (port) result.port = port;\n    }\n  } catch {\n    // If parsing fails, we still have the connectionString\n  }\n\n  return result;\n}\n\nfunction parseADONetString(input: string): ParsedConnection | null {\n  try {\n    const params: Record<string, string> = {};\n    input.split(\";\").forEach((part) => {\n      const eq = part.indexOf(\"=\");\n      if (eq > 0) {\n        const key = part.slice(0, eq).trim().toLowerCase();\n        const val = part.slice(eq + 1).trim();\n        params[key] = val;\n      }\n    });\n\n    const host = params[\"server\"] || params[\"data source\"] || \"localhost\";\n    const [hostPart, portPart] = host.split(\",\");\n\n    return {\n      type: \"mssql\",\n      host: hostPart || \"localhost\",\n      port: portPart || \"1433\",\n      user: params[\"user id\"] || params[\"uid\"] || undefined,\n      password: params[\"password\"] || params[\"pwd\"] || undefined,\n      database: params[\"database\"] || params[\"initial catalog\"] || undefined,\n    };\n  } catch {\n    return null;\n  }\n}\n\nfunction parseGenericURL(uri: string, type: DatabaseType, defaultPort: string): ParsedConnection | null {\n  try {\n    const url = new URL(uri);\n\n    return {\n      type,\n      host: url.hostname || \"localhost\",\n      port: url.port || defaultPort,\n      user: url.username ? decodeURIComponent(url.username) : undefined,\n      password: url.password ? decodeURIComponent(url.password) : undefined,\n      database: url.pathname.slice(1) || undefined, // remove leading /\n    };\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Detect the database type from a connection string.\n */\nexport function detectConnectionStringType(input: string): DatabaseType | null {\n  const trimmed = input.trim().toLowerCase();\n  if (trimmed.startsWith(\"postgres://\") || trimmed.startsWith(\"postgresql://\")) return \"postgres\";\n  if (trimmed.startsWith(\"mysql://\")) return \"mysql\";\n  if (trimmed.startsWith(\"mongodb://\") || trimmed.startsWith(\"mongodb+srv://\")) return \"mongodb\";\n  if (trimmed.startsWith(\"redis://\") || trimmed.startsWith(\"rediss://\")) return \"redis\";\n  if (trimmed.startsWith(\"oracle://\")) return \"oracle\";\n  if (trimmed.startsWith(\"mssql://\") || trimmed.startsWith(\"sqlserver://\")) return \"mssql\";\n  if (/^server\\s*=/i.test(trimmed)) return \"mssql\";\n  return null;\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport {\n  DatabaseConnection,\n  DatabaseType,\n  ConnectionEnvironment,\n  ENVIRONMENT_COLORS,\n  SSLMode,\n  SSLConfig,\n  SSHTunnelConfig,\n} from \"@/lib/types\";\nimport { getDBConfig } from \"@/lib/db-ui-config\";\nimport { parseConnectionString } from \"@/lib/connection-string-parser\";\n\ninterface UseConnectionFormProps {\n  isOpen: boolean;\n  onClose: () => void;\n  onConnect: (conn: DatabaseConnection) => void;\n  editConnection?: DatabaseConnection | null;\n  /** Optional API adapter: when provided, bypasses the built-in /api/db/test-connection fetch. */\n  onTestConnection?: (\n    connection: DatabaseConnection,\n  ) => Promise<{ success: boolean; latency?: number; error?: string }>;\n}\n\nexport function useConnectionForm({ isOpen, onConnect, editConnection, onTestConnection }: UseConnectionFormProps) {\n  const [type, setType] = useState<DatabaseType>(\"postgres\");\n  const [name, setName] = useState(\"\");\n  const [host, setHost] = useState(\"localhost\");\n  const [port, setPort] = useState(\"5432\");\n  const [user, setUser] = useState(\"\");\n  const [password, setPassword] = useState(\"\");\n  const [database, setDatabase] = useState(\"\");\n  const [isTesting, setIsTesting] = useState(false);\n  const [connectionString, setConnectionString] = useState(\"\");\n  const [mongoConnectionMode, setMongoConnectionMode] = useState<\"host\" | \"connectionString\">(\"host\");\n  const [environment, setEnvironment] = useState<ConnectionEnvironment>(\"local\");\n  const [testResult, setTestResult] = useState<{ success: boolean; message: string; latency?: number } | null>(null);\n  const [pasteInput, setPasteInput] = useState(\"\");\n  const [showPasteInput, setShowPasteInput] = useState(false);\n\n  // SSL/TLS\n  const [showSSL, setShowSSL] = useState(false);\n  const [sslMode, setSSLMode] = useState<SSLMode>(\"disable\");\n  const [caCert, setCaCert] = useState(\"\");\n  const [clientCert, setClientCert] = useState(\"\");\n  const [clientKey, setClientKey] = useState(\"\");\n\n  // Advanced (Oracle/MSSQL)\n  const [showAdvanced, setShowAdvanced] = useState(false);\n  const [serviceName, setServiceName] = useState(\"\");\n  const [instanceName, setInstanceName] = useState(\"\");\n\n  // SSH Tunnel\n  const [showSSH, setShowSSH] = useState(false);\n  const [sshEnabled, setSSHEnabled] = useState(false);\n  const [sshHost, setSSHHost] = useState(\"\");\n  const [sshPort, setSSHPort] = useState(\"22\");\n  const [sshUsername, setSSHUsername] = useState(\"\");\n  const [sshAuthMethod, setSSHAuthMethod] = useState<\"password\" | \"privateKey\">(\"password\");\n  const [sshPassword, setSSHPassword] = useState(\"\");\n  const [sshPrivateKey, setSSHPrivateKey] = useState(\"\");\n  const [sshPassphrase, setSSHPassphrase] = useState(\"\");\n\n  const isEditMode = !!editConnection;\n\n  // Populate form when editing\n  useEffect(() => {\n    if (editConnection) {\n      setType(editConnection.type);\n      setName(editConnection.name);\n      setHost(editConnection.host || \"localhost\");\n      setPort(editConnection.port?.toString() || getDBConfig(editConnection.type).defaultPort);\n      setUser(editConnection.user || \"\");\n      setPassword(editConnection.password || \"\");\n      setDatabase(editConnection.database || \"\");\n      setConnectionString(editConnection.connectionString || \"\");\n      setEnvironment(editConnection.environment || \"local\");\n      if (editConnection.connectionString) {\n        setMongoConnectionMode(\"connectionString\");\n      }\n      // Advanced fields\n      if (editConnection.serviceName) {\n        setServiceName(editConnection.serviceName);\n        setShowAdvanced(true);\n      }\n      if (editConnection.instanceName) {\n        setInstanceName(editConnection.instanceName);\n        setShowAdvanced(true);\n      }\n      // SSL\n      if (editConnection.ssl) {\n        setSSLMode(editConnection.ssl.mode);\n        setCaCert(editConnection.ssl.caCert || \"\");\n        setClientCert(editConnection.ssl.clientCert || \"\");\n        setClientKey(editConnection.ssl.clientKey || \"\");\n        if (editConnection.ssl.mode !== \"disable\") setShowSSL(true);\n      }\n      // SSH\n      if (editConnection.sshTunnel?.enabled) {\n        setSSHEnabled(true);\n        setShowSSH(true);\n        setSSHHost(editConnection.sshTunnel.host);\n        setSSHPort(editConnection.sshTunnel.port.toString());\n        setSSHUsername(editConnection.sshTunnel.username);\n        setSSHAuthMethod(editConnection.sshTunnel.authMethod);\n        setSSHPassword(editConnection.sshTunnel.password || \"\");\n        setSSHPrivateKey(editConnection.sshTunnel.privateKey || \"\");\n        setSSHPassphrase(editConnection.sshTunnel.passphrase || \"\");\n      }\n    }\n  }, [editConnection]);\n\n  // Reset form when modal closes\n  useEffect(() => {\n    if (!isOpen) {\n      setTestResult(null);\n      setShowPasteInput(false);\n      setPasteInput(\"\");\n      if (!editConnection) {\n        setName(\"\");\n        setUser(\"\");\n        setPassword(\"\");\n        setDatabase(\"\");\n        setConnectionString(\"\");\n        setMongoConnectionMode(\"host\");\n        setType(\"postgres\");\n        setHost(\"localhost\");\n        setPort(\"5432\");\n      }\n    }\n  }, [isOpen, editConnection]);\n\n  const buildConnection = useCallback((): DatabaseConnection => {\n    const sslConfig: SSLConfig | undefined =\n      sslMode !== \"disable\"\n        ? {\n            mode: sslMode,\n            ...(caCert ? { caCert } : {}),\n            ...(clientCert ? { clientCert } : {}),\n            ...(clientKey ? { clientKey } : {}),\n          }\n        : undefined;\n\n    const sshConfig: SSHTunnelConfig | undefined = sshEnabled\n      ? {\n          enabled: true,\n          host: sshHost,\n          port: parseInt(sshPort) || 22,\n          username: sshUsername,\n          authMethod: sshAuthMethod,\n          ...(sshAuthMethod === \"password\" ? { password: sshPassword } : {}),\n          ...(sshAuthMethod === \"privateKey\" ? { privateKey: sshPrivateKey } : {}),\n          ...(sshPassphrase ? { passphrase: sshPassphrase } : {}),\n        }\n      : undefined;\n\n    return {\n      id: editConnection?.id || Math.random().toString(36).substr(2, 9),\n      name: name || `${type}-connection`,\n      type,\n      host,\n      port: parseInt(port),\n      user,\n      password,\n      database,\n      createdAt: editConnection?.createdAt || new Date(),\n      environment,\n      color: ENVIRONMENT_COLORS[environment],\n      ...(sslConfig ? { ssl: sslConfig } : {}),\n      ...(sshConfig ? { sshTunnel: sshConfig } : {}),\n      ...(getDBConfig(type).showConnectionStringToggle && mongoConnectionMode === \"connectionString\"\n        ? {\n            connectionString,\n            host: undefined,\n            port: undefined,\n            user: undefined,\n            password: undefined,\n          }\n        : {}),\n      ...(type === \"oracle\" && serviceName ? { serviceName } : {}),\n      ...(type === \"mssql\" && instanceName ? { instanceName } : {}),\n    };\n  }, [\n    sslMode,\n    caCert,\n    clientCert,\n    clientKey,\n    sshEnabled,\n    sshHost,\n    sshPort,\n    sshUsername,\n    sshAuthMethod,\n    sshPassword,\n    sshPrivateKey,\n    sshPassphrase,\n    editConnection,\n    name,\n    type,\n    host,\n    port,\n    user,\n    password,\n    database,\n    environment,\n    mongoConnectionMode,\n    connectionString,\n    serviceName,\n    instanceName,\n  ]);\n\n  const handleTestConnection = useCallback(async () => {\n    setIsTesting(true);\n    setTestResult(null);\n\n    try {\n      const conn = buildConnection();\n\n      if (onTestConnection) {\n        // Platform adapter: use callback instead of fetch\n        const result = await onTestConnection(conn);\n        setTestResult({\n          success: result.success,\n          message: result.success\n            ? `Connected successfully${result.latency ? ` (${result.latency}ms)` : \"\"}`\n            : result.error || \"Connection failed\",\n          latency: result.latency,\n        });\n      } else {\n        // Default: existing fetch behavior\n        const response = await fetch(\"/api/db/test-connection\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify(conn),\n        });\n\n        const result = await response.json();\n        setTestResult({\n          success: result.success,\n          message: result.success\n            ? `Connected successfully${result.latency ? ` (${result.latency}ms)` : \"\"}`\n            : result.error || \"Connection failed\",\n          latency: result.latency,\n        });\n      }\n    } catch {\n      setTestResult({ success: false, message: \"Network error - could not reach server\" });\n    } finally {\n      setIsTesting(false);\n    }\n  }, [buildConnection, onTestConnection]);\n\n  const handleConnect = useCallback(async () => {\n    setIsTesting(true);\n    setTestResult(null);\n\n    try {\n      const conn = buildConnection();\n\n      let result: { success: boolean; error?: string };\n      if (onTestConnection) {\n        // Platform adapter: use callback instead of fetch\n        result = await onTestConnection(conn);\n      } else {\n        // Default: existing fetch behavior\n        const response = await fetch(\"/api/db/test-connection\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify(conn),\n        });\n        result = await response.json();\n      }\n\n      if (result.success) {\n        onConnect(conn);\n        // Reset form\n        setName(\"\");\n        setUser(\"\");\n        setPassword(\"\");\n        setDatabase(\"\");\n        setConnectionString(\"\");\n        setMongoConnectionMode(\"host\");\n        setTestResult(null);\n      } else {\n        setTestResult({ success: false, message: result.error || \"Connection failed\" });\n      }\n    } catch {\n      setTestResult({ success: false, message: \"Network error - could not reach server\" });\n    } finally {\n      setIsTesting(false);\n    }\n  }, [buildConnection, type, onConnect, onTestConnection]);\n\n  const handlePasteConnectionString = useCallback(() => {\n    const trimmed = pasteInput.trim();\n    if (!trimmed) return;\n\n    const parsed = parseConnectionString(trimmed);\n    if (!parsed) {\n      setTestResult({\n        success: false,\n        message:\n          \"Could not parse connection string. Supported formats: postgres://, mysql://, mongodb://, redis://, oracle://, mssql://\",\n      });\n      return;\n    }\n\n    // Auto-switch DB type\n    setType(parsed.type);\n    if (parsed.host) setHost(parsed.host);\n    if (parsed.port) setPort(parsed.port);\n    if (parsed.user) setUser(parsed.user);\n    if (parsed.password) setPassword(parsed.password);\n    if (parsed.database) setDatabase(parsed.database);\n\n    // For MongoDB, also set connection string mode\n    if (parsed.type === \"mongodb\" && parsed.connectionString) {\n      setConnectionString(parsed.connectionString);\n      setMongoConnectionMode(\"connectionString\");\n    }\n\n    // Auto-fill name if empty\n    if (!name) {\n      const dbName = parsed.database || parsed.host || parsed.type;\n      setName(`${dbName}`);\n    }\n\n    setShowPasteInput(false);\n    setPasteInput(\"\");\n    setTestResult({ success: true, message: \"Connection string parsed successfully. Review the fields and connect.\" });\n  }, [pasteInput, name]);\n\n  const selectableTypes: DatabaseType[] = [\"postgres\", \"mysql\", \"oracle\", \"mssql\", \"mongodb\", \"redis\", \"libredb\"];\n  const dbTypes = selectableTypes.map((t) => {\n    const cfg = getDBConfig(t);\n    return { value: t, label: cfg.label, icon: cfg.icon, color: cfg.color };\n  });\n\n  return {\n    // Connection fields\n    type,\n    setType,\n    name,\n    setName,\n    host,\n    setHost,\n    port,\n    setPort,\n    user,\n    setUser,\n    password,\n    setPassword,\n    database,\n    setDatabase,\n    connectionString,\n    setConnectionString,\n    mongoConnectionMode,\n    setMongoConnectionMode,\n    environment,\n    setEnvironment,\n\n    // UI state\n    isTesting,\n    testResult,\n    setTestResult,\n    pasteInput,\n    setPasteInput,\n    showPasteInput,\n    setShowPasteInput,\n    isEditMode,\n\n    // SSL/TLS\n    showSSL,\n    setShowSSL,\n    sslMode,\n    setSSLMode,\n    caCert,\n    setCaCert,\n    clientCert,\n    setClientCert,\n    clientKey,\n    setClientKey,\n\n    // Advanced (Oracle/MSSQL)\n    showAdvanced,\n    setShowAdvanced,\n    serviceName,\n    setServiceName,\n    instanceName,\n    setInstanceName,\n\n    // SSH Tunnel\n    showSSH,\n    setShowSSH,\n    sshEnabled,\n    setSSHEnabled,\n    sshHost,\n    setSSHHost,\n    sshPort,\n    setSSHPort,\n    sshUsername,\n    setSSHUsername,\n    sshAuthMethod,\n    setSSHAuthMethod,\n    sshPassword,\n    setSSHPassword,\n    sshPrivateKey,\n    setSSHPrivateKey,\n    sshPassphrase,\n    setSSHPassphrase,\n\n    // Handlers\n    handleTestConnection,\n    handleConnect,\n    handlePasteConnectionString,\n\n    // Derived data\n    dbTypes,\n  };\n}\n","import * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n  const [isMobile, setIsMobile] = React.useState<boolean>(false);\n\n  React.useEffect(() => {\n    const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n    const onChange = () => {\n      setIsMobile(mql.matches);\n    };\n    // Set initial value immediately\n    setIsMobile(mql.matches);\n    mql.addEventListener(\"change\", onChange);\n    return () => mql.removeEventListener(\"change\", onChange);\n  }, []);\n\n  return isMobile;\n}\n","\"use client\";\n\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from \"@/components/ui/dialog\";\nimport { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription } from \"@/components/ui/drawer\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n  DatabaseConnection,\n  ConnectionEnvironment,\n  ENVIRONMENT_COLORS,\n  ENVIRONMENT_LABELS,\n  SSLMode,\n} from \"@/lib/types\";\nimport {\n  Database,\n  ShieldCheck,\n  Zap,\n  Globe,\n  Key,\n  Link,\n  CheckCircle2,\n  XCircle,\n  ClipboardPaste,\n  Lock,\n  ChevronDown,\n  Terminal,\n  Settings2,\n} from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { getDBConfig, isFileBased } from \"@/lib/db-ui-config\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { useConnectionForm } from \"@/hooks/use-connection-form\";\nimport { useIsMobile } from \"@/hooks/use-mobile\";\n\ninterface ConnectionModalProps {\n  isOpen: boolean;\n  onClose: () => void;\n  onConnect: (conn: DatabaseConnection) => void;\n  editConnection?: DatabaseConnection | null;\n  /** Optional API adapter: when provided, bypasses the built-in /api/db/test-connection fetch. */\n  onTestConnection?: (\n    connection: DatabaseConnection,\n  ) => Promise<{ success: boolean; latency?: number; error?: string }>;\n}\n\nexport function ConnectionModal({\n  isOpen,\n  onClose,\n  onConnect,\n  editConnection,\n  onTestConnection,\n}: ConnectionModalProps) {\n  const isMobile = useIsMobile();\n  const {\n    // Connection fields\n    type,\n    setType,\n    name,\n    setName,\n    host,\n    setHost,\n    port,\n    setPort,\n    user,\n    setUser,\n    password,\n    setPassword,\n    database,\n    setDatabase,\n    connectionString,\n    setConnectionString,\n    mongoConnectionMode,\n    setMongoConnectionMode,\n    environment,\n    setEnvironment,\n\n    // UI state\n    isTesting,\n    testResult,\n    setTestResult,\n    pasteInput,\n    setPasteInput,\n    showPasteInput,\n    setShowPasteInput,\n    isEditMode,\n\n    // SSL/TLS\n    showSSL,\n    setShowSSL,\n    sslMode,\n    setSSLMode,\n    caCert,\n    setCaCert,\n    clientCert,\n    setClientCert,\n    clientKey,\n    setClientKey,\n\n    // Advanced (Oracle/MSSQL)\n    showAdvanced,\n    setShowAdvanced,\n    serviceName,\n    setServiceName,\n    instanceName,\n    setInstanceName,\n\n    // SSH Tunnel\n    showSSH,\n    setShowSSH,\n    sshEnabled,\n    setSSHEnabled,\n    sshHost,\n    setSSHHost,\n    sshPort,\n    setSSHPort,\n    sshUsername,\n    setSSHUsername,\n    sshAuthMethod,\n    setSSHAuthMethod,\n    sshPassword,\n    setSSHPassword,\n    sshPrivateKey,\n    setSSHPrivateKey,\n    sshPassphrase,\n    setSSHPassphrase,\n\n    // Handlers\n    handleTestConnection,\n    handleConnect,\n    handlePasteConnectionString,\n\n    // Derived data\n    dbTypes,\n  } = useConnectionForm({ isOpen, onClose, onConnect, editConnection, onTestConnection });\n\n  const formContent = (\n    <>\n      {/* Progress bar — fixed top */}\n      <div className=\"shrink-0 h-2 w-full bg-blue-600/20\">\n        <motion.div\n          initial={{ width: 0 }}\n          animate={{ width: \"100%\" }}\n          className=\"h-full bg-blue-500 shadow-[0_0_15px_rgba(59,130,246,0.5)]\"\n        />\n      </div>\n\n      {/* Scrollable body */}\n      <div className=\"flex-1 overflow-y-auto p-4 md:p-8\">\n        <div className=\"mb-4 md:mb-8\">\n          <div className=\"flex items-center gap-3 mb-2\">\n            <div className=\"p-2 rounded-xl bg-blue-500/10 border border-blue-500/20\">\n              <Zap strokeWidth={1.5} className=\"w-5 h-5 text-blue-400\" />\n            </div>\n            <h2 className=\"text-xs md:text-[0.8125rem] font-medium\">\n              {isEditMode ? \"Edit Connection\" : \"New Connection\"}\n            </h2>\n          </div>\n          <div className=\"flex items-center justify-between\">\n            <p className=\"text-xs text-zinc-500\">\n              {isEditMode\n                ? \"Update your database connection parameters.\"\n                : \"Configure your database connection parameters securely.\"}\n            </p>\n            {!isEditMode && (\n              <button\n                onClick={() => setShowPasteInput(!showPasteInput)}\n                className=\"flex items-center gap-1.5 text-xs font-mediumr text-blue-400 hover:text-blue-300 transition-colors px-2 py-1 rounded-md hover:bg-blue-500/10\"\n              >\n                <ClipboardPaste strokeWidth={1.5} className=\"w-3 h-3\" />\n                Paste URL\n              </button>\n            )}\n          </div>\n        </div>\n\n        {/* Paste Connection String Input */}\n        <AnimatePresence>\n          {showPasteInput && (\n            <motion.div\n              initial={{ height: 0, opacity: 0 }}\n              animate={{ height: \"auto\", opacity: 1 }}\n              exit={{ height: 0, opacity: 0 }}\n              className=\"mb-6 overflow-hidden\"\n            >\n              <div className=\"p-3 rounded-lg border border-blue-500/20 bg-blue-500/5 space-y-2\">\n                <Label className=\"text-xs font-mediumr text-blue-400\">Paste Connection URL</Label>\n                <div className=\"flex gap-2\">\n                  <Input\n                    value={pasteInput}\n                    onChange={(e) => setPasteInput(e.target.value)}\n                    placeholder=\"postgres://user:pass@host:5432/db  or  mongodb://...\"\n                    className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 text-xs font-mono flex-1\"\n                    onKeyDown={(e) => e.key === \"Enter\" && handlePasteConnectionString()}\n                  />\n                  <Button\n                    size=\"sm\"\n                    onClick={handlePasteConnectionString}\n                    className=\"bg-blue-600 hover:bg-blue-500 text-white h-9 px-4 text-xs font-medium\"\n                  >\n                    Parse\n                  </Button>\n                </div>\n                <p className=\"text-xs text-zinc-500\">\n                  Supports: postgres://, mysql://, mongodb://, redis://, oracle://, mssql://\n                </p>\n              </div>\n            </motion.div>\n          )}\n        </AnimatePresence>\n\n        <div className=\"space-y-4 md:space-y-6\">\n          {/* Connection Name - always visible */}\n          <div className=\"space-y-2\">\n            <div className=\"flex items-center gap-2 mb-1\">\n              <Database strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n              <Label htmlFor=\"name\" className=\"text-xs font-mediumr text-zinc-500\">\n                Connection Name\n              </Label>\n            </div>\n            <Input\n              id=\"name\"\n              value={name}\n              onChange={(e) => setName(e.target.value)}\n              placeholder=\"My Database\"\n              className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs\"\n            />\n          </div>\n\n          {/* Environment Selector */}\n          <div className=\"space-y-2\">\n            <Label className=\"text-xs font-mediumr text-zinc-500\">Environment</Label>\n            <div className=\"flex flex-wrap items-center gap-2\">\n              {(Object.keys(ENVIRONMENT_COLORS) as ConnectionEnvironment[]).map((env) => (\n                <button\n                  key={env}\n                  onClick={() => setEnvironment(env)}\n                  className={cn(\n                    \"flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-mediumr transition-all border\",\n                    environment === env\n                      ? \"border-white/20 bg-white/5 text-zinc-200\"\n                      : \"border-transparent text-zinc-500 hover:text-zinc-300 hover:bg-white/5\",\n                  )}\n                >\n                  <div className=\"w-2 h-2 rounded-full\" style={{ backgroundColor: ENVIRONMENT_COLORS[env] }} />\n                  {env === \"other\" ? \"Other\" : ENVIRONMENT_LABELS[env]}\n                </button>\n              ))}\n            </div>\n          </div>\n\n          {/* DB Type Selector */}\n          <div className=\"grid grid-cols-2 gap-3\">\n            {dbTypes.map((db) => (\n              <button\n                key={db.value}\n                onClick={() => {\n                  setType(db.value);\n                  const cfg = getDBConfig(db.value);\n                  if (cfg.defaultPort) setPort(cfg.defaultPort);\n                  setTestResult(null);\n                }}\n                disabled={isEditMode}\n                className={cn(\n                  \"flex flex-col items-center justify-center p-3 md:p-4 rounded-xl border transition-all duration-200 gap-2 group\",\n                  type === db.value\n                    ? \"bg-blue-600/10 border-blue-500/50 shadow-[0_0_20px_rgba(59,130,246,0.1)]\"\n                    : \"bg-zinc-900/50 border-white/5 hover:border-white/10 hover:bg-zinc-900\",\n                  isEditMode && type !== db.value && \"opacity-30 cursor-not-allowed\",\n                )}\n              >\n                <db.icon\n                  className={cn(\n                    \"w-6 h-6 mb-1 transition-transform group-hover:scale-110\",\n                    type === db.value ? db.color : \"text-zinc-600\",\n                  )}\n                />\n                <span className={cn(\"text-xs font-medium\", type === db.value ? \"text-zinc-200\" : \"text-zinc-500\")}>\n                  {db.label}\n                </span>\n              </button>\n            ))}\n          </div>\n\n          <div className=\"space-y-4 animate-in fade-in slide-in-from-bottom-4 duration-500\">\n            <>\n              {/* Connection string mode toggle */}\n              {getDBConfig(type).showConnectionStringToggle && (\n                <div className=\"flex items-center gap-2 p-1 rounded-lg bg-zinc-900/50 border border-white/5\">\n                  <button\n                    onClick={() => setMongoConnectionMode(\"host\")}\n                    className={cn(\n                      \"flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-md text-xs font-medium transition-all\",\n                      mongoConnectionMode === \"host\"\n                        ? \"bg-blue-600/20 text-blue-400 border border-blue-500/30\"\n                        : \"text-zinc-500 hover:text-zinc-300\",\n                    )}\n                  >\n                    <Globe strokeWidth={1.5} className=\"w-3 h-3\" />\n                    Host / Port\n                  </button>\n                  <button\n                    onClick={() => setMongoConnectionMode(\"connectionString\")}\n                    className={cn(\n                      \"flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-md text-xs font-medium transition-all\",\n                      mongoConnectionMode === \"connectionString\"\n                        ? \"bg-blue-600/20 text-blue-400 border border-blue-500/30\"\n                        : \"text-zinc-500 hover:text-zinc-300\",\n                    )}\n                  >\n                    <Link strokeWidth={1.5} className=\"w-3 h-3\" />\n                    Connection String\n                  </button>\n                </div>\n              )}\n\n              {getDBConfig(type).showConnectionStringToggle && mongoConnectionMode === \"connectionString\" ? (\n                <>\n                  <div className=\"space-y-2\">\n                    <div className=\"flex items-center gap-2 mb-1\">\n                      <Link strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n                      <Label htmlFor=\"connectionString\" className=\"text-xs font-mediumr text-zinc-500\">\n                        Connection URI\n                      </Label>\n                    </div>\n                    <Input\n                      id=\"connectionString\"\n                      value={connectionString}\n                      onChange={(e) => setConnectionString(e.target.value)}\n                      placeholder=\"mongodb://localhost:27017/mydb  or  mongodb+srv://...\"\n                      className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs font-mono\"\n                    />\n                  </div>\n                  <div className=\"space-y-2\">\n                    <div className=\"flex items-center gap-2 mb-1\">\n                      <Database strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n                      <Label htmlFor=\"database\" className=\"text-xs font-mediumr text-zinc-500\">\n                        Database Name (optional override)\n                      </Label>\n                    </div>\n                    <Input\n                      id=\"database\"\n                      value={database}\n                      onChange={(e) => setDatabase(e.target.value)}\n                      placeholder=\"Extracted from URI if not provided\"\n                      className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs font-mono\"\n                    />\n                  </div>\n                </>\n              ) : isFileBased(type) ? (\n                <div className=\"space-y-2\">\n                  <div className=\"flex items-center gap-2 mb-1\">\n                    <Database strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n                    <Label htmlFor=\"database\" className=\"text-xs font-medium text-zinc-500\">\n                      Database File Path\n                    </Label>\n                  </div>\n                  <Input\n                    id=\"database\"\n                    value={database}\n                    onChange={(e) => setDatabase(e.target.value)}\n                    placeholder=\"/path/to/database file\"\n                    className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs font-mono\"\n                  />\n                </div>\n              ) : (\n                <>\n                  <div className=\"space-y-2\">\n                    <div className=\"flex items-center gap-2 mb-1\">\n                      <Globe strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n                      <Label htmlFor=\"host\" className=\"text-xs font-mediumr text-zinc-500\">\n                        Host & Instance\n                      </Label>\n                    </div>\n                    <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n                      <Input\n                        id=\"host\"\n                        value={host}\n                        onChange={(e) => setHost(e.target.value)}\n                        placeholder=\"localhost\"\n                        className=\"md:col-span-3 h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs\"\n                      />\n                      <Input\n                        id=\"port\"\n                        value={port}\n                        onChange={(e) => setPort(e.target.value)}\n                        className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs font-mono\"\n                      />\n                    </div>\n                  </div>\n\n                  <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n                    <div className=\"space-y-2\">\n                      <div className=\"flex items-center gap-2 mb-1\">\n                        <Key strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n                        <Label htmlFor=\"user\" className=\"text-xs font-mediumr text-zinc-500\">\n                          Username\n                        </Label>\n                      </div>\n                      <Input\n                        id=\"user\"\n                        value={user}\n                        onChange={(e) => setUser(e.target.value)}\n                        placeholder=\"postgres\"\n                        className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs\"\n                      />\n                    </div>\n                    <div className=\"space-y-2\">\n                      <div className=\"flex items-center gap-2 mb-1\">\n                        <ShieldCheck strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n                        <Label htmlFor=\"password\" className=\"text-xs font-mediumr text-zinc-500\">\n                          Password\n                        </Label>\n                      </div>\n                      <Input\n                        id=\"password\"\n                        type=\"password\"\n                        value={password}\n                        onChange={(e) => setPassword(e.target.value)}\n                        placeholder=\"••••••••\"\n                        className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs\"\n                      />\n                    </div>\n                  </div>\n\n                  <div className=\"space-y-2\">\n                    <div className=\"flex items-center gap-2 mb-1\">\n                      <Database strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n                      <Label htmlFor=\"database\" className=\"text-xs font-mediumr text-zinc-500\">\n                        Database Name\n                      </Label>\n                    </div>\n                    <Input\n                      id=\"database\"\n                      value={database}\n                      onChange={(e) => setDatabase(e.target.value)}\n                      placeholder=\"production_db\"\n                      className=\"h-10 bg-zinc-900/50 border-white/5 focus:border-blue-500/50 transition-all text-xs font-mono\"\n                    />\n                  </div>\n                </>\n              )}\n            </>\n          </div>\n\n          {/* Advanced Settings (Oracle/MSSQL) */}\n          {(type === \"oracle\" || type === \"mssql\") && (\n            <div className=\"space-y-2\">\n              <button\n                type=\"button\"\n                onClick={() => setShowAdvanced(!showAdvanced)}\n                className=\"flex items-center gap-2 w-full px-3 py-2 rounded-lg border border-white/5 hover:border-white/10 bg-zinc-900/30 text-xs font-medium text-zinc-400 hover:text-zinc-200 transition-all\"\n              >\n                <Settings2 strokeWidth={1.5} className=\"w-3.5 h-3.5 text-orange-500\" />\n                <span>Advanced</span>\n                {(serviceName || instanceName) && (\n                  <span className=\"ml-1 px-1.5 py-0.5 rounded text-[0.625rem] bg-orange-500/10 text-orange-400 border border-orange-500/20\">\n                    SET\n                  </span>\n                )}\n                <ChevronDown className={cn(\"w-3 h-3 ml-auto transition-transform\", showAdvanced && \"rotate-180\")} />\n              </button>\n              <AnimatePresence>\n                {showAdvanced && (\n                  <motion.div\n                    initial={{ height: 0, opacity: 0 }}\n                    animate={{ height: \"auto\", opacity: 1 }}\n                    exit={{ height: 0, opacity: 0 }}\n                    className=\"overflow-hidden\"\n                  >\n                    <div className=\"p-3 rounded-lg border border-orange-500/10 bg-orange-500/5 space-y-3\">\n                      {type === \"oracle\" && (\n                        <div className=\"space-y-1.5\">\n                          <Label className=\"text-xs font-mediumr text-zinc-500\">Service Name</Label>\n                          <Input\n                            value={serviceName}\n                            onChange={(e) => setServiceName(e.target.value)}\n                            placeholder=\"ORCL or XEPDB1\"\n                            className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-orange-500/50 text-xs\"\n                          />\n                          <p className=\"text-xs text-zinc-500\">\n                            If empty, the Database Name field is used as the service name.\n                          </p>\n                        </div>\n                      )}\n                      {type === \"mssql\" && (\n                        <div className=\"space-y-1.5\">\n                          <Label className=\"text-xs font-mediumr text-zinc-500\">Instance Name</Label>\n                          <Input\n                            value={instanceName}\n                            onChange={(e) => setInstanceName(e.target.value)}\n                            placeholder=\"SQLEXPRESS\"\n                            className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-orange-500/50 text-xs\"\n                          />\n                          <p className=\"text-xs text-zinc-500\">\n                            For named instances (e.g. SQLEXPRESS). Leave empty for default instance.\n                          </p>\n                        </div>\n                      )}\n                    </div>\n                  </motion.div>\n                )}\n              </AnimatePresence>\n            </div>\n          )}\n\n          {/* SSL/TLS & SSH Panels - only for non-file-based providers */}\n          {!isFileBased(type) && (\n            <div className=\"space-y-2\">\n              {/* SSL/TLS Toggle */}\n              <button\n                type=\"button\"\n                onClick={() => setShowSSL(!showSSL)}\n                className=\"flex items-center gap-2 w-full px-3 py-2 rounded-lg border border-white/5 hover:border-white/10 bg-zinc-900/30 text-xs font-medium text-zinc-400 hover:text-zinc-200 transition-all\"\n              >\n                <Lock strokeWidth={1.5} className=\"w-3.5 h-3.5 text-emerald-500\" />\n                <span>SSL / TLS</span>\n                {sslMode !== \"disable\" && (\n                  <span className=\"ml-1 px-1.5 py-0.5 rounded text-[0.625rem] bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\">\n                    {sslMode.toUpperCase()}\n                  </span>\n                )}\n                <ChevronDown className={cn(\"w-3 h-3 ml-auto transition-transform\", showSSL && \"rotate-180\")} />\n              </button>\n              <AnimatePresence>\n                {showSSL && (\n                  <motion.div\n                    initial={{ height: 0, opacity: 0 }}\n                    animate={{ height: \"auto\", opacity: 1 }}\n                    exit={{ height: 0, opacity: 0 }}\n                    className=\"overflow-hidden\"\n                  >\n                    <div className=\"p-3 rounded-lg border border-emerald-500/10 bg-emerald-500/5 space-y-3\">\n                      <div className=\"space-y-2\">\n                        <Label className=\"text-xs font-mediumr text-zinc-500\">SSL Mode</Label>\n                        <div className=\"flex flex-wrap gap-1.5\">\n                          {([\"disable\", \"require\", \"verify-ca\", \"verify-full\"] as SSLMode[]).map((mode) => (\n                            <button\n                              key={mode}\n                              type=\"button\"\n                              onClick={() => setSSLMode(mode)}\n                              className={cn(\n                                \"px-2.5 py-1.5 rounded-md text-xs font-mediumr transition-all border\",\n                                sslMode === mode\n                                  ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-400\"\n                                  : \"border-transparent text-zinc-500 hover:text-zinc-300 hover:bg-white/5\",\n                              )}\n                            >\n                              {mode}\n                            </button>\n                          ))}\n                        </div>\n                      </div>\n                      {sslMode !== \"disable\" && (\n                        <div className=\"space-y-3\">\n                          <div className=\"space-y-1.5\">\n                            <Label className=\"text-xs font-mediumr text-zinc-500\">CA Certificate (PEM)</Label>\n                            <textarea\n                              value={caCert}\n                              onChange={(e) => setCaCert(e.target.value)}\n                              placeholder=\"-----BEGIN CERTIFICATE-----&#10;Paste CA cert content here...&#10;-----END CERTIFICATE-----\"\n                              rows={3}\n                              className=\"w-full rounded-md bg-zinc-900/50 border border-white/5 focus:border-emerald-500/50 text-xs font-mono text-zinc-300 p-2 resize-none placeholder:text-zinc-600\"\n                            />\n                          </div>\n                          {(sslMode === \"verify-ca\" || sslMode === \"verify-full\") && (\n                            <>\n                              <div className=\"space-y-1.5\">\n                                <Label className=\"text-xs font-mediumr text-zinc-500\">Client Certificate (PEM)</Label>\n                                <textarea\n                                  value={clientCert}\n                                  onChange={(e) => setClientCert(e.target.value)}\n                                  placeholder=\"-----BEGIN CERTIFICATE-----&#10;Optional client cert...&#10;-----END CERTIFICATE-----\"\n                                  rows={3}\n                                  className=\"w-full rounded-md bg-zinc-900/50 border border-white/5 focus:border-emerald-500/50 text-xs font-mono text-zinc-300 p-2 resize-none placeholder:text-zinc-600\"\n                                />\n                              </div>\n                              <div className=\"space-y-1.5\">\n                                <Label className=\"text-xs font-mediumr text-zinc-500\">Client Private Key (PEM)</Label>\n                                <textarea\n                                  value={clientKey}\n                                  onChange={(e) => setClientKey(e.target.value)}\n                                  placeholder=\"-----BEGIN PRIVATE KEY-----&#10;Optional client key...&#10;-----END PRIVATE KEY-----\"\n                                  rows={3}\n                                  className=\"w-full rounded-md bg-zinc-900/50 border border-white/5 focus:border-emerald-500/50 text-xs font-mono text-zinc-300 p-2 resize-none placeholder:text-zinc-600\"\n                                />\n                              </div>\n                            </>\n                          )}\n                        </div>\n                      )}\n                    </div>\n                  </motion.div>\n                )}\n              </AnimatePresence>\n\n              {/* SSH Tunnel Toggle */}\n              <button\n                type=\"button\"\n                onClick={() => setShowSSH(!showSSH)}\n                className=\"flex items-center gap-2 w-full px-3 py-2 rounded-lg border border-white/5 hover:border-white/10 bg-zinc-900/30 text-xs font-medium text-zinc-400 hover:text-zinc-200 transition-all\"\n              >\n                <Terminal strokeWidth={1.5} className=\"w-3.5 h-3.5 text-purple-500\" />\n                <span>SSH Tunnel</span>\n                {sshEnabled && (\n                  <span className=\"ml-1 px-1.5 py-0.5 rounded text-[0.625rem] bg-purple-500/10 text-purple-400 border border-purple-500/20\">\n                    ON\n                  </span>\n                )}\n                <ChevronDown className={cn(\"w-3 h-3 ml-auto transition-transform\", showSSH && \"rotate-180\")} />\n              </button>\n              <AnimatePresence>\n                {showSSH && (\n                  <motion.div\n                    initial={{ height: 0, opacity: 0 }}\n                    animate={{ height: \"auto\", opacity: 1 }}\n                    exit={{ height: 0, opacity: 0 }}\n                    className=\"overflow-hidden\"\n                  >\n                    <div className=\"p-3 rounded-lg border border-purple-500/10 bg-purple-500/5 space-y-3\">\n                      <label className=\"flex items-center gap-2 cursor-pointer\">\n                        <input\n                          type=\"checkbox\"\n                          checked={sshEnabled}\n                          onChange={(e) => setSSHEnabled(e.target.checked)}\n                          className=\"rounded border-white/20 bg-zinc-900/50\"\n                        />\n                        <span className=\"text-xs font-medium text-zinc-300\">Enable SSH Tunnel</span>\n                      </label>\n                      {sshEnabled && (\n                        <div className=\"space-y-3\">\n                          <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n                            <div className=\"md:col-span-3 space-y-1.5\">\n                              <Label className=\"text-xs font-mediumr text-zinc-500\">SSH Host</Label>\n                              <Input\n                                value={sshHost}\n                                onChange={(e) => setSSHHost(e.target.value)}\n                                placeholder=\"bastion.example.com\"\n                                className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-purple-500/50 text-xs\"\n                              />\n                            </div>\n                            <div className=\"space-y-1.5\">\n                              <Label className=\"text-xs font-mediumr text-zinc-500\">Port</Label>\n                              <Input\n                                value={sshPort}\n                                onChange={(e) => setSSHPort(e.target.value)}\n                                className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-purple-500/50 text-xs font-mono\"\n                              />\n                            </div>\n                          </div>\n                          <div className=\"space-y-1.5\">\n                            <Label className=\"text-xs font-mediumr text-zinc-500\">Username</Label>\n                            <Input\n                              value={sshUsername}\n                              onChange={(e) => setSSHUsername(e.target.value)}\n                              placeholder=\"ubuntu\"\n                              className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-purple-500/50 text-xs\"\n                            />\n                          </div>\n                          <div className=\"space-y-2\">\n                            <Label className=\"text-xs font-mediumr text-zinc-500\">Auth Method</Label>\n                            <div className=\"flex gap-2\">\n                              <button\n                                type=\"button\"\n                                onClick={() => setSSHAuthMethod(\"password\")}\n                                className={cn(\n                                  \"flex-1 px-3 py-1.5 rounded-md text-xs font-mediumr transition-all border\",\n                                  sshAuthMethod === \"password\"\n                                    ? \"border-purple-500/30 bg-purple-500/10 text-purple-400\"\n                                    : \"border-transparent text-zinc-500 hover:text-zinc-300 hover:bg-white/5\",\n                                )}\n                              >\n                                Password\n                              </button>\n                              <button\n                                type=\"button\"\n                                onClick={() => setSSHAuthMethod(\"privateKey\")}\n                                className={cn(\n                                  \"flex-1 px-3 py-1.5 rounded-md text-xs font-mediumr transition-all border\",\n                                  sshAuthMethod === \"privateKey\"\n                                    ? \"border-purple-500/30 bg-purple-500/10 text-purple-400\"\n                                    : \"border-transparent text-zinc-500 hover:text-zinc-300 hover:bg-white/5\",\n                                )}\n                              >\n                                Private Key\n                              </button>\n                            </div>\n                          </div>\n                          {sshAuthMethod === \"password\" ? (\n                            <div className=\"space-y-1.5\">\n                              <Label className=\"text-xs font-mediumr text-zinc-500\">SSH Password</Label>\n                              <Input\n                                type=\"password\"\n                                value={sshPassword}\n                                onChange={(e) => setSSHPassword(e.target.value)}\n                                placeholder=\"••••••••\"\n                                className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-purple-500/50 text-xs\"\n                              />\n                            </div>\n                          ) : (\n                            <div className=\"space-y-3\">\n                              <div className=\"space-y-1.5\">\n                                <Label className=\"text-xs font-mediumr text-zinc-500\">Private Key (PEM)</Label>\n                                <textarea\n                                  value={sshPrivateKey}\n                                  onChange={(e) => setSSHPrivateKey(e.target.value)}\n                                  placeholder=\"-----BEGIN OPENSSH PRIVATE KEY-----&#10;Paste private key here...&#10;-----END OPENSSH PRIVATE KEY-----\"\n                                  rows={4}\n                                  className=\"w-full rounded-md bg-zinc-900/50 border border-white/5 focus:border-purple-500/50 text-xs font-mono text-zinc-300 p-2 resize-none placeholder:text-zinc-600\"\n                                />\n                              </div>\n                              <div className=\"space-y-1.5\">\n                                <Label className=\"text-xs font-mediumr text-zinc-500\">Passphrase (optional)</Label>\n                                <Input\n                                  type=\"password\"\n                                  value={sshPassphrase}\n                                  onChange={(e) => setSSHPassphrase(e.target.value)}\n                                  placeholder=\"Key passphrase (if encrypted)\"\n                                  className=\"h-9 bg-zinc-900/50 border-white/5 focus:border-purple-500/50 text-xs\"\n                                />\n                              </div>\n                            </div>\n                          )}\n                        </div>\n                      )}\n                    </div>\n                  </motion.div>\n                )}\n              </AnimatePresence>\n            </div>\n          )}\n\n          {/* Test Result */}\n          <AnimatePresence>\n            {testResult && (\n              <motion.div\n                initial={{ height: 0, opacity: 0 }}\n                animate={{ height: \"auto\", opacity: 1 }}\n                exit={{ height: 0, opacity: 0 }}\n                className=\"overflow-hidden\"\n              >\n                <div\n                  className={cn(\n                    \"flex items-center gap-2 p-3 rounded-lg border text-xs\",\n                    testResult.success\n                      ? \"bg-emerald-500/5 border-emerald-500/20 text-emerald-400\"\n                      : \"bg-red-500/5 border-red-500/20 text-red-400\",\n                  )}\n                >\n                  {testResult.success ? (\n                    <CheckCircle2 strokeWidth={1.5} className=\"w-3.5 h-3.5 shrink-0\" />\n                  ) : (\n                    <XCircle strokeWidth={1.5} className=\"w-3.5 h-3.5 shrink-0\" />\n                  )}\n                  <span className=\"leading-relaxed\">{testResult.message}</span>\n                </div>\n              </motion.div>\n            )}\n          </AnimatePresence>\n        </div>\n      </div>\n\n      {/* Sticky footer */}\n      <div className=\"shrink-0 bg-zinc-900/30 p-4 md:p-6 border-t border-white/5\">\n        <div className=\"flex flex-col-reverse gap-3 md:flex-row md:items-center md:justify-between\">\n          <Button\n            variant=\"ghost\"\n            onClick={onClose}\n            className=\"w-full md:w-auto text-zinc-500 hover:text-zinc-200 hover:bg-white/5 text-xs font-medium\"\n          >\n            Cancel\n          </Button>\n          <div className=\"flex flex-col gap-2 md:flex-row md:items-center md:gap-2\">\n            <Button\n              variant=\"outline\"\n              onClick={handleTestConnection}\n              disabled={isTesting}\n              className=\"w-full md:w-auto border-white/10 text-zinc-400 hover:text-white hover:bg-white/5 text-xs font-medium h-10 px-4\"\n            >\n              {isTesting ? (\n                <div className=\"flex items-center gap-2\">\n                  <div className=\"w-3 h-3 border-2 border-zinc-400/30 border-t-zinc-400 rounded-full animate-spin\" />\n                  Testing...\n                </div>\n              ) : (\n                \"Test Connection\"\n              )}\n            </Button>\n            <Button\n              onClick={handleConnect}\n              disabled={\n                isTesting ||\n                (getDBConfig(type).showConnectionStringToggle &&\n                  mongoConnectionMode === \"connectionString\" &&\n                  !connectionString.trim())\n              }\n              className=\"w-full md:w-auto min-w-0 md:min-w-[140px] bg-blue-600 hover:bg-blue-500 text-white font-medium text-xs h-10 shadow-lg shadow-blue-900/20 group relative overflow-hidden\"\n            >\n              <AnimatePresence mode=\"wait\">\n                {isTesting ? (\n                  <motion.div\n                    key=\"testing\"\n                    initial={{ opacity: 0 }}\n                    animate={{ opacity: 1 }}\n                    exit={{ opacity: 0 }}\n                    className=\"flex items-center gap-2\"\n                  >\n                    <div className=\"w-3.5 h-3.5 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\n                    Connecting...\n                  </motion.div>\n                ) : (\n                  <motion.div\n                    key=\"connect\"\n                    initial={{ opacity: 0 }}\n                    animate={{ opacity: 1 }}\n                    exit={{ opacity: 0 }}\n                    className=\"flex items-center gap-2\"\n                  >\n                    {isEditMode ? \"Save Changes\" : \"Establish Connection\"}\n                  </motion.div>\n                )}\n              </AnimatePresence>\n            </Button>\n          </div>\n        </div>\n      </div>\n    </>\n  );\n\n  if (isMobile) {\n    return (\n      <Drawer\n        open={isOpen}\n        onOpenChange={(open) => {\n          if (!open) onClose();\n        }}\n      >\n        <DrawerContent className=\"max-h-[95dvh] bg-[#0a0a0a] border-white/5 text-zinc-200 p-0 flex flex-col\">\n          <DrawerHeader className=\"sr-only\">\n            <DrawerTitle>{isEditMode ? \"Edit Connection\" : \"New Connection\"}</DrawerTitle>\n            <DrawerDescription>Configure database connection parameters.</DrawerDescription>\n          </DrawerHeader>\n          {formContent}\n        </DrawerContent>\n      </Drawer>\n    );\n  }\n\n  return (\n    <Dialog open={isOpen} onOpenChange={onClose}>\n      <DialogContent\n        className=\"sm:max-w-[500px] lg:max-w-[540px] max-h-[90vh] bg-[#0a0a0a] border-white/5 text-zinc-200 p-0 overflow-hidden shadow-2xl flex flex-col\"\n        showCloseButton={false}\n      >\n        <DialogTitle className=\"sr-only\">{isEditMode ? \"Edit Connection\" : \"New Connection\"}</DialogTitle>\n        <DialogDescription className=\"sr-only\">Configure database connection parameters.</DialogDescription>\n        {formContent}\n      </DialogContent>\n    </Dialog>\n  );\n}\n"]}