{"version":3,"sources":["../src/context/CilantroContext.tsx","../src/core/auth.ts","../src/core/storage-adapter.ts","../src/core/types.ts","../src/core/error-utils.ts","../src/core/normalize.ts","../src/providers/CilantroProvider.tsx","../src/providers/CilantroAuthProvider.tsx","../src/providers/WalletProvider.tsx","../src/index.ts","../src/hooks/useCilantroConfig.ts","../src/hooks/useAuth.ts","../src/hooks/useReturnUrl.ts","../src/hooks/useWallet.ts","../src/hooks/useSigners.ts","../src/core/signer-helpers.ts","../src/core/signer-creation.ts","../src/hooks/usePasskey.ts","../src/hooks/useExternalWallet.ts","../src/hooks/useSendTransaction.ts","../src/components/auth/LoginForm.tsx","../src/ui/button.tsx","../src/ui/cn.ts","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/card.tsx","../src/components/auth/SocialLoginButtons.tsx","../src/components/auth/RegisterForm.tsx","../src/components/auth/LogoutButton.tsx","../src/ui/dialog.tsx","../src/components/auth/AuthGuard.tsx","../src/ui/skeleton.tsx","../src/components/auth/AuthShell.tsx","../src/components/signers/CreateEmailSignerForm.tsx","../src/components/signers/CreatePhoneSignerForm.tsx","../src/components/signers/AddPasskeyButton.tsx","../src/components/signers/SignerList.tsx","../src/components/signers/SignerSelector.tsx","../src/components/wallet/ConnectWalletButton.tsx","../src/components/wallet/CreateWalletForm.tsx","../src/ui/select.tsx","../src/components/wallet/WalletSelector.tsx","../src/components/wallet/WalletAddress.tsx","../src/components/wallet/WalletBalance.tsx","../src/components/transactions/SendSOLForm.tsx","../src/components/transactions/SendSPLForm.tsx","../src/components/transactions/TransactionStatus.tsx","../src/components/transactions/TransactionHistory.tsx","../src/components/layout/CilantroConnect.tsx","../src/components/layout/LoadingOverlay.tsx","../src/components/layout/ErrorBoundary.tsx","../src/ui/theme-provider.tsx","../src/adapters/solana-connection.ts","../src/core/signer-signing/core.ts","../src/core/signer-signing/constants.ts","../src/core/signer-signing/storage.ts","../src/core/signer-signing/message-signing.ts","../src/core/signer-signing/errors.ts","../src/core/signer-signing/signer-types.ts","../src/core/signer-signing/transaction-signing.ts","../src/core/signer-signing/validation.ts","../src/core/signer-signing/wallet-data.ts"],"sourcesContent":["\"use client\";\n\nimport {\n  createContext,\n  type ReactNode,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useState,\n} from \"react\";\nimport { clearAuth } from \"cilantro-sdk\";\nimport { login as cilantroLogin, socialLoginAndSetAuth } from \"cilantro-sdk/auth\";\nimport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nimport { create as createUser } from \"cilantro-sdk/user\";\nimport { create as createWalletSDK, findAll as findAllWallets } from \"cilantro-sdk/wallet\";\nimport type {\n  WalletControllerFindAllResult,\n  WalletControllerCreateResult,\n} from \"cilantro-sdk/wallet\";\nimport { setAuthConfig, setSdkAuth, getPlatformApiKey, isJwtExpired } from \"../core/auth\";\nimport { setStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage, isAuthError } from \"../core/error-utils\";\nimport { normalizeWallet } from \"../core/normalize\";\n\nconst DEFAULT_BASE_URL = \"https://api.cilantro.gg\";\nconst DEFAULT_JWT_STORAGE_KEY = \"cilantro_jwt\";\nconst DEFAULT_WALLET_STORAGE_KEY = \"cilantro_selected_wallet_id\";\n\n/** Hard-coded Google OAuth client ID for built-in Google Sign-In. */\nconst GOOGLE_CLIENT_ID = \"75083940771-q41831bdbpckupb0idvqf1pgr5ng4lg4.apps.googleusercontent.com\";\n\n/** Minimal user view; populated from SDK login result data.user when available. */\nexport interface User {\n  username?: string;\n  email?: string;\n  userType?: string;\n}\n\n/** SDK wallet list item type. */\nexport type WalletDataDto = WalletControllerFindAllResult[\"data\"] extends readonly (infer E)[]\n  ? E\n  : WalletControllerFindAllResult[\"data\"] extends (infer E)[]\n    ? E\n    : never;\n\n/** Wallet with backward-compat aliases (id, address, active). */\nexport type WalletData = WalletDataDto & {\n  id?: string;\n  address?: string;\n  active?: boolean;\n};\n\nexport interface SocialAuthConfig {\n  /** Google OAuth client ID for built-in Google Sign-In. */\n  googleClientId?: string;\n  /** Discord OAuth client ID (optional; for reference). */\n  discordClientId?: string;\n  /** Client redirect URI for built-in \"Sign in with Discord\" (e.g. https://myapp.com/auth/callback). User lands here after Discord login; use setAuthFromFragment() on that page. */\n  discordRedirectUri?: string;\n}\n\n/** Params for loginWithSocial. Matches cilantro-sdk SocialLoginDto: Google/Apple use id_token, Discord uses access_token. */\nexport type SocialLoginParams =\n  | { provider: \"google\"; id_token: string }\n  | { provider: \"apple\"; id_token: string }\n  | { provider: \"discord\"; access_token: string };\n\nexport interface CilantroConfig {\n  apiKey?: string;\n  baseURL: string;\n  jwt?: string | null;\n  socialAuth?: SocialAuthConfig;\n}\n\nexport interface CilantroContextValue {\n  config: CilantroConfig;\n  storage: DeviceKeyStorage | null;\n  // Auth\n  user: User | null;\n  jwt: string | null;\n  isAuthenticated: boolean;\n  isLoading: boolean;\n  login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n  /** Sign in with Google/Apple (id_token) or Discord (access_token). Matches cilantro-sdk SocialLoginDto. */\n  loginWithSocial: (params: SocialLoginParams) => Promise<void>;\n  logout: () => void;\n  register: (\n    username: string,\n    email: string,\n    password: string,\n    isActive?: boolean\n  ) => Promise<void>;\n  clearSessionDueToAuthError: () => void;\n  // Wallet\n  wallet: WalletData | null;\n  wallets: WalletData[];\n  createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n  selectWallet: (walletId: string) => void;\n  refreshWallets: () => Promise<void>;\n  walletError: string | null;\n  walletsLoading: boolean;\n}\n\nconst CilantroContext = createContext<CilantroContextValue | undefined>(undefined);\n\nexport interface CilantroContextProviderProps {\n  children: ReactNode;\n  apiKey?: string;\n  baseURL?: string;\n  storageAdapter?: DeviceKeyStorage | null;\n  jwtStorageKey?: string;\n  walletStorageKey?: string;\n  /** When true, sync JWT to a cookie (same name as jwtStorageKey) for Next.js/middleware. Default: false. */\n  syncJwtToCookie?: boolean;\n  /** Cookie name for JWT when syncJwtToCookie is true. Default: cilantro_jwt. */\n  jwtCookieName?: string;\n  onLoginSuccess?: () => void;\n  onLogout?: () => void;\n  onRegisterSuccess?: () => void;\n  onSessionExpired?: () => void;\n}\n\nconst DEFAULT_JWT_COOKIE_NAME = \"cilantro_jwt\";\n\nfunction setJwtCookie(name: string, token: string | null): void {\n  if (typeof document === \"undefined\") return;\n  const value = token ?? \"\";\n  if (!value) {\n    document.cookie = `${name}=; path=/; SameSite=Lax; max-age=0`;\n    return;\n  }\n  // Set cookie with long expiry (JWT has its own exp; middleware will validate).\n  const maxAge = 60 * 60 * 24 * 7; // 7 days\n  document.cookie = `${name}=${encodeURIComponent(value)}; path=/; SameSite=Lax; max-age=${maxAge}`;\n}\n\nexport function CilantroContextProvider({\n  children,\n  apiKey,\n  baseURL = DEFAULT_BASE_URL,\n  storageAdapter = null,\n  jwtStorageKey = DEFAULT_JWT_STORAGE_KEY,\n  walletStorageKey = DEFAULT_WALLET_STORAGE_KEY,\n  syncJwtToCookie = false,\n  jwtCookieName = DEFAULT_JWT_COOKIE_NAME,\n  onLoginSuccess,\n  onLogout,\n  onRegisterSuccess,\n  onSessionExpired,\n}: CilantroContextProviderProps) {\n  const [user, setUser] = useState<User | null>(null);\n  const [jwt, setJwt] = useState<string | null>(null);\n  const [authLoading, setAuthLoading] = useState(true);\n  const [wallets, setWallets] = useState<WalletData[]>([]);\n  const [selectedWallet, setSelectedWallet] = useState<WalletData | null>(null);\n  const [walletsLoading, setWalletsLoading] = useState(true);\n  const [walletError, setWalletError] = useState<string | null>(null);\n\n  const config = useMemo<CilantroConfig>(\n    () => ({\n      apiKey,\n      baseURL,\n      jwt: jwt ?? undefined,\n      socialAuth: { googleClientId: GOOGLE_CLIENT_ID },\n    }),\n    [apiKey, baseURL, jwt]\n  );\n\n  // Inject storage adapter into core so signer creation uses it\n  useEffect(() => {\n    setStorageAdapter(storageAdapter ?? null);\n    return () => setStorageAdapter(null);\n  }, [storageAdapter]);\n\n  // Set SDK auth config and restore session from storage\n  useEffect(() => {\n    setAuthConfig({ apiKey, baseURL });\n    const storedToken =\n      typeof window !== \"undefined\" ? localStorage.getItem(jwtStorageKey) : null;\n    if (storedToken) {\n      if (isJwtExpired(storedToken)) {\n        if (typeof window !== \"undefined\") {\n          localStorage.removeItem(jwtStorageKey);\n          const keys = Object.keys(localStorage);\n          keys.forEach((key) => {\n            if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n          });\n        }\n        setSdkAuth(null);\n      } else {\n        setJwt(storedToken);\n        setSdkAuth(storedToken);\n        try {\n          const payload = JSON.parse(atob(storedToken.split(\".\")[1]));\n          setUser({\n            username: payload.username,\n            email: payload.email,\n            userType: payload.userType,\n          });\n        } catch {\n          // ignore\n        }\n      }\n    } else {\n      setSdkAuth(null);\n    }\n    setAuthLoading(false);\n  }, [apiKey, baseURL, jwtStorageKey]);\n\n  // Sync JWT to cookie for Next.js/middleware when enabled\n  useEffect(() => {\n    if (syncJwtToCookie && typeof document !== \"undefined\") {\n      setJwtCookie(jwtCookieName, jwt);\n    }\n  }, [jwt, syncJwtToCookie, jwtCookieName]);\n\n  const login = useCallback(\n    async (params: { usernameOrEmail: string; password: string }) => {\n      const result = await cilantroLogin(params);\n      const data: AuthControllerLogin200Data | undefined =\n        result && typeof result === \"object\" && \"data\" in result\n          ? (result as { data: AuthControllerLogin200Data }).data\n          : undefined;\n      const token =\n        (data && \"jwt\" in data ? (data as { jwt?: string }).jwt : undefined) ??\n        (data && \"accessToken\" in data ? (data as { accessToken?: string }).accessToken : undefined);\n      if (!token) throw new Error(\"No JWT token received from server\");\n      const userType = data?.userType;\n      setJwt(token);\n      setSdkAuth(token);\n      if (typeof window !== \"undefined\") {\n        localStorage.setItem(jwtStorageKey, token);\n        if (syncJwtToCookie) setJwtCookie(jwtCookieName, token);\n      }\n      if (data?.user && typeof data.user === \"object\") {\n        const u = data.user as Record<string, unknown>;\n        setUser({\n          username: u.username as string | undefined,\n          email: u.email as string | undefined,\n          userType: (userType ?? u.userType) as string | undefined,\n        });\n      } else {\n        try {\n          const payload = JSON.parse(atob(token.split(\".\")[1])) as Record<string, unknown>;\n          setUser({\n            username: payload.username as string | undefined,\n            email: payload.email as string | undefined,\n            userType: (userType ?? payload.userType) as string | undefined,\n          });\n        } catch {\n          setUser({ userType: userType as string | undefined });\n        }\n      }\n      onLoginSuccess?.();\n    },\n    [jwtStorageKey, jwtCookieName, syncJwtToCookie, onLoginSuccess]\n  );\n\n  const loginWithSocial = useCallback(\n    async (params: SocialLoginParams) => {\n      const credentials =\n        params.provider === \"discord\"\n          ? { provider: \"discord\" as const, access_token: params.access_token }\n          : { provider: params.provider, id_token: params.id_token };\n      const result = await socialLoginAndSetAuth(credentials);\n      const data: AuthControllerLogin200Data | undefined =\n        result && typeof result === \"object\" && \"data\" in result\n          ? (result as { data: AuthControllerLogin200Data }).data\n          : undefined;\n      const token =\n        (data && \"jwt\" in data ? (data as { jwt?: string }).jwt : undefined) ??\n        (data && \"accessToken\" in data ? (data as { accessToken?: string }).accessToken : undefined);\n      if (!token) throw new Error(\"No JWT token received from server\");\n      const userType = data?.userType;\n      setJwt(token);\n      setSdkAuth(token);\n      if (typeof window !== \"undefined\") {\n        localStorage.setItem(jwtStorageKey, token);\n        if (syncJwtToCookie) setJwtCookie(jwtCookieName, token);\n      }\n      if (data?.user && typeof data.user === \"object\") {\n        const u = data.user as Record<string, unknown>;\n        setUser({\n          username: u.username as string | undefined,\n          email: u.email as string | undefined,\n          userType: (userType ?? u.userType) as string | undefined,\n        });\n      } else {\n        try {\n          const payload = JSON.parse(atob(token.split(\".\")[1])) as Record<string, unknown>;\n          setUser({\n            username: payload.username as string | undefined,\n            email: payload.email as string | undefined,\n            userType: (userType ?? payload.userType) as string | undefined,\n          });\n        } catch {\n          setUser({ userType: userType as string | undefined });\n        }\n      }\n      onLoginSuccess?.();\n    },\n    [jwtStorageKey, jwtCookieName, syncJwtToCookie, onLoginSuccess]\n  );\n\n  const logout = useCallback(() => {\n    setUser(null);\n    setJwt(null);\n    clearAuth();\n    if (typeof window !== \"undefined\") {\n      localStorage.removeItem(jwtStorageKey);\n      if (syncJwtToCookie) setJwtCookie(jwtCookieName, null);\n      const keys = Object.keys(localStorage);\n      keys.forEach((key) => {\n        if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n      });\n    }\n    setSdkAuth(null);\n    onLogout?.();\n  }, [jwtStorageKey, jwtCookieName, syncJwtToCookie, onLogout]);\n\n  const register = useCallback(\n    async (username: string, email: string, password: string, isActive = true) => {\n      setSdkAuth(null);\n      const platformKey = getPlatformApiKey();\n      const userData: {\n        username: string;\n        email: string;\n        password: string;\n        isActive: boolean;\n        platformApiKey?: string;\n      } = { username, email, password, isActive };\n      if (platformKey) userData.platformApiKey = platformKey;\n      await createUser(userData);\n      await login({ usernameOrEmail: username, password });\n      onRegisterSuccess?.();\n    },\n    [login, onRegisterSuccess]\n  );\n\n  const clearSessionDueToAuthError = useCallback(() => {\n    setUser(null);\n    setJwt(null);\n    clearAuth();\n    if (typeof window !== \"undefined\") {\n      localStorage.removeItem(jwtStorageKey);\n      if (syncJwtToCookie) setJwtCookie(jwtCookieName, null);\n      const keys = Object.keys(localStorage);\n      keys.forEach((key) => {\n        if (key.startsWith(\"delegated-key-\")) localStorage.removeItem(key);\n      });\n    }\n    setSdkAuth(null);\n    onSessionExpired?.();\n  }, [jwtStorageKey, jwtCookieName, syncJwtToCookie, onSessionExpired]);\n\n  const loadWallets = useCallback(async () => {\n    if (!jwt) return;\n    setWalletsLoading(true);\n    setWalletError(null);\n    try {\n      setSdkAuth(jwt);\n      const result = await findAllWallets();\n      const walletsList = extractResponseData<WalletDataDto[]>(result) ?? [];\n      const list = Array.isArray(walletsList) ? walletsList : [];\n      const formatted: WalletData[] = list.map((w) =>\n        normalizeWallet(w as unknown as Record<string, unknown>) as unknown as WalletData\n      );\n      setWallets(formatted);\n    } catch (err) {\n      if (isAuthError(err)) {\n        clearSessionDueToAuthError();\n        setWalletError(\"Session expired. Please sign in again.\");\n      } else {\n        setWalletError(extractErrorMessage(err));\n      }\n      setWallets([]);\n    } finally {\n      setWalletsLoading(false);\n    }\n  }, [jwt, clearSessionDueToAuthError]);\n\n  useEffect(() => {\n    if (jwt) {\n      loadWallets();\n    } else {\n      setWallets([]);\n      setSelectedWallet(null);\n      setWalletError(null);\n      setWalletsLoading(false);\n    }\n  }, [jwt, loadWallets]);\n\n  useEffect(() => {\n    if (wallets.length > 0 && !selectedWallet) {\n      const storedId =\n        typeof window !== \"undefined\" ? localStorage.getItem(walletStorageKey) : null;\n      if (storedId) {\n        const w = wallets.find((x) => x.id === storedId || x.walletId === storedId);\n        if (w) setSelectedWallet(w);\n        else {\n          setSelectedWallet(wallets[0]);\n          if (typeof window !== \"undefined\")\n            localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n        }\n      } else {\n        setSelectedWallet(wallets[0]);\n        if (typeof window !== \"undefined\")\n          localStorage.setItem(walletStorageKey, wallets[0].id ?? wallets[0].walletId);\n      }\n    } else if (wallets.length === 0) {\n      setSelectedWallet(null);\n      if (typeof window !== \"undefined\") localStorage.removeItem(walletStorageKey);\n    }\n  }, [wallets, walletStorageKey]);\n\n  const selectWallet = useCallback(\n    (walletId: string) => {\n      const w = wallets.find((x) => x.id === walletId || x.walletId === walletId);\n      if (w) {\n        setSelectedWallet(w);\n        if (typeof window !== \"undefined\")\n          localStorage.setItem(walletStorageKey, w.id ?? w.walletId);\n      }\n    },\n    [wallets, walletStorageKey]\n  );\n\n  const createWallet = useCallback(\n    async (params: { name: string; userId?: string }) => {\n      setSdkAuth(jwt ?? undefined);\n      const dto = { walletName: params.name, chain: \"solana\" as const };\n      const result = await createWalletSDK(dto);\n      await loadWallets();\n      return result as WalletControllerCreateResult;\n    },\n    [jwt, loadWallets]\n  );\n\n  const value: CilantroContextValue = useMemo(\n    () => ({\n      config,\n      storage: storageAdapter ?? null,\n      user,\n      jwt,\n      isAuthenticated: !!jwt,\n      isLoading: authLoading,\n      login,\n      loginWithSocial,\n      logout,\n      register,\n      clearSessionDueToAuthError,\n      wallet: selectedWallet,\n      wallets,\n      createWallet,\n      selectWallet,\n      refreshWallets: loadWallets,\n      walletError,\n      walletsLoading,\n    }),\n    [\n      config,\n      storageAdapter,\n      user,\n      jwt,\n      authLoading,\n      login,\n      loginWithSocial,\n      logout,\n      register,\n      clearSessionDueToAuthError,\n      selectedWallet,\n      wallets,\n      createWallet,\n      selectWallet,\n      loadWallets,\n      walletError,\n      walletsLoading,\n    ]\n  );\n\n  return (\n    <CilantroContext.Provider value={value}>{children}</CilantroContext.Provider>\n  );\n}\n\nexport function useCilantroContext(): CilantroContextValue {\n  const ctx = useContext(CilantroContext);\n  if (ctx === undefined) {\n    throw new Error(\"useCilantroContext must be used within CilantroContextProvider\");\n  }\n  return ctx;\n}\n","import { setAuth } from \"cilantro-sdk\";\n\nlet platformApiKey = \"\";\nlet apiUrl: string | undefined;\n\nexport interface AuthConfig {\n  platformApiKey?: string;\n  apiUrl?: string;\n  /** Guide-aligned alias for platformApiKey */\n  apiKey?: string;\n  /** Guide-aligned alias for apiUrl */\n  baseURL?: string;\n  jwt?: string | null;\n}\n\n/**\n * Set SDK authentication config. Call with apiKey/baseURL (or platformApiKey/apiUrl) from provider/config.\n * Do not read process.env in library code.\n */\nexport function setAuthConfig(config: AuthConfig): void {\n  platformApiKey = config.apiKey ?? config.platformApiKey ?? \"\";\n  apiUrl = config.baseURL ?? config.apiUrl;\n  const authPayload: { jwt?: string; apiKey?: string; platformApiKey?: string; apiUrl?: string } = {};\n  if (config.jwt) {\n    authPayload.jwt = config.jwt;\n  }\n  if (platformApiKey) {\n    authPayload.apiKey = platformApiKey; // SDK uses auth.apiKey for X-API-Key\n    authPayload.platformApiKey = platformApiKey; // backward compat with SDK\n  }\n  if (apiUrl) {\n    authPayload.apiUrl = apiUrl;\n  }\n  setAuth(authPayload);\n}\n\n/**\n * Set SDK auth with JWT (assumes platformApiKey already set via setAuthConfig).\n */\nexport function setSdkAuth(jwt?: string | null): void {\n  const authConfig: { jwt?: string; apiKey?: string; platformApiKey?: string; apiUrl?: string } = {};\n  if (jwt) {\n    authConfig.jwt = jwt;\n  }\n  if (platformApiKey) {\n    authConfig.apiKey = platformApiKey; // SDK uses auth.apiKey for X-API-Key\n    authConfig.platformApiKey = platformApiKey; // backward compat with SDK\n  }\n  if (apiUrl) {\n    authConfig.apiUrl = apiUrl;\n  }\n  setAuth(authConfig);\n}\n\n/**\n * Get the platform API key (set via setAuthConfig).\n */\nexport function getPlatformApiKey(): string {\n  return platformApiKey;\n}\n\n/**\n * Get the optional API URL (set via setAuthConfig).\n */\nexport function getApiUrl(): string | undefined {\n  return apiUrl;\n}\n\n/**\n * Check if a JWT is expired using the payload `exp` claim.\n * @param token - JWT string (assumes 3 segments separated by dots).\n * @param bufferSeconds - Optional buffer in seconds; if exp is within this many seconds of now, treat as expired (default 60).\n * @returns true if token is expired or invalid/not a JWT.\n */\nexport function isJwtExpired(token: string, bufferSeconds = 60): boolean {\n  if (!token || typeof token !== \"string\") return true;\n  const parts = token.split(\".\");\n  if (parts.length !== 3) return true;\n  try {\n    const payload = JSON.parse(atob(parts[1])) as { exp?: number };\n    const exp = payload.exp;\n    if (exp == null || typeof exp !== \"number\") return false;\n    const now = Math.floor(Date.now() / 1000);\n    return exp - bufferSeconds <= now;\n  } catch {\n    return true;\n  }\n}\n","import { createIndexedDBAdapter } from \"cilantro-sdk/helpers\";\n\nexport type DeviceKeyStorage = ReturnType<typeof createIndexedDBAdapter>;\n\nlet storageAdapterInstance: DeviceKeyStorage | null = null;\nlet contextProvidedAdapter: DeviceKeyStorage | null = null;\nlet initializationPromise: Promise<DeviceKeyStorage> | null = null;\n\n/**\n * Set the storage adapter from CilantroProvider (context). When set, getStorageAdapter() returns this.\n */\nexport function setStorageAdapter(adapter: DeviceKeyStorage | null): void {\n  contextProvidedAdapter = adapter;\n}\n\nexport async function initializeStorageAdapter(): Promise<DeviceKeyStorage> {\n  if (contextProvidedAdapter) return contextProvidedAdapter;\n  if (storageAdapterInstance) return storageAdapterInstance;\n  if (initializationPromise) return initializationPromise;\n  if (typeof window === \"undefined\") {\n    throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n  }\n  initializationPromise = (async () => {\n    try {\n      storageAdapterInstance = createIndexedDBAdapter();\n      return storageAdapterInstance;\n    } catch (error) {\n      initializationPromise = null;\n      throw error;\n    }\n  })();\n  return initializationPromise;\n}\n\nexport function getStorageAdapter(): DeviceKeyStorage {\n  if (contextProvidedAdapter) return contextProvidedAdapter;\n  if (storageAdapterInstance) return storageAdapterInstance;\n  if (typeof window === \"undefined\") {\n    throw new Error(\"Storage adapter can only be initialized in browser environment.\");\n  }\n  storageAdapterInstance = createIndexedDBAdapter();\n  return storageAdapterInstance;\n}\n\nexport function getStorageAdapterType(): \"IndexedDB\" | \"LocalStorage\" | \"Memory\" | \"Unknown\" {\n  if (typeof window === \"undefined\") return \"Memory\";\n  if (\"indexedDB\" in window) return \"IndexedDB\";\n  return \"Unknown\";\n}\n\nexport function clearStorageAdapter(): void {\n  storageAdapterInstance = null;\n}\n","/**\n * Type Utilities - common types and utilities for SDK interactions\n */\n\nexport type ActionState<T = unknown> = {\n  status: \"idle\" | \"loading\" | \"success\" | \"error\";\n  message?: string;\n  detail?: T;\n};\n\nexport interface ErrorResponse {\n  message?: string;\n  error?: string;\n  code?: string | number;\n  status?: number;\n  statusText?: string;\n  data?: unknown;\n  stack?: string;\n  type?: string;\n}\n\nexport type ApiResponse<T> = T | { data: T } | { success: boolean; data: T };\n\nexport function extractResponseData<T>(response: unknown): T | null {\n  if (!response) return null;\n  if (typeof response !== \"object\" || response === null) {\n    return response as T;\n  }\n  if (\"data\" in response) {\n    const data = (response as { data: unknown }).data;\n    if (data && typeof data === \"object\" && !Array.isArray(data)) {\n      const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n      if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n        const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n        const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n        return [...authSigners, ...onChainSigners] as T;\n      }\n    }\n    return data as T;\n  }\n  if (\"success\" in response && \"data\" in response) {\n    const data = (response as { success: boolean; data: unknown }).data;\n    if (data && typeof data === \"object\" && !Array.isArray(data)) {\n      const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n      if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) {\n        const authSigners = Array.isArray(dataObj.authenticationSigners) ? dataObj.authenticationSigners : [];\n        const onChainSigners = Array.isArray(dataObj.onChainSigners) ? dataObj.onChainSigners : [];\n        return [...authSigners, ...onChainSigners] as T;\n      }\n    }\n    return data as T;\n  }\n  if (\"authenticationSigners\" in response || \"onChainSigners\" in response) {\n    const responseObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n    const authSigners = Array.isArray(responseObj.authenticationSigners) ? responseObj.authenticationSigners : [];\n    const onChainSigners = Array.isArray(responseObj.onChainSigners) ? responseObj.onChainSigners : [];\n    return [...authSigners, ...onChainSigners] as T;\n  }\n  return response as T;\n}\n\nexport function extractOnChainSigners<T>(response: unknown): T[] {\n  if (!response || typeof response !== \"object\" || response === null) return [];\n  let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n  if (\"data\" in response) {\n    const data = (response as { data: unknown }).data;\n    if (data && typeof data === \"object\" && !Array.isArray(data)) {\n      const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n      if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n    }\n  }\n  if (!signersObj && \"success\" in response && \"data\" in response) {\n    const data = (response as { success: boolean; data: unknown }).data;\n    if (data && typeof data === \"object\" && !Array.isArray(data)) {\n      const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n      if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n    }\n  }\n  if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n    signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n  }\n  if (signersObj) {\n    return (Array.isArray(signersObj.onChainSigners) ? signersObj.onChainSigners : []) as T[];\n  }\n  if (Array.isArray(response)) return response as T[];\n  return [];\n}\n\nexport function extractAuthenticationSigners<T>(response: unknown): T[] {\n  if (!response || typeof response !== \"object\" || response === null) return [];\n  let signersObj: { authenticationSigners?: unknown[]; onChainSigners?: unknown[] } | null = null;\n  if (\"data\" in response) {\n    const data = (response as { data: unknown }).data;\n    if (data && typeof data === \"object\" && !Array.isArray(data)) {\n      const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n      if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n    }\n  }\n  if (!signersObj && \"success\" in response && \"data\" in response) {\n    const data = (response as { success: boolean; data: unknown }).data;\n    if (data && typeof data === \"object\" && !Array.isArray(data)) {\n      const dataObj = data as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n      if (\"authenticationSigners\" in dataObj || \"onChainSigners\" in dataObj) signersObj = dataObj;\n    }\n  }\n  if (!signersObj && (\"authenticationSigners\" in response || \"onChainSigners\" in response)) {\n    signersObj = response as { authenticationSigners?: unknown[]; onChainSigners?: unknown[] };\n  }\n  if (signersObj) {\n    return (Array.isArray(signersObj.authenticationSigners) ? signersObj.authenticationSigners : []) as T[];\n  }\n  return [];\n}\n\nexport function isErrorWithResponse(\n  error: unknown\n): error is { response?: { data?: { message?: string; error?: string }; status?: number; statusText?: string } } {\n  return typeof error === \"object\" && error !== null && \"response\" in error;\n}\n\nexport function isErrorWithMessage(error: unknown): error is { message?: string } {\n  return typeof error === \"object\" && error !== null && \"message\" in error;\n}\n","import { isErrorWithResponse, isErrorWithMessage } from \"./types\";\nimport type { ErrorResponse } from \"./types\";\n\nexport function extractErrorMessage(error: unknown): string {\n  if (!error) return \"An unknown error occurred\";\n  if (error instanceof Error) return error.message;\n  if (isErrorWithResponse(error)) {\n    if (error.response?.data?.message) return String(error.response.data.message);\n    if (error.response?.data?.error) return String(error.response.data.error);\n  }\n  if (isErrorWithMessage(error)) return String(error.message);\n  if (typeof error === \"object\" && error !== null && \"error\" in error) {\n    return String((error as { error: unknown }).error);\n  }\n  return String(error);\n}\n\nexport function getErrorDetails(error: unknown): ErrorResponse | null {\n  if (!error) return null;\n  if (typeof error === \"object\" && error !== null) {\n    const err = error as { name?: string; constructor?: { name?: string }; code?: string | number; stack?: string };\n    const details: ErrorResponse = {\n      message: extractErrorMessage(error),\n      type: err.name || (err.constructor?.name as string | undefined),\n      stack: err.stack,\n    };\n    if (isErrorWithResponse(error)) {\n      details.code = err.code ?? error.response?.status;\n      details.status = error.response?.status;\n      details.statusText = error.response?.statusText;\n      details.data = error.response?.data;\n    } else if (err.code) {\n      details.code = err.code;\n    }\n    return details;\n  }\n  return { message: extractErrorMessage(error), data: error };\n}\n\nexport function isNetworkError(error: unknown): boolean {\n  if (!error || typeof error !== \"object\" || error === null) return false;\n  const err = error as { code?: string; message?: string };\n  const hasResponse = isErrorWithResponse(error);\n  return (\n    err.code === \"ECONNREFUSED\" ||\n    err.code === \"ETIMEDOUT\" ||\n    err.code === \"ENOTFOUND\" ||\n    (err.message?.toLowerCase().includes(\"network\") ?? false) ||\n    (err.message?.toLowerCase().includes(\"connection\") ?? false) ||\n    !hasResponse\n  );\n}\n\nexport function isAuthError(error: unknown): boolean {\n  if (!error || typeof error !== \"object\" || error === null) return false;\n  if (isErrorWithResponse(error)) {\n    const status = error.response?.status;\n    if (status === 401 || status === 403) return true;\n  }\n  const err = error as { message?: string };\n  const message = err.message?.toLowerCase() ?? \"\";\n  return message.includes(\"unauthorized\") || message.includes(\"authentication\");\n}\n","/**\n * Normalization at the boundary: map SDK DTOs to a consistent shape with id/address (and aliases).\n * Use these when ingesting wallet/signer data from the SDK so consumers can rely on id and address.\n */\n\n/** Normalized wallet shape: always has id and address. */\nexport interface NormalizedWallet {\n  id: string;\n  address: string;\n  active?: boolean;\n  [key: string]: unknown;\n}\n\n/**\n * Normalize a wallet DTO so that id and address are always present.\n * Use at the boundary when loading wallets from the SDK.\n * Accepts any object with optional walletId/id, walletAddress/address, isActive.\n */\nexport function normalizeWallet(dto: Record<string, unknown>): NormalizedWallet {\n  const w = dto as { walletId?: string; id?: string; walletAddress?: string; address?: string; isActive?: boolean };\n  return {\n    ...dto,\n    id: w.walletId ?? w.id ?? \"\",\n    address: w.walletAddress ?? w.address ?? \"\",\n    active: w.isActive,\n  } as NormalizedWallet;\n}\n\n/** Wallet-like object with optional id/walletId and address/walletAddress. */\nexport type WalletLike = { id?: string; walletId?: string; address?: string; walletAddress?: string } & Record<string, unknown>;\n\n/**\n * Get wallet ID from a wallet-like object. Prefer id; fallback to walletId.\n */\nexport function getWalletId(wallet: WalletLike | null | undefined): string {\n  if (!wallet) return \"\";\n  return (wallet.id ?? wallet.walletId ?? \"\") as string;\n}\n\n/**\n * Get wallet address from a wallet-like object. Prefer address; fallback to walletAddress.\n */\nexport function getWalletAddress(wallet: WalletLike | null | undefined): string {\n  if (!wallet) return \"\";\n  return (wallet.address ?? wallet.walletAddress ?? \"\") as string;\n}\n","\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { GoogleOAuthProvider } from \"@react-oauth/google\";\nimport { CilantroContextProvider } from \"../context/CilantroContext\";\nimport { initializeStorageAdapter } from \"../core/storage-adapter\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\n/** Hard-coded Google OAuth client ID for built-in Google Sign-In. */\nconst GOOGLE_CLIENT_ID = \"75083940771-q41831bdbpckupb0idvqf1pgr5ng4lg4.apps.googleusercontent.com\";\n\nexport interface CilantroProviderProps {\n  children: ReactNode;\n  /** Platform API key (guide: apiKey). Either apiKey or jwt via login is required for authenticated requests. */\n  apiKey?: string;\n  /** API base URL (guide: baseURL). Default: https://api.cilantro.gg */\n  baseURL?: string;\n  /** Storage for device keys - email/phone signers (guide: storageAdapter). Default: IndexedDB in browser. */\n  storageAdapter?: DeviceKeyStorage | null;\n  /** @deprecated Use apiKey instead. */\n  platformApiKey?: string;\n  /** @deprecated Use baseURL instead. */\n  apiUrl?: string;\n  /** localStorage key for JWT (default: cilantro_jwt) */\n  jwtStorageKey?: string;\n  /** localStorage key for selected wallet id (default: cilantro_selected_wallet_id) */\n  walletStorageKey?: string;\n  /** When true, sync JWT to a cookie for Next.js/middleware. Default: false. */\n  syncJwtToCookie?: boolean;\n  /** Cookie name for JWT when syncJwtToCookie is true. Default: cilantro_jwt. */\n  jwtCookieName?: string;\n  onLoginSuccess?: () => void;\n  onLogout?: () => void;\n  onRegisterSuccess?: () => void;\n  onSessionExpired?: () => void;\n}\n\nexport function CilantroProvider({\n  children,\n  apiKey: apiKeyProp,\n  baseURL,\n  storageAdapter,\n  platformApiKey,\n  apiUrl,\n  jwtStorageKey,\n  walletStorageKey,\n  syncJwtToCookie,\n  jwtCookieName,\n  onLoginSuccess,\n  onLogout,\n  onRegisterSuccess,\n  onSessionExpired,\n}: CilantroProviderProps) {\n  const apiKey = apiKeyProp ?? platformApiKey;\n  const resolvedBaseURL = baseURL ?? apiUrl;\n\n  useEffect(() => {\n    if (!storageAdapter) {\n      initializeStorageAdapter().catch((err) => {\n        console.error(\"[CilantroProvider] Failed to initialize storage adapter:\", err);\n      });\n    }\n  }, [storageAdapter]);\n\n  const content = (\n    <CilantroContextProvider\n      apiKey={apiKey}\n      baseURL={resolvedBaseURL}\n      storageAdapter={storageAdapter ?? undefined}\n      jwtStorageKey={jwtStorageKey}\n      walletStorageKey={walletStorageKey}\n      syncJwtToCookie={syncJwtToCookie}\n      jwtCookieName={jwtCookieName}\n      onLoginSuccess={onLoginSuccess}\n      onLogout={onLogout}\n      onRegisterSuccess={onRegisterSuccess}\n      onSessionExpired={onSessionExpired}\n    >\n      {children}\n    </CilantroContextProvider>\n  );\n\n  return <GoogleOAuthProvider clientId={GOOGLE_CLIENT_ID}>{content}</GoogleOAuthProvider>;\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User, SocialLoginParams } from \"../context/CilantroContext\";\n\nexport interface CilantroAuthContextType {\n  user: User | null;\n  /** JWT token. Alias for token. */\n  jwt: string | null;\n  token: string | null;\n  isAuthenticated: boolean;\n  login: (usernameOrEmail: string, password: string) => Promise<void>;\n  loginWithSocial: (params: SocialLoginParams) => Promise<void>;\n  register: (username: string, email: string, password: string, isActive?: boolean) => Promise<void>;\n  logout: () => void;\n  clearSessionDueToAuthError: () => void;\n  isLoading: boolean;\n}\n\nexport function useCilantroAuth(): CilantroAuthContextType {\n  const ctx = useCilantroContext();\n  return {\n    user: ctx.user,\n    jwt: ctx.jwt,\n    token: ctx.jwt,\n    isAuthenticated: ctx.isAuthenticated,\n    login: (usernameOrEmail: string, password: string) =>\n      ctx.login({ usernameOrEmail, password }),\n    loginWithSocial: ctx.loginWithSocial,\n    register: ctx.register,\n    logout: ctx.logout,\n    clearSessionDueToAuthError: ctx.clearSessionDueToAuthError,\n    isLoading: ctx.isLoading,\n  };\n}\n\nexport type { User };\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\n\nexport interface WalletContextType {\n  /** Selected wallet. Primary name. */\n  wallet: WalletData | null;\n  /** @deprecated Use wallet instead. Alias for backward compat. */\n  selectedWallet: WalletData | null;\n  wallets: WalletData[];\n  selectWallet: (walletId: string) => void;\n  refreshWallets: () => Promise<void>;\n  isLoading: boolean;\n  error: string | null;\n}\n\nexport function useWallets(): WalletContextType {\n  const ctx = useCilantroContext();\n  const wallet = ctx.wallet;\n  return {\n    wallet,\n    selectedWallet: wallet,\n    wallets: ctx.wallets,\n    selectWallet: ctx.selectWallet,\n    refreshWallets: ctx.refreshWallets,\n    isLoading: ctx.walletsLoading,\n    error: ctx.walletError,\n  };\n}\n\nexport type { WalletData };\nexport type WalletDataDto = WalletData;\n","/**\n * cilantro-react - Public API\n * React SDK/UI for Cilantro Smart Wallet (guide-aligned)\n */\n\n// Context\nexport {\n  CilantroContextProvider,\n  useCilantroContext,\n  type CilantroConfig,\n  type CilantroContextValue,\n  type User,\n  type WalletData,\n  type WalletDataDto,\n  type SocialLoginParams,\n  type SocialAuthConfig,\n} from \"./context/CilantroContext\";\n\n// Provider (single entry point)\nexport {\n  CilantroProvider,\n  type CilantroProviderProps,\n} from \"./providers/CilantroProvider\";\n\n// Auth/wallet hooks (read from context)\nexport { useCilantroAuth, type CilantroAuthContextType } from \"./providers/CilantroAuthProvider\";\nexport {\n  useWallets,\n  type WalletContextType,\n  type WalletData as WalletDataFromHook,\n  type WalletDataDto as WalletDataDtoFromHook,\n} from \"./providers/WalletProvider\";\n\n// Storage adapters\nexport {\n  createIndexedDBAdapter,\n  createLocalStorageAdapter,\n  createMemoryAdapter,\n} from \"cilantro-sdk/helpers\";\nexport type { DeviceKeyStorage } from \"./core/storage-adapter\";\n\n// Hooks (guide API)\nexport { useCilantroConfig, type UseCilantroConfigResult } from \"./hooks/useCilantroConfig\";\nexport { useAuth, type UseAuthResult } from \"./hooks/useAuth\";\nexport { useReturnUrl, type UseReturnUrlOptions } from \"./hooks/useReturnUrl\";\nexport { useWallet, type UseWalletResult } from \"./hooks/useWallet\";\nexport { useSigners, type UseSignersOptions, type UseSignersResult } from \"./hooks/useSigners\";\nexport { usePasskey, type UsePasskeyResult } from \"./hooks/usePasskey\";\nexport {\n  useExternalWallet,\n  type UseExternalWalletResult,\n  type SolanaWallet,\n} from \"./hooks/useExternalWallet\";\nexport {\n  useSendTransaction,\n  type UseSendTransactionResult,\n  type SubmitTransactionResult,\n  type SignerType as SendTransactionSignerType,\n} from \"./hooks/useSendTransaction\";\n\n// Auth components\nexport { LoginForm, type LoginFormProps, type LoginFormClassNames } from \"./components/auth/LoginForm\";\nexport {\n  SocialLoginButtons,\n  type SocialLoginButtonsProps,\n  type SocialLoginButtonsClassNames,\n  type SocialProvider,\n} from \"./components/auth/SocialLoginButtons\";\nexport { RegisterForm, type RegisterFormProps, type RegisterFormClassNames } from \"./components/auth/RegisterForm\";\nexport { LogoutButton, type LogoutButtonProps } from \"./components/auth/LogoutButton\";\nexport { AuthGuard, type AuthGuardProps, type AuthGuardClassNames, type AuthGuardLayout } from \"./components/auth/AuthGuard\";\nexport { AuthShell, type AuthShellProps, type AuthShellClassNames } from \"./components/auth/AuthShell\";\n\n// Signer components\nexport {\n  CreateEmailSignerForm,\n  type CreateEmailSignerFormProps,\n} from \"./components/signers/CreateEmailSignerForm\";\nexport {\n  CreatePhoneSignerForm,\n  type CreatePhoneSignerFormProps,\n} from \"./components/signers/CreatePhoneSignerForm\";\nexport { AddPasskeyButton, type AddPasskeyButtonProps } from \"./components/signers/AddPasskeyButton\";\nexport {\n  SignerList,\n  type SignerListProps,\n  type SignerListClassNames,\n} from \"./components/signers/SignerList\";\nexport {\n  SignerSelector,\n  type SignerSelectorProps,\n  type SignerSelectorClassNames,\n} from \"./components/signers/SignerSelector\";\n\n// Wallet components\nexport {\n  ConnectWalletButton,\n  type ConnectWalletButtonProps,\n} from \"./components/wallet/ConnectWalletButton\";\nexport {\n  CreateWalletForm,\n  type CreateWalletFormProps,\n} from \"./components/wallet/CreateWalletForm\";\nexport {\n  WalletSelector,\n  type WalletSelectorProps,\n  type WalletSelectorClassNames,\n} from \"./components/wallet/WalletSelector\";\nexport { WalletAddress, type WalletAddressProps } from \"./components/wallet/WalletAddress\";\nexport { WalletBalance, type WalletBalanceProps } from \"./components/wallet/WalletBalance\";\n\n// Transaction components\nexport {\n  SendSOLForm,\n  type SendSOLFormProps,\n  type SignerType as SendSOLSignerType,\n} from \"./components/transactions/SendSOLForm\";\nexport {\n  SendSPLForm,\n  type SendSPLFormProps,\n} from \"./components/transactions/SendSPLForm\";\nexport {\n  TransactionStatus,\n  type TransactionStatusProps,\n} from \"./components/transactions/TransactionStatus\";\nexport {\n  TransactionHistory,\n  type TransactionHistoryProps,\n} from \"./components/transactions/TransactionHistory\";\n\n// Layout / utility\nexport {\n  CilantroConnect,\n  type CilantroConnectProps,\n  type WalletInfo,\n} from \"./components/layout/CilantroConnect\";\nexport { LoadingOverlay, type LoadingOverlayProps } from \"./components/layout/LoadingOverlay\";\nexport { ErrorBoundary, type ErrorBoundaryProps } from \"./components/layout/ErrorBoundary\";\n\n// UI primitives\nexport { Skeleton } from \"./ui/skeleton\";\nexport {\n  ThemeProvider,\n  type Theme,\n  type ResolvedTheme,\n  type ThemeProviderProps,\n} from \"./ui/theme-provider\";\n\n// Core types and utilities\nexport type { ActionState, ApiResponse, ErrorResponse } from \"./core/types\";\nexport type { SignerData } from \"./core/signer-helpers\";\nexport { normalizeSigner } from \"./core/signer-helpers\";\nexport { normalizeWallet, getWalletId, getWalletAddress } from \"./core/normalize\";\nexport type { NormalizedWallet, WalletLike } from \"./core/normalize\";\nexport { extractResponseData } from \"./core/types\";\nexport { extractErrorMessage, isAuthError } from \"./core/error-utils\";\nexport { isJwtExpired } from \"./core/auth\";\n\n// Solana connection adapter (advanced usage)\nexport {\n  adaptSolanaConnection,\n  type SignAndSendConnectionAdapter,\n} from \"./adapters/solana-connection\";\n\n// Signer signing (advanced usage)\nexport {\n  signMessageWithSigner,\n  signAndSendTransactionWithSigner,\n  signTransactionWithSigner,\n  getWalletData,\n  getSignerPublicKey,\n  SIGNER_TYPES,\n  type SignerType,\n  type SignAndSendConnection,\n  type SignAndSendResult,\n  type SubmitTransactionDataDto,\n  type SignMessageResult,\n} from \"./core/signer-signing\";\n\n// SDK types and Discord OAuth (re-exports)\nexport type { AuthControllerLogin200Data } from \"cilantro-sdk/auth\";\nexport { SocialLoginDtoProvider, getDiscordAuthorizeUrl, discordCallbackAndSetAuth } from \"cilantro-sdk/auth\";\nexport type {\n  DiscordAuthorizeUrlResponse,\n  GetDiscordAuthorizeUrlParams,\n  DiscordCallbackAndSetAuthParams,\n  AuthControllerDiscordCallbackResult,\n} from \"cilantro-sdk/auth\";\nexport type {\n  WalletControllerFindAllResult,\n  WalletControllerFindOneResult,\n  WalletControllerSubmitTransactionResult,\n  WalletControllerListSignersResult,\n} from \"cilantro-sdk/wallet\";\nexport type { TransactionControllerSendRawPasskeyTransactionResult } from \"cilantro-sdk/transactions\";\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { CilantroConfig } from \"../context/CilantroContext\";\nimport type { DeviceKeyStorage } from \"../core/storage-adapter\";\n\nexport interface UseCilantroConfigResult {\n  config: CilantroConfig;\n  storage: DeviceKeyStorage | null;\n}\n\nexport function useCilantroConfig(): UseCilantroConfigResult {\n  const ctx = useCilantroContext();\n  return {\n    config: ctx.config,\n    storage: ctx.storage,\n  };\n}\n","\"use client\";\n\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { User, SocialLoginParams } from \"../context/CilantroContext\";\n\nexport interface UseAuthResult {\n  /** Current user (from JWT payload or login response). */\n  user: User | null;\n  /** JWT token. Prefer this name. */\n  jwt: string | null;\n  /** Alias for jwt. Same value. */\n  token: string | null;\n  isLoading: boolean;\n  isAuthenticated: boolean;\n  login: (params: { usernameOrEmail: string; password: string }) => Promise<void>;\n  /** Sign in with Google/Apple (id_token) or Discord (access_token). Matches cilantro-sdk SocialLoginDto. */\n  loginWithSocial: (params: SocialLoginParams) => Promise<void>;\n  /** Register a new user and auto-login. */\n  register: (\n    username: string,\n    email: string,\n    password: string,\n    isActive?: boolean\n  ) => Promise<void>;\n  logout: () => void;\n  /** Clear session when API returns 401/403. Call onSessionExpired. */\n  clearSessionDueToAuthError: () => void;\n}\n\nexport function useAuth(): UseAuthResult {\n  const ctx = useCilantroContext();\n  return {\n    user: ctx.user,\n    jwt: ctx.jwt,\n    token: ctx.jwt,\n    isLoading: ctx.isLoading,\n    isAuthenticated: ctx.isAuthenticated,\n    login: ctx.login,\n    loginWithSocial: ctx.loginWithSocial,\n    register: ctx.register,\n    logout: ctx.logout,\n    clearSessionDueToAuthError: ctx.clearSessionDueToAuthError,\n  };\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\n\nexport interface UseReturnUrlOptions {\n  /** Query param name for return URL. Default: \"returnUrl\" */\n  param?: string;\n  /** Default path when no returnUrl in URL. Default: \"/\" */\n  defaultPath?: string;\n  /** Only allow relative paths (no protocol). Default: true */\n  allowRelativeOnly?: boolean;\n}\n\n/**\n * Read returnUrl from URL search params and provide a safe redirect path.\n * Use with LoginForm/RegisterForm to redirect users back after auth.\n *\n * @example\n * // In LoginForm wrapper - redirect to returnUrl after login\n * const { returnPath, redirect } = useReturnUrl();\n * <LoginForm onSuccess={() => redirect()} redirectAfterSuccess={returnPath} onRedirect={router.replace} />\n */\nexport function useReturnUrl(options: UseReturnUrlOptions = {}): {\n  /** Safe path to redirect to (from URL or defaultPath) */\n  returnPath: string;\n  /** Redirect to returnPath using window.location (or pass custom fn) */\n  redirect: (customRedirect?: (path: string) => void) => void;\n  /** Raw value from URL (may be empty) */\n  rawReturnUrl: string | null;\n} {\n  const {\n    param = \"returnUrl\",\n    defaultPath = \"/\",\n    allowRelativeOnly = true,\n  } = options;\n\n  const rawReturnUrl = useMemo(() => {\n    if (typeof window === \"undefined\") return null;\n    const params = new URLSearchParams(window.location.search);\n    return params.get(param);\n  }, [param]);\n\n  const returnPath = useMemo(() => {\n    if (!rawReturnUrl) return defaultPath;\n    if (allowRelativeOnly) {\n      // Reject absolute URLs (protocol-relative or http(s))\n      const trimmed = rawReturnUrl.trim();\n      if (trimmed.startsWith(\"//\") || /^https?:\\/\\//i.test(trimmed)) {\n        return defaultPath;\n      }\n      if (trimmed.startsWith(\"/\")) return trimmed;\n      // Relative path without leading slash - make absolute\n      return `/${trimmed}`;\n    }\n    return rawReturnUrl;\n  }, [rawReturnUrl, defaultPath, allowRelativeOnly]);\n\n  const redirect = useCallback(\n    (customRedirect?: (path: string) => void) => {\n      const path = returnPath;\n      if (customRedirect) {\n        customRedirect(path);\n      } else if (typeof window !== \"undefined\") {\n        window.location.href = path;\n      }\n    },\n    [returnPath]\n  );\n\n  return { returnPath, redirect, rawReturnUrl };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport type { WalletData } from \"../context/CilantroContext\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface UseWalletResult {\n  /** Selected wallet. Use this as primary. */\n  wallet: WalletData | null;\n  wallets: WalletData[];\n  createWallet: (params: { name: string; userId?: string }) => Promise<WalletControllerCreateResult>;\n  selectWallet: (walletId: string) => void;\n  /** Refresh wallet list from API. */\n  refreshWallets: () => Promise<void>;\n  isLoading: boolean;\n  /** Error from wallet operations (e.g. fetch failed). */\n  error: string | null;\n}\n\nexport function useWallet(_walletId?: string): UseWalletResult {\n  const ctx = useCilantroContext();\n  return useMemo(\n    () => ({\n      wallet: ctx.wallet,\n      wallets: ctx.wallets,\n      createWallet: ctx.createWallet,\n      selectWallet: ctx.selectWallet,\n      refreshWallets: ctx.refreshWallets,\n      isLoading: ctx.walletsLoading,\n      error: ctx.walletError,\n    }),\n    [\n      ctx.wallet,\n      ctx.wallets,\n      ctx.createWallet,\n      ctx.selectWallet,\n      ctx.refreshWallets,\n      ctx.walletsLoading,\n      ctx.walletError,\n    ]\n  );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { loadSigners, type SignerData } from \"../core/signer-helpers\";\nimport {\n  createEmailSignerHelper,\n  createPhoneSignerHelper,\n} from \"../core/signer-creation\";\nimport { deleteSigner } from \"cilantro-sdk/wallet\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface UseSignersOptions {\n  /** Wallet ID to load signers for. If not provided, uses selectedWallet?.id from context (call useWallets() in same component). */\n  walletId?: string | null;\n}\n\nexport interface UseSignersResult {\n  signers: SignerData[];\n  isLoading: boolean;\n  error: string | null;\n  refresh: () => Promise<void>;\n  createEmailSigner: (params: { email: string }) => Promise<SignerInfo>;\n  createPhoneSigner: (params: { phone: string }) => Promise<SignerInfo>;\n  revokeSigner: (signerId: string) => Promise<void>;\n}\n\nexport function useSigners(\n  walletIdOrOptions?: string | null | UseSignersOptions\n): UseSignersResult {\n  const walletIdOption =\n    typeof walletIdOrOptions === \"object\"\n      ? walletIdOrOptions?.walletId\n      : walletIdOrOptions;\n  const { jwt } = useCilantroContext();\n  const [signers, setSigners] = useState<SignerData[]>([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const load = useCallback(\n    async (walletId: string) => {\n      if (!walletId) {\n        setSigners([]);\n        return;\n      }\n      setIsLoading(true);\n      setError(null);\n      try {\n        if (jwt) setSdkAuth(jwt);\n        const list = await loadSigners(walletId);\n        setSigners(list);\n      } catch (err) {\n        const message = err instanceof Error ? err.message : String(err);\n        setError(message);\n        setSigners([]);\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [jwt]\n  );\n\n  useEffect(() => {\n    const id = walletIdOption ?? undefined;\n    if (id) load(id);\n    else {\n      setSigners([]);\n      setError(null);\n    }\n  }, [walletIdOption, load]);\n\n  const refresh = useCallback(async () => {\n    const id = walletIdOption ?? undefined;\n    if (id) await load(id);\n  }, [walletIdOption, load]);\n\n  const createEmailSigner = useCallback(\n    async (params: { email: string }) => {\n      const walletId = walletIdOption ?? undefined;\n      if (!walletId) throw new Error(\"walletId is required\");\n      if (jwt) setSdkAuth(jwt);\n      const signer = await createEmailSignerHelper(walletId, params.email);\n      await refresh();\n      return signer;\n    },\n    [walletIdOption, jwt, refresh]\n  );\n\n  const createPhoneSigner = useCallback(\n    async (params: { phone: string }) => {\n      const walletId = walletIdOption ?? undefined;\n      if (!walletId) throw new Error(\"walletId is required\");\n      if (jwt) setSdkAuth(jwt);\n      const signer = await createPhoneSignerHelper(walletId, params.phone);\n      await refresh();\n      return signer;\n    },\n    [walletIdOption, jwt, refresh]\n  );\n\n  const revokeSigner = useCallback(\n    async (signerId: string) => {\n      const walletId = walletIdOption ?? undefined;\n      if (!walletId) throw new Error(\"walletId is required\");\n      if (jwt) setSdkAuth(jwt);\n      await deleteSigner(walletId, signerId);\n      await refresh();\n    },\n    [walletIdOption, jwt, refresh]\n  );\n\n  return {\n    signers,\n    isLoading,\n    error,\n    refresh,\n    createEmailSigner,\n    createPhoneSigner,\n    revokeSigner,\n  };\n}\n","import { getSigners, parseSignerResponse, type SignerInfo } from \"cilantro-sdk/helpers\";\nimport { listSigners } from \"cilantro-sdk/wallet\";\nimport { extractOnChainSigners, extractAuthenticationSigners } from \"./types\";\n\n/**\n * Normalized signer shape aligned with SDK SignerDataDto / WalletSignerDataDto.\n * Uses SDK field names (signerId, signerType, signerPubkey, authId); id is an alias for signerId or WalletSignerDataDto.id.\n */\nexport interface SignerData extends Omit<SignerInfo, \"signerId\"> {\n  id: string;\n  signerId: string;\n  signerType?: string;\n  signerPubkey?: string;\n  signerConfig?: { email?: string; phone?: string; credentialId?: string };\n  deviceIdentities?: unknown[];\n  credentialId?: string;\n  authId?: string;\n  signerCategory?: \"onchain\" | \"authenticationsigner\";\n  [key: string]: unknown;\n}\n\nexport async function loadSigners(walletId: string): Promise<SignerData[]> {\n  if (!walletId) return [];\n  try {\n    let signersResult = (await getSigners(walletId)) as unknown;\n    let onChainSigners = extractOnChainSigners<Record<string, unknown>>(signersResult);\n    let authSigners = extractAuthenticationSigners<Record<string, unknown>>(signersResult);\n    if (\n      (!onChainSigners || !Array.isArray(onChainSigners) || onChainSigners.length === 0) &&\n      (!authSigners || !Array.isArray(authSigners) || authSigners.length === 0)\n    ) {\n      const response = await listSigners(walletId);\n      onChainSigners = extractOnChainSigners<Record<string, unknown>>(response);\n      authSigners = extractAuthenticationSigners<Record<string, unknown>>(response);\n    }\n    const processedOnChain = onChainSigners\n      .filter((s) => s && typeof s === \"object\")\n      .map((signer) => processSigner(signer, \"onchain\"));\n    const processedAuth = authSigners\n      .filter((s) => s && typeof s === \"object\")\n      .map((signer) => processSigner(signer, \"authenticationsigner\"));\n    return [...processedOnChain, ...processedAuth].filter((s) => s.id && (s.type || s.signerType));\n  } catch (error) {\n    console.error(\"Failed to load signers:\", error);\n    return [];\n  }\n}\n\n/**\n * Normalize a raw signer DTO to SignerData (id, signerId, signerPubkey/publicKey, etc.).\n * Use at API boundaries when ingesting signer data from the SDK.\n */\nexport function normalizeSigner(\n  signer: Record<string, unknown>,\n  category: \"onchain\" | \"authenticationsigner\"\n): SignerData {\n  return processSigner(signer, category);\n}\n\nfunction processSigner(signer: Record<string, unknown>, category: \"onchain\" | \"authenticationsigner\"): SignerData {\n  const parsed = parseSignerResponse(signer);\n  const signerId = (signer.id ?? signer.signerId ?? parsed.signerId) as string;\n  const signerType = (signer.signerType ?? signer.type ?? parsed.type) as string;\n  const signerPubkey = (signer.signerPubkey ?? signer.publicKey ?? parsed.publicKey ?? \"\") as string;\n  const authId = (signer.authId ?? parsed.email ?? parsed.phone) as string | undefined;\n  const walletId = (signer.walletId ?? parsed.walletId) as string | undefined;\n  let email = (signer.email ?? parsed.email) as string | undefined;\n  let phone = (signer.phone ?? parsed.phone) as string | undefined;\n  if (!email && !phone && authId) {\n    if (signerType === \"email\") email = authId;\n    else if (signerType === \"phone\") phone = authId;\n  }\n  const signerConfig = signer.signerConfig as { email?: string; phone?: string } | undefined;\n  if (signerConfig) {\n    if (!email && signerConfig.email) email = signerConfig.email;\n    if (!phone && signerConfig.phone) phone = signerConfig.phone;\n  }\n  const isActive =\n    signer.isActive !== undefined ? (signer.isActive as boolean) : (parsed.isActive !== undefined ? parsed.isActive : true);\n  return {\n    ...signer,\n    id: signerId,\n    signerId,\n    walletId: walletId ?? \"\",\n    type: signerType,\n    signerType,\n    publicKey: signerPubkey,\n    signerPubkey,\n    email,\n    phone,\n    isActive,\n    credentialId: (signer.credentialId ?? (signerType === \"passkey\" ? authId : undefined)) as string | undefined,\n    authId,\n    deviceIdentities: signer.deviceIdentities as unknown[] | undefined,\n    signerConfig: signer.signerConfig as SignerData[\"signerConfig\"],\n    permissions: signer.permissions,\n    signerCategory: category,\n  } as SignerData;\n}\n\nexport function getSignerType(signer: SignerData): string {\n  return signer.type || signer.signerType || \"\";\n}\n\nexport function getSignerTypeLabel(type?: string): string {\n  if (!type) return \"Unknown\";\n  const t = type.toLowerCase();\n  if (t === \"email\") return \"Email\";\n  if (t === \"phone\") return \"Phone\";\n  if (t === \"external\" || t === \"external-wallet\") return \"External Wallet\";\n  if (t === \"passkey\") return \"Passkey\";\n  if (t === \"api-key\" || t === \"apikey\") return \"API Key\";\n  return type;\n}\n\nexport function getSignerDisplayName(signer: SignerData): string {\n  const signerType = getSignerType(signer);\n  const typeLabel = getSignerTypeLabel(signerType);\n  const shortId = signer.id.length > 8 ? `${signer.id.slice(0, 4)}...${signer.id.slice(-4)}` : signer.id;\n  if (signer.email) return `${typeLabel}: ${signer.email}`;\n  if (signer.phone) return `${typeLabel}: ${signer.phone}`;\n  if (signerType === \"passkey\") {\n    const credId =\n      (signer.credentialId as string | undefined) ??\n      (signer.authId as string | undefined) ??\n      (signer.signerConfig as { credentialId?: string } | undefined)?.credentialId;\n    if (credId) {\n      const shortCredId = credId.length > 12 ? `${credId.slice(0, 6)}...${credId.slice(-6)}` : credId;\n      return `${typeLabel} (${shortCredId})`;\n    }\n    return `${typeLabel} (${shortId})`;\n  }\n  return `${typeLabel} (${shortId})`;\n}\n\nexport function getSignerUniqueId(signer: SignerData): string {\n  if (signer.id) return signer.id.length > 12 ? `${signer.id.slice(0, 6)}...${signer.id.slice(-6)}` : signer.id;\n  if (signer.publicKey) return `${signer.publicKey.slice(0, 6)}...${signer.publicKey.slice(-6)}`;\n  return \"Unknown\";\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: string): void {\n  if (!signer.isActive) {\n    throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n  }\n}\n\nexport function extractSignerInfo(signer: SignerData): { signerId: string; signerType: string } {\n  const signerType = signer.type || signer.signerType;\n  const signerId = signer.id || signer.signerId;\n  if (!signerType) throw new Error(`Signer type is missing. Signer data: ${JSON.stringify(signer)}`);\n  if (!signerId) throw new Error(`Signer ID is missing. Signer data: ${JSON.stringify(signer)}`);\n  return { signerId, signerType };\n}\n","import type { Transaction } from \"@solana/web3.js\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport {\n  createEmailSignerHelper as createEmailSignerSDK,\n  createPhoneSignerHelper as createPhoneSignerSDK,\n  isValidEmail,\n  isValidPhone,\n  type SignerInfo,\n  authenticateWithPasskey,\n  findExistingPasskeySigner,\n  formatAuthenticationResponse,\n  isWebAuthnSupported,\n  registerPasskeyComplete,\n  signWithPasskeySigner,\n} from \"cilantro-sdk/helpers\";\nimport {\n  sendRawPasskeyTransaction,\n  type TransactionControllerSendRawPasskeyTransactionResult,\n} from \"cilantro-sdk/transactions\";\nimport { createExternalWalletSigner, startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerStartPasskeyAuthenticationResult } from \"cilantro-sdk/wallet\";\nimport { getStorageAdapter } from \"./storage-adapter\";\nimport { loadSigners } from \"./signer-helpers\";\nimport { extractResponseData } from \"./types\";\n\ntype PasskeyTransactionDataDto = TransactionControllerSendRawPasskeyTransactionResult[\"data\"];\n\nexport async function createEmailSignerHelper(walletId: string, email: string): Promise<SignerInfo> {\n  const trimmedEmail = email.trim();\n  if (!trimmedEmail) throw new Error(\"Email address is required\");\n  if (!isValidEmail(trimmedEmail)) throw new Error(\"Invalid email address format\");\n  const deviceKeyManager = getStorageAdapter();\n  return await createEmailSignerSDK(walletId, { email: trimmedEmail, deviceKeyManager });\n}\n\nexport async function createPhoneSignerHelper(walletId: string, phone: string): Promise<SignerInfo> {\n  const trimmedPhone = phone.trim();\n  if (!trimmedPhone) throw new Error(\"Phone number is required\");\n  if (!isValidPhone(trimmedPhone)) throw new Error(\"Invalid phone number format\");\n  const deviceKeyManager = getStorageAdapter();\n  return await createPhoneSignerSDK(walletId, { phone: trimmedPhone, deviceKeyManager });\n}\n\nexport async function createExternalSignerHelper(walletId: string, address: string): Promise<unknown> {\n  if (!address.trim()) throw new Error(\"Wallet address is required\");\n  return await createExternalWalletSigner(walletId, { address: address.trim(), chain: \"solana\" });\n}\n\nexport async function registerPasskeySigner(walletId: string): Promise<{\n  signerId: string;\n  isNew: boolean;\n  credentialId?: string;\n}> {\n  if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n  return await registerPasskeyComplete(walletId);\n}\n\nexport async function checkExistingPasskey(\n  walletId: string,\n  credentialId?: string\n): Promise<{ signerId: string; credentialId?: string } | null> {\n  return await findExistingPasskeySigner(walletId, credentialId);\n}\n\nexport async function signWithPasskey(\n  walletId: string,\n  signerId: string,\n  message: string,\n  options?: { useBrowserAutofill?: boolean }\n): Promise<{ signature: string; signer: string }> {\n  if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n  const messageBytes = new TextEncoder().encode(message);\n  const signature = await signWithPasskeySigner(walletId, signerId, messageBytes, options);\n  return {\n    signature: Buffer.from(signature).toString(\"hex\"),\n    signer: signerId,\n  };\n}\n\nexport async function signAndSendPasskeyTransaction(\n  walletId: string,\n  signerId: string,\n  transaction: Transaction,\n  options?: { credentialId?: string; useBrowserAutofill?: boolean; mintAddress?: string }\n): Promise<{ signature: string; status?: string }> {\n  if (!isWebAuthnSupported()) throw new Error(\"WebAuthn is not supported in this browser\");\n  let credentialId = options?.credentialId;\n  if (!credentialId) {\n    const signers = await loadSigners(walletId);\n    const passkeySigner = signers.find((s) => s.id === signerId || s.signerId === signerId);\n    if (!passkeySigner) {\n      throw new Error(\n        `Passkey signer ${signerId} not found in wallet. Available signers: ${signers.map((s) => `${s.id} (${s.type})`).join(\", \")}`\n      );\n    }\n    credentialId =\n      passkeySigner.credentialId ??\n      (passkeySigner.signerConfig as { credentialId?: string } | undefined)?.credentialId ??\n      (passkeySigner.authId as string | undefined);\n    if (!credentialId) {\n      throw new Error(`Credential ID not found for passkey signer ${signerId}.`);\n    }\n  }\n  let mintAddress: string | undefined = options?.mintAddress;\n  if (!mintAddress && transaction.instructions.length > 0) {\n    const systemProgramId = new PublicKey(\"11111111111111111111111111111111\");\n    const feePayer = transaction.feePayer || systemProgramId;\n    transaction.instructions.forEach((ix) => {\n      ix.keys.forEach((key) => {\n        if (key.isWritable && key.isSigner && !key.pubkey.equals(feePayer) && !mintAddress) {\n          mintAddress = key.pubkey.toString();\n        }\n      });\n    });\n  }\n  const unsignedTransaction = transaction.serialize({ verifySignatures: false }).toString(\"base64\");\n  const authOptions: WalletControllerStartPasskeyAuthenticationResult = await startPasskeyAuthentication(\n    walletId,\n    { credentialId: options?.credentialId }\n  );\n  const authData = extractResponseData<WalletControllerStartPasskeyAuthenticationResult[\"data\"]>(authOptions);\n  if (!authData) throw new Error(\"Failed to get authentication options\");\n  const authDataValue =\n    authData && typeof authData === \"object\" && \"data\" in authData\n      ? (authData as { data: unknown }).data\n      : authData;\n  const credential = await authenticateWithPasskey(\n    authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n    { useBrowserAutofill: options?.useBrowserAutofill ?? false }\n  );\n  const formattedCredential = formatAuthenticationResponse(credential);\n  const dto = {\n    walletId,\n    credentialId,\n    unsignedTransaction,\n    signature: formattedCredential.response.signature,\n    authenticatorData: formattedCredential.response.authenticatorData,\n    clientDataJSON: formattedCredential.response.clientDataJSON,\n  };\n  const result: TransactionControllerSendRawPasskeyTransactionResult = await sendRawPasskeyTransaction(dto);\n  const resultData = extractResponseData<PasskeyTransactionDataDto>(result);\n  return {\n    signature: resultData?.signature ?? \"\",\n    status: resultData?.status,\n  };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { isWebAuthnSupported } from \"cilantro-sdk/helpers\";\nimport { registerPasskeySigner } from \"../core/signer-creation\";\nimport { startPasskeyAuthentication } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { authenticateWithPasskey, formatAuthenticationResponse } from \"cilantro-sdk/helpers\";\n\nexport interface UsePasskeyResult {\n  isSupported: boolean;\n  register: () => Promise<{ signerId: string; isNew: boolean; credentialId?: string }>;\n  authenticate: (signerId?: string) => Promise<{ signature: string; signerId: string }>;\n  isLoading: boolean;\n}\n\nexport function usePasskey(walletId: string | undefined): UsePasskeyResult {\n  const { jwt } = useCilantroContext();\n  const [isLoading, setIsLoading] = useState(false);\n  const isSupported = typeof window !== \"undefined\" && isWebAuthnSupported();\n\n  const register = useCallback(async () => {\n    if (!walletId) throw new Error(\"walletId is required\");\n    if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n    setIsLoading(true);\n    try {\n      const result = await registerPasskeySigner(walletId);\n      return result;\n    } finally {\n      setIsLoading(false);\n    }\n  }, [walletId, isSupported]);\n\n  const authenticate = useCallback(\n    async (signerId?: string) => {\n      if (!walletId) throw new Error(\"walletId is required\");\n      if (!isSupported) throw new Error(\"WebAuthn is not supported in this browser\");\n      setIsLoading(true);\n      try {\n        const authOptions = await startPasskeyAuthentication(walletId, {\n          credentialId: undefined,\n        });\n        const authData = extractResponseData(authOptions);\n        const authDataValue =\n          authData && typeof authData === \"object\" && \"data\" in authData\n            ? (authData as { data: unknown }).data\n            : authData;\n        const credential = await authenticateWithPasskey(\n          authDataValue as Parameters<typeof authenticateWithPasskey>[0],\n          { useBrowserAutofill: false }\n        );\n        const formatted = formatAuthenticationResponse(credential);\n        return {\n          signature: Buffer.from(formatted.response.signature).toString(\"hex\"),\n          signerId: signerId ?? \"\",\n        };\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [walletId, isSupported]\n  );\n\n  return { isSupported, register, authenticate, isLoading };\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect } from \"react\";\n\n/** Minimal Solana wallet interface (Phantom, Solflare, etc.) */\nexport interface SolanaWallet {\n  name: string;\n  publicKey: { toString: () => string } | null;\n  connect: () => Promise<{ publicKey: { toString: () => string } }>;\n  disconnect: () => Promise<void>;\n}\n\ndeclare global {\n  interface Window {\n    solana?: SolanaWallet & { isPhantom?: boolean };\n    solflare?: SolanaWallet;\n  }\n}\n\nfunction getDetectedWallets(): SolanaWallet[] {\n  if (typeof window === \"undefined\") return [];\n  const list: SolanaWallet[] = [];\n  if (window.solana?.connect) {\n    list.push({\n      name: \"Phantom\",\n      publicKey: window.solana.publicKey ?? null,\n      connect: window.solana.connect.bind(window.solana),\n      disconnect: window.solana.disconnect?.bind(window.solana) ?? (() => Promise.resolve()),\n    });\n  }\n  if (window.solflare?.connect && !list.some((w) => w.name === \"Solflare\")) {\n    list.push({\n      name: \"Solflare\",\n      publicKey: window.solflare.publicKey ?? null,\n      connect: window.solflare.connect.bind(window.solflare),\n      disconnect: window.solflare.disconnect?.bind(window.solflare) ?? (() => Promise.resolve()),\n    });\n  }\n  return list;\n}\n\nexport interface UseExternalWalletResult {\n  wallets: SolanaWallet[];\n  connectedWallet: SolanaWallet | null;\n  connect: (wallet: SolanaWallet) => Promise<string>;\n  disconnect: () => Promise<void>;\n}\n\nexport function useExternalWallet(): UseExternalWalletResult {\n  const [wallets, setWallets] = useState<SolanaWallet[]>([]);\n  const [connectedWallet, setConnectedWallet] = useState<SolanaWallet | null>(null);\n\n  useEffect(() => {\n    setWallets(getDetectedWallets());\n  }, []);\n\n  const connect = useCallback(async (wallet: SolanaWallet) => {\n    const res = await wallet.connect();\n    const publicKey = res.publicKey.toString();\n    setConnectedWallet(wallet);\n    return publicKey;\n  }, []);\n\n  const disconnect = useCallback(async () => {\n    if (connectedWallet?.disconnect) {\n      await connectedWallet.disconnect();\n    }\n    setConnectedWallet(null);\n  }, [connectedWallet]);\n\n  return { wallets, connectedWallet, connect, disconnect };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { useCilantroContext } from \"../context/CilantroContext\";\nimport { setSdkAuth } from \"../core/auth\";\nimport { sendSOL as sendSOLApi, sendSPL as sendSPLApi } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../core/types\";\nimport { extractErrorMessage } from \"../core/error-utils\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SubmitTransactionResult {\n  success: boolean;\n  data: { signature?: string; [key: string]: unknown };\n}\n\nexport interface UseSendTransactionResult {\n  sendSOL: (params: {\n    recipientAddress: string;\n    amountLamports: number;\n  }) => Promise<SubmitTransactionResult>;\n  sendSPL: (params: {\n    mintAddress: string;\n    recipientAddress: string;\n    amount: number;\n  }) => Promise<SubmitTransactionResult>;\n  isPending: boolean;\n  error: string | null;\n}\n\nexport function useSendTransaction(\n  walletId: string | undefined,\n  _signerId?: string,\n  _signerType?: SignerType\n): UseSendTransactionResult {\n  const { jwt } = useCilantroContext();\n  const [isPending, setIsPending] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const sendSOL = useCallback(\n    async (params: { recipientAddress: string; amountLamports: number }) => {\n      if (!walletId) throw new Error(\"walletId is required\");\n      setError(null);\n      setIsPending(true);\n      try {\n        if (jwt) setSdkAuth(jwt);\n        const result = await sendSOLApi(walletId, {\n          recipientAddress: params.recipientAddress,\n          amountLamports: params.amountLamports,\n        });\n        const data = extractResponseData<{ transactionHash?: string }>(result);\n        const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n        return {\n          success: true,\n          data: { signature, ...data },\n        } as SubmitTransactionResult;\n      } catch (err) {\n        const msg = extractErrorMessage(err);\n        setError(msg);\n        throw new Error(msg);\n      } finally {\n        setIsPending(false);\n      }\n    },\n    [walletId, jwt]\n  );\n\n  const sendSPL = useCallback(\n    async (params: {\n      mintAddress: string;\n      recipientAddress: string;\n      amount: number;\n    }) => {\n      if (!walletId) throw new Error(\"walletId is required\");\n      setError(null);\n      setIsPending(true);\n      try {\n        if (jwt) setSdkAuth(jwt);\n        const result = await sendSPLApi(walletId, {\n          mintAddress: params.mintAddress,\n          recipientAddress: params.recipientAddress,\n          amount: params.amount,\n        });\n        const data = extractResponseData<{ transactionHash?: string }>(result);\n        const signature = data?.transactionHash ?? (data as { signature?: string })?.signature;\n        return {\n          success: true,\n          data: { signature, ...data },\n        } as SubmitTransactionResult;\n      } catch (err) {\n        const msg = extractErrorMessage(err);\n        setError(msg);\n        throw new Error(msg);\n      } finally {\n        setIsPending(false);\n      }\n    },\n    [walletId, jwt]\n  );\n\n  return { sendSOL, sendSPL, isPending, error };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { useReturnUrl } from \"../../hooks/useReturnUrl\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../ui/card\";\nimport { cn } from \"../../ui/cn\";\nimport { SocialLoginButtons } from \"./SocialLoginButtons\";\n\nexport interface LoginFormClassNames {\n  root?: string;\n  header?: string;\n  title?: string;\n  description?: string;\n  form?: string;\n  label?: string;\n  input?: string;\n  submitButton?: string;\n  error?: string;\n}\n\nexport interface LoginFormProps {\n  className?: string;\n  classNames?: LoginFormClassNames;\n  style?: React.CSSProperties;\n  onSuccess?: () => void;\n  onError?: (error: Error) => void;\n  /** Redirect to this path after successful login. If not set, reads from URL ?returnUrl= (when returnUrlParam provided). */\n  redirectAfterSuccess?: string;\n  /** Custom redirect function for SPA routers. e.g. (path) => router.replace(path) */\n  onRedirect?: (path: string) => void;\n  /** Query param to read returnUrl from URL. Default: \"returnUrl\". Used when redirectAfterSuccess not set. */\n  returnUrlParam?: string;\n  rememberMe?: boolean;\n  /** Override submit button label */\n  submitLabel?: string;\n  /** Override title */\n  title?: string;\n  /** Override description */\n  description?: string;\n  /** Render \"Create account\" link (e.g. to switch to register). Shown below submit. */\n  renderSwitchToRegister?: () => React.ReactNode;\n  /** Enable Google sign-in. Built-in flow is always available, or provide callback. */\n  onGoogleSignIn?: () => Promise<string>;\n  /** Show Google sign-in using built-in flow (always available). */\n  enableGoogleSignIn?: boolean;\n}\n\nexport function LoginForm({\n  className,\n  classNames,\n  style,\n  onSuccess,\n  onError,\n  redirectAfterSuccess,\n  onRedirect,\n  returnUrlParam = \"returnUrl\",\n  submitLabel = \"Sign in\",\n  title = \"Sign in\",\n  description,\n  renderSwitchToRegister,\n  onGoogleSignIn,\n  enableGoogleSignIn,\n}: LoginFormProps) {\n  const { login, isLoading } = useCilantroAuth();\n  const { returnPath } = useReturnUrl({ param: returnUrlParam, defaultPath: \"/\" });\n  const [usernameOrEmail, setUsernameOrEmail] = useState(\"\");\n  const [password, setPassword] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n\n  const pathToRedirect = redirectAfterSuccess ?? returnPath;\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    setError(null);\n    try {\n      await login(usernameOrEmail.trim(), password);\n      onSuccess?.();\n      if (pathToRedirect) {\n        if (onRedirect) {\n          onRedirect(pathToRedirect);\n        } else if (typeof window !== \"undefined\") {\n          window.location.href = pathToRedirect;\n        }\n      }\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  return (\n    <Card className={cn(className, classNames?.root)} style={style} data-cilantro-login-form>\n      <CardHeader className={classNames?.header}>\n        <CardTitle className={classNames?.title}>{title}</CardTitle>\n        {description != null && (\n          <CardDescription className={classNames?.description}>{description}</CardDescription>\n        )}\n      </CardHeader>\n      <CardContent>\n        <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n          {(onGoogleSignIn || enableGoogleSignIn) && (\n            <SocialLoginButtons\n              onGoogleSignIn={onGoogleSignIn}\n              onSuccess={() => {\n                if (pathToRedirect) {\n                  if (onRedirect) onRedirect(pathToRedirect);\n                  else if (typeof window !== \"undefined\") window.location.href = pathToRedirect;\n                }\n              }}\n              showDivider={true}\n            />\n          )}\n          <div className=\"space-y-2\">\n            <Label htmlFor=\"cilantro-login-username\" className={classNames?.label}>\n              Username or email\n            </Label>\n            <Input\n              id=\"cilantro-login-username\"\n              type=\"text\"\n              autoComplete=\"username\"\n              className={classNames?.input}\n              value={usernameOrEmail}\n              onChange={(e) => setUsernameOrEmail(e.target.value)}\n              placeholder=\"Username or email\"\n              required\n              disabled={isLoading}\n            />\n          </div>\n          <div className=\"space-y-2\">\n            <Label htmlFor=\"cilantro-login-password\" className={classNames?.label}>\n              Password\n            </Label>\n            <Input\n              id=\"cilantro-login-password\"\n              type=\"password\"\n              autoComplete=\"current-password\"\n              className={classNames?.input}\n              value={password}\n              onChange={(e) => setPassword(e.target.value)}\n              placeholder=\"Password\"\n              required\n              disabled={isLoading}\n            />\n          </div>\n          {error && (\n            <div\n              className={cn(\n                \"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\",\n                classNames?.error\n              )}\n              role=\"alert\"\n            >\n              {error}\n            </div>\n          )}\n          <Button\n            type=\"submit\"\n            size=\"touch\"\n            className={cn(\"w-full\", classNames?.submitButton)}\n            disabled={isLoading || !usernameOrEmail.trim() || !password}\n          >\n            {isLoading ? \"Signing in...\" : submitLabel}\n          </Button>\n          {renderSwitchToRegister && (\n            <div className=\"text-center text-sm text-muted-foreground\">{renderSwitchToRegister()}</div>\n          )}\n        </form>\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst buttonVariants = cva(\n  \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n        destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n        outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n        secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n        ghost: \"hover:bg-accent hover:text-accent-foreground\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n      },\n      size: {\n        default: \"h-10 px-4 py-2\",\n        sm: \"h-9 rounded-md px-3\",\n        lg: \"h-11 rounded-md px-8\",\n        icon: \"h-10 w-10\",\n        touch: \"h-12 min-h-[44px] min-w-[44px] rounded-md px-4\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n);\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\n    const Comp = asChild ? Slot : \"button\";\n    return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\n  }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n  return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n  ({ className, type, ...props }, ref) => {\n    return (\n      <input\n        type={type}\n        className={cn(\n          \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    );\n  }\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"./cn\";\n\nconst labelVariants = cva(\n  \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n);\n\nconst Label = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n  <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n  ({ className, ...props }, ref) => (\n    <div\n      ref={ref}\n      className={cn(\"rounded-xl border bg-card text-card-foreground shadow\", className)}\n      {...props}\n    />\n  )\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n  ({ className, ...props }, ref) => (\n    <div ref={ref} className={cn(\"flex flex-col space-y-1.5 p-6\", className)} {...props} />\n  )\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n  ({ className, ...props }, ref) => (\n    <h3\n      ref={ref}\n      className={cn(\"font-semibold leading-none tracking-tight\", className)}\n      {...props}\n    />\n  )\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <p ref={ref} className={cn(\"text-sm text-muted-foreground\", className)} {...props} />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n  ({ className, ...props }, ref) => (\n    <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n  )\n);\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n  ({ className, ...props }, ref) => (\n    <div ref={ref} className={cn(\"flex items-center p-6 pt-0\", className)} {...props} />\n  )\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { GoogleLogin } from \"@react-oauth/google\";\nimport { getDiscordAuthorizeUrl } from \"cilantro-sdk/auth\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { useCilantroConfig } from \"../../hooks/useCilantroConfig\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport type SocialProvider = \"google\" | \"apple\" | \"discord\";\n\nexport interface SocialLoginButtonsClassNames {\n  root?: string;\n  divider?: string;\n  button?: string;\n  googleButton?: string;\n  appleButton?: string;\n  discordButton?: string;\n  error?: string;\n}\n\nexport interface SocialLoginButtonsProps {\n  /** Called when user clicks Google. Return the id_token from Google Sign-In. */\n  onGoogleSignIn?: () => Promise<string>;\n  /** Called when user clicks Apple. Return the id_token from Apple Sign-In. */\n  onAppleSignIn?: () => Promise<string>;\n  /** Called when user clicks Discord. Return the OAuth access_token from Discord (required by SDK). */\n  onDiscordSignIn?: () => Promise<string>;\n  /** Called after successful social login (e.g. for redirect). */\n  onSuccess?: () => void;\n  /** Show Google sign-in. Default: true */\n  showGoogle?: boolean;\n  /** Show Apple sign-in. Default: false */\n  showApple?: boolean;\n  /** Show Discord sign-in. Use built-in redirect (set discordRedirectUri in CilantroProvider socialAuth) or provide onDiscordSignIn. Default: false */\n  showDiscord?: boolean;\n  className?: string;\n  classNames?: SocialLoginButtonsClassNames;\n  /** Optional divider between social and email/password form */\n  showDivider?: boolean;\n}\n\n/**\n * Social sign-in buttons (Google, Apple, Discord). Integrates with loginWithSocial.\n * Matches cilantro-sdk SocialLoginDto: Google/Apple use id_token, Discord uses access_token.\n */\nexport function SocialLoginButtons({\n  onGoogleSignIn,\n  onAppleSignIn,\n  onDiscordSignIn,\n  onSuccess,\n  showGoogle = true,\n  showApple = false,\n  showDiscord = false,\n  className,\n  classNames,\n  showDivider = true,\n}: SocialLoginButtonsProps) {\n  const { loginWithSocial } = useAuth();\n  const { config } = useCilantroConfig();\n  const [loading, setLoading] = useState<SocialProvider | null>(null);\n  const [error, setError] = useState<string | null>(null);\n\n  const sa = config.socialAuth;\n  const hasBuiltInGoogle = showGoogle && sa?.googleClientId && !onGoogleSignIn;\n  const hasCallbackGoogle = showGoogle && onGoogleSignIn;\n  const hasApple = showApple && onAppleSignIn;\n  const hasBuiltInDiscord = showDiscord && sa?.discordRedirectUri && !onDiscordSignIn;\n  const hasCallbackDiscord = showDiscord && onDiscordSignIn;\n  const hasDiscord = hasBuiltInDiscord || hasCallbackDiscord;\n  const hasProviders = hasBuiltInGoogle || hasCallbackGoogle || hasApple || hasDiscord;\n\n  const handleIdTokenLogin = async (\n    getToken: (() => Promise<string>) | undefined,\n    provider: \"google\" | \"apple\"\n  ) => {\n    if (!getToken) {\n      setError(`Sign in with ${provider} is not configured.`);\n      return;\n    }\n    setError(null);\n    setLoading(provider);\n    try {\n      const id_token = await getToken();\n      if (id_token) {\n        await loginWithSocial({ provider, id_token });\n        onSuccess?.();\n      }\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n    } finally {\n      setLoading(null);\n    }\n  };\n\n  const handleDiscordClick = useCallback(async () => {\n    if (onDiscordSignIn) {\n      setError(null);\n      setLoading(\"discord\");\n      try {\n        const access_token = await onDiscordSignIn();\n        if (access_token) {\n          await loginWithSocial({ provider: \"discord\", access_token });\n          onSuccess?.();\n        }\n      } catch (err) {\n        const message = err instanceof Error ? err.message : String(err);\n        setError(message);\n      } finally {\n        setLoading(null);\n      }\n      return;\n    }\n    setError(\"Sign in with Discord is not configured.\");\n  }, [onDiscordSignIn, loginWithSocial, onSuccess]);\n\n  const handleDiscordRedirect = useCallback(async () => {\n    const clientRedirectUri = sa?.discordRedirectUri;\n    if (!clientRedirectUri) {\n      setError(\"Sign in with Discord is not configured (missing discordRedirectUri in socialAuth).\");\n      return;\n    }\n    setError(null);\n    setLoading(\"discord\");\n    try {\n      const result = await getDiscordAuthorizeUrl({ clientRedirectUri });\n      const authorizeUrl = typeof result === \"object\" && result !== null && \"authorizeUrl\" in result\n        ? String((result as { authorizeUrl: string }).authorizeUrl)\n        : \"\";\n      if (authorizeUrl) {\n        window.location.href = authorizeUrl;\n      } else {\n        setError(\"Discord sign-in: no authorize URL returned.\");\n        setLoading(null);\n      }\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n      setLoading(null);\n    }\n  }, [sa?.discordRedirectUri]);\n\n  const handleGoogleSuccess = useCallback(\n    async (credentialResponse: { credential?: string }) => {\n      const id_token = credentialResponse.credential;\n      if (!id_token) return;\n      setError(null);\n      setLoading(\"google\");\n      try {\n        await loginWithSocial({ provider: \"google\", id_token });\n        onSuccess?.();\n      } catch (err) {\n        const message = err instanceof Error ? err.message : String(err);\n        setError(message);\n      } finally {\n        setLoading(null);\n      }\n    },\n    [loginWithSocial, onSuccess]\n  );\n\n  if (!hasProviders) return null;\n\n  return (\n    <div className={cn(\"space-y-3\", className, classNames?.root)} data-cilantro-social-login>\n      {showDivider && (\n        <div className={cn(\"relative\", classNames?.divider)}>\n          <div className=\"absolute inset-0 flex items-center\">\n            <span className=\"w-full border-t\" />\n          </div>\n          <div className=\"relative flex justify-center text-xs uppercase\">\n            <span className=\"bg-background px-2 text-muted-foreground\">Or continue with</span>\n          </div>\n        </div>\n      )}\n      <div className=\"flex flex-col gap-2\">\n        {hasBuiltInGoogle && (\n          <div className={cn(\"w-full [&>div]:!w-full [&>div]:!justify-center\", classNames?.googleButton)} data-cilantro-social-google>\n            <GoogleLogin\n              onSuccess={handleGoogleSuccess}\n              onError={() => setError(\"Google sign-in failed\")}\n              theme=\"outline\"\n              size=\"large\"\n              width=\"100%\"\n            />\n          </div>\n        )}\n        {hasCallbackGoogle && (\n          <Button\n            type=\"button\"\n            variant=\"outline\"\n            className={cn(\"w-full\", classNames?.button, classNames?.googleButton)}\n            disabled={!!loading}\n            onClick={() => handleIdTokenLogin(onGoogleSignIn, \"google\")}\n            data-cilantro-social-google\n          >\n            {loading === \"google\" ? (\n              <span className=\"flex items-center gap-2\">\n                <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n                Signing in...\n              </span>\n            ) : (\n              \"Sign in with Google\"\n            )}\n          </Button>\n        )}\n        {hasApple && (\n          <Button\n            type=\"button\"\n            variant=\"outline\"\n            className={cn(\"w-full\", classNames?.button, classNames?.appleButton)}\n            disabled={!!loading}\n            onClick={() => handleIdTokenLogin(onAppleSignIn, \"apple\")}\n            data-cilantro-social-apple\n          >\n            {loading === \"apple\" ? (\n              <span className=\"flex items-center gap-2\">\n                <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n                Signing in...\n              </span>\n            ) : (\n              \"Sign in with Apple\"\n            )}\n          </Button>\n        )}\n        {hasDiscord && (\n          <Button\n            type=\"button\"\n            variant=\"outline\"\n            className={cn(\"w-full\", classNames?.button, classNames?.discordButton)}\n            disabled={!!loading}\n            onClick={hasCallbackDiscord ? handleDiscordClick : handleDiscordRedirect}\n            data-cilantro-social-discord\n          >\n            {loading === \"discord\" ? (\n              <span className=\"flex items-center gap-2\">\n                <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n                Signing in...\n              </span>\n            ) : (\n              \"Sign in with Discord\"\n            )}\n          </Button>\n        )}\n      </div>\n      {error && (\n        <div\n          className={cn(\n            \"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\",\n            classNames?.error\n          )}\n          role=\"alert\"\n        >\n          {error}\n        </div>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { useReturnUrl } from \"../../hooks/useReturnUrl\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../ui/card\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface RegisterFormClassNames {\n  root?: string;\n  header?: string;\n  title?: string;\n  description?: string;\n  form?: string;\n  label?: string;\n  input?: string;\n  submitButton?: string;\n  error?: string;\n}\n\nexport interface RegisterFormProps {\n  className?: string;\n  classNames?: RegisterFormClassNames;\n  style?: React.CSSProperties;\n  onSuccess?: () => void;\n  onError?: (error: Error) => void;\n  /** Redirect to this path after successful registration. If not set, reads from URL ?returnUrl= */\n  redirectAfterSuccess?: string;\n  /** Custom redirect function for SPA routers */\n  onRedirect?: (path: string) => void;\n  /** Query param to read returnUrl from URL. Default: \"returnUrl\" */\n  returnUrlParam?: string;\n  /** Override submit button label */\n  submitLabel?: string;\n  /** Override title */\n  title?: string;\n  /** Override description */\n  description?: string;\n  /** Render \"Already have an account?\" link to switch to login */\n  renderSwitchToLogin?: () => React.ReactNode;\n}\n\nexport function RegisterForm({\n  className,\n  classNames,\n  style,\n  onSuccess,\n  onError,\n  redirectAfterSuccess,\n  onRedirect,\n  returnUrlParam = \"returnUrl\",\n  submitLabel = \"Create account\",\n  title = \"Create account\",\n  description,\n  renderSwitchToLogin,\n}: RegisterFormProps) {\n  const { register, isLoading } = useAuth();\n  const { returnPath } = useReturnUrl({ param: returnUrlParam, defaultPath: \"/\" });\n  const [username, setUsername] = useState(\"\");\n  const [email, setEmail] = useState(\"\");\n  const [password, setPassword] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n\n  const pathToRedirect = redirectAfterSuccess ?? returnPath;\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    setError(null);\n    try {\n      await register(username.trim(), email.trim(), password);\n      onSuccess?.();\n      if (pathToRedirect) {\n        if (onRedirect) {\n          onRedirect(pathToRedirect);\n        } else if (typeof window !== \"undefined\") {\n          window.location.href = pathToRedirect;\n        }\n      }\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  return (\n    <Card className={cn(className, classNames?.root)} style={style} data-cilantro-register-form>\n      <CardHeader className={classNames?.header}>\n        <CardTitle className={classNames?.title}>{title}</CardTitle>\n        {description != null && (\n          <CardDescription className={classNames?.description}>{description}</CardDescription>\n        )}\n      </CardHeader>\n      <CardContent>\n        <form onSubmit={handleSubmit} className={cn(\"space-y-4\", classNames?.form)}>\n          <div className=\"space-y-2\">\n            <Label htmlFor=\"cilantro-register-username\" className={classNames?.label}>\n              Username\n            </Label>\n            <Input\n              id=\"cilantro-register-username\"\n              type=\"text\"\n              autoComplete=\"username\"\n              className={classNames?.input}\n              value={username}\n              onChange={(e) => setUsername(e.target.value)}\n              placeholder=\"Username\"\n              required\n              disabled={isLoading}\n            />\n          </div>\n          <div className=\"space-y-2\">\n            <Label htmlFor=\"cilantro-register-email\" className={classNames?.label}>\n              Email\n            </Label>\n            <Input\n              id=\"cilantro-register-email\"\n              type=\"email\"\n              autoComplete=\"email\"\n              className={classNames?.input}\n              value={email}\n              onChange={(e) => setEmail(e.target.value)}\n              placeholder=\"Email\"\n              required\n              disabled={isLoading}\n            />\n          </div>\n          <div className=\"space-y-2\">\n            <Label htmlFor=\"cilantro-register-password\" className={classNames?.label}>\n              Password\n            </Label>\n            <Input\n              id=\"cilantro-register-password\"\n              type=\"password\"\n              autoComplete=\"new-password\"\n              className={classNames?.input}\n              value={password}\n              onChange={(e) => setPassword(e.target.value)}\n              placeholder=\"Password\"\n              required\n              disabled={isLoading}\n            />\n          </div>\n          {error && (\n            <div\n              className={cn(\n                \"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\",\n                classNames?.error\n              )}\n              role=\"alert\"\n            >\n              {error}\n            </div>\n          )}\n          <Button\n            type=\"submit\"\n            size=\"touch\"\n            className={cn(\"w-full\", classNames?.submitButton)}\n            disabled={isLoading || !username.trim() || !email.trim() || !password}\n          >\n            {isLoading ? \"Creating account...\" : submitLabel}\n          </Button>\n          {renderSwitchToLogin && (\n            <div className=\"text-center text-sm text-muted-foreground\">{renderSwitchToLogin()}</div>\n          )}\n        </form>\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { Button } from \"../../ui/button\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from \"../../ui/dialog\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LogoutButtonProps {\n  onLogout?: () => void;\n  /** Redirect to this path after logout (e.g. \"/login\") */\n  redirectAfterLogout?: string;\n  /** Custom redirect for SPA routers. e.g. (path) => router.replace(path) */\n  onRedirect?: (path: string) => void;\n  confirmBeforeLogout?: boolean;\n  className?: string;\n  children?: ReactNode;\n}\n\nexport function LogoutButton({\n  onLogout,\n  redirectAfterLogout,\n  onRedirect,\n  confirmBeforeLogout = false,\n  className,\n  children,\n}: LogoutButtonProps) {\n  const { logout } = useAuth();\n  const [confirmOpen, setConfirmOpen] = useState(false);\n\n  const handleLogout = () => {\n    logout();\n    setConfirmOpen(false);\n    onLogout?.();\n    if (redirectAfterLogout) {\n      if (onRedirect) {\n        onRedirect(redirectAfterLogout);\n      } else if (typeof window !== \"undefined\") {\n        window.location.href = redirectAfterLogout;\n      }\n    }\n  };\n\n  const handleClick = () => {\n    if (confirmBeforeLogout) {\n      setConfirmOpen(true);\n    } else {\n      handleLogout();\n    }\n  };\n\n  return (\n    <>\n      <Button\n        type=\"button\"\n        variant=\"outline\"\n        className={cn(className)}\n        onClick={handleClick}\n        data-cilantro-logout-button\n      >\n        {children ?? \"Log out\"}\n      </Button>\n      {confirmBeforeLogout && (\n        <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n          <DialogContent>\n            <DialogHeader>\n              <DialogTitle>Log out?</DialogTitle>\n              <DialogDescription>Are you sure you want to log out?</DialogDescription>\n            </DialogHeader>\n            <DialogFooter>\n              <Button variant=\"outline\" onClick={() => setConfirmOpen(false)}>\n                Cancel\n              </Button>\n              <Button variant=\"destructive\" onClick={handleLogout}>\n                Log out\n              </Button>\n            </DialogFooter>\n          </DialogContent>\n        </Dialog>\n      )}\n    </>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cn } from \"./cn\";\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Overlay\n    ref={ref}\n    className={cn(\n      \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n  />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <DialogPortal>\n    <DialogOverlay />\n    <DialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg max-h-[100dvh] sm:max-h-[90vh] translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </DialogPrimitive.Content>\n  </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n  <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n    {...props}\n  />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Title\n    ref={ref}\n    className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n    {...props}\n  />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n  Dialog,\n  DialogPortal,\n  DialogOverlay,\n  DialogTrigger,\n  DialogClose,\n  DialogContent,\n  DialogHeader,\n  DialogFooter,\n  DialogTitle,\n  DialogDescription,\n};\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { useCilantroAuth } from \"../../providers/CilantroAuthProvider\";\nimport { LoginForm } from \"./LoginForm\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface AuthGuardClassNames {\n  root?: string;\n  fallback?: string;\n  skeleton?: string;\n  loading?: string;\n  /** Centered/fullscreen layout wrapper */\n  layout?: string;\n}\n\nexport type AuthGuardLayout = \"inline\" | \"centered\" | \"fullscreen\";\n\nexport interface AuthGuardProps {\n  children: ReactNode;\n  /** Shown when not authenticated. Default: <LoginForm /> */\n  fallback?: ReactNode;\n  /** Redirect unauthenticated users to this path (e.g. \"/login\"). Uses onRedirect if provided, else window.location. */\n  redirectTo?: string;\n  /** Custom redirect function for SPA routers (Next.js, React Router). e.g. (path) => router.replace(path) */\n  onRedirect?: (path: string) => void;\n  /** Query param for return URL when redirecting. Default: \"returnUrl\" */\n  returnUrlParam?: string;\n  /** Layout for fallback content. \"centered\" and \"fullscreen\" give polished auth UX. */\n  layout?: AuthGuardLayout;\n  /** Root class when showing fallback */\n  className?: string;\n  classNames?: AuthGuardClassNames;\n  /** When true, show fallback (login) instead of redirecting. When false, redirect when redirectTo is set, else render null. */\n  showFallback?: boolean;\n  /** When true, show skeleton while loading. When false, show \"Loading...\" text. */\n  useSkeleton?: boolean;\n}\n\nconst LAYOUT_CLASSES: Record<AuthGuardLayout, string> = {\n  inline: \"\",\n  centered: \"flex min-h-[280px] items-center justify-center p-6\",\n  fullscreen: \"fixed inset-0 z-50 flex min-h-screen items-center justify-center bg-background p-4\",\n};\n\nfunction getCurrentReturnPath(returnUrlParam: string): string {\n  if (typeof window === \"undefined\") return \"/\";\n  const params = new URLSearchParams(window.location.search);\n  const existing = params.get(returnUrlParam);\n  if (existing && existing.startsWith(\"/\")) return existing;\n  const path = window.location.pathname + window.location.search;\n  return path || \"/\";\n}\n\n/**\n * Wraps content and shows fallback (e.g. LoginForm) when the user is not authenticated.\n * Use inside CilantroProvider.\n *\n * For Next.js: pass onRedirect={(path) => router.replace(path)} and redirectTo=\"/login\".\n * For return-after-login flow: set redirectTo=\"/login\"; AuthGuard will redirect with ?returnUrl=currentPath.\n */\nexport function AuthGuard({\n  children,\n  fallback,\n  redirectTo,\n  onRedirect,\n  returnUrlParam = \"returnUrl\",\n  layout = \"inline\",\n  className,\n  classNames,\n  showFallback = true,\n  useSkeleton = false,\n}: AuthGuardProps) {\n  const { isAuthenticated, isLoading } = useCilantroAuth();\n\n  const redirectPath = useMemo(() => {\n    if (!redirectTo) return null;\n    const returnPath = getCurrentReturnPath(returnUrlParam);\n    const sep = redirectTo.includes(\"?\") ? \"&\" : \"?\";\n    return `${redirectTo}${sep}${returnUrlParam}=${encodeURIComponent(returnPath)}`;\n  }, [redirectTo, returnUrlParam]);\n\n  if (isLoading) {\n    const loadingContent = useSkeleton ? (\n      <div className={cn(\"rounded-lg border border-input p-6 space-y-4 w-full max-w-sm\", classNames?.fallback)}>\n        <Skeleton className={cn(\"h-7 w-2/3 rounded\", classNames?.skeleton)} />\n        <Skeleton className={cn(\"h-4 w-full rounded\", classNames?.skeleton)} />\n        <Skeleton className={cn(\"h-10 w-full rounded\", classNames?.skeleton)} />\n        <Skeleton className={cn(\"h-10 w-full rounded\", classNames?.skeleton)} />\n      </div>\n    ) : (\n      <div className=\"flex flex-col items-center gap-3\">\n        <div\n          className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\"\n          aria-hidden\n        />\n        <p className=\"text-sm text-muted-foreground\">Loading...</p>\n      </div>\n    );\n\n    return (\n      <div\n        className={cn(\n          LAYOUT_CLASSES[layout],\n          className,\n          classNames?.root,\n          classNames?.loading\n        )}\n        data-cilantro-auth-guard\n        aria-busy=\"true\"\n        aria-live=\"polite\"\n      >\n        <div className={cn(layout !== \"inline\" && \"w-full max-w-sm\", classNames?.layout)}>\n          {loadingContent}\n        </div>\n      </div>\n    );\n  }\n\n  if (!isAuthenticated) {\n    if (!showFallback && redirectPath) {\n      if (onRedirect) {\n        onRedirect(redirectPath);\n      } else if (typeof window !== \"undefined\") {\n        window.location.href = redirectPath;\n      }\n      return null;\n    }\n    if (!showFallback) return null;\n\n    // Redirect mode: send user to login page with returnUrl\n    if (redirectPath) {\n      if (onRedirect) {\n        onRedirect(redirectPath);\n      } else if (typeof window !== \"undefined\") {\n        window.location.href = redirectPath;\n      }\n      return null;\n    }\n\n    // Show fallback (login form) - pass returnPath for post-login redirect\n    const returnPath = getCurrentReturnPath(returnUrlParam);\n    const fallbackContent =\n      fallback ??\n      (\n        <LoginForm\n          className={classNames?.fallback}\n          redirectAfterSuccess={returnPath}\n          returnUrlParam={returnUrlParam}\n          onRedirect={onRedirect}\n        />\n      );\n\n    return (\n      <div\n        className={cn(\n          LAYOUT_CLASSES[layout],\n          className,\n          classNames?.root\n        )}\n        data-cilantro-auth-guard\n      >\n        <div className={cn(layout !== \"inline\" && \"w-full max-w-sm\", classNames?.layout)}>\n          {fallbackContent}\n        </div>\n      </div>\n    );\n  }\n\n  return <>{children}</>;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n  ({ className, ...props }, ref) => (\n    <div\n      ref={ref}\n      className={cn(\"rounded-md bg-muted animate-pulse\", className)}\n      {...props}\n    />\n  )\n);\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface AuthShellClassNames {\n  root?: string;\n  inner?: string;\n  logo?: string;\n}\n\nexport interface AuthShellProps {\n  children: ReactNode;\n  /** Optional logo/brand (e.g. <img> or <Logo />) */\n  logo?: ReactNode;\n  /** Max width of the auth card area. Default: \"sm\" (24rem) */\n  maxWidth?: \"sm\" | \"md\" | \"lg\";\n  className?: string;\n  classNames?: AuthShellClassNames;\n}\n\nconst MAX_WIDTH_CLASSES = {\n  sm: \"max-w-sm\",\n  md: \"max-w-md\",\n  lg: \"max-w-lg\",\n};\n\n/**\n * Full-page centered layout for auth screens (login, register).\n * Provides a polished, accessible UX with consistent spacing and optional logo.\n *\n * @example\n * <AuthShell logo={<img src=\"/logo.svg\" alt=\"App\" />}>\n *   <LoginForm />\n * </AuthShell>\n */\nexport function AuthShell({\n  children,\n  logo,\n  maxWidth = \"sm\",\n  className,\n  classNames,\n}: AuthShellProps) {\n  return (\n    <div\n      className={cn(\n        \"flex min-h-screen flex-col items-center justify-center bg-background p-4 sm:p-6\",\n        className,\n        classNames?.root\n      )}\n      data-cilantro-auth-shell\n    >\n      <div\n        className={cn(\n          \"w-full space-y-6\",\n          MAX_WIDTH_CLASSES[maxWidth],\n          classNames?.inner\n        )}\n      >\n        {logo && (\n          <div\n            className={cn(\"flex justify-center\", classNames?.logo)}\n            data-cilantro-auth-shell-logo\n          >\n            {logo}\n          </div>\n        )}\n        {children}\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreateEmailSignerFormProps {\n  walletId: string;\n  onCreated?: (signer: SignerInfo) => void;\n  onError?: (error: Error) => void;\n  className?: string;\n}\n\nexport function CreateEmailSignerForm({\n  walletId,\n  onCreated,\n  onError,\n  className,\n}: CreateEmailSignerFormProps) {\n  const { createEmailSigner, isLoading } = useSigners(walletId);\n  const [email, setEmail] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    setError(null);\n    try {\n      const signer = await createEmailSigner({ email: email.trim() });\n      setEmail(\"\");\n      onCreated?.(signer);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-email-signer>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-email-signer-email\">Email</Label>\n        <Input\n          id=\"cilantro-email-signer-email\"\n          type=\"email\"\n          autoComplete=\"email\"\n          value={email}\n          onChange={(e) => setEmail(e.target.value)}\n          placeholder=\"you@example.com\"\n          required\n          disabled={isLoading}\n        />\n      </div>\n      {error && (\n        <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n          {error}\n        </div>\n      )}\n      <Button type=\"submit\" disabled={isLoading || !email.trim()}>\n        {isLoading ? \"Creating...\" : \"Create email signer\"}\n      </Button>\n    </form>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface CreatePhoneSignerFormProps {\n  walletId: string;\n  onCreated?: (signer: SignerInfo) => void;\n  onError?: (error: Error) => void;\n  className?: string;\n}\n\nexport function CreatePhoneSignerForm({\n  walletId,\n  onCreated,\n  onError,\n  className,\n}: CreatePhoneSignerFormProps) {\n  const { createPhoneSigner, isLoading } = useSigners(walletId);\n  const [phone, setPhone] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    setError(null);\n    try {\n      const signer = await createPhoneSigner({ phone: phone.trim() });\n      setPhone(\"\");\n      onCreated?.(signer);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-phone-signer>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-phone-signer-phone\">Phone number</Label>\n        <Input\n          id=\"cilantro-phone-signer-phone\"\n          type=\"tel\"\n          autoComplete=\"tel\"\n          value={phone}\n          onChange={(e) => setPhone(e.target.value)}\n          placeholder=\"+1234567890\"\n          required\n          disabled={isLoading}\n        />\n      </div>\n      {error && (\n        <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n          {error}\n        </div>\n      )}\n      <Button type=\"submit\" disabled={isLoading || !phone.trim()}>\n        {isLoading ? \"Creating...\" : \"Create phone signer\"}\n      </Button>\n    </form>\n  );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { usePasskey } from \"../../hooks/usePasskey\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\n\nexport interface AddPasskeyButtonProps {\n  walletId: string;\n  onRegistered?: (signer: SignerInfo) => void;\n  onError?: (error: Error) => void;\n  className?: string;\n  children?: ReactNode;\n}\n\nexport function AddPasskeyButton({\n  walletId,\n  onRegistered,\n  onError,\n  className,\n  children,\n}: AddPasskeyButtonProps) {\n  const { isSupported, register, isLoading } = usePasskey(walletId);\n  const [error, setError] = useState<string | null>(null);\n\n  const handleClick = async () => {\n    setError(null);\n    try {\n      const result = await register();\n      onRegistered?.(result as unknown as SignerInfo);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  if (!isSupported) return null;\n\n  return (\n    <div className={cn(className)} data-cilantro-add-passkey>\n      <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={isLoading}>\n        {children ?? \"Add Passkey\"}\n      </Button>\n      {error && (\n        <p className=\"mt-2 text-sm text-destructive\" role=\"alert\">\n          {error}\n        </p>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport { getSignerDisplayName, getSignerTypeLabel } from \"../../core/signer-helpers\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogHeader,\n  DialogTitle,\n} from \"../../ui/dialog\";\nimport { CreateEmailSignerForm } from \"./CreateEmailSignerForm\";\nimport { CreatePhoneSignerForm } from \"./CreatePhoneSignerForm\";\nimport { AddPasskeyButton } from \"./AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SignerListClassNames {\n  root?: string;\n  header?: string;\n  list?: string;\n  item?: string;\n  addButton?: string;\n  message?: string;\n  skeleton?: string;\n  loading?: string;\n}\n\nexport interface SignerListProps {\n  walletId: string;\n  onRevoke?: (signerId: string) => void;\n  className?: string;\n  classNames?: SignerListClassNames;\n  onSignerAdded?: () => void;\n  useSkeleton?: boolean;\n  children?: (props: {\n    signers: SignerData[];\n    isLoading: boolean;\n    error: string | null;\n    refresh: () => Promise<void>;\n    openAddSigner: () => void;\n  }) => React.ReactNode;\n}\n\nexport function SignerList({\n  walletId,\n  onRevoke,\n  className,\n  classNames,\n  onSignerAdded,\n  useSkeleton = true,\n  children,\n}: SignerListProps) {\n  const { signers, isLoading, error, refresh, revokeSigner } = useSigners(walletId);\n  const [addSignerOpen, setAddSignerOpen] = useState(false);\n\n  const handleAddSuccess = () => {\n    refresh();\n    setAddSignerOpen(false);\n    onSignerAdded?.();\n  };\n\n  const handleRevoke = async (signerId: string) => {\n    try {\n      await revokeSigner(signerId);\n      onRevoke?.(signerId);\n    } catch {\n      // error handled by hook/UI\n    }\n  };\n\n  if (children) {\n    return (\n      <>\n        {children({\n          signers,\n          isLoading,\n          error,\n          refresh,\n          openAddSigner: () => setAddSignerOpen(true),\n        })}\n        <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n          <DialogContent>\n            <DialogHeader>\n              <DialogTitle>Add signer</DialogTitle>\n            </DialogHeader>\n            <div className=\"space-y-4\">\n              <CreateEmailSignerForm\n                walletId={walletId}\n                onCreated={handleAddSuccess}\n              />\n              <CreatePhoneSignerForm\n                walletId={walletId}\n                onCreated={handleAddSuccess}\n              />\n              <AddPasskeyButton\n                walletId={walletId}\n                onRegistered={handleAddSuccess}\n              />\n            </div>\n          </DialogContent>\n        </Dialog>\n      </>\n    );\n  }\n\n  if (!walletId) {\n    return (\n      <div className={cn(className, classNames?.root)} data-cilantro-signer-list>\n        <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Select a wallet first.</p>\n      </div>\n    );\n  }\n\n  return (\n    <div className={cn(className, classNames?.root)} data-cilantro-signer-list aria-busy={isLoading} aria-live=\"polite\">\n      <div className={cn(\"flex items-center justify-between gap-2 mb-2\", classNames?.header)}>\n        <span className=\"text-sm font-medium\">Signers</span>\n        <Button\n          type=\"button\"\n          size=\"touch\"\n          variant=\"outline\"\n          className={classNames?.addButton}\n          onClick={() => setAddSignerOpen(true)}\n          disabled={isLoading}\n          aria-label=\"Add signer\"\n        >\n          Add signer\n        </Button>\n      </div>\n      {isLoading && useSkeleton ? (\n        <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n          {[1, 2, 3].map((i) => (\n            <Skeleton key={i} className={cn(\"h-5 w-full rounded-md\", classNames?.skeleton)} />\n          ))}\n        </div>\n      ) : isLoading ? (\n        <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n      ) : error ? (\n        <div className={cn(\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2\", classNames?.message)} role=\"alert\">\n          <p className=\"text-sm text-destructive\">{error}</p>\n          <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-2\" onClick={() => refresh()}>\n            Retry\n          </Button>\n        </div>\n      ) : signers.length === 0 ? (\n        <div className={cn(\"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\", classNames?.message)}>\n          <p className=\"font-medium text-foreground\">No signers</p>\n          <p className=\"mt-1\">Add a signer to authorize transactions for this wallet.</p>\n          <Button\n            type=\"button\"\n            size=\"touch\"\n            variant=\"outline\"\n            className={cn(\"mt-3\", classNames?.addButton)}\n            onClick={() => setAddSignerOpen(true)}\n            aria-label=\"Add signer\"\n          >\n            Add signer\n          </Button>\n        </div>\n      ) : (\n        <ul className={cn(\"space-y-1\", classNames?.list)} role=\"list\">\n          {signers.map((signer) => (\n            <li key={signer.id} className={cn(\"flex items-center justify-between gap-2 text-sm\", classNames?.item)}>\n              <span>\n                {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n              </span>\n              {onRevoke && (\n                <Button\n                  type=\"button\"\n                  variant=\"ghost\"\n                  size=\"sm\"\n                  className=\"text-destructive\"\n                  onClick={() => handleRevoke(signer.id)}\n                  aria-label=\"Revoke signer\"\n                >\n                  Revoke\n                </Button>\n              )}\n            </li>\n          ))}\n        </ul>\n      )}\n      <Dialog open={addSignerOpen} onOpenChange={setAddSignerOpen}>\n        <DialogContent>\n          <DialogHeader>\n            <DialogTitle>Add signer</DialogTitle>\n          </DialogHeader>\n          <div className=\"space-y-4\">\n            <CreateEmailSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n            <CreatePhoneSignerForm walletId={walletId} onCreated={handleAddSuccess} />\n            <AddPasskeyButton walletId={walletId} onRegistered={handleAddSuccess} />\n          </div>\n        </DialogContent>\n      </Dialog>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { SignerData } from \"../../core/signer-helpers\";\nimport { getSignerDisplayName, getSignerTypeLabel, getSignerUniqueId } from \"../../core/signer-helpers\";\nimport { Button } from \"../../ui/button\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\nimport type { SignerType } from \"../../core/signer-signing\";\n\nexport interface SignerSelectorClassNames {\n  root?: string;\n  list?: string;\n  item?: string;\n  message?: string;\n  skeleton?: string;\n  loading?: string;\n}\n\n/** Guide API: walletId + value + onChange(signerId, signerType) */\nexport interface SignerSelectorProps {\n  walletId: string;\n  value?: string;\n  onChange: (signerId: string, signerType: SignerType) => void;\n  className?: string;\n  classNames?: SignerSelectorClassNames;\n  useSkeleton?: boolean;\n  /** Legacy: when provided with availableSigners/selectedSigner/onSignerSelect, use legacy API */\n  selectedWalletId?: string;\n  availableSigners?: SignerData[];\n  selectedSigner?: SignerData | null;\n  isLoadingSigners?: boolean;\n  onSignerSelect?: (signer: SignerData) => void;\n  renderList?: (props: {\n    signers: SignerData[];\n    selectedSigner: SignerData | null;\n    onSelect: (signer: SignerData) => void;\n    isLoading: boolean;\n    getSignerDisplayName: (s: SignerData) => string;\n    getSignerTypeLabel: (type: string) => string;\n    getSignerUniqueId: (s: SignerData) => string;\n  }) => React.ReactNode;\n  children?: (props: {\n    signers: SignerData[];\n    selectedSigner: SignerData | null;\n    onSignerSelect: (signer: SignerData) => void;\n    isLoading: boolean;\n  }) => React.ReactNode;\n}\n\nexport function SignerSelector({\n  walletId,\n  value,\n  onChange,\n  className,\n  classNames,\n  useSkeleton = true,\n  selectedWalletId,\n  availableSigners: availableSignersProp,\n  selectedSigner: selectedSignerProp,\n  isLoadingSigners: isLoadingSignersProp,\n  onSignerSelect,\n  renderList,\n  children,\n}: SignerSelectorProps) {\n  const { signers, isLoading } = useSigners(walletId);\n  const availableSigners = availableSignersProp ?? signers;\n  const isLoadingSigners = isLoadingSignersProp ?? isLoading;\n  const resolvedSelected =\n    value != null\n      ? availableSigners.find((s) => s.id === value || s.signerId === value)\n      : null;\n  const selectedSigner = selectedSignerProp ?? resolvedSelected ?? null;\n\n  const handleSelect = (signer: SignerData) => {\n    const signerType = (signer.type || signer.signerType || \"email\") as SignerType;\n    onChange(signer.id, signerType);\n    onSignerSelect?.(signer);\n  };\n\n  if (!walletId && !selectedWalletId) return null;\n\n  if (children) {\n    return (\n      <>\n        {children({\n          signers: availableSigners,\n          selectedSigner,\n          onSignerSelect: handleSelect,\n          isLoading: isLoadingSigners,\n        })}\n      </>\n    );\n  }\n\n  if (renderList) {\n    return (\n      <div className={cn(className, classNames?.root)} data-cilantro-signer-selector>\n        {renderList({\n          signers: availableSigners,\n          selectedSigner: selectedSigner ?? null,\n          onSelect: handleSelect,\n          isLoading: isLoadingSigners,\n          getSignerDisplayName,\n          getSignerTypeLabel,\n          getSignerUniqueId,\n        })}\n      </div>\n    );\n  }\n\n  const loadingContent =\n    isLoadingSigners && useSkeleton ? (\n      <div className={cn(\"space-y-1\", classNames?.loading)} aria-busy=\"true\" aria-live=\"polite\">\n        {[1, 2, 3].map((i) => (\n          <Skeleton key={i} className={cn(\"h-8 w-full rounded-md\", classNames?.skeleton)} />\n        ))}\n      </div>\n    ) : isLoadingSigners ? (\n      <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>Loading signers...</p>\n    ) : null;\n\n  return (\n    <div\n      className={cn(className, classNames?.root)}\n      data-cilantro-signer-selector\n      role=\"listbox\"\n      aria-label=\"Select signer\"\n      aria-busy={isLoadingSigners}\n      aria-live=\"polite\"\n    >\n      {loadingContent ??\n        (availableSigners.length === 0 ? (\n          <p className={cn(\"text-sm text-muted-foreground\", classNames?.message)}>No signers for this wallet.</p>\n        ) : (\n          <ul className={cn(\"space-y-1\", classNames?.list)}>\n            {availableSigners.map((signer) => (\n              <li key={signer.id}>\n                <Button\n                  type=\"button\"\n                  variant={selectedSigner?.id === signer.id ? \"secondary\" : \"ghost\"}\n                  size=\"sm\"\n                  className={cn(\"w-full justify-start\", classNames?.item)}\n                  onClick={() => handleSelect(signer)}\n                  aria-pressed={selectedSigner?.id === signer.id}\n                >\n                  {getSignerDisplayName(signer)} ({getSignerTypeLabel(signer.type || signer.signerType || \"\")})\n                </Button>\n              </li>\n            ))}\n          </ul>\n        ))}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useExternalWallet } from \"../../hooks/useExternalWallet\";\nimport type { SolanaWallet } from \"../../hooks/useExternalWallet\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ConnectWalletButtonProps {\n  onConnect?: (publicKey: string, wallet: SolanaWallet) => void;\n  onDisconnect?: () => void;\n  className?: string;\n  children?: ReactNode;\n}\n\nexport function ConnectWalletButton({\n  onConnect,\n  onDisconnect,\n  className,\n  children,\n}: ConnectWalletButtonProps) {\n  const { wallets, connectedWallet, connect, disconnect } = useExternalWallet();\n  const [loading, setLoading] = useState(false);\n\n  const handleConnect = async (wallet: SolanaWallet) => {\n    setLoading(true);\n    try {\n      const publicKey = await connect(wallet);\n      onConnect?.(publicKey, wallet);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handleDisconnect = async () => {\n    setLoading(true);\n    try {\n      await disconnect();\n      onDisconnect?.();\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  if (connectedWallet) {\n    return (\n      <Button\n        type=\"button\"\n        variant=\"outline\"\n        className={cn(className)}\n        onClick={handleDisconnect}\n        disabled={loading}\n        data-cilantro-connect-wallet\n      >\n        {loading ? \"Disconnecting...\" : \"Disconnect\"}\n      </Button>\n    );\n  }\n\n  if (wallets.length === 0) {\n    return (\n      <Button type=\"button\" variant=\"outline\" className={cn(className)} disabled data-cilantro-connect-wallet>\n        No wallet detected\n      </Button>\n    );\n  }\n\n  return (\n    <Button\n      type=\"button\"\n      variant=\"outline\"\n      className={cn(className)}\n      onClick={() => handleConnect(wallets[0])}\n      disabled={loading}\n      data-cilantro-connect-wallet\n    >\n      {loading ? \"Connecting...\" : (children ?? \"Connect Wallet\")}\n    </Button>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\nimport type { WalletControllerCreateResult } from \"cilantro-sdk/wallet\";\n\nexport interface CreateWalletFormProps {\n  userId?: string;\n  onCreated?: (wallet: WalletControllerCreateResult) => void;\n  onError?: (error: Error) => void;\n  className?: string;\n}\n\nexport function CreateWalletForm({\n  userId,\n  onCreated,\n  onError,\n  className,\n}: CreateWalletFormProps) {\n  const { createWallet, isLoading } = useWallet();\n  const [name, setName] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    setError(null);\n    try {\n      const result = await createWallet({ name: name.trim(), userId });\n      setName(\"\");\n      onCreated?.(result);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-create-wallet>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-wallet-name\">Wallet name</Label>\n        <Input\n          id=\"cilantro-wallet-name\"\n          type=\"text\"\n          value={name}\n          onChange={(e) => setName(e.target.value)}\n          placeholder=\"My Wallet\"\n          required\n          disabled={isLoading}\n        />\n      </div>\n      {error && (\n        <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n          {error}\n        </div>\n      )}\n      <Button type=\"submit\" disabled={isLoading || !name.trim()}>\n        {isLoading ? \"Creating...\" : \"Create wallet\"}\n      </Button>\n    </form>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cn } from \"./cn\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <SelectPrimitive.Icon asChild>\n      <span className=\"ml-2 h-4 w-4 shrink-0 opacity-50\">▼</span>\n    </SelectPrimitive.Icon>\n  </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectContent = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n  <SelectPrimitive.Portal>\n    <SelectPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n        position === \"popper\" &&\n          \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n        className\n      )}\n      position={position}\n      {...props}\n    >\n      <SelectPrimitive.Viewport\n        className={cn(\n          \"p-1\",\n          position === \"popper\" &&\n            \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n        )}\n      >\n        {children}\n      </SelectPrimitive.Viewport>\n    </SelectPrimitive.Content>\n  </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectItem = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <SelectPrimitive.ItemIndicator>✓</SelectPrimitive.ItemIndicator>\n    </span>\n    <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n  </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nexport { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectItem };\n","\"use client\";\n\nimport { useWallets } from \"../../providers/WalletProvider\";\nimport type { WalletData } from \"../../providers/WalletProvider\";\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"../../ui/select\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletSelectorClassNames {\n  root?: string;\n  trigger?: string;\n  content?: string;\n  item?: string;\n  skeleton?: string;\n  loading?: string;\n}\n\nexport interface WalletSelectorProps {\n  value?: string;\n  onChange?: (walletId: string) => void;\n  onWalletChange?: (walletId: string, wallet: WalletData | null) => void;\n  className?: string;\n  classNames?: WalletSelectorClassNames;\n  useSkeleton?: boolean;\n  placeholder?: string;\n  renderTrigger?: (props: {\n    selectedWallet: WalletData | null;\n    wallets: WalletData[];\n    isLoading: boolean;\n    open: boolean;\n    setOpen: (open: boolean) => void;\n  }) => React.ReactNode;\n  renderList?: (props: {\n    wallets: WalletData[];\n    selectedWallet: WalletData | null;\n    onSelect: (wallet: WalletData) => void;\n    isLoading: boolean;\n  }) => React.ReactNode;\n  children?: (props: {\n    wallets: WalletData[];\n    selectedWallet: WalletData | null;\n    selectWallet: (walletId: string) => void;\n    isLoading: boolean;\n    refreshWallets: () => Promise<void>;\n  }) => React.ReactNode;\n}\n\nexport function WalletSelector(props: WalletSelectorProps) {\n  const {\n    value,\n    onChange,\n    onWalletChange,\n    className,\n    classNames,\n    useSkeleton = true,\n    placeholder = \"Select a wallet\",\n    renderTrigger,\n    renderList,\n    children,\n  } = props;\n  const { wallets, selectedWallet, selectWallet, isLoading, refreshWallets } = useWallets();\n  const isEmpty = !isLoading && wallets.length === 0;\n  const effectiveValue = value ?? selectedWallet?.id ?? selectedWallet?.walletId ?? \"\";\n  const selected = wallets.find((w) => w.id === effectiveValue || w.walletId === effectiveValue) ?? selectedWallet;\n\n  const handleSelect = (wallet: WalletData) => {\n    const id = wallet.id ?? wallet.walletId;\n    selectWallet(id);\n    onChange?.(id);\n    onWalletChange?.(id, wallet);\n  };\n\n  const handleValueChange = (id: string) => {\n    selectWallet(id);\n    onChange?.(id);\n    onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n  };\n\n  if (children) {\n    return (\n      <>\n        {children({\n          wallets,\n          selectedWallet: selected,\n          selectWallet: (id) => {\n            selectWallet(id);\n            onChange?.(id);\n            onWalletChange?.(id, wallets.find((w) => w.id === id || w.walletId === id) ?? null);\n          },\n          isLoading,\n          refreshWallets,\n        })}\n      </>\n    );\n  }\n\n  if (renderTrigger || renderList) {\n    return (\n      <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n        {renderTrigger?.({ selectedWallet: selected, wallets, isLoading, open: false, setOpen: () => {} })}\n        {renderList?.({ wallets, selectedWallet: selected, onSelect: handleSelect, isLoading })}\n      </div>\n    );\n  }\n\n  if (isLoading && useSkeleton) {\n    return (\n      <div\n        className={cn(className, classNames?.root, classNames?.loading)}\n        data-cilantro-wallet-selector\n        aria-busy=\"true\"\n        aria-live=\"polite\"\n      >\n        <div\n          className={cn(\n            \"flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2\",\n            classNames?.trigger\n          )}\n        >\n          <Skeleton className={cn(\"h-4 flex-1 rounded\", classNames?.skeleton)} />\n        </div>\n      </div>\n    );\n  }\n\n  if (isEmpty) {\n    return (\n      <div\n        className={cn(\n          \"rounded-md border border-input bg-muted/30 px-4 py-3 text-sm text-muted-foreground\",\n          className,\n          classNames?.root\n        )}\n        data-cilantro-wallet-selector\n      >\n        <p className=\"font-medium text-foreground\">No wallets</p>\n        <p className=\"mt-1\">Wallets are created by the platform when you sign in. If you just logged in, try refreshing.</p>\n      </div>\n    );\n  }\n\n  return (\n    <div className={cn(className, classNames?.root)} data-cilantro-wallet-selector>\n      <Select value={effectiveValue || undefined} onValueChange={handleValueChange} disabled={isLoading}>\n        <SelectTrigger className={classNames?.trigger} aria-label=\"Select wallet\">\n          <SelectValue placeholder={isLoading ? \"Loading...\" : placeholder} />\n        </SelectTrigger>\n        <SelectContent className={classNames?.content}>\n          {wallets.map((w) => {\n            const id = w.id ?? w.walletId;\n            return (\n              <SelectItem key={id} value={id} className={classNames?.item}>\n                {w.walletName || id}\n              </SelectItem>\n            );\n          })}\n        </SelectContent>\n      </Select>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletAddressProps {\n  address: string;\n  short?: boolean;\n  copyable?: boolean;\n  className?: string;\n}\n\nfunction truncateAddress(addr: string, chars = 4): string {\n  if (addr.length <= chars * 2 + 3) return addr;\n  return `${addr.slice(0, chars)}...${addr.slice(-chars)}`;\n}\n\nexport function WalletAddress({\n  address,\n  short = false,\n  copyable = false,\n  className,\n}: WalletAddressProps) {\n  const [copied, setCopied] = useState(false);\n  const display = short ? truncateAddress(address) : address;\n\n  const handleCopy = async () => {\n    try {\n      await navigator.clipboard.writeText(address);\n      setCopied(true);\n      setTimeout(() => setCopied(false), 2000);\n    } catch {\n      // ignore\n    }\n  };\n\n  return (\n    <span className={cn(\"inline-flex items-center gap-2\", className)} data-cilantro-wallet-address>\n      <code className=\"text-sm font-mono\">{display}</code>\n      {copyable && (\n        <Button\n          type=\"button\"\n          variant=\"ghost\"\n          size=\"sm\"\n          className=\"h-6 px-2 text-xs\"\n          onClick={handleCopy}\n          aria-label=\"Copy address\"\n        >\n          {copied ? \"Copied\" : \"Copy\"}\n        </Button>\n      )}\n    </span>\n  );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { getAssets } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../../core/types\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletBalanceProps {\n  walletId: string;\n  showTokens?: boolean;\n  className?: string;\n}\n\nexport function WalletBalance({\n  walletId,\n  showTokens = false,\n  className,\n}: WalletBalanceProps) {\n  const { jwt } = useCilantroContext();\n  const [loading, setLoading] = useState(true);\n  const [solBalance, setSolBalance] = useState<string | null>(null);\n  const [tokens, setTokens] = useState<Array<{ symbol?: string; balance?: string; mint?: string }>>([]);\n  const [error, setError] = useState<string | null>(null);\n\n  useEffect(() => {\n    if (!walletId || !jwt) {\n      setSolBalance(null);\n      setTokens([]);\n      setLoading(false);\n      return;\n    }\n    let cancelled = false;\n    setLoading(true);\n    setError(null);\n    (async () => {\n      try {\n        if (jwt) setSdkAuth(jwt);\n        const result = await getAssets(walletId);\n        const data = extractResponseData<{ solBalance?: string; assets?: Array<{ symbol?: string; balance?: string; mint?: string }> }>(result);\n        if (cancelled) return;\n        setSolBalance(data?.solBalance ?? null);\n        if (showTokens && Array.isArray(data?.assets)) {\n          setTokens(data.assets);\n        } else {\n          setTokens([]);\n        }\n      } catch (err) {\n        if (!cancelled) {\n          setError(err instanceof Error ? err.message : String(err));\n          setSolBalance(null);\n          setTokens([]);\n        }\n      } finally {\n        if (!cancelled) setLoading(false);\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n  }, [walletId, jwt, showTokens]);\n\n  if (loading) {\n    return (\n      <div className={cn(className)} data-cilantro-wallet-balance>\n        <Skeleton className=\"h-5 w-24 rounded\" />\n      </div>\n    );\n  }\n\n  if (error) {\n    return (\n      <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-wallet-balance role=\"alert\">\n        {error}\n      </div>\n    );\n  }\n\n  const solDisplay = solBalance != null ? `${Number(solBalance) / 1e9} SOL` : \"—\";\n\n  return (\n    <div className={cn(\"text-sm\", className)} data-cilantro-wallet-balance>\n      <span className=\"font-medium\">{solDisplay}</span>\n      {showTokens && tokens.length > 0 && (\n        <ul className=\"mt-1 space-y-0.5 text-muted-foreground\">\n          {tokens.map((t, i) => (\n            <li key={t.mint ?? i}>\n              {t.symbol ?? t.mint ?? \"Token\"}: {t.balance ?? \"—\"}\n            </li>\n          ))}\n        </ul>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSendTransaction } from \"../../hooks/useSendTransaction\";\nimport type { SubmitTransactionResult } from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport type SignerType = \"email\" | \"phone\" | \"passkey\" | \"external\";\n\nexport interface SendSOLFormProps {\n  walletId: string;\n  signerId?: string;\n  signerType?: SignerType;\n  onSuccess?: (result: SubmitTransactionResult) => void;\n  onError?: (error: Error) => void;\n  className?: string;\n}\n\nexport function SendSOLForm({\n  walletId,\n  signerId,\n  signerType,\n  onSuccess,\n  onError,\n  className,\n}: SendSOLFormProps) {\n  const { sendSOL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n  const [recipientAddress, setRecipientAddress] = useState(\"\");\n  const [amountLamports, setAmountLamports] = useState(\"\");\n  const [submitError, setSubmitError] = useState<string | null>(null);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    setSubmitError(null);\n    const lamports = Number(amountLamports);\n    if (!recipientAddress.trim() || Number.isNaN(lamports) || lamports < 1) {\n      setSubmitError(\"Invalid recipient or amount\");\n      return;\n    }\n    try {\n      const result = await sendSOL({ recipientAddress: recipientAddress.trim(), amountLamports: lamports });\n      setRecipientAddress(\"\");\n      setAmountLamports(\"\");\n      onSuccess?.(result);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setSubmitError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-sol>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-send-sol-recipient\">Recipient address</Label>\n        <Input\n          id=\"cilantro-send-sol-recipient\"\n          type=\"text\"\n          value={recipientAddress}\n          onChange={(e) => setRecipientAddress(e.target.value)}\n          placeholder=\"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU\"\n          required\n          disabled={isPending}\n        />\n      </div>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-send-sol-amount\">Amount (lamports)</Label>\n        <Input\n          id=\"cilantro-send-sol-amount\"\n          type=\"number\"\n          min={1}\n          value={amountLamports}\n          onChange={(e) => setAmountLamports(e.target.value)}\n          placeholder=\"100000000\"\n          required\n          disabled={isPending}\n        />\n      </div>\n      {(error || submitError) && (\n        <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n          {submitError ?? error}\n        </div>\n      )}\n      <Button type=\"submit\" disabled={isPending || !recipientAddress.trim() || !amountLamports}>\n        {isPending ? \"Sending...\" : \"Send SOL\"}\n      </Button>\n    </form>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n  useSendTransaction,\n  type SubmitTransactionResult,\n  type SignerType,\n} from \"../../hooks/useSendTransaction\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Label } from \"../../ui/label\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface SendSPLFormProps {\n  walletId: string;\n  signerId?: string;\n  signerType?: SignerType;\n  mintAddress?: string;\n  onSuccess?: (result: SubmitTransactionResult) => void;\n  onError?: (error: Error) => void;\n  className?: string;\n}\n\nexport function SendSPLForm({\n  walletId,\n  signerId,\n  signerType,\n  mintAddress: initialMint,\n  onSuccess,\n  onError,\n  className,\n}: SendSPLFormProps) {\n  const { sendSPL, isPending, error } = useSendTransaction(walletId, signerId, signerType);\n  const [mintAddress, setMintAddress] = useState(initialMint ?? \"\");\n  const [recipientAddress, setRecipientAddress] = useState(\"\");\n  const [amount, setAmount] = useState(\"\");\n  const [submitError, setSubmitError] = useState<string | null>(null);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    setSubmitError(null);\n    const amt = Number(amount);\n    if (!mintAddress.trim() || !recipientAddress.trim() || Number.isNaN(amt) || amt < 0) {\n      setSubmitError(\"Invalid mint, recipient or amount\");\n      return;\n    }\n    try {\n      const result = await sendSPL({\n        mintAddress: mintAddress.trim(),\n        recipientAddress: recipientAddress.trim(),\n        amount: amt,\n      });\n      setRecipientAddress(\"\");\n      setAmount(\"\");\n      onSuccess?.(result);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      setSubmitError(message);\n      onError?.(err instanceof Error ? err : new Error(message));\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit} className={cn(\"space-y-4\", className)} data-cilantro-send-spl>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-send-spl-mint\">Mint address</Label>\n        <Input\n          id=\"cilantro-send-spl-mint\"\n          type=\"text\"\n          value={mintAddress}\n          onChange={(e) => setMintAddress(e.target.value)}\n          placeholder=\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"\n          required\n          disabled={isPending}\n        />\n      </div>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-send-spl-recipient\">Recipient address</Label>\n        <Input\n          id=\"cilantro-send-spl-recipient\"\n          type=\"text\"\n          value={recipientAddress}\n          onChange={(e) => setRecipientAddress(e.target.value)}\n          placeholder=\"Recipient Solana address\"\n          required\n          disabled={isPending}\n        />\n      </div>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"cilantro-send-spl-amount\">Amount</Label>\n        <Input\n          id=\"cilantro-send-spl-amount\"\n          type=\"number\"\n          min={0}\n          step=\"any\"\n          value={amount}\n          onChange={(e) => setAmount(e.target.value)}\n          placeholder=\"100\"\n          required\n          disabled={isPending}\n        />\n      </div>\n      {(error || submitError) && (\n        <div className=\"rounded-md border border-destructive/50 bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">\n          {submitError ?? error}\n        </div>\n      )}\n      <Button type=\"submit\" disabled={isPending || !mintAddress.trim() || !recipientAddress.trim() || !amount}>\n        {isPending ? \"Sending...\" : \"Send SPL\"}\n      </Button>\n    </form>\n  );\n}\n","\"use client\";\n\nimport { cn } from \"../../ui/cn\";\n\nconst EXPLORER_URL: Record<string, string> = {\n  \"mainnet-beta\": \"https://explorer.solana.com\",\n  devnet: \"https://explorer.solana.com/?cluster=devnet\",\n  testnet: \"https://explorer.solana.com/?cluster=testnet\",\n};\n\nexport interface TransactionStatusProps {\n  signature: string;\n  cluster?: \"mainnet-beta\" | \"devnet\" | \"testnet\";\n  className?: string;\n}\n\nexport function TransactionStatus({\n  signature,\n  cluster = \"mainnet-beta\",\n  className,\n}: TransactionStatusProps) {\n  const base = EXPLORER_URL[cluster] ?? EXPLORER_URL[\"mainnet-beta\"];\n  const href = `${base}/tx/${signature}`;\n\n  return (\n    <div className={cn(\"text-sm\", className)} data-cilantro-transaction-status>\n      <span className=\"text-muted-foreground\">Transaction: </span>\n      <a\n        href={href}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        className=\"font-mono text-primary underline underline-offset-2\"\n      >\n        {signature.slice(0, 8)}...{signature.slice(-8)}\n      </a>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCilantroContext } from \"../../context/CilantroContext\";\nimport { setSdkAuth } from \"../../core/auth\";\nimport { cn } from \"../../ui/cn\";\nimport { TransactionStatus } from \"./TransactionStatus\";\n\nexport interface TransactionHistoryProps {\n  walletId: string;\n  pageSize?: number;\n  className?: string;\n}\n\nexport function TransactionHistory({\n  walletId,\n  pageSize = 10,\n  className,\n}: TransactionHistoryProps) {\n  const { jwt } = useCilantroContext();\n  const [loading, setLoading] = useState(true);\n  const [signatures, setSignatures] = useState<string[]>([]);\n  const [error, setError] = useState<string | null>(null);\n\n  useEffect(() => {\n    if (!walletId || !jwt) {\n      setSignatures([]);\n      setLoading(false);\n      return;\n    }\n    let cancelled = false;\n    setLoading(true);\n    setError(null);\n    (async () => {\n      try {\n        if (jwt) setSdkAuth(jwt);\n        // Placeholder: SDK may not expose transaction history list; show empty or use API when available\n        if (!cancelled) setSignatures([]);\n      } catch (err) {\n        if (!cancelled) {\n          setError(err instanceof Error ? err.message : String(err));\n          setSignatures([]);\n        }\n      } finally {\n        if (!cancelled) setLoading(false);\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n  }, [walletId, jwt, pageSize]);\n\n  if (loading) {\n    return (\n      <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n        Loading...\n      </div>\n    );\n  }\n\n  if (error) {\n    return (\n      <div className={cn(\"text-sm text-destructive\", className)} data-cilantro-transaction-history role=\"alert\">\n        {error}\n      </div>\n    );\n  }\n\n  if (signatures.length === 0) {\n    return (\n      <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-transaction-history>\n        No recent transactions.\n      </div>\n    );\n  }\n\n  return (\n    <ul className={cn(\"space-y-2\", className)} data-cilantro-transaction-history role=\"list\">\n      {signatures.map((sig) => (\n        <li key={sig}>\n          <TransactionStatus signature={sig} />\n        </li>\n      ))}\n    </ul>\n  );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { useAuth } from \"../../hooks/useAuth\";\nimport { useWallet } from \"../../hooks/useWallet\";\nimport { useSigners } from \"../../hooks/useSigners\";\nimport type { WalletData } from \"../../context/CilantroContext\";\nimport type { SignerInfo } from \"cilantro-sdk/helpers\";\nimport { LoginForm } from \"../auth/LoginForm\";\nimport { CreateWalletForm } from \"../wallet/CreateWalletForm\";\nimport { CreateEmailSignerForm } from \"../signers/CreateEmailSignerForm\";\nimport { AddPasskeyButton } from \"../signers/AddPasskeyButton\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface WalletInfo extends WalletData {}\n\nexport interface CilantroConnectProps {\n  onConnect?: (wallet: WalletInfo, signers: SignerInfo[]) => void;\n  onDisconnect?: () => void;\n  className?: string;\n}\n\nexport function CilantroConnect({\n  onConnect,\n  onDisconnect,\n  className,\n}: CilantroConnectProps) {\n  const { isAuthenticated } = useAuth();\n  const { wallet, wallets, createWallet, selectWallet, isLoading: walletLoading } = useWallet();\n  const [walletId, setWalletId] = useState<string | null>(null);\n  const [step, setStep] = useState<\"auth\" | \"wallet\" | \"signer\" | \"done\">(\"auth\");\n\n  if (!isAuthenticated) {\n    return (\n      <div className={cn(className)} data-cilantro-connect>\n        <LoginForm onSuccess={() => setStep(\"wallet\")} />\n      </div>\n    );\n  }\n\n  if (step === \"wallet\" && wallets.length === 0 && !walletLoading) {\n    return (\n      <div className={cn(className)} data-cilantro-connect>\n        <CreateWalletForm\n          onCreated={(res) => {\n            const id = (res as { data?: { id?: string } })?.data?.id;\n            if (id) {\n              setWalletId(id);\n              selectWallet(id);\n              setStep(\"signer\");\n            }\n          }}\n        />\n      </div>\n    );\n  }\n\n  if (step === \"signer\" && walletId) {\n    const currentWallet = wallet ?? wallets.find((w) => (w.id ?? w.walletId) === walletId);\n    return (\n      <div className={cn(\"space-y-4\", className)} data-cilantro-connect>\n        <p className=\"text-sm text-muted-foreground\">Add a signer to your wallet</p>\n        <CreateEmailSignerForm\n          walletId={walletId}\n          onCreated={(signer) => {\n            const signers = [signer];\n            if (currentWallet) {\n              onConnect?.(currentWallet as WalletInfo, signers);\n            }\n            setStep(\"done\");\n          }}\n        />\n        <AddPasskeyButton\n          walletId={walletId}\n          onRegistered={() => {\n            if (currentWallet) {\n              onConnect?.(currentWallet as WalletInfo, []);\n            }\n            setStep(\"done\");\n          }}\n        />\n      </div>\n    );\n  }\n\n  if (wallet && step === \"done\") {\n    return (\n      <div className={cn(className)} data-cilantro-connect>\n        <p className=\"text-sm text-muted-foreground\">Connected</p>\n        {onDisconnect && (\n          <button\n            type=\"button\"\n            className=\"text-sm text-primary underline\"\n            onClick={() => {\n              onDisconnect();\n              setStep(\"wallet\");\n              setWalletId(null);\n            }}\n          >\n            Disconnect\n          </button>\n        )}\n      </div>\n    );\n  }\n\n  if (walletLoading) {\n    return (\n      <div className={cn(\"text-sm text-muted-foreground\", className)} data-cilantro-connect>\n        Loading...\n      </div>\n    );\n  }\n\n  return (\n    <div className={cn(className)} data-cilantro-connect>\n      <p className=\"text-sm text-muted-foreground\">Set up your wallet</p>\n      <CreateWalletForm\n        onCreated={(res) => {\n          const id = (res as { data?: { id?: string } })?.data?.id;\n          if (id) {\n            setWalletId(id);\n            selectWallet(id);\n            setStep(\"signer\");\n          }\n        }}\n      />\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface LoadingOverlayProps {\n  isLoading: boolean;\n  message?: string;\n  children: ReactNode;\n  className?: string;\n}\n\nexport function LoadingOverlay({\n  isLoading,\n  message,\n  children,\n  className,\n}: LoadingOverlayProps) {\n  if (!isLoading) return <>{children}</>;\n\n  return (\n    <div className={cn(\"relative\", className)} data-cilantro-loading-overlay>\n      <div\n        className=\"absolute inset-0 z-10 flex items-center justify-center bg-background/80\"\n        aria-busy=\"true\"\n        aria-live=\"polite\"\n      >\n        <div className=\"flex flex-col items-center gap-2\">\n          <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n          {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n        </div>\n      </div>\n      {children}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../ui/cn\";\n\nexport interface ErrorBoundaryProps {\n  fallback?: ReactNode;\n  onRetry?: () => void;\n  children: ReactNode;\n}\n\ninterface State {\n  hasError: boolean;\n  error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, State> {\n  state: State = { hasError: false, error: null };\n\n  static getDerivedStateFromError(error: Error): State {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n    console.error(\"[Cilantro ErrorBoundary]\", error, errorInfo);\n  }\n\n  handleRetry = () => {\n    this.setState({ hasError: false, error: null });\n    this.props.onRetry?.();\n  };\n\n  render() {\n    if (this.state.hasError && this.state.error) {\n      if (this.props.fallback) {\n        return this.props.fallback;\n      }\n      return (\n        <div\n          className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\"\n          data-cilantro-error-boundary\n          role=\"alert\"\n        >\n          <p className=\"font-medium\">Something went wrong</p>\n          <p className=\"mt-1 text-muted-foreground\">{this.state.error.message}</p>\n          {this.props.onRetry && (\n            <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-3\" onClick={this.handleRetry}>\n              Retry\n            </Button>\n          )}\n        </div>\n      );\n    }\n    return this.props.children;\n  }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\nconst DEFAULT_THEME_CSS = `\n:root,[data-theme=\"light\"]{--background:0 0% 100%;--foreground:222.2 84% 4.9%;--primary:222.2 47.4% 11.2%;--primary-foreground:210 40% 98%;--muted:210 40% 96.1%;--muted-foreground:215.4 16.3% 46.9%;--border:214.3 31.8% 91.4%;--input:214.3 31.8% 91.4%;--ring:222.2 84% 4.9%;--destructive:0 84.2% 60.2%;--destructive-foreground:210 40% 98%;--accent:210 40% 96.1%;--accent-foreground:222.2 47.4% 11.2%;--popover:0 0% 100%;--popover-foreground:222.2 84% 4.9%;--card:0 0% 100%;--card-foreground:222.2 84% 4.9%}\n[data-theme=\"dark\"]{--background:222.2 84% 4.9%;--foreground:210 40% 98%;--primary:210 40% 98%;--primary-foreground:222.2 47.4% 11.2%;--muted:217.2 32.6% 17.5%;--muted-foreground:215 20.2% 65.1%;--border:217.2 32.6% 17.5%;--input:217.2 32.6% 17.5%;--ring:212.7 26.8% 83.9%;--destructive:0 62.8% 30.6%;--destructive-foreground:210 40% 98%;--accent:217.2 32.6% 17.5%;--accent-foreground:210 40% 98%;--popover:222.2 84% 4.9%;--popover-foreground:210 40% 98%;--card:222.2 84% 4.9%;--card-foreground:210 40% 98%}\n`;\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport interface ThemeProviderProps {\n  /** Current theme: \"light\", \"dark\", or \"system\" (follows prefers-color-scheme). */\n  theme?: Theme;\n  /** Default theme when theme is \"system\" or for initial render. */\n  defaultTheme?: ResolvedTheme;\n  /** Optional localStorage key for persisting theme when using \"system\". */\n  storageKey?: string;\n  /** Optional class for the wrapper div. */\n  className?: string;\n  children: React.ReactNode;\n  /** When true, inject the default theme CSS variables (light/dark). Your app must still use Tailwind. */\n  injectStyles?: boolean;\n}\n\nfunction getSystemTheme(): ResolvedTheme {\n  if (typeof window === \"undefined\") return \"dark\";\n  return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\nexport function ThemeProvider({\n  theme = \"system\",\n  defaultTheme = \"dark\",\n  storageKey,\n  className,\n  children,\n  injectStyles = true,\n}: ThemeProviderProps) {\n  const [resolved, setResolved] = React.useState<ResolvedTheme>(() => {\n    if (theme === \"light\") return \"light\";\n    if (theme === \"dark\") return \"dark\";\n    if (typeof window !== \"undefined\" && storageKey) {\n      const stored = window.localStorage.getItem(storageKey);\n      if (stored === \"light\" || stored === \"dark\") return stored;\n    }\n    return defaultTheme;\n  });\n\n  React.useEffect(() => {\n    if (theme === \"light\") {\n      setResolved(\"light\");\n      return;\n    }\n    if (theme === \"dark\") {\n      setResolved(\"dark\");\n      return;\n    }\n    const system = getSystemTheme();\n    setResolved(system);\n    const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    const listener = () => {\n      const next = mql.matches ? \"dark\" : \"light\";\n      setResolved(next);\n      if (storageKey) window.localStorage.setItem(storageKey, next);\n    };\n    mql.addEventListener(\"change\", listener);\n    return () => mql.removeEventListener(\"change\", listener);\n  }, [theme, storageKey]);\n\n  return (\n    <>\n      {injectStyles && (\n        <style\n          dangerouslySetInnerHTML={{ __html: DEFAULT_THEME_CSS }}\n          data-cilantro-theme-styles\n        />\n      )}\n      <div\n        className={cn(className)}\n        data-theme={resolved}\n        data-cilantro-theme-provider\n      >\n        {children}\n      </div>\n    </>\n  );\n}\n","/**\n * Adapter to use @solana/web3.js Connection for sign-and-send (advanced usage).\n * Pass the result as the connection prop so you don't need type assertions.\n */\n\nimport type { Connection } from \"@solana/web3.js\";\n\n/** Connection shape expected for sign-and-send (advanced usage). */\nexport interface SignAndSendConnectionAdapter {\n  sendRawTransaction: (buf: Buffer) => Promise<string>;\n  getLatestBlockhash: () => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n  confirmTransaction: (opts: {\n    signature: string;\n    blockhash: string;\n    lastValidBlockHeight: number;\n  }) => Promise<void>;\n}\n\n/**\n * Wrap a @solana/web3.js Connection for sign-and-send (advanced usage).\n * Use when you have a Solana Connection and need the adapter shape without type assertions.\n *\n * @example\n * import { Connection } from '@solana/web3.js';\n * import { adaptSolanaConnection } from 'cilantro-react';\n *\n * const connection = new Connection(rpcUrl);\n * const adapter = adaptSolanaConnection(connection);\n */\nexport function adaptSolanaConnection(connection: Connection): SignAndSendConnectionAdapter {\n  return {\n    sendRawTransaction: (buf: Buffer) =>\n      connection.sendRawTransaction(buf),\n\n    getLatestBlockhash: () =>\n      connection.getLatestBlockhash().then(({ blockhash, lastValidBlockHeight }) => ({\n        blockhash,\n        lastValidBlockHeight,\n      })),\n\n    confirmTransaction: async (opts: {\n      signature: string;\n      blockhash: string;\n      lastValidBlockHeight: number;\n    }) => {\n      await connection.confirmTransaction({\n        signature: opts.signature,\n        blockhash: opts.blockhash,\n        lastValidBlockHeight: opts.lastValidBlockHeight,\n      });\n    },\n  };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport {\n  deriveSignerKeypair,\n  getEmailSignerKeypair,\n  getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\n\nexport async function getSignerPublicKey(\n  walletId: string,\n  signer: SignerData,\n  signerType: string,\n  signerId: string\n): Promise<PublicKey> {\n  const existingPubkey = signer.signerPubkey || signer.publicKey;\n  if (existingPubkey && typeof existingPubkey === \"string\" && existingPubkey.trim()) {\n    return new PublicKey(existingPubkey.trim());\n  }\n  const storageOptions = getStorageOptions();\n  if (signerType === SIGNER_TYPES.EMAIL) {\n    const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n    return new PublicKey(keypair.publicKey);\n  }\n  if (signerType === SIGNER_TYPES.PHONE) {\n    const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n    return new PublicKey(keypair.publicKey);\n  }\n  if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n    const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n    return new PublicKey(keypair.publicKey);\n  }\n  throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","export const CACHE_CONFIG = { enabled: true, ttl: 300000 } as const;\n\nexport const SIGNER_TYPES = {\n  EMAIL: \"email\",\n  PHONE: \"phone\",\n  PASSKEY: \"passkey\",\n  EXTERNAL: \"external\",\n  API_KEY: \"apiKey\",\n} as const;\n\nexport type SignerType = (typeof SIGNER_TYPES)[keyof typeof SIGNER_TYPES];\n\nexport function isValidSignerType(type: string): type is SignerType {\n  return Object.values(SIGNER_TYPES).includes(type as SignerType);\n}\n","import { getStorageAdapter, type DeviceKeyStorage } from \"../storage-adapter\";\nimport { CACHE_CONFIG } from \"./constants\";\n\nexport function getSignerStorage(): DeviceKeyStorage {\n  return getStorageAdapter();\n}\n\nexport function getStorageOptions() {\n  return {\n    deviceKeyManager: getSignerStorage(),\n    cache: CACHE_CONFIG,\n  };\n}\n","import {\n  deriveSignerKeypair,\n  signWithSigner,\n  signWithEmailSigner,\n  signWithPhoneSigner,\n  getEmailSignerKeypair,\n  getPhoneSignerKeypair,\n} from \"cilantro-sdk/helpers\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signWithPasskey } from \"../signer-creation\";\nimport { handleDeviceKeyError } from \"./errors\";\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES } from \"./constants\";\n\n/** Result shape aligned with SDK SignMessageDataDto (signature base64, message) plus optional helper fields. */\nexport interface SignMessageResult {\n  /** Signature in base64 (SDK SignMessageDataDto shape). */\n  signature: string;\n  /** Original message that was signed (SDK SignMessageDataDto shape). */\n  message: string;\n  publicKey?: string;\n  signerType: string;\n  signer?: string;\n}\n\nexport async function signMessageWithSigner(\n  walletId: string,\n  signer: SignerData,\n  messageText: string\n): Promise<SignMessageResult> {\n  const { signerType, signerId } = extractSignerInfo(signer);\n  const message = new TextEncoder().encode(messageText);\n\n  if (signerType === SIGNER_TYPES.EMAIL) {\n    validateSignerActive(signer, signerType);\n    const storageOptions = getStorageOptions();\n    try {\n      const signatureBytes = await signWithEmailSigner(walletId, signerId, message, storageOptions);\n      const keypair = await getEmailSignerKeypair(walletId, signerId, storageOptions);\n      return {\n        signature: Buffer.from(signatureBytes).toString(\"base64\"),\n        message: messageText,\n        publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n        signerType: SIGNER_TYPES.EMAIL,\n      };\n    } catch (error: unknown) {\n      throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n    }\n  }\n\n  if (signerType === SIGNER_TYPES.PHONE) {\n    validateSignerActive(signer, signerType);\n    const storageOptions = getStorageOptions();\n    try {\n      const signatureBytes = await signWithPhoneSigner(walletId, signerId, message, storageOptions);\n      const keypair = await getPhoneSignerKeypair(walletId, signerId, storageOptions);\n      return {\n        signature: Buffer.from(signatureBytes).toString(\"base64\"),\n        message: messageText,\n        publicKey: Buffer.from(keypair.publicKey).toString(\"hex\"),\n        signerType: SIGNER_TYPES.PHONE,\n      };\n    } catch (error: unknown) {\n      throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n    }\n  }\n\n  if (signerType === SIGNER_TYPES.PASSKEY) {\n    const signResult = await signWithPasskey(walletId, signerId, messageText, { useBrowserAutofill: false });\n    const signatureBase64 = Buffer.from(signResult.signature, \"hex\").toString(\"base64\");\n    return {\n      signature: signatureBase64,\n      message: messageText,\n      signerType: SIGNER_TYPES.PASSKEY,\n      signer: signResult.signer,\n    };\n  }\n\n  if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n    validateSignerActive(signer, signerType);\n    const storageOptions = getStorageOptions();\n    const signatureBytes = await signWithSigner(walletId, signerId, signerType, message, storageOptions);\n    const keypair = await deriveSignerKeypair(walletId, signerId, signerType, storageOptions);\n    return {\n      signature: Buffer.from(signatureBytes).toString(\"base64\"),\n      message: messageText,\n      publicKey: Buffer.from(keypair.publicKey).toString(\"base64\"),\n      signerType,\n    };\n  }\n\n  throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import {\n  DeviceKeyNotFoundError,\n  DeviceKeyMismatchError,\n  SignerInactiveError,\n  SignerNotFoundError,\n} from \"cilantro-sdk/helpers\";\n\nexport function handleDeviceKeyError(error: unknown, signerType: string): never {\n  if (error instanceof DeviceKeyNotFoundError) {\n    throw new Error(\n      `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n    );\n  }\n  if (error instanceof DeviceKeyMismatchError) {\n    throw new Error(\n      \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n    );\n  }\n  if (error instanceof SignerNotFoundError) {\n    throw new Error(`Signer not found. Please ensure the ${signerType} signer exists.`);\n  }\n  if (error instanceof SignerInactiveError) {\n    throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n  }\n  if (error instanceof Error) {\n    if (error.message.includes(\"Device key not found\") || error.name === \"DeviceKeyNotFoundError\") {\n      throw new Error(\n        `Device key not found. Please create the ${signerType} signer first using the Signers page. The device key is generated when you create the signer.`\n      );\n    }\n    if (error.message.includes(\"Device key mismatch\") || error.name === \"DeviceKeyMismatchError\") {\n      throw new Error(\n        \"Device key mismatch. The stored device key doesn't match the server. You may need to create a new signer or update the device identity.\"\n      );\n    }\n  }\n  throw error;\n}\n\nexport function createMissingSignerInfoError(signer: unknown): Error {\n  return new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n}\n\nexport function createUnsupportedSignerTypeError(signerType: string): Error {\n  return new Error(`Unsupported signer type: ${signerType}`);\n}\n","import type { SignerData } from \"../signer-helpers\";\nimport { SIGNER_TYPES, isValidSignerType, type SignerType } from \"./constants\";\n\nexport function extractSignerInfo(signer: SignerData): { signerType: SignerType; signerId: string } {\n  const signerType = (signer.type || signer.signerType) as SignerType;\n  const signerId = signer.id || signer.signerId;\n  if (!signerType || !signerId) {\n    throw new Error(`Signer type or ID is missing. Signer data: ${JSON.stringify(signer)}`);\n  }\n  if (!isValidSignerType(signerType)) {\n    throw new Error(`Unsupported signer type: ${signerType}`);\n  }\n  return { signerType, signerId };\n}\n\nexport function requiresDeviceKeyStorage(signerType: SignerType): boolean {\n  return (\n    signerType === SIGNER_TYPES.EMAIL ||\n    signerType === SIGNER_TYPES.PHONE ||\n    signerType === SIGNER_TYPES.EXTERNAL ||\n    signerType === SIGNER_TYPES.API_KEY\n  );\n}\n\nexport function isAuthenticationSigner(signerType: SignerType): boolean {\n  return (\n    signerType === SIGNER_TYPES.EMAIL ||\n    signerType === SIGNER_TYPES.PHONE ||\n    signerType === SIGNER_TYPES.PASSKEY\n  );\n}\n\nexport function requiresActiveStatus(signerType: SignerType): boolean {\n  return (\n    signerType === SIGNER_TYPES.EMAIL ||\n    signerType === SIGNER_TYPES.PHONE ||\n    signerType === SIGNER_TYPES.EXTERNAL ||\n    signerType === SIGNER_TYPES.API_KEY\n  );\n}\n\nexport function validateSignerActive(signer: SignerData, signerType: SignerType): void {\n  if (requiresActiveStatus(signerType) && !signer.isActive) {\n    throw new Error(`${signerType} signer is not active. Please activate the signer first.`);\n  }\n}\n","import { Transaction } from \"@solana/web3.js\";\nimport {\n  signWithSigner,\n  signWithEmailSigner,\n  signWithPhoneSigner,\n  signTransactionWithEmailSigner,\n  signTransactionWithPhoneSigner,\n} from \"cilantro-sdk/helpers\";\nimport { submitTransaction } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerSubmitTransactionResult } from \"cilantro-sdk/wallet\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { signAndSendPasskeyTransaction } from \"../signer-creation\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { extractResponseData } from \"../types\";\nimport { handleDeviceKeyError } from \"./errors\";\n\n/** Connection-like interface for sign-and-send (passkey). Consumer provides from their Solana config. */\nexport interface SignAndSendConnection {\n  getLatestBlockhash: (commitment?: string) => Promise<{ blockhash: string; lastValidBlockHeight: number }>;\n  confirmTransaction: (opts: { signature: string; blockhash: string; lastValidBlockHeight: number }) => Promise<void>;\n}\nimport { extractSignerInfo, validateSignerActive } from \"./signer-types\";\nimport { getStorageOptions } from \"./storage\";\nimport { SIGNER_TYPES, type SignerType } from \"./constants\";\nimport { getSignerPublicKey } from \"./core\";\nimport { validateSignerInTransaction } from \"./validation\";\n\nfunction prepareTransactionForSigning(\n  transaction: Transaction,\n  signerPublicKey: import(\"@solana/web3.js\").PublicKey\n): void {\n  const signerPubkeyStr = signerPublicKey.toString();\n  const hasSignerInSignatures = transaction.signatures.some(\n    (sig) => sig.publicKey.toString() === signerPubkeyStr\n  );\n  if (!hasSignerInSignatures) {\n    transaction.signatures.push({\n      publicKey: signerPublicKey,\n      signature: null,\n    });\n  }\n  if (transaction.feePayer) {\n    const feePayerStr = transaction.feePayer.toString();\n    const hasFeePayerInSignatures = transaction.signatures.some(\n      (sig) => sig.publicKey.toString() === feePayerStr\n    );\n    if (!hasFeePayerInSignatures) {\n      transaction.signatures.push({ publicKey: transaction.feePayer, signature: null });\n    }\n  }\n}\n\nasync function signTransactionWithEmailOrPhone(\n  walletId: string,\n  signerId: string,\n  signerType: SignerType,\n  unsignedTransactionBase64: string\n): Promise<string> {\n  const storageOptions = getStorageOptions();\n  if (signerType === SIGNER_TYPES.EMAIL) {\n    return await signTransactionWithEmailSigner(\n      walletId,\n      signerId,\n      unsignedTransactionBase64,\n      storageOptions\n    );\n  }\n  return await signTransactionWithPhoneSigner(\n    walletId,\n    signerId,\n    unsignedTransactionBase64,\n    storageOptions\n  );\n}\n\n/** SDK submit transaction data (SubmitTransactionResponseDto.data). */\nexport type SubmitTransactionDataDto = WalletControllerSubmitTransactionResult[\"data\"];\n\nasync function submitSignedTransaction(\n  walletId: string,\n  signedTransactionBase64: string\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n  const submitResult: WalletControllerSubmitTransactionResult = await submitTransaction(walletId, {\n    signedTransaction: signedTransactionBase64,\n  });\n  const resultData = extractResponseData<SubmitTransactionDataDto>(submitResult);\n  if (!resultData?.signature) throw new Error(\"Server did not return a transaction signature\");\n  const status = resultData.status ?? \"pending\";\n  return {\n    signature: resultData.signature,\n    status,\n    confirmationStatus: status,\n  };\n}\n\nasync function handlePasskeyTransaction(\n  walletId: string,\n  signerId: string,\n  transaction: Transaction,\n  connection: SignAndSendConnection | null | undefined\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n  if (!connection) {\n    throw new Error(\n      \"Connection is required for passkey sign-and-send. Pass the connection from your Solana config.\"\n    );\n  }\n  const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash(\"confirmed\");\n  const result = await signAndSendPasskeyTransaction(walletId, signerId, transaction, {\n    useBrowserAutofill: false,\n  });\n  let status = \"confirmed\";\n  try {\n    await connection.confirmTransaction({\n      signature: result.signature,\n      blockhash,\n      lastValidBlockHeight,\n    });\n  } catch (error) {\n    const errorMsg = extractErrorMessage(error);\n    if (\n      errorMsg.includes(\"block height exceeded\") ||\n      errorMsg.includes(\"expired\") ||\n      errorMsg.includes(\"timeout\")\n    ) {\n      status = \"pending\";\n    } else {\n      throw new Error(`Transaction confirmation failed: ${errorMsg}. Signature: ${result.signature}`);\n    }\n  }\n  return { signature: result.signature, status, confirmationStatus: status };\n}\n\nasync function handleEmailOrPhoneTransaction(\n  walletId: string,\n  signer: SignerData,\n  signerType: SignerType,\n  signerId: string,\n  transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n  validateSignerActive(signer, signerType);\n  const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n  prepareTransactionForSigning(transaction, signerPublicKey);\n  const unsignedTransactionBase64 = Buffer.from(\n    transaction.serialize({ verifySignatures: false })\n  ).toString(\"base64\");\n  let signedTransactionBase64: string;\n  try {\n    signedTransactionBase64 = await signTransactionWithEmailOrPhone(\n      walletId,\n      signerId,\n      signerType,\n      unsignedTransactionBase64\n    );\n  } catch (error: unknown) {\n    handleDeviceKeyError(error, signerType);\n    throw error;\n  }\n  try {\n    const validationResult = await validateSignerInTransaction(\n      signedTransactionBase64,\n      signerPublicKey\n    );\n    if (!validationResult.isValid) {\n      console.error(\"Transaction validation failed:\", {\n        errors: validationResult.errors,\n        warnings: validationResult.warnings,\n      });\n    }\n  } catch (validationError) {\n    console.error(\"Validation error (non-fatal):\", extractErrorMessage(validationError));\n  }\n  return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nasync function handleExternalOrApiKeyTransaction(\n  walletId: string,\n  signer: SignerData,\n  signerType: SignerType,\n  signerId: string,\n  transaction: Transaction\n): Promise<{ signature: string; status: string; confirmationStatus: string }> {\n  validateSignerActive(signer, signerType);\n  const messageBytes = transaction.serializeMessage();\n  const storageOptions = getStorageOptions();\n  const signatureBytes = await signWithSigner(\n    walletId,\n    signerId,\n    signerType,\n    messageBytes,\n    storageOptions\n  );\n  const signerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n  const signatureBuffer = Buffer.from(signatureBytes);\n  transaction.addSignature(signerPublicKey, signatureBuffer);\n  const signedTransactionBytes = transaction.serialize();\n  const signedTransactionBase64 = Buffer.from(signedTransactionBytes).toString(\"base64\");\n  return await submitSignedTransaction(walletId, signedTransactionBase64);\n}\n\nexport async function signTransactionWithSigner(\n  walletId: string,\n  signer: SignerData,\n  transactionBuffer: Uint8Array\n): Promise<{ signature: string; signerType: string }> {\n  const { signerType, signerId } = extractSignerInfo(signer);\n  const storageOptions = getStorageOptions();\n\n  if (signerType === SIGNER_TYPES.EMAIL) {\n    validateSignerActive(signer, signerType);\n    try {\n      const signature = await signWithEmailSigner(walletId, signerId, transactionBuffer, storageOptions);\n      return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.EMAIL };\n    } catch (error: unknown) {\n      throw handleDeviceKeyError(error, SIGNER_TYPES.EMAIL);\n    }\n  }\n  if (signerType === SIGNER_TYPES.PHONE) {\n    validateSignerActive(signer, signerType);\n    try {\n      const signature = await signWithPhoneSigner(walletId, signerId, transactionBuffer, storageOptions);\n      return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PHONE };\n    } catch (error: unknown) {\n      throw handleDeviceKeyError(error, SIGNER_TYPES.PHONE);\n    }\n  }\n  if (signerType === SIGNER_TYPES.PASSKEY) {\n    const { signWithPasskeySigner } = await import(\"cilantro-sdk/helpers\");\n    const signature = await signWithPasskeySigner(walletId, signerId, transactionBuffer, {\n      useBrowserAutofill: false,\n    });\n    return { signature: Buffer.from(signature).toString(\"hex\"), signerType: SIGNER_TYPES.PASSKEY };\n  }\n  if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n    validateSignerActive(signer, signerType);\n    const signature = await signWithSigner(\n      walletId,\n      signerId,\n      signerType,\n      transactionBuffer,\n      storageOptions\n    );\n    return { signature: Buffer.from(signature).toString(\"hex\"), signerType };\n  }\n  throw new Error(`Unsupported signer type: ${signerType}`);\n}\n\n/** Result of sign-and-send; status is the SDK SubmitTransactionDataDto.status, confirmationStatus is the same for backward compat. */\nexport interface SignAndSendResult {\n  signature: string;\n  status: string;\n  confirmationStatus: string;\n}\n\nexport async function signAndSendTransactionWithSigner(\n  walletId: string,\n  signer: SignerData,\n  transaction: Transaction,\n  connection?: SignAndSendConnection | null\n): Promise<SignAndSendResult> {\n  const { signerType, signerId } = extractSignerInfo(signer);\n  if (signerType === SIGNER_TYPES.PASSKEY) {\n    return await handlePasskeyTransaction(walletId, signerId, transaction, connection);\n  }\n  if (signerType === SIGNER_TYPES.EMAIL || signerType === SIGNER_TYPES.PHONE) {\n    return await handleEmailOrPhoneTransaction(walletId, signer, signerType, signerId, transaction);\n  }\n  if (signerType === SIGNER_TYPES.EXTERNAL || signerType === SIGNER_TYPES.API_KEY) {\n    return await handleExternalOrApiKeyTransaction(walletId, signer, signerType, signerId, transaction);\n  }\n  throw new Error(`Unsupported signer type: ${signerType}`);\n}\n","import { PublicKey, Transaction } from \"@solana/web3.js\";\nimport type { SignerData } from \"../signer-helpers\";\nimport { extractErrorMessage } from \"../error-utils\";\nimport { getSignerPublicKey } from \"./core\";\nimport { extractSignerInfo } from \"./signer-types\";\n\nexport async function validateSignerInTransaction(\n  signedTransactionBase64: string,\n  expectedSignerPublicKey?: PublicKey | string\n): Promise<{\n  isValid: boolean;\n  transaction: Transaction;\n  signers: Array<{\n    publicKey: string;\n    hasSignature: boolean;\n    signatureLength: number;\n    matchesExpected: boolean;\n  }>;\n  expectedSignerFound: boolean;\n  allSignaturesValid: boolean;\n  feePayer?: string;\n  recentBlockhash?: string;\n  errors: string[];\n  warnings: string[];\n}> {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n  try {\n    const transactionBuffer = Buffer.from(signedTransactionBase64, \"base64\");\n    const transaction = Transaction.from(transactionBuffer);\n    let allSignaturesValid = true;\n    try {\n      transaction.verifySignatures();\n    } catch (error) {\n      allSignaturesValid = false;\n      errors.push(`Signature verification failed: ${extractErrorMessage(error)}`);\n    }\n    const signers = transaction.signatures.map((sig) => {\n      const publicKeyStr = sig.publicKey.toString();\n      const hasSignature = sig.signature !== null && sig.signature.length > 0;\n      const signatureLength = sig.signature !== null ? sig.signature.length : 0;\n      let matchesExpected = false;\n      if (expectedSignerPublicKey) {\n        const expectedPubkey =\n          typeof expectedSignerPublicKey === \"string\"\n            ? new PublicKey(expectedSignerPublicKey)\n            : expectedSignerPublicKey;\n        matchesExpected = sig.publicKey.equals(expectedPubkey);\n      }\n      if (!hasSignature) warnings.push(`Signer ${publicKeyStr} has no signature (unsigned)`);\n      return { publicKey: publicKeyStr, hasSignature, signatureLength, matchesExpected };\n    });\n    let expectedSignerFound = false;\n    if (expectedSignerPublicKey) {\n      const expectedPubkey =\n        typeof expectedSignerPublicKey === \"string\"\n          ? new PublicKey(expectedSignerPublicKey)\n          : expectedSignerPublicKey;\n      expectedSignerFound = signers.some((s) => s.matchesExpected);\n      if (!expectedSignerFound) {\n        errors.push(`Expected signer ${expectedPubkey.toString()} not found in transaction signers`);\n      }\n    }\n    if (expectedSignerFound && expectedSignerPublicKey) {\n      const expectedSigner = signers.find((s) => s.matchesExpected);\n      if (expectedSigner && !expectedSigner.hasSignature) {\n        errors.push(\n          `Expected signer ${\n            typeof expectedSignerPublicKey === \"string\"\n              ? expectedSignerPublicKey\n              : expectedSignerPublicKey.toString()\n          } is present but has no signature`\n        );\n      }\n    }\n    const isValid =\n      allSignaturesValid && (expectedSignerPublicKey ? expectedSignerFound : true) && errors.length === 0;\n    return {\n      isValid,\n      transaction,\n      signers,\n      expectedSignerFound,\n      allSignaturesValid,\n      feePayer: transaction.feePayer?.toString(),\n      recentBlockhash: transaction.recentBlockhash ?? undefined,\n      errors,\n      warnings,\n    };\n  } catch (error) {\n    errors.push(`Failed to deserialize transaction: ${extractErrorMessage(error)}`);\n    throw new Error(\n      `Transaction validation failed: ${errors.join(\"; \")}\\nOriginal error: ${extractErrorMessage(error)}`\n    );\n  }\n}\n\nexport async function validateSignerInTransactionWithSigner(\n  walletId: string,\n  signer: SignerData,\n  signedTransactionBase64: string\n): Promise<\n  Awaited<ReturnType<typeof validateSignerInTransaction>> & { expectedSignerPublicKey: string }\n> {\n  const { signerType, signerId } = extractSignerInfo(signer);\n  const expectedSignerPublicKey = await getSignerPublicKey(walletId, signer, signerType, signerId);\n  const validationResult = await validateSignerInTransaction(\n    signedTransactionBase64,\n    expectedSignerPublicKey\n  );\n  return {\n    ...validationResult,\n    expectedSignerPublicKey: expectedSignerPublicKey.toString(),\n  };\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { findOne as findOneWallet } from \"cilantro-sdk/wallet\";\nimport type { WalletControllerFindOneResult } from \"cilantro-sdk/wallet\";\nimport { extractResponseData } from \"../types\";\n\n/** SDK wallet single response data (WalletSuccessResponseDto.data). */\nexport type WalletDataDtoFromFindOne = WalletControllerFindOneResult[\"data\"];\n\nexport async function getWalletData(walletId: string): Promise<{\n  walletPublicKey: PublicKey;\n  adminSignerPubkey: PublicKey;\n}> {\n  const walletDataResponse: WalletControllerFindOneResult = await findOneWallet(walletId);\n  const walletData = extractResponseData<WalletDataDtoFromFindOne>(walletDataResponse);\n  if (!walletData) throw new Error(\"Wallet data is empty\");\n  const address = String(walletData.walletAddress ?? \"\").trim();\n  if (!address) throw new Error(\"No wallet address found (walletAddress is empty).\");\n  const walletPublicKey = new PublicKey(address);\n  const adminPubkey = String(walletData.adminSignerPubkey ?? \"\").trim();\n  if (!adminPubkey) {\n    throw new Error(\"adminSignerPubkey not found in wallet data.\");\n  }\n  const adminSignerPubkey = new PublicKey(adminPubkey);\n  return { walletPublicKey, adminSignerPubkey };\n}\n"],"mappings":"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","names":["useEffect","jsx","GOOGLE_CLIENT_ID","platformApiKey","apiUrl","useEffect","createIndexedDBAdapter","useCallback","useMemo","useMemo","useMemo","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useCallback","isWebAuthnSupported","startPasskeyAuthentication","authenticateWithPasskey","formatAuthenticationResponse","useState","isWebAuthnSupported","useCallback","startPasskeyAuthentication","useState","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","jsx","React","jsx","React","cva","jsx","cva","React","jsx","useState","useCallback","jsx","useState","useCallback","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useMemo","React","jsx","Fragment","jsx","jsxs","useMemo","jsx","jsxs","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","jsx","useState","useState","jsx","jsxs","useState","React","jsx","jsxs","jsxs","jsx","Fragment","jsx","jsxs","useState","jsx","jsxs","useState","useState","useEffect","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useState","useEffect","jsx","useState","useEffect","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","jsx","jsxs","React","Fragment","jsx","jsxs","PublicKey","PublicKey","deriveSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","getEmailSignerKeypair","getPhoneSignerKeypair","deriveSignerKeypair","signWithSigner","signWithEmailSigner","signWithPhoneSigner","PublicKey","PublicKey","signWithSigner","signWithEmailSigner","signWithPhoneSigner","signWithPasskeySigner","PublicKey","PublicKey","getDiscordAuthorizeUrl"]}