{"version":3,"file":"PaymentCheckout-Cq57gmpT.mjs","names":[],"sources":["../../src/events/EventEmitter.ts","../../src/types/index.ts","../../src/PaymentCheckout.ts"],"sourcesContent":["import type { CheckoutEventName, CheckoutEventListener } from '../types';\n\n/**\n * Type-safe EventEmitter for the checkout system\n */\nexport class EventEmitter {\n  private listeners: Map<CheckoutEventName, Set<CheckoutEventListener<any>>> = new Map();\n\n  /**\n   * Add an event listener\n   */\n  on<T extends CheckoutEventName>(\n    event: T,\n    listener: CheckoutEventListener<T>\n  ): this {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    this.listeners.get(event)!.add(listener);\n    return this;\n  }\n\n  /**\n   * Add a one-time event listener\n   */\n  once<T extends CheckoutEventName>(\n    event: T,\n    listener: CheckoutEventListener<T>\n  ): this {\n    // @ts-ignore - Complex type inference issue with spread arguments\n    const onceListener = ((...args: any[]) => {\n      this.off(event, onceListener);\n      (listener as any)(...args);\n    }) as CheckoutEventListener<T>;\n    \n    return this.on(event, onceListener);\n  }\n\n  /**\n   * Remove an event listener\n   */\n  off<T extends CheckoutEventName>(\n    event: T,\n    listener: CheckoutEventListener<T>\n  ): this {\n    const eventListeners = this.listeners.get(event);\n    if (eventListeners) {\n      eventListeners.delete(listener);\n      if (eventListeners.size === 0) {\n        this.listeners.delete(event);\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Remove all listeners for a specific event\n   */\n  offAll(event: CheckoutEventName): this {\n    this.listeners.delete(event);\n    return this;\n  }\n\n  /**\n   * Remove all event listeners\n   */\n  removeAllListeners(): this {\n    this.listeners.clear();\n    return this;\n  }\n\n  /**\n   * Emit an event\n   */\n  emit<T extends CheckoutEventName>(\n    event: T,\n    ...args: any[]\n  ): boolean {\n    const eventListeners = this.listeners.get(event);\n    if (!eventListeners || eventListeners.size === 0) {\n      return false;\n    }\n\n    const listeners = Array.from(eventListeners);\n    listeners.forEach((listener) => {\n      try {\n        (listener as any)(...args);\n      } catch (error) {\n        console.error(`Error in event listener for ${event}:`, error);\n        // Emit error event if available\n        if (event !== 'checkout:error') {\n          this.emit('checkout:error', error as any);\n        }\n      }\n    });\n\n    return true;\n  }\n\n  /**\n   * Get the number of listeners for a specific event\n   */\n  listenerCount(event: CheckoutEventName): number {\n    const eventListeners = this.listeners.get(event);\n    return eventListeners ? eventListeners.size : 0;\n  }\n\n  /**\n   * Get all event names that have listeners\n   */\n  eventNames(): CheckoutEventName[] {\n    return Array.from(this.listeners.keys());\n  }\n\n  /**\n   * Get all listeners for a specific event\n   */\n  getListeners<T extends CheckoutEventName>(event: T): CheckoutEventListener<T>[] {\n    const eventListeners = this.listeners.get(event);\n    return eventListeners ? Array.from(eventListeners) : [];\n  }\n\n  /**\n   * Check if there are any listeners for a specific event\n   */\n  hasListeners(event: CheckoutEventName): boolean {\n    return this.listenerCount(event) > 0;\n  }\n} ","// Core type definitions for the Fanbasis Payment SDK\n\nexport interface PrefillAddress {\n  country?: string;\n  line1?: string;\n  line2?: string;\n  city?: string;\n  state?: string;\n  postal_code?: string;\n}\n\nexport interface PrefillConfig {\n  email?: string;\n  first_name?: string;\n  last_name?: string;\n  phone?: string;\n  address?: PrefillAddress;\n}\n\nexport interface FieldControl {\n  hide?: boolean;\n  disable?: boolean;\n}\n\nexport interface FieldsConfig {\n  email?: FieldControl;\n  first_name?: FieldControl;\n  last_name?: FieldControl;\n  phone?: FieldControl;\n  address?: FieldControl;\n}\n\nexport type PrefillableFieldName = keyof FieldsConfig;\n\nexport interface CustomizationParams {\n  theme: 'light' | 'dark';\n  show_product_info: boolean;\n  product_layout: 'left' | 'above';\n  show_coupon_row: boolean;\n  coupon_row_disclaimer?: string;\n  accent_color: string;\n  background_color?: string;\n  label_color?: string;\n  input_background_color?: string;\n  product_text_color?: string;\n  heading_color?: string;\n  secondary_color?: string;\n  border_color?: string;\n  surface_color?: string;\n  product_image?: string;\n  /** @deprecated Use `fields` for per-field visibility control instead */\n  billing_display_fields?: string;\n  billing_form_placement?: 'above' | 'left';\n  show_headings?: boolean;\n  show_powered_by?: boolean;\n  prefill?: PrefillConfig;\n  fields?: FieldsConfig;\n}\n\nexport type Theme = 'light' | 'dark';\nexport type ProductLayout = 'left' | 'above';\nexport type BillingFormPlacement = 'above' | 'left';\n\nexport interface RedirectSettings {\n  success_redirect_url?: string;\n  failure_redirect_url?: string;\n  always_redirect?: boolean;\n}\n\nexport interface CheckoutConfig {\n  // Core configuration - only the required parameters\n  creatorId: string;\n  productId: string;\n  bumpProductIds?: string[];\n  couponCode?: string;\n  affiliateCode?: string;\n  checkoutSessionSecret: string;\n  environment: 'sandbox' | 'production';\n  overrideBaseUrl?: string;\n  showAllAddons?: boolean;\n\n  /** When true, shows a phone number field with country code selector on the checkout form */\n  collectPhone?: boolean;\n\n  metadata?: Record<string, string>;\n\n  // Theme customization options\n  theme?: CustomizationParams;\n  containerOptions?: {\n    width?: string;\n    height?: string;\n  };\n\n  // Redirect settings\n  redirectSettings?: RedirectSettings;\n\n  // Programmatic form submission\n  showSubmitButton?: boolean;\n}\n\n// Simplified state - only what's needed for the core functionality\nexport interface CheckoutState {\n  isOpen: boolean;\n  isLoading: boolean;\n  isInitialized: boolean;\n  error: PaymentError | null;\n}\n\nexport enum PaymentErrorCode {\n  INVALID_CONFIG = 'INVALID_CONFIG',\n  CREATOR_ID_REQUIRED = 'CREATOR_ID_REQUIRED',\n  PRODUCT_ID_REQUIRED = 'PRODUCT_ID_REQUIRED',\n  CHECKOUT_SESSION_SECRET_REQUIRED = 'CHECKOUT_SESSION_SECRET_REQUIRED',\n  FIELD_VALIDATION_ERROR = 'FIELD_VALIDATION_ERROR',\n  FIELD_NOT_SETTABLE = 'FIELD_NOT_SETTABLE',\n  IFRAME_NOT_READY = 'IFRAME_NOT_READY',\n  UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\nexport interface FieldValueData {\n  field: string;\n  value: string | PrefillAddress | null;\n}\n\nexport class PaymentError extends Error {\n  public readonly code: PaymentErrorCode;\n  public readonly details?: any;\n\n  constructor(code: PaymentErrorCode, message: string, details?: any) {\n    super(message);\n    this.name = 'PaymentError';\n    this.code = code;\n    this.details = details;\n  }\n}\n\nexport interface CheckoutSuccessData {\n  transactionId: string;\n  amount: number;\n  currency: string;\n  customer: any;\n  metadata: any;\n}\n\n// Programmatic form submission interfaces\nexport interface SubmitFormOptions {\n  paymentMethod?: string;\n  forceValidation?: boolean;\n}\n\nexport interface FormSubmittingData {\n  paymentMethod: string;\n  timestamp: number;\n  timestamp_iso?: string;\n}\n\nexport interface FormSubmissionErrorData {\n  type: 'FORM_SUBMISSION_ERROR';\n  timestamp: number;\n  data: {\n    errorCode: string;\n    errorMessage: string;\n    retryable: boolean;\n  };\n}\n\nexport interface FormReadyData {\n  timestamp: number;\n}\n\nexport interface Addon {\n  id: string;\n  title: string;\n  price: number;\n  description: string;\n  subscription_details?: {\n    starting_on: string;\n    payment_frequency: string;\n    free_trial_days: number;\n    recurring_subtotal: number;\n  };\n}\n\nexport interface AddonsChangedData {\n  selectedAddons: string[];\n  addons: Addon[];\n}\n\nexport interface CouponAppliedData {\n  code: string;\n  discountAmount: number;\n  newTotal: number;\n}\n\nexport interface CouponErrorData {\n  code: string;\n  error: string;\n}\n\nexport interface FormValidationFieldStatus {\n  valid: boolean;\n  error: string | null;\n}\n\nexport interface FormValidationData {\n  isValid: boolean;\n  fields: Record<string, FormValidationFieldStatus>;\n}\n\n// Simplified events - only core checkout events\nexport interface CheckoutEvents {\n  'checkout:opened': () => void;\n  'checkout:closed': () => void;\n  'checkout:loaded': () => void;\n  'checkout:error': (error: PaymentError) => void;\n  'checkout:success': (data: CheckoutSuccessData) => void;\n  'form:ready': (data: FormReadyData) => void;\n  'form:submitting': (data: FormSubmittingData) => void;\n  'form:submission_error': (data: FormSubmissionErrorData) => void;\n  'form:validation': (data: FormValidationData) => void;\n  // Addon events\n  'addons:changed': (data: AddonsChangedData) => void;\n  // Coupon events\n  'coupon:applied': (data: CouponAppliedData) => void;\n  'coupon:error': (data: CouponErrorData) => void;\n  'field:value': (data: FieldValueData) => void;\n}\n\nexport type CheckoutEventName = keyof CheckoutEvents;\nexport type CheckoutEventListener<T extends CheckoutEventName> =\n  CheckoutEvents[T];\n","import { EventEmitter } from './events/EventEmitter';\nimport { PaymentError, PaymentErrorCode } from './types';\nimport type {\n  CheckoutConfig,\n  CheckoutState,\n  CheckoutSuccessData,\n  CustomizationParams,\n  SubmitFormOptions,\n  FormSubmittingData,\n  FormSubmissionErrorData,\n  FormReadyData,\n  FormValidationData,\n  AddonsChangedData,\n  CouponAppliedData,\n  CouponErrorData,\n  FieldValueData,\n  PrefillAddress,\n  PrefillableFieldName,\n} from './types';\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst PHONE_REGEX = /^\\+?[\\d\\s\\-().]{7,20}$/;\n\n/**\n * Main PaymentCheckout class for handling checkout display\n */\nexport class PaymentCheckout extends EventEmitter {\n  private config: CheckoutConfig;\n  private state: CheckoutState;\n  private iframe: HTMLIFrameElement | null = null;\n  private container: HTMLElement | null = null;\n  private pendingFieldRequests: Map<string, { resolve: (v: any) => void; reject: (e: any) => void }> = new Map();\n\n  constructor(config: CheckoutConfig) {\n    super();\n    this.config = this.validateAndMergeConfig(config);\n    this.state = this.getInitialState();\n  }\n\n  static create(config: CheckoutConfig): PaymentCheckout {\n    return new PaymentCheckout(config);\n  }\n\n  /**\n   * Create PaymentCheckout from an existing DOM element\n   */\n  static fromElement(\n    element: HTMLElement,\n    config: CheckoutConfig\n  ): PaymentCheckout {\n    const checkout = new PaymentCheckout(config);\n    checkout.attachToElement(element);\n    return checkout;\n  }\n\n  getState(): CheckoutState {\n    return { ...this.state };\n  }\n\n  updateConfig(newConfig: Partial<CheckoutConfig>): void {\n    this.config = this.validateAndMergeConfig({ ...this.config, ...newConfig });\n    if (this.iframe) {\n      this.iframe.src = this.getCheckoutUrl();\n    }\n  }\n\n  updateTheme(newTheme: CustomizationParams): void {\n    this.config = this.validateAndMergeConfig({\n      ...this.config,\n      theme: newTheme,\n    });\n    if (this.iframe) {\n      this.iframe.src = this.getCheckoutUrl();\n    }\n  }\n\n  init(): Promise<void> {\n    if (this.state.isOpen) {\n      return Promise.resolve();\n    }\n\n    this.setState({ isOpen: true, isLoading: true });\n    this.emit('checkout:opened');\n\n    return this.initializeCheckout()\n      .then(() => {\n        this.setState({ isLoading: false });\n        this.emit('checkout:loaded');\n      })\n      .catch(error => {\n        console.log('error', error);\n        this.setState({\n          isLoading: false,\n          error:\n            error instanceof PaymentError\n              ? error\n              : new PaymentError(\n                  PaymentErrorCode.UNKNOWN_ERROR,\n                  'Failed to open checkout',\n                  error\n                ),\n        });\n        this.emit('checkout:error', this.state.error!);\n        throw error;\n      });\n  }\n\n  destroy(): void {\n    if (!this.state.isOpen) {\n      return;\n    }\n\n    this.setState({ isOpen: false });\n    this.cleanupIframe();\n    this.emit('checkout:closed');\n  }\n\n  cleanup(): void {\n    this.destroy();\n    this.removeAllListeners();\n    this.pendingFieldRequests.clear();\n    this.config = {} as CheckoutConfig;\n    this.state = this.getInitialState();\n  }\n\n  attachToElement(element: HTMLElement): void {\n    this.container = element;\n  }\n\n  submitForm(options: SubmitFormOptions = {}): void {\n    if (!this.iframe) {\n      throw new PaymentError(\n        PaymentErrorCode.INVALID_CONFIG,\n        'Checkout iframe is not initialized'\n      );\n    }\n\n    const message = {\n      type: 'SUBMIT_FORM',\n      timestamp: Date.now(),\n      data: {\n        paymentMethod: options.paymentMethod || 'card',\n        forceValidation: options.forceValidation !== false,\n      },\n    };\n    console.log('submitForm', message);\n    this.sendSecureMessage(this.iframe, 'SUBMIT_FORM', message.data);\n  }\n\n  isFormReady(): boolean {\n    return this.state.isOpen && !this.state.isLoading;\n  }\n\n  addAddon(addonId: string): void {\n    if (!this.iframe) {\n      console.warn('Checkout iframe is not initialized');\n      return;\n    }\n    this.sendSecureMessage(this.iframe, 'ADD_ADDON', { addonId });\n  }\n\n  removeAddon(addonId: string): void {\n    if (!this.iframe) {\n      console.warn('Checkout iframe is not initialized');\n      return;\n    }\n    this.sendSecureMessage(this.iframe, 'REMOVE_ADDON', { addonId });\n  }\n\n  toggleAddon(addonId: string): void {\n    if (!this.iframe) {\n      console.warn('Checkout iframe is not initialized');\n      return;\n    }\n    this.sendSecureMessage(this.iframe, 'TOGGLE_ADDON', { addonId });\n  }\n\n  applyCoupon(code: string): void {\n    if (!code || code.trim().length === 0) {\n      throw new PaymentError(\n        PaymentErrorCode.FIELD_VALIDATION_ERROR,\n        'Coupon code cannot be empty'\n      );\n    }\n    if (!this.iframe) {\n      console.warn('Checkout iframe is not initialized');\n      return;\n    }\n    this.sendSecureMessage(this.iframe, 'APPLY_COUPON', { code });\n  }\n\n  removeCoupon(): void {\n    if (!this.iframe) {\n      console.warn('Checkout iframe is not initialized');\n      return;\n    }\n    this.sendSecureMessage(this.iframe, 'REMOVE_COUPON', {});\n  }\n\n  // --- Field getter/setter methods ---\n\n  async setEmail(value: string): Promise<void> {\n    if (!EMAIL_REGEX.test(value)) {\n      throw new PaymentError(PaymentErrorCode.FIELD_VALIDATION_ERROR, `Invalid email format: \"${value}\"`);\n    }\n    return this.setField('email', value);\n  }\n\n  async getEmail(): Promise<string | null> {\n    return this.getField('email') as Promise<string | null>;\n  }\n\n  async setFirstName(value: string): Promise<void> {\n    if (!value || value.trim().length === 0) {\n      throw new PaymentError(PaymentErrorCode.FIELD_VALIDATION_ERROR, 'First name cannot be empty');\n    }\n    return this.setField('first_name', value);\n  }\n\n  async getFirstName(): Promise<string | null> {\n    return this.getField('first_name') as Promise<string | null>;\n  }\n\n  async setLastName(value: string): Promise<void> {\n    if (!value || value.trim().length === 0) {\n      throw new PaymentError(PaymentErrorCode.FIELD_VALIDATION_ERROR, 'Last name cannot be empty');\n    }\n    return this.setField('last_name', value);\n  }\n\n  async getLastName(): Promise<string | null> {\n    return this.getField('last_name') as Promise<string | null>;\n  }\n\n  async setPhone(value: string): Promise<void> {\n    if (!PHONE_REGEX.test(value)) {\n      throw new PaymentError(PaymentErrorCode.FIELD_VALIDATION_ERROR, `Invalid phone format: \"${value}\"`);\n    }\n    return this.setField('phone', value);\n  }\n\n  async getPhone(): Promise<string | null> {\n    return this.getField('phone') as Promise<string | null>;\n  }\n\n  async setAddress(value: PrefillAddress): Promise<void> {\n    if (this.config.theme?.fields?.address?.hide !== true) {\n      throw new PaymentError(\n        PaymentErrorCode.FIELD_NOT_SETTABLE,\n        'setAddress() can only be used when fields.address.hide is true'\n      );\n    }\n    if (!value || typeof value !== 'object') {\n      throw new PaymentError(PaymentErrorCode.FIELD_VALIDATION_ERROR, 'Address must be an object');\n    }\n    return this.setField('address', value);\n  }\n\n  async getAddress(): Promise<PrefillAddress | null> {\n    return this.getField('address') as Promise<PrefillAddress | null>;\n  }\n\n  // --- Private methods ---\n\n  private async setField(field: string, value: string | PrefillAddress): Promise<void> {\n    if (!this.iframe) {\n      throw new PaymentError(PaymentErrorCode.IFRAME_NOT_READY, 'Checkout iframe is not initialized');\n    }\n    this.sendSecureMessage(this.iframe, 'SET_FIELD', { field, value });\n  }\n\n  private getField(field: string): Promise<string | PrefillAddress | null> {\n    if (!this.iframe) {\n      return Promise.reject(new PaymentError(PaymentErrorCode.IFRAME_NOT_READY, 'Checkout iframe is not initialized'));\n    }\n\n    const requestId = `${field}_${Date.now()}`;\n    this.sendSecureMessage(this.iframe, 'GET_FIELD', { field, requestId });\n\n    return new Promise((resolve, reject) => {\n      this.pendingFieldRequests.set(requestId, { resolve, reject });\n      setTimeout(() => {\n        if (this.pendingFieldRequests.has(requestId)) {\n          this.pendingFieldRequests.delete(requestId);\n          reject(new PaymentError(PaymentErrorCode.UNKNOWN_ERROR, `Timeout waiting for field value: ${field}`));\n        }\n      }, 5000);\n    });\n  }\n\n  private validateAndMergeConfig(config: CheckoutConfig): CheckoutConfig {\n    if (!config.creatorId) {\n      throw new PaymentError(PaymentErrorCode.CREATOR_ID_REQUIRED, 'Creator ID is required');\n    }\n    if (!config.productId) {\n      throw new PaymentError(PaymentErrorCode.PRODUCT_ID_REQUIRED, 'Product ID is required');\n    }\n    if (!config.checkoutSessionSecret) {\n      throw new PaymentError(PaymentErrorCode.CHECKOUT_SESSION_SECRET_REQUIRED, 'Checkout session secret is required');\n    }\n\n    const merged = { environment: 'sandbox' as const, ...config };\n\n    if (merged.theme) {\n      this.emitPrefillFieldWarnings(merged.theme);\n    }\n\n    return merged;\n  }\n\n  private emitPrefillFieldWarnings(theme: CustomizationParams): void {\n    const { prefill, fields, billing_display_fields } = theme;\n\n    if (billing_display_fields && fields) {\n      console.warn(\n        '[FanBasis SDK] billing_display_fields is deprecated in favor of the fields config. ' +\n        'Please migrate to the fields config for per-field visibility and disable controls. ' +\n        'When both are provided, fields takes precedence.'\n      );\n    }\n\n    if (!fields) return;\n\n    const fieldNames: PrefillableFieldName[] = ['email', 'first_name', 'last_name', 'phone', 'address'];\n\n    for (const fieldName of fieldNames) {\n      const control = fields[fieldName];\n      if (!control) continue;\n\n      const hasPrefill = fieldName === 'address'\n        ? prefill?.address && Object.keys(prefill.address).length > 0\n        : !!(prefill as any)?.[fieldName];\n\n      if (control.hide && !hasPrefill) {\n        console.warn(\n          `[FanBasis SDK] Field \"${fieldName}\" is hidden but has no prefill value. ` +\n          'The field value will be missing from the checkout payload.'\n        );\n      }\n      if (control.disable && !hasPrefill) {\n        console.warn(\n          `[FanBasis SDK] Field \"${fieldName}\" is disabled but has no prefill value. ` +\n          'The customer will see an empty locked field.'\n        );\n      }\n    }\n  }\n\n  private getInitialState(): CheckoutState {\n    return {\n      isOpen: false,\n      isLoading: false,\n      error: null,\n      isInitialized: false,\n    };\n  }\n\n  private setState(updates: Partial<CheckoutState>): void {\n    this.state = { ...this.state, ...updates };\n  }\n\n  private async initializeCheckout(): Promise<void> {\n    if (this.container) {\n      await this.createEmbeddedCheckout();\n    }\n  }\n\n  private async createEmbeddedCheckout(): Promise<void> {\n    if (!this.container) {\n      throw new PaymentError(\n        PaymentErrorCode.INVALID_CONFIG,\n        'Container element is required for embedded checkout'\n      );\n    }\n\n    this.iframe = document.createElement('iframe');\n    this.iframe.src = this.getCheckoutUrl();\n    this.iframe.allow = 'payment';\n    this.iframe.style.border = 'none';\n    if (this.config.containerOptions?.width) {\n      this.iframe.style.width = this.config.containerOptions.width;\n    }\n    if (this.config.containerOptions?.height) {\n      this.iframe.style.height = this.config.containerOptions.height;\n    }\n    this.iframe.sandbox.add(\n      'allow-scripts',\n      'allow-same-origin',\n      'allow-forms',\n      'allow-popups',\n      'allow-modals',\n      'allow-downloads',\n      'allow-top-navigation-by-user-activation'\n    );\n\n    this.container.appendChild(this.iframe);\n\n    window.addEventListener('message', this.handleMessage.bind(this));\n  }\n\n  private getBaseUrl(): string {\n    if (this.config.overrideBaseUrl) {\n      return this.config.overrideBaseUrl;\n    }\n\n    return this.config.environment === 'sandbox'\n      ? 'https://embedded-checkout.qa.dev-fan-basis.com/'\n      : 'https://embedded.fanbasis.io/';\n  }\n\n  private getCheckoutUrl(): string {\n    const baseUrl =\n      this.getBaseUrl() +\n      'session/' +\n      this.config.creatorId +\n      '/' +\n      this.config.productId +\n      '/' +\n      this.config.checkoutSessionSecret;\n\n    const params = new URLSearchParams({});\n\n    if (this.config.showSubmitButton !== undefined) {\n      params.append(\n        'show_submit_button',\n        this.config.showSubmitButton.toString()\n      );\n    }\n\n    if (this.config.theme) {\n      params.append('theme', this.config.theme.theme);\n      params.append(\n        'show_product_info',\n        this.config.theme.show_product_info.toString()\n      );\n      params.append('product_layout', this.config.theme.product_layout);\n      params.append(\n        'show_coupon_row',\n        (this.config.theme.show_coupon_row ?? false).toString()\n      );\n      params.append('accent_color', this.config.theme.accent_color);\n      if (this.config.theme.coupon_row_disclaimer !== undefined) {\n        params.append(\n          'coupon_row_disclaimer',\n          this.config.theme.coupon_row_disclaimer\n        );\n      }\n\n      if (this.config.theme.show_headings !== undefined) {\n        params.append(\n          'show_headings',\n          this.config.theme.show_headings.toString()\n        );\n      }\n      if (this.config.theme.show_powered_by !== undefined) {\n        params.append(\n          'show_powered_by',\n          this.config.theme.show_powered_by.toString()\n        );\n      }\n\n      if (this.config.theme.background_color) {\n        params.append('background_color', this.config.theme.background_color);\n      }\n      if (this.config.theme.label_color) {\n        params.append('label_color', this.config.theme.label_color);\n      }\n      if (this.config.theme.input_background_color) {\n        params.append(\n          'input_background_color',\n          this.config.theme.input_background_color\n        );\n      }\n      if (this.config.theme.product_text_color) {\n        params.append(\n          'product_text_color',\n          this.config.theme.product_text_color\n        );\n      }\n      if (this.config.theme.heading_color) {\n        params.append('heading_color', this.config.theme.heading_color);\n      }\n      if (this.config.theme.secondary_color) {\n        params.append('secondary_color', this.config.theme.secondary_color);\n      }\n      if (this.config.theme.border_color) {\n        params.append('border_color', this.config.theme.border_color);\n      }\n      if (this.config.theme.surface_color) {\n        params.append('surface_color', this.config.theme.surface_color);\n      }\n      if (this.config.theme.product_image) {\n        params.append('product_image', this.config.theme.product_image);\n      }\n      if (this.config.theme.billing_display_fields) {\n        params.append(\n          'billing_display_fields',\n          this.config.theme.billing_display_fields\n        );\n      }\n      if (this.config.theme.billing_form_placement) {\n        params.append(\n          'billing_form_placement',\n          this.config.theme.billing_form_placement\n        );\n      }\n\n      if (this.config.theme.prefill) {\n        params.append('prefill', JSON.stringify(this.config.theme.prefill));\n      }\n      if (this.config.theme.fields) {\n        params.append('fields', JSON.stringify(this.config.theme.fields));\n      }\n    }\n\n    if (this.config.redirectSettings?.success_redirect_url) {\n      params.append(\n        'redirect_url',\n        this.config.redirectSettings.success_redirect_url\n      );\n    }\n\n    if (this.config.bumpProductIds) {\n      params.append('addonIds', this.config.bumpProductIds.join(','));\n    }\n    if (this.config.couponCode) {\n      params.append('coupon_code', this.config.couponCode);\n    }\n    if (this.config.affiliateCode) {\n      params.append('affiliate_code', this.config.affiliateCode);\n    }\n\n    if (this.config.showAllAddons) {\n      params.append('show_all_addons', 'true');\n    }\n\n    if (this.config.collectPhone) {\n      params.append('collect_phone', 'true');\n    }\n\n    if (this.config.metadata) {\n      params.append('metadata', JSON.stringify(this.config.metadata));\n    }\n\n    return `${baseUrl}?${params.toString()}`;\n  }\n\n  private handleMessage(event: MessageEvent): void {\n    const { type, data } = event.data || {};\n    if (!type) return;\n\n    switch (type) {\n      case 'PING':\n        this.sendSecureMessage(this.iframe!, 'PONG', {});\n        break;\n      case 'PAYMENT_SUCCESS':\n        this.emit('checkout:success', data as CheckoutSuccessData);\n        this.handleRedirect('success');\n        break;\n      case 'PAYMENT_ERROR':\n        this.emit('checkout:error', data);\n        this.handleRedirect('failure');\n        break;\n      case 'checkout:ready':\n        this.setState({ isLoading: false });\n        this.emit('checkout:loaded');\n        break;\n      case 'checkout:close':\n        this.destroy();\n        break;\n      case 'FORM_READY':\n        this.emit('form:ready', data as FormReadyData);\n        break;\n      case 'FORM_SUBMITTING':\n        this.emit('form:submitting', data as FormSubmittingData);\n        break;\n      case 'FORM_SUBMISSION_ERROR':\n        this.emit('form:submission_error', data as FormSubmissionErrorData);\n        break;\n      case 'FORM_VALIDATION':\n        this.emit('form:validation', data as FormValidationData);\n        break;\n      case 'ADDONS_CHANGED':\n        this.emit('addons:changed', data as AddonsChangedData);\n        break;\n      case 'COUPON_APPLIED':\n        this.emit('coupon:applied', data as CouponAppliedData);\n        break;\n      case 'COUPON_ERROR':\n        this.emit('coupon:error', data as CouponErrorData);\n        break;\n      case 'GET_FIELD_RESPONSE': {\n        const { requestId, field, value } = data as { requestId: string; field: string; value: any };\n        const pending = this.pendingFieldRequests.get(requestId);\n        if (pending) {\n          this.pendingFieldRequests.delete(requestId);\n          pending.resolve(value);\n        }\n        this.emit('field:value', { field, value } as FieldValueData);\n        break;\n      }\n    }\n  }\n\n  private sendSecureMessage(\n    iframe: HTMLIFrameElement,\n    type: string,\n    data: any\n  ): void {\n    iframe.contentWindow?.postMessage(\n      { type, data, timestamp: Date.now() },\n      '*'\n    );\n  }\n\n  private handleRedirect(type: 'success' | 'failure'): void {\n    const redirectSettings = this.config.redirectSettings;\n\n    if (!redirectSettings || !redirectSettings.always_redirect) {\n      return;\n    }\n\n    let redirectUrl: string | undefined;\n\n    if (type === 'success' && redirectSettings.success_redirect_url) {\n      redirectUrl = redirectSettings.success_redirect_url;\n    } else if (type === 'failure' && redirectSettings.failure_redirect_url) {\n      redirectUrl = redirectSettings.failure_redirect_url;\n    }\n\n    if (redirectUrl) {\n      setTimeout(() => {\n        window.location.href = redirectUrl!;\n      }, 100);\n    }\n  }\n\n  private cleanupIframe(): void {\n    if (this.iframe && this.container) {\n      this.container.removeChild(this.iframe);\n      this.iframe = null;\n    }\n\n    window.removeEventListener('message', this.handleMessage.bind(this));\n  }\n}\n"],"mappings":"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"}