@sendmailos/sdk 1.2.2 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/index.d.mts +23 -2
- package/dist/index.d.ts +23 -2
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -3
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +1 -1
- package/dist/react/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/use-subscribe.ts","../../src/react/subscribe-form.tsx","../../src/pixel.ts","../../src/react/use-pixel.ts"],"names":["createContext","useMemo","jsx","useContext","useState","useCallback","data","error","jsxs","useRef","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\n\ninterface SendMailOSContextValue {\n publicKey: string;\n baseUrl: string;\n}\n\nconst SendMailOSContext = createContext<SendMailOSContextValue | null>(null);\n\nexport interface SendMailOSProviderProps {\n /** Your public key (pk_live_... or pk_test_...) */\n publicKey: string;\n /** Custom API base URL (optional) */\n baseUrl?: string;\n children: React.ReactNode;\n}\n\n/**\n * Provider component for SendMailOS React integration\n * \n * @example\n * ```tsx\n * import { SendMailOSProvider } from '@sendmailos/sdk/react';\n * \n * function App() {\n * return (\n * <SendMailOSProvider publicKey=\"pk_live_...\">\n * <YourApp />\n * </SendMailOSProvider>\n * );\n * }\n * ```\n */\nexport function SendMailOSProvider({\n publicKey,\n baseUrl = 'https://api.sendmailos.com/api/v1',\n children,\n}: SendMailOSProviderProps) {\n if (!publicKey) {\n throw new Error('SendMailOSProvider requires a publicKey');\n }\n\n if (!publicKey.startsWith('pk_')) {\n console.warn(\n '[SendMailOS] Public keys should start with \"pk_\". ' +\n 'Never expose secret keys (sk_) in client-side code.'\n );\n }\n\n const value = useMemo(\n () => ({\n publicKey,\n baseUrl: baseUrl.replace(/\\/$/, ''),\n }),\n [publicKey, baseUrl]\n );\n\n return (\n <SendMailOSContext.Provider value={value}>\n {children}\n </SendMailOSContext.Provider>\n );\n}\n\n/**\n * Hook to access SendMailOS context\n */\nexport function useSendMailOS(): SendMailOSContextValue {\n const context = useContext(SendMailOSContext);\n \n if (!context) {\n throw new Error('useSendMailOS must be used within a SendMailOSProvider');\n }\n \n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useSendMailOS } from './provider';\n\ninterface SubscribeParams {\n email: string;\n firstName?: string;\n lastName?: string;\n tags?: string[];\n}\n\ninterface SubscribeResult {\n success: boolean;\n subscriberId?: string;\n message?: string;\n}\n\ninterface UseSubscribeReturn {\n /** Subscribe a new email address */\n subscribe: (params: SubscribeParams) => Promise<SubscribeResult>;\n /** Loading state */\n isLoading: boolean;\n /** Error message if subscription failed */\n error: Error | null;\n /** Success state */\n isSuccess: boolean;\n /** Reset the hook state */\n reset: () => void;\n}\n\n/**\n * Hook for subscribing users to your email list\n * \n * @example\n * ```tsx\n * function NewsletterForm() {\n * const { subscribe, isLoading, error, isSuccess } = useSubscribe();\n * const [email, setEmail] = useState('');\n * \n * const handleSubmit = async (e) => {\n * e.preventDefault();\n * await subscribe({ email, tags: ['newsletter'] });\n * };\n * \n * if (isSuccess) {\n * return <p>Thanks for subscribing!</p>;\n * }\n * \n * return (\n * <form onSubmit={handleSubmit}>\n * <input\n * type=\"email\"\n * value={email}\n * onChange={(e) => setEmail(e.target.value)}\n * placeholder=\"Enter your email\"\n * />\n * <button disabled={isLoading}>\n * {isLoading ? 'Subscribing...' : 'Subscribe'}\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\nexport function useSubscribe(): UseSubscribeReturn {\n const { publicKey, baseUrl } = useSendMailOS();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isSuccess, setIsSuccess] = useState(false);\n\n const reset = useCallback(() => {\n setIsLoading(false);\n setError(null);\n setIsSuccess(false);\n }, []);\n\n const subscribe = useCallback(\n async (params: SubscribeParams): Promise<SubscribeResult> => {\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n const response = await fetch(`${baseUrl}/public/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Public-Key': publicKey,\n },\n body: JSON.stringify({\n email: params.email,\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n }),\n });\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || 'Failed to subscribe');\n }\n\n const data = await response.json();\n setIsSuccess(true);\n setIsLoading(false);\n\n return {\n success: true,\n subscriberId: data.subscriber?.id,\n message: data.message,\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n setIsLoading(false);\n return { success: false, message: error.message };\n }\n },\n [baseUrl, publicKey]\n );\n\n return {\n subscribe,\n isLoading,\n error,\n isSuccess,\n reset,\n };\n}\n","import React, { useState, FormEvent } from 'react';\nimport { useSubscribe } from './use-subscribe';\n\nexport interface SubscribeFormProps {\n /** Tags to apply to new subscribers */\n tags?: string[];\n /** Callback when subscription succeeds */\n onSuccess?: () => void;\n /** Callback when subscription fails */\n onError?: (error: Error) => void;\n /** CSS class for the form container */\n className?: string;\n /** Placeholder text for email input */\n placeholder?: string;\n /** Text for submit button */\n buttonText?: string;\n /** Text shown while loading */\n loadingText?: string;\n /** Text shown on success */\n successMessage?: string;\n /** Whether to show first/last name fields */\n showNameFields?: boolean;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Pre-built newsletter subscription form\n * \n * @example\n * ```tsx\n * import { SubscribeForm } from '@sendmailos/sdk/react';\n * \n * function Newsletter() {\n * return (\n * <SubscribeForm\n * tags={['newsletter']}\n * onSuccess={() => console.log('Subscribed!')}\n * buttonText=\"Join Newsletter\"\n * placeholder=\"you@example.com\"\n * />\n * );\n * }\n * ```\n */\nexport function SubscribeForm({\n tags,\n onSuccess,\n onError,\n className,\n placeholder = 'Enter your email',\n buttonText = 'Subscribe',\n loadingText = 'Subscribing...',\n successMessage = 'Thanks for subscribing!',\n showNameFields = false,\n style,\n}: SubscribeFormProps) {\n const { subscribe, isLoading, error, isSuccess, reset } = useSubscribe();\n const [email, setEmail] = useState('');\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n \n const result = await subscribe({\n email,\n firstName: showNameFields ? firstName : undefined,\n lastName: showNameFields ? lastName : undefined,\n tags,\n });\n\n if (result.success) {\n onSuccess?.();\n setEmail('');\n setFirstName('');\n setLastName('');\n } else if (error) {\n onError?.(error);\n }\n };\n\n if (isSuccess) {\n return (\n <div className={className} style={style}>\n <p style={{ color: '#10b981', margin: 0 }}>{successMessage}</p>\n <button\n type=\"button\"\n onClick={reset}\n style={{\n marginTop: '8px',\n padding: '4px 8px',\n fontSize: '12px',\n background: 'transparent',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Subscribe another\n </button>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className} style={style}>\n {showNameFields && (\n <div style={{ display: 'flex', gap: '8px', marginBottom: '8px' }}>\n <input\n type=\"text\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n placeholder=\"First name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <input\n type=\"text\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n placeholder=\"Last name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n </div>\n )}\n \n <div style={{ display: 'flex', gap: '8px' }}>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={placeholder}\n required\n disabled={isLoading}\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <button\n type=\"submit\"\n disabled={isLoading || !email}\n style={{\n padding: '8px 16px',\n backgroundColor: isLoading ? '#9ca3af' : '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n }}\n >\n {isLoading ? loadingText : buttonText}\n </button>\n </div>\n \n {error && (\n <p style={{ color: '#ef4444', fontSize: '14px', marginTop: '8px' }}>\n {error.message}\n </p>\n )}\n </form>\n );\n}\n","export interface PixelConfig {\n /** Public API key (pk_live_... or pk_test_...) or legacy token */\n token: string;\n /** API endpoint for tracking events */\n endpoint?: string;\n /** Cookie name for anonymous ID storage */\n cookieName?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Respect Do Not Track browser setting (default: true) */\n respectDNT?: boolean;\n}\n\n/** Alias for PixelConfig for SDK consistency */\nexport type PixelOptions = PixelConfig;\n\nexport interface TrackProps {\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Alias for TrackProps */\nexport type TrackEventProperties = TrackProps;\n\n/** Traits for identify calls */\nexport interface IdentifyTraits {\n first_name?: string;\n last_name?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Dynamic rule for context detection */\ninterface PixelRule {\n match_type: 'exact' | 'contains' | 'regex';\n url_pattern: string;\n page_type: string;\n selectors?: Record<string, string>;\n}\n\nconst OPT_OUT_KEY = 'smp_opt_out';\nconst IDENTIFIED_EMAIL_KEY = 'smp_identified_email';\n\nexport class SendmailPixel {\n private config: PixelConfig;\n private anonymousId: string;\n private initialized: boolean = false;\n private rules: PixelRule[] = [];\n private identifiedEmail: string | null = null;\n\n constructor(config: PixelConfig) {\n this.config = {\n endpoint: 'https://sendmailos.com/api/pixel/track',\n cookieName: 'sm_anon_id',\n debug: false,\n respectDNT: true,\n ...config\n };\n this.anonymousId = this.getOrSetAnonymousId();\n this.identifiedEmail = this.getStoredEmail();\n }\n\n public init() {\n if (this.initialized) return;\n\n if (typeof window === 'undefined') {\n return; // Server-side safety\n }\n\n // Check for opt-out\n if (this.isOptedOut()) {\n this.log('Tracking disabled (user opted out)');\n return;\n }\n\n // Check for Do Not Track\n if (this.config.respectDNT && this.isDNTEnabled()) {\n this.log('Tracking disabled (Do Not Track enabled)');\n return;\n }\n\n this.initialized = true;\n\n // Check URL for subscriber ID from email clicks\n this.checkUrlForSubscriber();\n\n // 0. Load Dynamic Rules (Async)\n this.loadRules();\n\n // 1. Auto-track Page View\n this.pageView();\n\n // 2. Setup Form Auto-Detection\n this.setupFormListeners();\n\n // 3. Track History State Changes (SPA Support)\n this.setupHistoryListeners();\n\n // 4. Setup data attribute tracking\n this.setupDataAttributeTracking();\n\n this.log('Pixel initialized with Token:', this.config.token);\n }\n\n /**\n * Opt out of all tracking\n */\n public optOut(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(OPT_OUT_KEY, 'true');\n }\n this.log('User opted out of tracking');\n }\n\n /**\n * Opt back in to tracking\n */\n public optIn(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(OPT_OUT_KEY);\n }\n if (!this.initialized && typeof window !== 'undefined') {\n this.init();\n }\n this.log('User opted in to tracking');\n }\n\n /**\n * Check if user has opted out\n */\n public isOptedOut(): boolean {\n if (typeof localStorage === 'undefined') return false;\n return localStorage.getItem(OPT_OUT_KEY) === 'true';\n }\n\n /**\n * Reset identity (e.g., on logout)\n */\n public reset(): void {\n this.identifiedEmail = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(IDENTIFIED_EMAIL_KEY);\n }\n // Generate new anonymous ID\n this.anonymousId = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, this.anonymousId, 365);\n this.log('Identity reset');\n }\n\n /**\n * Get current visitor/anonymous ID\n */\n public getVisitorId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get identified email address\n */\n public getIdentifiedEmail(): string | null {\n return this.identifiedEmail;\n }\n\n public track(eventName: string, properties: TrackProps = {}) {\n this.sendEvent('track', {\n event_name: eventName,\n properties\n });\n }\n\n public identify(email: string, traits: TrackProps = {}) {\n if (this.isOptedOut()) return;\n\n this.identifiedEmail = email;\n this.storeEmail(email);\n\n this.sendEvent('identify', {\n email,\n traits\n });\n }\n\n public pageView() {\n this.track('page_view', {\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n url: window.location.href\n });\n }\n\n // --- INTERNAL HELPERS ---\n\n private getOrSetAnonymousId(): string {\n if (typeof document === 'undefined') return '';\n\n let id = this.getCookie(this.config.cookieName!);\n if (!id) {\n id = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, id, 365);\n }\n return id;\n }\n\n private sendEvent(type: 'track' | 'identify', payload: any) {\n if (typeof window === 'undefined') return;\n\n // Auto-Enrichment (Smart Context)\n const smartContext = this.detectContext();\n\n const body = {\n type,\n token: this.config.token, // Send Token\n anonymous_id: this.anonymousId,\n url: window.location.href,\n timestamp: new Date().toISOString(),\n ...payload\n };\n\n // Capture UTMs on first touch -> sent via context in API\n // For simplicity, we just send context\n const context = {\n userAgent: navigator.userAgent,\n locale: navigator.language,\n screen: { width: window.screen.width, height: window.screen.height },\n search: window.location.search,\n title: document.title,\n referrer: document.referrer,\n ...smartContext // Merge smart context\n };\n\n const finalBody = { ...body, context };\n\n // Use Beacon API if available (better for page unload)\n if (navigator.sendBeacon && type === 'track') {\n const blob = new Blob([JSON.stringify(finalBody)], { type: 'application/json' });\n navigator.sendBeacon(this.config.endpoint!, blob);\n } else {\n fetch(this.config.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(finalBody),\n keepalive: true\n }).catch(err => {\n if (this.config.debug) console.error('[Pixel Error]', err);\n });\n }\n\n this.log(`Event Sent [${type}]`, body);\n }\n\n // Call this after init to load rules\n public async loadRules() {\n if (typeof window === 'undefined') return;\n try {\n // Updated Endpoint Query Param\n const res = await fetch(`${this.config.endpoint?.replace('/track', '')}/rules?token=${this.config.token}`);\n if (res.ok) {\n const data = await res.json();\n this.rules = data.rules || [];\n }\n } catch (e) {\n // silent fail\n }\n }\n\n /**\n * Smart Auto-Detection of Page Type & Context\n * Uses Dynamic Rules + Static Heuristics\n */\n private detectContext(): any {\n if (typeof document === 'undefined') return {};\n\n const path = window.location.pathname.toLowerCase();\n let context: any = {\n page_type: 'general', // Default\n topics: []\n };\n\n // 0. CHECK DYNAMIC RULES (Database / AI Optimized)\n for (const rule of this.rules) {\n let matched = false;\n // URL Pattern Match\n try {\n if (rule.match_type === 'exact' && path === rule.url_pattern) matched = true;\n else if (rule.match_type === 'contains' && path.includes(rule.url_pattern)) matched = true;\n else if (rule.match_type === 'regex' && new RegExp(rule.url_pattern).test(path)) matched = true;\n } catch (e) { }\n\n if (matched) {\n context.page_type = rule.page_type;\n\n // Extract Data via Selectors\n if (rule.selectors) {\n for (const [key, selector] of Object.entries(rule.selectors)) {\n const el = document.querySelector(selector as string);\n if (el) {\n // Try value (input), then textContent, then content (meta)\n const val = (el as HTMLInputElement).value || el.textContent || el.getAttribute('content');\n if (val) context[key] = val.trim();\n }\n }\n }\n // Stop after first strong match? Or continue to merge? \n // Let's stop to allow override of default heuristics.\n return context;\n }\n }\n\n // --- FALLBACK TO STATIC HEURISTICS ---\n\n // 1. URL Heuristics\n if (path.match(/\\/(cart|basket|bag)/)) context.page_type = 'cart';\n else if (path.match(/\\/(checkout|payment|order)/)) context.page_type = 'checkout';\n else if (path.match(/\\/(product|item|p)\\//)) context.page_type = 'product';\n else if (path.match(/\\/(category|c|collection)\\//)) context.page_type = 'category';\n else if (path.match(/\\/(blog|article|post|news)/)) context.page_type = 'content';\n else if (path.match(/\\/(login|signin)/)) context.page_type = 'auth';\n else if (path.match(/\\/(signup|register)/)) context.page_type = 'auth';\n else if (path.match(/\\/(pricing|plans)/)) context.page_type = 'pricing';\n else if (path.match(/\\/(thank-you|confirmation|success)/)) context.page_type = 'purchase_success';\n\n // 2. DOM/Meta Heuristics (Stronger Signals)\n\n // Product? (Schema.org or OG Tags)\n const ogType = document.querySelector('meta[property=\"og:type\"]')?.getAttribute('content');\n if (ogType === 'product') {\n context.page_type = 'product';\n // Try to scrape price\n const price = document.querySelector('meta[property=\"product:price:amount\"]')?.getAttribute('content');\n if (price) context.product_price = price;\n const currency = document.querySelector('meta[property=\"product:price:currency\"]')?.getAttribute('content');\n if (currency) context.currency = currency;\n }\n\n // Cart?\n if (document.querySelector('.cart-total') || document.querySelector('#cart-summary')) {\n context.page_type = 'cart';\n }\n\n // Checkout?\n if (document.querySelector('#card-element') || document.querySelector('input[name=\"card_number\"]')) {\n context.page_type = 'checkout';\n }\n\n // 3. Content Scraping (Keywords)\n const text = document.body.innerText.toLowerCase().slice(0, 2000); // Check first 2k chars\n if (text.includes('out of stock')) context.stock_status = 'out_of_stock';\n if (text.includes('limited time')) context.urgency = 'high';\n\n return context;\n }\n\n private setupFormListeners() {\n if (typeof document === 'undefined') return;\n\n // Debounce to avoid performance hit\n document.addEventListener('submit', (e) => {\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n // Look for email input\n const emailInput = form.querySelector('input[type=\"email\"]') as HTMLInputElement;\n if (emailInput && emailInput.value) {\n this.log('Auto-detected email form submission', emailInput.value);\n this.identify(emailInput.value);\n }\n }, true); // Capture phase to catch it before propagation stops\n }\n\n private setupHistoryListeners() {\n if (typeof window === 'undefined') return;\n\n const pushState = history.pushState;\n history.pushState = (...args) => {\n pushState.apply(history, args);\n this.pageView();\n };\n\n window.addEventListener('popstate', () => {\n this.pageView();\n });\n }\n\n // --- COOKIE UTILS ---\n\n private setCookie(name: string, value: string, days: number) {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = name + \"=\" + value + \";\" + expires + \";path=/;SameSite=Lax\";\n }\n\n private getCookie(name: string): string | null {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n }\n\n private log(...args: unknown[]) {\n if (this.config.debug) {\n console.log('[SendmailPixel]', ...args);\n }\n }\n\n private isDNTEnabled(): boolean {\n if (typeof navigator === 'undefined') return false;\n return navigator.doNotTrack === '1' ||\n (window as unknown as { doNotTrack?: string }).doNotTrack === '1';\n }\n\n private checkUrlForSubscriber(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const subscriberEmail = params.get('smp_email');\n const subscriberId = params.get('smp_sub');\n\n if (subscriberEmail) {\n try {\n const email = atob(subscriberEmail);\n if (this.isValidEmail(email)) {\n this.identify(email);\n }\n } catch {\n if (this.isValidEmail(subscriberEmail)) {\n this.identify(subscriberEmail);\n }\n }\n } else if (subscriberId) {\n this.track('email_link_clicked', { subscriber_id: subscriberId });\n }\n }\n\n private setupDataAttributeTracking(): void {\n if (typeof document === 'undefined') return;\n\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const tracked = target.closest('[data-smp-track]');\n\n if (tracked) {\n const eventName = tracked.getAttribute('data-smp-track');\n const properties: TrackProps = {};\n\n Array.from(tracked.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-smp-track-') && attr.name !== 'data-smp-track') {\n const propName = attr.name.replace('data-smp-track-', '').replace(/-/g, '_');\n properties[propName] = attr.value;\n }\n });\n\n if (eventName) {\n this.track(eventName, properties);\n }\n }\n });\n }\n\n private getStoredEmail(): string | null {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(IDENTIFIED_EMAIL_KEY);\n }\n\n private storeEmail(email: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(IDENTIFIED_EMAIL_KEY, email);\n }\n }\n\n private isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n }\n}\n\n/** Alias for SendmailPixel for SDK consistency */\nexport const Pixel = SendmailPixel;\n\n/**\n * Create pixel and attach global smp() function\n */\nexport function createGlobalPixel(config: PixelConfig): SendmailPixel {\n const pixel = new SendmailPixel(config);\n\n if (typeof window !== 'undefined') {\n const smpFunction = (method: string, ...args: unknown[]): unknown => {\n switch (method) {\n case 'track':\n pixel.track(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'identify':\n pixel.identify(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'page':\n pixel.pageView();\n return undefined;\n case 'optOut':\n pixel.optOut();\n return undefined;\n case 'optIn':\n pixel.optIn();\n return undefined;\n case 'isOptedOut':\n return pixel.isOptedOut();\n case 'reset':\n pixel.reset();\n return undefined;\n default:\n console.warn(`[SendmailPixel] Unknown method: ${method}`);\n return undefined;\n }\n };\n (window as unknown as { smp: typeof smpFunction }).smp = smpFunction;\n }\n\n pixel.init();\n return pixel;\n}\n","/**\n * React hook for SendMailOS Pixel tracking\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SendmailPixel, PixelConfig, TrackProps, IdentifyTraits } from '../pixel';\n\nexport interface UsePixelOptions extends Omit<PixelConfig, 'token'> {}\n\nexport interface UsePixelReturn {\n /** Track a custom event */\n track: (eventName: string, properties?: TrackProps) => void;\n /** Track a page view */\n page: () => void;\n /** Identify a user by email */\n identify: (email: string, traits?: IdentifyTraits) => void;\n /** Opt out of tracking */\n optOut: () => void;\n /** Opt back in to tracking */\n optIn: () => void;\n /** Check if opted out */\n isOptedOut: () => boolean;\n /** Reset identity (e.g., on logout) */\n reset: () => void;\n /** Get current visitor ID */\n getVisitorId: () => string | null;\n /** Pixel instance (for advanced usage) */\n pixel: SendmailPixel | null;\n}\n\n/**\n * React hook for pixel tracking\n *\n * @example\n * ```tsx\n * import { usePixel } from '@sendmailos/sdk/react';\n *\n * function MyComponent() {\n * const { track, identify } = usePixel('pk_live_...');\n *\n * const handleClick = () => {\n * track('button_clicked', { button_id: 'cta' });\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function usePixel(token: string, options?: UsePixelOptions): UsePixelReturn {\n const pixelRef = useRef<SendmailPixel | null>(null);\n\n // Initialize pixel once\n useEffect(() => {\n if (!pixelRef.current && typeof window !== 'undefined') {\n pixelRef.current = new SendmailPixel({\n token,\n ...options,\n });\n pixelRef.current.init();\n }\n }, [token, options]);\n\n const track = useCallback((eventName: string, properties?: TrackProps) => {\n pixelRef.current?.track(eventName, properties);\n }, []);\n\n const page = useCallback(() => {\n pixelRef.current?.pageView();\n }, []);\n\n const identify = useCallback((email: string, traits?: IdentifyTraits) => {\n pixelRef.current?.identify(email, traits);\n }, []);\n\n const optOut = useCallback(() => {\n pixelRef.current?.optOut();\n }, []);\n\n const optIn = useCallback(() => {\n pixelRef.current?.optIn();\n }, []);\n\n const isOptedOut = useCallback(() => {\n return pixelRef.current?.isOptedOut() ?? false;\n }, []);\n\n const reset = useCallback(() => {\n pixelRef.current?.reset();\n }, []);\n\n const getVisitorId = useCallback(() => {\n return pixelRef.current?.getVisitorId() ?? null;\n }, []);\n\n return {\n track,\n page,\n identify,\n optOut,\n optIn,\n isOptedOut,\n reset,\n getVisitorId,\n pixel: pixelRef.current,\n };\n}\n\n/**\n * Hook to track page views on route changes\n * Useful for Next.js App Router or React Router\n *\n * @example\n * ```tsx\n * import { usePageTracking } from '@sendmailos/sdk/react';\n * import { usePathname } from 'next/navigation';\n *\n * function Layout({ children }) {\n * const pathname = usePathname();\n * usePageTracking('pk_live_...', pathname);\n * return children;\n * }\n * ```\n */\nexport function usePageTracking(\n token: string,\n pathname: string,\n options?: UsePixelOptions\n): void {\n const { page } = usePixel(token, options);\n\n useEffect(() => {\n page();\n }, [pathname, page]);\n}\n\n/**\n * Hook to identify user when they log in\n *\n * @example\n * ```tsx\n * import { useIdentifyOnLogin } from '@sendmailos/sdk/react';\n *\n * function App() {\n * const { user } = useAuth();\n * useIdentifyOnLogin('pk_live_...', user?.email, {\n * first_name: user?.firstName,\n * plan: user?.plan,\n * });\n * return <Main />;\n * }\n * ```\n */\nexport function useIdentifyOnLogin(\n token: string,\n email: string | null | undefined,\n traits?: IdentifyTraits,\n options?: UsePixelOptions\n): void {\n const { identify, reset } = usePixel(token, options);\n\n useEffect(() => {\n if (email) {\n identify(email, traits);\n } else {\n // User logged out\n reset();\n }\n }, [email, traits, identify, reset]);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/use-subscribe.ts","../../src/react/subscribe-form.tsx","../../src/pixel.ts","../../src/react/use-pixel.ts"],"names":["createContext","useMemo","jsx","useContext","useState","useCallback","data","error","jsxs","useRef","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\n\ninterface SendMailOSContextValue {\n publicKey: string;\n baseUrl: string;\n}\n\nconst SendMailOSContext = createContext<SendMailOSContextValue | null>(null);\n\nexport interface SendMailOSProviderProps {\n /** Your public key (pk_live_... or pk_test_...) */\n publicKey: string;\n /** Custom API base URL (optional) */\n baseUrl?: string;\n children: React.ReactNode;\n}\n\n/**\n * Provider component for SendMailOS React integration\n * \n * @example\n * ```tsx\n * import { SendMailOSProvider } from '@sendmailos/sdk/react';\n * \n * function App() {\n * return (\n * <SendMailOSProvider publicKey=\"pk_live_...\">\n * <YourApp />\n * </SendMailOSProvider>\n * );\n * }\n * ```\n */\nexport function SendMailOSProvider({\n publicKey,\n baseUrl = 'https://sendmailos.com/api/v1',\n children,\n}: SendMailOSProviderProps) {\n if (!publicKey) {\n throw new Error('SendMailOSProvider requires a publicKey');\n }\n\n if (!publicKey.startsWith('pk_')) {\n console.warn(\n '[SendMailOS] Public keys should start with \"pk_\". ' +\n 'Never expose secret keys (sk_) in client-side code.'\n );\n }\n\n const value = useMemo(\n () => ({\n publicKey,\n baseUrl: baseUrl.replace(/\\/$/, ''),\n }),\n [publicKey, baseUrl]\n );\n\n return (\n <SendMailOSContext.Provider value={value}>\n {children}\n </SendMailOSContext.Provider>\n );\n}\n\n/**\n * Hook to access SendMailOS context\n */\nexport function useSendMailOS(): SendMailOSContextValue {\n const context = useContext(SendMailOSContext);\n \n if (!context) {\n throw new Error('useSendMailOS must be used within a SendMailOSProvider');\n }\n \n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useSendMailOS } from './provider';\n\ninterface SubscribeParams {\n email: string;\n firstName?: string;\n lastName?: string;\n tags?: string[];\n}\n\ninterface SubscribeResult {\n success: boolean;\n subscriberId?: string;\n message?: string;\n}\n\ninterface UseSubscribeReturn {\n /** Subscribe a new email address */\n subscribe: (params: SubscribeParams) => Promise<SubscribeResult>;\n /** Loading state */\n isLoading: boolean;\n /** Error message if subscription failed */\n error: Error | null;\n /** Success state */\n isSuccess: boolean;\n /** Reset the hook state */\n reset: () => void;\n}\n\n/**\n * Hook for subscribing users to your email list\n * \n * @example\n * ```tsx\n * function NewsletterForm() {\n * const { subscribe, isLoading, error, isSuccess } = useSubscribe();\n * const [email, setEmail] = useState('');\n * \n * const handleSubmit = async (e) => {\n * e.preventDefault();\n * await subscribe({ email, tags: ['newsletter'] });\n * };\n * \n * if (isSuccess) {\n * return <p>Thanks for subscribing!</p>;\n * }\n * \n * return (\n * <form onSubmit={handleSubmit}>\n * <input\n * type=\"email\"\n * value={email}\n * onChange={(e) => setEmail(e.target.value)}\n * placeholder=\"Enter your email\"\n * />\n * <button disabled={isLoading}>\n * {isLoading ? 'Subscribing...' : 'Subscribe'}\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\nexport function useSubscribe(): UseSubscribeReturn {\n const { publicKey, baseUrl } = useSendMailOS();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isSuccess, setIsSuccess] = useState(false);\n\n const reset = useCallback(() => {\n setIsLoading(false);\n setError(null);\n setIsSuccess(false);\n }, []);\n\n const subscribe = useCallback(\n async (params: SubscribeParams): Promise<SubscribeResult> => {\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n const response = await fetch(`${baseUrl}/public/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Public-Key': publicKey,\n },\n body: JSON.stringify({\n email: params.email,\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n }),\n });\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || 'Failed to subscribe');\n }\n\n const data = await response.json();\n setIsSuccess(true);\n setIsLoading(false);\n\n return {\n success: true,\n subscriberId: data.subscriber?.id,\n message: data.message,\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n setIsLoading(false);\n return { success: false, message: error.message };\n }\n },\n [baseUrl, publicKey]\n );\n\n return {\n subscribe,\n isLoading,\n error,\n isSuccess,\n reset,\n };\n}\n","import React, { useState, FormEvent } from 'react';\nimport { useSubscribe } from './use-subscribe';\n\nexport interface SubscribeFormProps {\n /** Tags to apply to new subscribers */\n tags?: string[];\n /** Callback when subscription succeeds */\n onSuccess?: () => void;\n /** Callback when subscription fails */\n onError?: (error: Error) => void;\n /** CSS class for the form container */\n className?: string;\n /** Placeholder text for email input */\n placeholder?: string;\n /** Text for submit button */\n buttonText?: string;\n /** Text shown while loading */\n loadingText?: string;\n /** Text shown on success */\n successMessage?: string;\n /** Whether to show first/last name fields */\n showNameFields?: boolean;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Pre-built newsletter subscription form\n * \n * @example\n * ```tsx\n * import { SubscribeForm } from '@sendmailos/sdk/react';\n * \n * function Newsletter() {\n * return (\n * <SubscribeForm\n * tags={['newsletter']}\n * onSuccess={() => console.log('Subscribed!')}\n * buttonText=\"Join Newsletter\"\n * placeholder=\"you@example.com\"\n * />\n * );\n * }\n * ```\n */\nexport function SubscribeForm({\n tags,\n onSuccess,\n onError,\n className,\n placeholder = 'Enter your email',\n buttonText = 'Subscribe',\n loadingText = 'Subscribing...',\n successMessage = 'Thanks for subscribing!',\n showNameFields = false,\n style,\n}: SubscribeFormProps) {\n const { subscribe, isLoading, error, isSuccess, reset } = useSubscribe();\n const [email, setEmail] = useState('');\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n \n const result = await subscribe({\n email,\n firstName: showNameFields ? firstName : undefined,\n lastName: showNameFields ? lastName : undefined,\n tags,\n });\n\n if (result.success) {\n onSuccess?.();\n setEmail('');\n setFirstName('');\n setLastName('');\n } else if (error) {\n onError?.(error);\n }\n };\n\n if (isSuccess) {\n return (\n <div className={className} style={style}>\n <p style={{ color: '#10b981', margin: 0 }}>{successMessage}</p>\n <button\n type=\"button\"\n onClick={reset}\n style={{\n marginTop: '8px',\n padding: '4px 8px',\n fontSize: '12px',\n background: 'transparent',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Subscribe another\n </button>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className} style={style}>\n {showNameFields && (\n <div style={{ display: 'flex', gap: '8px', marginBottom: '8px' }}>\n <input\n type=\"text\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n placeholder=\"First name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <input\n type=\"text\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n placeholder=\"Last name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n </div>\n )}\n \n <div style={{ display: 'flex', gap: '8px' }}>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={placeholder}\n required\n disabled={isLoading}\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <button\n type=\"submit\"\n disabled={isLoading || !email}\n style={{\n padding: '8px 16px',\n backgroundColor: isLoading ? '#9ca3af' : '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n }}\n >\n {isLoading ? loadingText : buttonText}\n </button>\n </div>\n \n {error && (\n <p style={{ color: '#ef4444', fontSize: '14px', marginTop: '8px' }}>\n {error.message}\n </p>\n )}\n </form>\n );\n}\n","export interface PixelConfig {\n /** Public API key (pk_live_... or pk_test_...) or legacy token */\n token: string;\n /** API endpoint for tracking events */\n endpoint?: string;\n /** Cookie name for anonymous ID storage */\n cookieName?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Respect Do Not Track browser setting (default: true) */\n respectDNT?: boolean;\n}\n\n/** Alias for PixelConfig for SDK consistency */\nexport type PixelOptions = PixelConfig;\n\nexport interface TrackProps {\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Alias for TrackProps */\nexport type TrackEventProperties = TrackProps;\n\n/** Traits for identify calls */\nexport interface IdentifyTraits {\n first_name?: string;\n last_name?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Dynamic rule for context detection */\ninterface PixelRule {\n match_type: 'exact' | 'contains' | 'regex';\n url_pattern: string;\n page_type: string;\n selectors?: Record<string, string>;\n}\n\nconst OPT_OUT_KEY = 'smp_opt_out';\nconst IDENTIFIED_EMAIL_KEY = 'smp_identified_email';\n\nexport class SendmailPixel {\n private config: PixelConfig;\n private anonymousId: string;\n private initialized: boolean = false;\n private rules: PixelRule[] = [];\n private identifiedEmail: string | null = null;\n\n constructor(config: PixelConfig) {\n this.config = {\n endpoint: 'https://sendmailos.com/api/pixel/track',\n cookieName: 'sm_anon_id',\n debug: false,\n respectDNT: true,\n ...config\n };\n this.anonymousId = this.getOrSetAnonymousId();\n this.identifiedEmail = this.getStoredEmail();\n }\n\n public init() {\n if (this.initialized) return;\n\n if (typeof window === 'undefined') {\n return; // Server-side safety\n }\n\n // Check for opt-out\n if (this.isOptedOut()) {\n this.log('Tracking disabled (user opted out)');\n return;\n }\n\n // Check for Do Not Track\n if (this.config.respectDNT && this.isDNTEnabled()) {\n this.log('Tracking disabled (Do Not Track enabled)');\n return;\n }\n\n this.initialized = true;\n\n // Check URL for subscriber ID from email clicks\n this.checkUrlForSubscriber();\n\n // 0. Load Dynamic Rules (Async)\n this.loadRules();\n\n // 1. Auto-track Page View\n this.pageView();\n\n // 2. Setup Form Auto-Detection\n this.setupFormListeners();\n\n // 3. Track History State Changes (SPA Support)\n this.setupHistoryListeners();\n\n // 4. Setup data attribute tracking\n this.setupDataAttributeTracking();\n\n this.log('Pixel initialized with Token:', this.config.token);\n }\n\n /**\n * Opt out of all tracking\n */\n public optOut(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(OPT_OUT_KEY, 'true');\n }\n this.log('User opted out of tracking');\n }\n\n /**\n * Opt back in to tracking\n */\n public optIn(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(OPT_OUT_KEY);\n }\n if (!this.initialized && typeof window !== 'undefined') {\n this.init();\n }\n this.log('User opted in to tracking');\n }\n\n /**\n * Check if user has opted out\n */\n public isOptedOut(): boolean {\n if (typeof localStorage === 'undefined') return false;\n return localStorage.getItem(OPT_OUT_KEY) === 'true';\n }\n\n /**\n * Reset identity (e.g., on logout)\n */\n public reset(): void {\n this.identifiedEmail = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(IDENTIFIED_EMAIL_KEY);\n }\n // Generate new anonymous ID\n this.anonymousId = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, this.anonymousId, 365);\n this.log('Identity reset');\n }\n\n /**\n * Get current visitor/anonymous ID\n */\n public getVisitorId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get identified email address\n */\n public getIdentifiedEmail(): string | null {\n return this.identifiedEmail;\n }\n\n public track(eventName: string, properties: TrackProps = {}) {\n this.sendEvent('track', {\n event_name: eventName,\n properties\n });\n }\n\n public identify(email: string, traits: TrackProps = {}) {\n if (this.isOptedOut()) return;\n\n this.identifiedEmail = email;\n this.storeEmail(email);\n\n this.sendEvent('identify', {\n email,\n traits\n });\n }\n\n public pageView() {\n this.track('page_view', {\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n url: window.location.href\n });\n }\n\n // --- INTERNAL HELPERS ---\n\n private getOrSetAnonymousId(): string {\n if (typeof document === 'undefined') return '';\n\n let id = this.getCookie(this.config.cookieName!);\n if (!id) {\n id = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, id, 365);\n }\n return id;\n }\n\n private sendEvent(type: 'track' | 'identify', payload: any) {\n if (typeof window === 'undefined') return;\n\n // Auto-Enrichment (Smart Context)\n const smartContext = this.detectContext();\n\n const body = {\n type,\n token: this.config.token, // Send Token\n anonymous_id: this.anonymousId,\n url: window.location.href,\n timestamp: new Date().toISOString(),\n ...payload\n };\n\n // Capture UTMs on first touch -> sent via context in API\n // For simplicity, we just send context\n const context = {\n userAgent: navigator.userAgent,\n locale: navigator.language,\n screen: { width: window.screen.width, height: window.screen.height },\n search: window.location.search,\n title: document.title,\n referrer: document.referrer,\n ...smartContext // Merge smart context\n };\n\n const finalBody = { ...body, context };\n\n // Use Beacon API if available (better for page unload)\n if (navigator.sendBeacon && type === 'track') {\n const blob = new Blob([JSON.stringify(finalBody)], { type: 'application/json' });\n navigator.sendBeacon(this.config.endpoint!, blob);\n } else {\n fetch(this.config.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(finalBody),\n keepalive: true\n }).catch(err => {\n if (this.config.debug) console.error('[Pixel Error]', err);\n });\n }\n\n this.log(`Event Sent [${type}]`, body);\n }\n\n // Call this after init to load rules\n public async loadRules() {\n if (typeof window === 'undefined') return;\n try {\n // Updated Endpoint Query Param\n const res = await fetch(`${this.config.endpoint?.replace('/track', '')}/rules?token=${this.config.token}`);\n if (res.ok) {\n const data = await res.json();\n this.rules = data.rules || [];\n }\n } catch (e) {\n // silent fail\n }\n }\n\n /**\n * Smart Auto-Detection of Page Type & Context\n * Uses Dynamic Rules + Static Heuristics\n */\n private detectContext(): any {\n if (typeof document === 'undefined') return {};\n\n const path = window.location.pathname.toLowerCase();\n let context: any = {\n page_type: 'general', // Default\n topics: []\n };\n\n // 0. CHECK DYNAMIC RULES (Database / AI Optimized)\n for (const rule of this.rules) {\n let matched = false;\n // URL Pattern Match\n try {\n if (rule.match_type === 'exact' && path === rule.url_pattern) matched = true;\n else if (rule.match_type === 'contains' && path.includes(rule.url_pattern)) matched = true;\n else if (rule.match_type === 'regex' && new RegExp(rule.url_pattern).test(path)) matched = true;\n } catch (e) { }\n\n if (matched) {\n context.page_type = rule.page_type;\n\n // Extract Data via Selectors\n if (rule.selectors) {\n for (const [key, selector] of Object.entries(rule.selectors)) {\n const el = document.querySelector(selector as string);\n if (el) {\n // Try value (input), then textContent, then content (meta)\n const val = (el as HTMLInputElement).value || el.textContent || el.getAttribute('content');\n if (val) context[key] = val.trim();\n }\n }\n }\n // Stop after first strong match? Or continue to merge? \n // Let's stop to allow override of default heuristics.\n return context;\n }\n }\n\n // --- FALLBACK TO STATIC HEURISTICS ---\n\n // 1. URL Heuristics\n if (path.match(/\\/(cart|basket|bag)/)) context.page_type = 'cart';\n else if (path.match(/\\/(checkout|payment|order)/)) context.page_type = 'checkout';\n else if (path.match(/\\/(product|item|p)\\//)) context.page_type = 'product';\n else if (path.match(/\\/(category|c|collection)\\//)) context.page_type = 'category';\n else if (path.match(/\\/(blog|article|post|news)/)) context.page_type = 'content';\n else if (path.match(/\\/(login|signin)/)) context.page_type = 'auth';\n else if (path.match(/\\/(signup|register)/)) context.page_type = 'auth';\n else if (path.match(/\\/(pricing|plans)/)) context.page_type = 'pricing';\n else if (path.match(/\\/(thank-you|confirmation|success)/)) context.page_type = 'purchase_success';\n\n // 2. DOM/Meta Heuristics (Stronger Signals)\n\n // Product? (Schema.org or OG Tags)\n const ogType = document.querySelector('meta[property=\"og:type\"]')?.getAttribute('content');\n if (ogType === 'product') {\n context.page_type = 'product';\n // Try to scrape price\n const price = document.querySelector('meta[property=\"product:price:amount\"]')?.getAttribute('content');\n if (price) context.product_price = price;\n const currency = document.querySelector('meta[property=\"product:price:currency\"]')?.getAttribute('content');\n if (currency) context.currency = currency;\n }\n\n // Cart?\n if (document.querySelector('.cart-total') || document.querySelector('#cart-summary')) {\n context.page_type = 'cart';\n }\n\n // Checkout?\n if (document.querySelector('#card-element') || document.querySelector('input[name=\"card_number\"]')) {\n context.page_type = 'checkout';\n }\n\n // 3. Content Scraping (Keywords)\n const text = document.body.innerText.toLowerCase().slice(0, 2000); // Check first 2k chars\n if (text.includes('out of stock')) context.stock_status = 'out_of_stock';\n if (text.includes('limited time')) context.urgency = 'high';\n\n return context;\n }\n\n private setupFormListeners() {\n if (typeof document === 'undefined') return;\n\n // Debounce to avoid performance hit\n document.addEventListener('submit', (e) => {\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n // Look for email input\n const emailInput = form.querySelector('input[type=\"email\"]') as HTMLInputElement;\n if (emailInput && emailInput.value) {\n this.log('Auto-detected email form submission', emailInput.value);\n this.identify(emailInput.value);\n }\n }, true); // Capture phase to catch it before propagation stops\n }\n\n private setupHistoryListeners() {\n if (typeof window === 'undefined') return;\n\n const pushState = history.pushState;\n history.pushState = (...args) => {\n pushState.apply(history, args);\n this.pageView();\n };\n\n window.addEventListener('popstate', () => {\n this.pageView();\n });\n }\n\n // --- COOKIE UTILS ---\n\n private setCookie(name: string, value: string, days: number) {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = name + \"=\" + value + \";\" + expires + \";path=/;SameSite=Lax\";\n }\n\n private getCookie(name: string): string | null {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n }\n\n private log(...args: unknown[]) {\n if (this.config.debug) {\n console.log('[SendmailPixel]', ...args);\n }\n }\n\n private isDNTEnabled(): boolean {\n if (typeof navigator === 'undefined') return false;\n return navigator.doNotTrack === '1' ||\n (window as unknown as { doNotTrack?: string }).doNotTrack === '1';\n }\n\n private checkUrlForSubscriber(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const subscriberEmail = params.get('smp_email');\n const subscriberId = params.get('smp_sub');\n\n if (subscriberEmail) {\n try {\n const email = atob(subscriberEmail);\n if (this.isValidEmail(email)) {\n this.identify(email);\n }\n } catch {\n if (this.isValidEmail(subscriberEmail)) {\n this.identify(subscriberEmail);\n }\n }\n } else if (subscriberId) {\n this.track('email_link_clicked', { subscriber_id: subscriberId });\n }\n }\n\n private setupDataAttributeTracking(): void {\n if (typeof document === 'undefined') return;\n\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const tracked = target.closest('[data-smp-track]');\n\n if (tracked) {\n const eventName = tracked.getAttribute('data-smp-track');\n const properties: TrackProps = {};\n\n Array.from(tracked.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-smp-track-') && attr.name !== 'data-smp-track') {\n const propName = attr.name.replace('data-smp-track-', '').replace(/-/g, '_');\n properties[propName] = attr.value;\n }\n });\n\n if (eventName) {\n this.track(eventName, properties);\n }\n }\n });\n }\n\n private getStoredEmail(): string | null {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(IDENTIFIED_EMAIL_KEY);\n }\n\n private storeEmail(email: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(IDENTIFIED_EMAIL_KEY, email);\n }\n }\n\n private isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n }\n}\n\n/** Alias for SendmailPixel for SDK consistency */\nexport const Pixel = SendmailPixel;\n\n/**\n * Create pixel and attach global smp() function\n */\nexport function createGlobalPixel(config: PixelConfig): SendmailPixel {\n const pixel = new SendmailPixel(config);\n\n if (typeof window !== 'undefined') {\n const smpFunction = (method: string, ...args: unknown[]): unknown => {\n switch (method) {\n case 'track':\n pixel.track(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'identify':\n pixel.identify(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'page':\n pixel.pageView();\n return undefined;\n case 'optOut':\n pixel.optOut();\n return undefined;\n case 'optIn':\n pixel.optIn();\n return undefined;\n case 'isOptedOut':\n return pixel.isOptedOut();\n case 'reset':\n pixel.reset();\n return undefined;\n default:\n console.warn(`[SendmailPixel] Unknown method: ${method}`);\n return undefined;\n }\n };\n (window as unknown as { smp: typeof smpFunction }).smp = smpFunction;\n }\n\n pixel.init();\n return pixel;\n}\n","/**\n * React hook for SendMailOS Pixel tracking\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SendmailPixel, PixelConfig, TrackProps, IdentifyTraits } from '../pixel';\n\nexport interface UsePixelOptions extends Omit<PixelConfig, 'token'> {}\n\nexport interface UsePixelReturn {\n /** Track a custom event */\n track: (eventName: string, properties?: TrackProps) => void;\n /** Track a page view */\n page: () => void;\n /** Identify a user by email */\n identify: (email: string, traits?: IdentifyTraits) => void;\n /** Opt out of tracking */\n optOut: () => void;\n /** Opt back in to tracking */\n optIn: () => void;\n /** Check if opted out */\n isOptedOut: () => boolean;\n /** Reset identity (e.g., on logout) */\n reset: () => void;\n /** Get current visitor ID */\n getVisitorId: () => string | null;\n /** Pixel instance (for advanced usage) */\n pixel: SendmailPixel | null;\n}\n\n/**\n * React hook for pixel tracking\n *\n * @example\n * ```tsx\n * import { usePixel } from '@sendmailos/sdk/react';\n *\n * function MyComponent() {\n * const { track, identify } = usePixel('pk_live_...');\n *\n * const handleClick = () => {\n * track('button_clicked', { button_id: 'cta' });\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function usePixel(token: string, options?: UsePixelOptions): UsePixelReturn {\n const pixelRef = useRef<SendmailPixel | null>(null);\n\n // Initialize pixel once\n useEffect(() => {\n if (!pixelRef.current && typeof window !== 'undefined') {\n pixelRef.current = new SendmailPixel({\n token,\n ...options,\n });\n pixelRef.current.init();\n }\n }, [token, options]);\n\n const track = useCallback((eventName: string, properties?: TrackProps) => {\n pixelRef.current?.track(eventName, properties);\n }, []);\n\n const page = useCallback(() => {\n pixelRef.current?.pageView();\n }, []);\n\n const identify = useCallback((email: string, traits?: IdentifyTraits) => {\n pixelRef.current?.identify(email, traits);\n }, []);\n\n const optOut = useCallback(() => {\n pixelRef.current?.optOut();\n }, []);\n\n const optIn = useCallback(() => {\n pixelRef.current?.optIn();\n }, []);\n\n const isOptedOut = useCallback(() => {\n return pixelRef.current?.isOptedOut() ?? false;\n }, []);\n\n const reset = useCallback(() => {\n pixelRef.current?.reset();\n }, []);\n\n const getVisitorId = useCallback(() => {\n return pixelRef.current?.getVisitorId() ?? null;\n }, []);\n\n return {\n track,\n page,\n identify,\n optOut,\n optIn,\n isOptedOut,\n reset,\n getVisitorId,\n pixel: pixelRef.current,\n };\n}\n\n/**\n * Hook to track page views on route changes\n * Useful for Next.js App Router or React Router\n *\n * @example\n * ```tsx\n * import { usePageTracking } from '@sendmailos/sdk/react';\n * import { usePathname } from 'next/navigation';\n *\n * function Layout({ children }) {\n * const pathname = usePathname();\n * usePageTracking('pk_live_...', pathname);\n * return children;\n * }\n * ```\n */\nexport function usePageTracking(\n token: string,\n pathname: string,\n options?: UsePixelOptions\n): void {\n const { page } = usePixel(token, options);\n\n useEffect(() => {\n page();\n }, [pathname, page]);\n}\n\n/**\n * Hook to identify user when they log in\n *\n * @example\n * ```tsx\n * import { useIdentifyOnLogin } from '@sendmailos/sdk/react';\n *\n * function App() {\n * const { user } = useAuth();\n * useIdentifyOnLogin('pk_live_...', user?.email, {\n * first_name: user?.firstName,\n * plan: user?.plan,\n * });\n * return <Main />;\n * }\n * ```\n */\nexport function useIdentifyOnLogin(\n token: string,\n email: string | null | undefined,\n traits?: IdentifyTraits,\n options?: UsePixelOptions\n): void {\n const { identify, reset } = usePixel(token, options);\n\n useEffect(() => {\n if (email) {\n identify(email, traits);\n } else {\n // User logged out\n reset();\n }\n }, [email, traits, identify, reset]);\n}\n"]}
|
package/dist/react/index.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
5
5
|
var SendMailOSContext = createContext(null);
|
|
6
6
|
function SendMailOSProvider({
|
|
7
7
|
publicKey,
|
|
8
|
-
baseUrl = "https://
|
|
8
|
+
baseUrl = "https://sendmailos.com/api/v1",
|
|
9
9
|
children
|
|
10
10
|
}) {
|
|
11
11
|
if (!publicKey) {
|
package/dist/react/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/use-subscribe.ts","../../src/react/subscribe-form.tsx","../../src/pixel.ts","../../src/react/use-pixel.ts"],"names":["data","error","useState","jsx","useCallback"],"mappings":";;;;AAOA,IAAM,iBAAA,GAAoB,cAA6C,IAAI,CAAA;AA0BpE,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,OAAA,GAAU,mCAAA;AAAA,EACV;AACF,CAAA,EAA4B;AAC1B,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,SAAA;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE;AAAA,KACpC,CAAA;AAAA,IACA,CAAC,WAAW,OAAO;AAAA,GACrB;AAEA,EAAA,uBACE,GAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OACzB,QAAA,EACH,CAAA;AAEJ;AAKO,SAAS,aAAA,GAAwC;AACtD,EAAA,MAAM,OAAA,GAAU,WAAW,iBAAiB,CAAA;AAE5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAA;AACT;ACXO,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAQ,GAAI,aAAA,EAAc;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,OAAO,MAAA,KAAsD;AAC3D,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,YAAA,CAAa,KAAK,CAAA;AAElB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,UAC1D,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,YAAY,MAAA,CAAO,SAAA;AAAA,YACnB,WAAW,MAAA,CAAO,QAAA;AAAA,YAClB,MAAM,MAAA,CAAO;AAAA,WACd;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAMA,KAAAA,GAAO,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACnD,UAAA,MAAM,IAAI,KAAA,CAAMA,KAAAA,CAAK,KAAA,IAAS,qBAAqB,CAAA;AAAA,QACrD;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,YAAA,CAAa,KAAK,CAAA;AAElB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,YAAA,EAAc,KAAK,UAAA,EAAY,EAAA;AAAA,UAC/B,SAAS,IAAA,CAAK;AAAA,SAChB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAMC,SAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,eAAe,CAAA;AACpE,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAASA,OAAM,OAAA,EAAQ;AAAA,MAClD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,SAAS;AAAA,GACrB;AAEA,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;ACnFO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,kBAAA;AAAA,EACd,UAAA,GAAa,WAAA;AAAA,EACb,WAAA,GAAc,gBAAA;AAAA,EACd,cAAA,GAAiB,yBAAA;AAAA,EACjB,cAAA,GAAiB,KAAA;AAAA,EACjB;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,OAAO,SAAA,EAAW,KAAA,KAAU,YAAA,EAAa;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAiB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU;AAAA,MAC7B,KAAA;AAAA,MACA,SAAA,EAAW,iBAAiB,SAAA,GAAY,MAAA;AAAA,MACxC,QAAA,EAAU,iBAAiB,QAAA,GAAW,MAAA;AAAA,MACtC;AAAA,KACD,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,SAAA,IAAY;AACZ,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAChB,WAAW,KAAA,EAAO;AAChB,MAAA,OAAA,GAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EACzB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,OAAE,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,MAAA,EAAQ,CAAA,EAAE,EAAI,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,sBAC3DA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAU,MAAA;AAAA,YACV,UAAA,EAAY,aAAA;AAAA,YACZ,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ;AAAA,WACV;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAsB,KAAA,EACjD,QAAA,EAAA;AAAA,IAAA,cAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,KAAA,EAAO,YAAA,EAAc,KAAA,EAAM,EAC7D,QAAA,EAAA;AAAA,sBAAAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,SAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC5C,WAAA,EAAY,YAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAChB;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC3C,WAAA,EAAY,WAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAChB;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBAGF,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,OAAM,EACxC,QAAA,EAAA;AAAA,sBAAAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA;AAAA,UACA,QAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,SAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAChB;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,aAAa,CAAC,KAAA;AAAA,UACxB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,UAAA;AAAA,YACT,eAAA,EAAiB,YAAY,SAAA,GAAY,SAAA;AAAA,YACzC,KAAA,EAAO,OAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ,YAAY,aAAA,GAAgB,SAAA;AAAA,YACpC,UAAA,EAAY;AAAA,WACd;AAAA,UAEC,sBAAY,WAAA,GAAc;AAAA;AAAA;AAC7B,KAAA,EACF,CAAA;AAAA,IAEC,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAM,EAC9D,gBAAM,OAAA,EACT;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;ACzIA,IAAM,WAAA,GAAc,aAAA;AACpB,IAAM,oBAAA,GAAuB,sBAAA;AAEtB,IAAM,gBAAN,MAAoB;AAAA,EAOvB,YAAY,MAAA,EAAqB;AAJjC,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAQ,QAAqB,EAAC;AAC9B,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAGrC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,QAAA,EAAU,wCAAA;AAAA,MACV,UAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,GAAG;AAAA,KACP;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,mBAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,cAAA,EAAe;AAAA,EAC/C;AAAA,EAEO,IAAA,GAAO;AACV,IAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,YAAW,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAC7C,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,cAAa,EAAG;AAC/C,MAAA,IAAA,CAAK,IAAI,0CAA0C,CAAA;AACnD,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAGnB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAG3B,IAAA,IAAA,CAAK,SAAA,EAAU;AAGf,IAAA,IAAA,CAAK,QAAA,EAAS;AAGd,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAGxB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAG3B,IAAA,IAAA,CAAK,0BAAA,EAA2B;AAEhC,IAAA,IAAA,CAAK,GAAA,CAAI,+BAAA,EAAiC,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKO,MAAA,GAAe;AAClB,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAa,MAAM,CAAA;AAAA,IAC5C;AACA,IAAA,IAAA,CAAK,IAAI,4BAA4B,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACjB,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,WAAW,WAAW,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,OAAO,WAAW,WAAA,EAAa;AACpD,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd;AACA,IAAA,IAAA,CAAK,IAAI,2BAA2B,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,UAAA,GAAsB;AACzB,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,KAAA;AAChD,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,KAAM,MAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,WAAW,oBAAoB,CAAA;AAAA,IAChD;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,UAAA,EAAW;AACrC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAa,IAAA,CAAK,aAAa,GAAG,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAI,gBAAgB,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKO,YAAA,GAAuB;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,GAAoC;AACvC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EAChB;AAAA,EAEO,KAAA,CAAM,SAAA,EAAmB,UAAA,GAAyB,EAAC,EAAG;AACzD,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS;AAAA,MACpB,UAAA,EAAY,SAAA;AAAA,MACZ;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEO,QAAA,CAAS,KAAA,EAAe,MAAA,GAAqB,EAAC,EAAG;AACpD,IAAA,IAAI,IAAA,CAAK,YAAW,EAAG;AAEvB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAErB,IAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,MACvB,KAAA;AAAA,MACA;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEO,QAAA,GAAW;AACd,IAAA,IAAA,CAAK,MAAM,WAAA,EAAa;AAAA,MACpB,IAAA,EAAM,OAAO,QAAA,CAAS,QAAA;AAAA,MACtB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,GAAA,EAAK,OAAO,QAAA,CAAS;AAAA,KACxB,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,mBAAA,GAA8B;AAClC,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,EAAA;AAE5C,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,UAAW,CAAA;AAC/C,IAAA,IAAI,CAAC,EAAA,EAAI;AACL,MAAA,EAAA,GAAK,OAAO,UAAA,EAAW;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAa,IAAI,GAAG,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,EAAA;AAAA,EACX;AAAA,EAEQ,SAAA,CAAU,MAA4B,OAAA,EAAc;AACxD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,IAAA,MAAM,YAAA,GAAe,KAAK,aAAA,EAAc;AAExC,IAAA,MAAM,IAAA,GAAO;AAAA,MACT,IAAA;AAAA,MACA,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA;AAAA,MACnB,cAAc,IAAA,CAAK,WAAA;AAAA,MACnB,GAAA,EAAK,OAAO,QAAA,CAAS,IAAA;AAAA,MACrB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,GAAG;AAAA,KACP;AAIA,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,QAAQ,SAAA,CAAU,QAAA;AAAA,MAClB,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,EAAO;AAAA,MACnE,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA;AAAA,MACxB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,GAAG;AAAA;AAAA,KACP;AAEA,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,IAAA,EAAM,OAAA,EAAQ;AAGrC,IAAA,IAAI,SAAA,CAAU,UAAA,IAAc,IAAA,KAAS,OAAA,EAAS;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAC/E,MAAA,SAAA,CAAU,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAW,IAAI,CAAA;AAAA,IACpD,CAAA,MAAO;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,OAAO,QAAA,EAAW;AAAA,QACzB,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,QAC9B,SAAA,EAAW;AAAA,OACd,CAAA,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,QAAA,IAAI,KAAK,MAAA,CAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,iBAAiB,GAAG,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,CAAA,EAAK,IAAI,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,MAAa,SAAA,GAAY;AACrB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAA,CAAO,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AACzG,MAAA,IAAI,IAAI,EAAA,EAAI;AACR,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,MAChC;AAAA,IACJ,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAA,GAAqB;AACzB,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,EAAC;AAE7C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,WAAA,EAAY;AAClD,IAAA,IAAI,OAAA,GAAe;AAAA,MACf,SAAA,EAAW,SAAA;AAAA;AAAA,MACX,QAAQ;AAAC,KACb;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC3B,MAAA,IAAI,OAAA,GAAU,KAAA;AAEd,MAAA,IAAI;AACA,QAAA,IAAI,KAAK,UAAA,KAAe,OAAA,IAAW,IAAA,KAAS,IAAA,CAAK,aAAa,OAAA,GAAU,IAAA;AAAA,aAAA,IAC/D,IAAA,CAAK,eAAe,UAAA,IAAc,IAAA,CAAK,SAAS,IAAA,CAAK,WAAW,GAAG,OAAA,GAAU,IAAA;AAAA,aAAA,IAC7E,IAAA,CAAK,UAAA,KAAe,OAAA,IAAW,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,IAAA;AAAA,MAC/F,SAAS,CAAA,EAAG;AAAA,MAAE;AAEd,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,SAAA;AAGzB,QAAA,IAAI,KAAK,SAAA,EAAW;AAChB,UAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1D,YAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAkB,CAAA;AACpD,YAAA,IAAI,EAAA,EAAI;AAEJ,cAAA,MAAM,MAAO,EAAA,CAAwB,KAAA,IAAS,GAAG,WAAA,IAAe,EAAA,CAAG,aAAa,SAAS,CAAA;AACzF,cAAA,IAAI,GAAA,EAAK,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAI,IAAA,EAAK;AAAA,YACrC;AAAA,UACJ;AAAA,QACJ;AAGA,QAAA,OAAO,OAAA;AAAA,MACX;AAAA,IACJ;AAKA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,UAAW,SAAA,GAAY,MAAA;AAAA,SAAA,IAClD,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA,UAAW,SAAA,GAAY,UAAA;AAAA,SAAA,IAC9D,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA,UAAW,SAAA,GAAY,SAAA;AAAA,SAAA,IACxD,IAAA,CAAK,KAAA,CAAM,6BAA6B,CAAA,UAAW,SAAA,GAAY,UAAA;AAAA,SAAA,IAC/D,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA,UAAW,SAAA,GAAY,SAAA;AAAA,SAAA,IAC9D,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,UAAW,SAAA,GAAY,MAAA;AAAA,SAAA,IACpD,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,UAAW,SAAA,GAAY,MAAA;AAAA,SAAA,IACvD,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA,UAAW,SAAA,GAAY,SAAA;AAAA,SAAA,IACrD,IAAA,CAAK,KAAA,CAAM,oCAAoC,CAAA,UAAW,SAAA,GAAY,kBAAA;AAK/E,IAAA,MAAM,SAAS,QAAA,CAAS,aAAA,CAAc,0BAA0B,CAAA,EAAG,aAAa,SAAS,CAAA;AACzF,IAAA,IAAI,WAAW,SAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,SAAA,GAAY,SAAA;AAEpB,MAAA,MAAM,QAAQ,QAAA,CAAS,aAAA,CAAc,uCAAuC,CAAA,EAAG,aAAa,SAAS,CAAA;AACrG,MAAA,IAAI,KAAA,UAAe,aAAA,GAAgB,KAAA;AACnC,MAAA,MAAM,WAAW,QAAA,CAAS,aAAA,CAAc,yCAAyC,CAAA,EAAG,aAAa,SAAS,CAAA;AAC1G,MAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AAAA,IACrC;AAGA,IAAA,IAAI,SAAS,aAAA,CAAc,aAAa,KAAK,QAAA,CAAS,aAAA,CAAc,eAAe,CAAA,EAAG;AAClF,MAAA,OAAA,CAAQ,SAAA,GAAY,MAAA;AAAA,IACxB;AAGA,IAAA,IAAI,SAAS,aAAA,CAAc,eAAe,KAAK,QAAA,CAAS,aAAA,CAAc,2BAA2B,CAAA,EAAG;AAChG,MAAA,OAAA,CAAQ,SAAA,GAAY,UAAA;AAAA,IACxB;AAGA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,SAAA,CAAU,aAAY,CAAE,KAAA,CAAM,GAAG,GAAI,CAAA;AAChE,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,UAAW,YAAA,GAAe,cAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,UAAW,OAAA,GAAU,MAAA;AAErD,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,kBAAA,GAAqB;AACzB,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAGrC,IAAA,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,CAAC,CAAA,KAAM;AACvC,MAAA,MAAM,OAAO,CAAA,CAAE,MAAA;AACf,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,qBAAqB,CAAA;AAC3D,MAAA,IAAI,UAAA,IAAc,WAAW,KAAA,EAAO;AAChC,QAAA,IAAA,CAAK,GAAA,CAAI,qCAAA,EAAuC,UAAA,CAAW,KAAK,CAAA;AAChE,QAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,MAClC;AAAA,IACJ,GAAG,IAAI,CAAA;AAAA,EACX;AAAA,EAEQ,qBAAA,GAAwB;AAC5B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,IAAA,OAAA,CAAQ,SAAA,GAAY,IAAI,IAAA,KAAS;AAC7B,MAAA,SAAA,CAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAC7B,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAClB,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM;AACtC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAClB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,IAAA,EAAc;AACzD,IAAA,MAAM,CAAA,uBAAQ,IAAA,EAAK;AACnB,IAAA,CAAA,CAAE,OAAA,CAAQ,EAAE,OAAA,EAAQ,GAAK,OAAO,EAAA,GAAK,EAAA,GAAK,KAAK,GAAK,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,UAAA,GAAa,CAAA,CAAE,WAAA,EAAY;AAC3C,IAAA,QAAA,CAAS,MAAA,GAAS,IAAA,GAAO,GAAA,GAAM,KAAA,GAAQ,MAAM,OAAA,GAAU,sBAAA;AAAA,EAC3D;AAAA,EAEQ,UAAU,IAAA,EAA6B;AAC3C,IAAA,MAAM,SAAS,IAAA,GAAO,GAAA;AACtB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAChC,MAAA,IAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AACZ,MAAA,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,IAAK,GAAA,MAAS,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA;AACtD,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,IAAK,CAAA,EAAG,OAAO,CAAA,CAAE,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA;AAAA,IAC1E;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,OAAO,IAAA,EAAiB;AAC5B,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACnB,MAAA,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB,GAAG,IAAI,CAAA;AAAA,IAC1C;AAAA,EACJ;AAAA,EAEQ,YAAA,GAAwB;AAC5B,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAC7C,IAAA,OAAO,SAAA,CAAU,UAAA,KAAe,GAAA,IACxB,MAAA,CAA8C,UAAA,KAAe,GAAA;AAAA,EACzE;AAAA,EAEQ,qBAAA,GAA8B;AAClC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAEzC,IAAA,IAAI,eAAA,EAAiB;AACjB,MAAA,IAAI;AACA,QAAA,MAAM,KAAA,GAAQ,KAAK,eAAe,CAAA;AAClC,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AAC1B,UAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,QACvB;AAAA,MACJ,CAAA,CAAA,MAAQ;AACJ,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,EAAG;AACpC,UAAA,IAAA,CAAK,SAAS,eAAe,CAAA;AAAA,QACjC;AAAA,MACJ;AAAA,IACJ,WAAW,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,KAAA,CAAM,oBAAA,EAAsB,EAAE,aAAA,EAAe,cAAc,CAAA;AAAA,IACpE;AAAA,EACJ;AAAA,EAEQ,0BAAA,GAAmC;AACvC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACtC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA;AAEjD,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,gBAAgB,CAAA;AACvD,QAAA,MAAM,aAAyB,EAAC;AAEhC,QAAA,KAAA,CAAM,KAAK,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7C,UAAA,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,iBAAiB,CAAA,IAAK,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAC3E,YAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,OAAA,CAAQ,mBAAmB,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC3E,YAAA,UAAA,CAAW,QAAQ,IAAI,IAAA,CAAK,KAAA;AAAA,UAChC;AAAA,QACJ,CAAC,CAAA;AAED,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,IAAA,CAAK,KAAA,CAAM,WAAW,UAAU,CAAA;AAAA,QACpC;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,cAAA,GAAgC;AACpC,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,IAAA;AAChD,IAAA,OAAO,YAAA,CAAa,QAAQ,oBAAoB,CAAA;AAAA,EACpD;AAAA,EAEQ,WAAW,KAAA,EAAqB;AACpC,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,OAAA,CAAQ,sBAAsB,KAAK,CAAA;AAAA,IACpD;AAAA,EACJ;AAAA,EAEQ,aAAa,KAAA,EAAwB;AACzC,IAAA,OAAO,4BAAA,CAA6B,KAAK,KAAK,CAAA;AAAA,EAClD;AACJ,CAAA;;;AC5aO,SAAS,QAAA,CAAS,OAAe,OAAA,EAA2C;AACjF,EAAA,MAAM,QAAA,GAAW,OAA6B,IAAI,CAAA;AAGlD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,OAAO,WAAW,WAAA,EAAa;AACtD,MAAA,QAAA,CAAS,OAAA,GAAU,IAAI,aAAA,CAAc;AAAA,QACnC,KAAA;AAAA,QACA,GAAG;AAAA,OACJ,CAAA;AACD,MAAA,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,MAAM,KAAA,GAAQC,WAAAA,CAAY,CAAC,SAAA,EAAmB,UAAA,KAA4B;AACxE,IAAA,QAAA,CAAS,OAAA,EAAS,KAAA,CAAM,SAAA,EAAW,UAAU,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,QAAA,CAAS,SAAS,QAAA,EAAS;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,CAAC,KAAA,EAAe,MAAA,KAA4B;AACvE,IAAA,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,SAAS,MAAA,EAAO;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,OAAO,QAAA,CAAS,OAAA,EAAS,UAAA,EAAW,IAAK,KAAA;AAAA,EAC3C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AACrC,IAAA,OAAO,QAAA,CAAS,OAAA,EAAS,YAAA,EAAa,IAAK,IAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAO,QAAA,CAAS;AAAA,GAClB;AACF;AAkBO,SAAS,eAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,QAAA,CAAS,OAAO,OAAO,CAAA;AAExC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAA,EAAK;AAAA,EACP,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AACrB;AAmBO,SAAS,kBAAA,CACd,KAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,QAAA,CAAS,OAAO,OAAO,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IACxB,CAAA,MAAO;AAEL,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA;AACrC","file":"index.mjs","sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\n\ninterface SendMailOSContextValue {\n publicKey: string;\n baseUrl: string;\n}\n\nconst SendMailOSContext = createContext<SendMailOSContextValue | null>(null);\n\nexport interface SendMailOSProviderProps {\n /** Your public key (pk_live_... or pk_test_...) */\n publicKey: string;\n /** Custom API base URL (optional) */\n baseUrl?: string;\n children: React.ReactNode;\n}\n\n/**\n * Provider component for SendMailOS React integration\n * \n * @example\n * ```tsx\n * import { SendMailOSProvider } from '@sendmailos/sdk/react';\n * \n * function App() {\n * return (\n * <SendMailOSProvider publicKey=\"pk_live_...\">\n * <YourApp />\n * </SendMailOSProvider>\n * );\n * }\n * ```\n */\nexport function SendMailOSProvider({\n publicKey,\n baseUrl = 'https://api.sendmailos.com/api/v1',\n children,\n}: SendMailOSProviderProps) {\n if (!publicKey) {\n throw new Error('SendMailOSProvider requires a publicKey');\n }\n\n if (!publicKey.startsWith('pk_')) {\n console.warn(\n '[SendMailOS] Public keys should start with \"pk_\". ' +\n 'Never expose secret keys (sk_) in client-side code.'\n );\n }\n\n const value = useMemo(\n () => ({\n publicKey,\n baseUrl: baseUrl.replace(/\\/$/, ''),\n }),\n [publicKey, baseUrl]\n );\n\n return (\n <SendMailOSContext.Provider value={value}>\n {children}\n </SendMailOSContext.Provider>\n );\n}\n\n/**\n * Hook to access SendMailOS context\n */\nexport function useSendMailOS(): SendMailOSContextValue {\n const context = useContext(SendMailOSContext);\n \n if (!context) {\n throw new Error('useSendMailOS must be used within a SendMailOSProvider');\n }\n \n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useSendMailOS } from './provider';\n\ninterface SubscribeParams {\n email: string;\n firstName?: string;\n lastName?: string;\n tags?: string[];\n}\n\ninterface SubscribeResult {\n success: boolean;\n subscriberId?: string;\n message?: string;\n}\n\ninterface UseSubscribeReturn {\n /** Subscribe a new email address */\n subscribe: (params: SubscribeParams) => Promise<SubscribeResult>;\n /** Loading state */\n isLoading: boolean;\n /** Error message if subscription failed */\n error: Error | null;\n /** Success state */\n isSuccess: boolean;\n /** Reset the hook state */\n reset: () => void;\n}\n\n/**\n * Hook for subscribing users to your email list\n * \n * @example\n * ```tsx\n * function NewsletterForm() {\n * const { subscribe, isLoading, error, isSuccess } = useSubscribe();\n * const [email, setEmail] = useState('');\n * \n * const handleSubmit = async (e) => {\n * e.preventDefault();\n * await subscribe({ email, tags: ['newsletter'] });\n * };\n * \n * if (isSuccess) {\n * return <p>Thanks for subscribing!</p>;\n * }\n * \n * return (\n * <form onSubmit={handleSubmit}>\n * <input\n * type=\"email\"\n * value={email}\n * onChange={(e) => setEmail(e.target.value)}\n * placeholder=\"Enter your email\"\n * />\n * <button disabled={isLoading}>\n * {isLoading ? 'Subscribing...' : 'Subscribe'}\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\nexport function useSubscribe(): UseSubscribeReturn {\n const { publicKey, baseUrl } = useSendMailOS();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isSuccess, setIsSuccess] = useState(false);\n\n const reset = useCallback(() => {\n setIsLoading(false);\n setError(null);\n setIsSuccess(false);\n }, []);\n\n const subscribe = useCallback(\n async (params: SubscribeParams): Promise<SubscribeResult> => {\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n const response = await fetch(`${baseUrl}/public/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Public-Key': publicKey,\n },\n body: JSON.stringify({\n email: params.email,\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n }),\n });\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || 'Failed to subscribe');\n }\n\n const data = await response.json();\n setIsSuccess(true);\n setIsLoading(false);\n\n return {\n success: true,\n subscriberId: data.subscriber?.id,\n message: data.message,\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n setIsLoading(false);\n return { success: false, message: error.message };\n }\n },\n [baseUrl, publicKey]\n );\n\n return {\n subscribe,\n isLoading,\n error,\n isSuccess,\n reset,\n };\n}\n","import React, { useState, FormEvent } from 'react';\nimport { useSubscribe } from './use-subscribe';\n\nexport interface SubscribeFormProps {\n /** Tags to apply to new subscribers */\n tags?: string[];\n /** Callback when subscription succeeds */\n onSuccess?: () => void;\n /** Callback when subscription fails */\n onError?: (error: Error) => void;\n /** CSS class for the form container */\n className?: string;\n /** Placeholder text for email input */\n placeholder?: string;\n /** Text for submit button */\n buttonText?: string;\n /** Text shown while loading */\n loadingText?: string;\n /** Text shown on success */\n successMessage?: string;\n /** Whether to show first/last name fields */\n showNameFields?: boolean;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Pre-built newsletter subscription form\n * \n * @example\n * ```tsx\n * import { SubscribeForm } from '@sendmailos/sdk/react';\n * \n * function Newsletter() {\n * return (\n * <SubscribeForm\n * tags={['newsletter']}\n * onSuccess={() => console.log('Subscribed!')}\n * buttonText=\"Join Newsletter\"\n * placeholder=\"you@example.com\"\n * />\n * );\n * }\n * ```\n */\nexport function SubscribeForm({\n tags,\n onSuccess,\n onError,\n className,\n placeholder = 'Enter your email',\n buttonText = 'Subscribe',\n loadingText = 'Subscribing...',\n successMessage = 'Thanks for subscribing!',\n showNameFields = false,\n style,\n}: SubscribeFormProps) {\n const { subscribe, isLoading, error, isSuccess, reset } = useSubscribe();\n const [email, setEmail] = useState('');\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n \n const result = await subscribe({\n email,\n firstName: showNameFields ? firstName : undefined,\n lastName: showNameFields ? lastName : undefined,\n tags,\n });\n\n if (result.success) {\n onSuccess?.();\n setEmail('');\n setFirstName('');\n setLastName('');\n } else if (error) {\n onError?.(error);\n }\n };\n\n if (isSuccess) {\n return (\n <div className={className} style={style}>\n <p style={{ color: '#10b981', margin: 0 }}>{successMessage}</p>\n <button\n type=\"button\"\n onClick={reset}\n style={{\n marginTop: '8px',\n padding: '4px 8px',\n fontSize: '12px',\n background: 'transparent',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Subscribe another\n </button>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className} style={style}>\n {showNameFields && (\n <div style={{ display: 'flex', gap: '8px', marginBottom: '8px' }}>\n <input\n type=\"text\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n placeholder=\"First name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <input\n type=\"text\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n placeholder=\"Last name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n </div>\n )}\n \n <div style={{ display: 'flex', gap: '8px' }}>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={placeholder}\n required\n disabled={isLoading}\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <button\n type=\"submit\"\n disabled={isLoading || !email}\n style={{\n padding: '8px 16px',\n backgroundColor: isLoading ? '#9ca3af' : '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n }}\n >\n {isLoading ? loadingText : buttonText}\n </button>\n </div>\n \n {error && (\n <p style={{ color: '#ef4444', fontSize: '14px', marginTop: '8px' }}>\n {error.message}\n </p>\n )}\n </form>\n );\n}\n","export interface PixelConfig {\n /** Public API key (pk_live_... or pk_test_...) or legacy token */\n token: string;\n /** API endpoint for tracking events */\n endpoint?: string;\n /** Cookie name for anonymous ID storage */\n cookieName?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Respect Do Not Track browser setting (default: true) */\n respectDNT?: boolean;\n}\n\n/** Alias for PixelConfig for SDK consistency */\nexport type PixelOptions = PixelConfig;\n\nexport interface TrackProps {\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Alias for TrackProps */\nexport type TrackEventProperties = TrackProps;\n\n/** Traits for identify calls */\nexport interface IdentifyTraits {\n first_name?: string;\n last_name?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Dynamic rule for context detection */\ninterface PixelRule {\n match_type: 'exact' | 'contains' | 'regex';\n url_pattern: string;\n page_type: string;\n selectors?: Record<string, string>;\n}\n\nconst OPT_OUT_KEY = 'smp_opt_out';\nconst IDENTIFIED_EMAIL_KEY = 'smp_identified_email';\n\nexport class SendmailPixel {\n private config: PixelConfig;\n private anonymousId: string;\n private initialized: boolean = false;\n private rules: PixelRule[] = [];\n private identifiedEmail: string | null = null;\n\n constructor(config: PixelConfig) {\n this.config = {\n endpoint: 'https://sendmailos.com/api/pixel/track',\n cookieName: 'sm_anon_id',\n debug: false,\n respectDNT: true,\n ...config\n };\n this.anonymousId = this.getOrSetAnonymousId();\n this.identifiedEmail = this.getStoredEmail();\n }\n\n public init() {\n if (this.initialized) return;\n\n if (typeof window === 'undefined') {\n return; // Server-side safety\n }\n\n // Check for opt-out\n if (this.isOptedOut()) {\n this.log('Tracking disabled (user opted out)');\n return;\n }\n\n // Check for Do Not Track\n if (this.config.respectDNT && this.isDNTEnabled()) {\n this.log('Tracking disabled (Do Not Track enabled)');\n return;\n }\n\n this.initialized = true;\n\n // Check URL for subscriber ID from email clicks\n this.checkUrlForSubscriber();\n\n // 0. Load Dynamic Rules (Async)\n this.loadRules();\n\n // 1. Auto-track Page View\n this.pageView();\n\n // 2. Setup Form Auto-Detection\n this.setupFormListeners();\n\n // 3. Track History State Changes (SPA Support)\n this.setupHistoryListeners();\n\n // 4. Setup data attribute tracking\n this.setupDataAttributeTracking();\n\n this.log('Pixel initialized with Token:', this.config.token);\n }\n\n /**\n * Opt out of all tracking\n */\n public optOut(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(OPT_OUT_KEY, 'true');\n }\n this.log('User opted out of tracking');\n }\n\n /**\n * Opt back in to tracking\n */\n public optIn(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(OPT_OUT_KEY);\n }\n if (!this.initialized && typeof window !== 'undefined') {\n this.init();\n }\n this.log('User opted in to tracking');\n }\n\n /**\n * Check if user has opted out\n */\n public isOptedOut(): boolean {\n if (typeof localStorage === 'undefined') return false;\n return localStorage.getItem(OPT_OUT_KEY) === 'true';\n }\n\n /**\n * Reset identity (e.g., on logout)\n */\n public reset(): void {\n this.identifiedEmail = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(IDENTIFIED_EMAIL_KEY);\n }\n // Generate new anonymous ID\n this.anonymousId = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, this.anonymousId, 365);\n this.log('Identity reset');\n }\n\n /**\n * Get current visitor/anonymous ID\n */\n public getVisitorId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get identified email address\n */\n public getIdentifiedEmail(): string | null {\n return this.identifiedEmail;\n }\n\n public track(eventName: string, properties: TrackProps = {}) {\n this.sendEvent('track', {\n event_name: eventName,\n properties\n });\n }\n\n public identify(email: string, traits: TrackProps = {}) {\n if (this.isOptedOut()) return;\n\n this.identifiedEmail = email;\n this.storeEmail(email);\n\n this.sendEvent('identify', {\n email,\n traits\n });\n }\n\n public pageView() {\n this.track('page_view', {\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n url: window.location.href\n });\n }\n\n // --- INTERNAL HELPERS ---\n\n private getOrSetAnonymousId(): string {\n if (typeof document === 'undefined') return '';\n\n let id = this.getCookie(this.config.cookieName!);\n if (!id) {\n id = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, id, 365);\n }\n return id;\n }\n\n private sendEvent(type: 'track' | 'identify', payload: any) {\n if (typeof window === 'undefined') return;\n\n // Auto-Enrichment (Smart Context)\n const smartContext = this.detectContext();\n\n const body = {\n type,\n token: this.config.token, // Send Token\n anonymous_id: this.anonymousId,\n url: window.location.href,\n timestamp: new Date().toISOString(),\n ...payload\n };\n\n // Capture UTMs on first touch -> sent via context in API\n // For simplicity, we just send context\n const context = {\n userAgent: navigator.userAgent,\n locale: navigator.language,\n screen: { width: window.screen.width, height: window.screen.height },\n search: window.location.search,\n title: document.title,\n referrer: document.referrer,\n ...smartContext // Merge smart context\n };\n\n const finalBody = { ...body, context };\n\n // Use Beacon API if available (better for page unload)\n if (navigator.sendBeacon && type === 'track') {\n const blob = new Blob([JSON.stringify(finalBody)], { type: 'application/json' });\n navigator.sendBeacon(this.config.endpoint!, blob);\n } else {\n fetch(this.config.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(finalBody),\n keepalive: true\n }).catch(err => {\n if (this.config.debug) console.error('[Pixel Error]', err);\n });\n }\n\n this.log(`Event Sent [${type}]`, body);\n }\n\n // Call this after init to load rules\n public async loadRules() {\n if (typeof window === 'undefined') return;\n try {\n // Updated Endpoint Query Param\n const res = await fetch(`${this.config.endpoint?.replace('/track', '')}/rules?token=${this.config.token}`);\n if (res.ok) {\n const data = await res.json();\n this.rules = data.rules || [];\n }\n } catch (e) {\n // silent fail\n }\n }\n\n /**\n * Smart Auto-Detection of Page Type & Context\n * Uses Dynamic Rules + Static Heuristics\n */\n private detectContext(): any {\n if (typeof document === 'undefined') return {};\n\n const path = window.location.pathname.toLowerCase();\n let context: any = {\n page_type: 'general', // Default\n topics: []\n };\n\n // 0. CHECK DYNAMIC RULES (Database / AI Optimized)\n for (const rule of this.rules) {\n let matched = false;\n // URL Pattern Match\n try {\n if (rule.match_type === 'exact' && path === rule.url_pattern) matched = true;\n else if (rule.match_type === 'contains' && path.includes(rule.url_pattern)) matched = true;\n else if (rule.match_type === 'regex' && new RegExp(rule.url_pattern).test(path)) matched = true;\n } catch (e) { }\n\n if (matched) {\n context.page_type = rule.page_type;\n\n // Extract Data via Selectors\n if (rule.selectors) {\n for (const [key, selector] of Object.entries(rule.selectors)) {\n const el = document.querySelector(selector as string);\n if (el) {\n // Try value (input), then textContent, then content (meta)\n const val = (el as HTMLInputElement).value || el.textContent || el.getAttribute('content');\n if (val) context[key] = val.trim();\n }\n }\n }\n // Stop after first strong match? Or continue to merge? \n // Let's stop to allow override of default heuristics.\n return context;\n }\n }\n\n // --- FALLBACK TO STATIC HEURISTICS ---\n\n // 1. URL Heuristics\n if (path.match(/\\/(cart|basket|bag)/)) context.page_type = 'cart';\n else if (path.match(/\\/(checkout|payment|order)/)) context.page_type = 'checkout';\n else if (path.match(/\\/(product|item|p)\\//)) context.page_type = 'product';\n else if (path.match(/\\/(category|c|collection)\\//)) context.page_type = 'category';\n else if (path.match(/\\/(blog|article|post|news)/)) context.page_type = 'content';\n else if (path.match(/\\/(login|signin)/)) context.page_type = 'auth';\n else if (path.match(/\\/(signup|register)/)) context.page_type = 'auth';\n else if (path.match(/\\/(pricing|plans)/)) context.page_type = 'pricing';\n else if (path.match(/\\/(thank-you|confirmation|success)/)) context.page_type = 'purchase_success';\n\n // 2. DOM/Meta Heuristics (Stronger Signals)\n\n // Product? (Schema.org or OG Tags)\n const ogType = document.querySelector('meta[property=\"og:type\"]')?.getAttribute('content');\n if (ogType === 'product') {\n context.page_type = 'product';\n // Try to scrape price\n const price = document.querySelector('meta[property=\"product:price:amount\"]')?.getAttribute('content');\n if (price) context.product_price = price;\n const currency = document.querySelector('meta[property=\"product:price:currency\"]')?.getAttribute('content');\n if (currency) context.currency = currency;\n }\n\n // Cart?\n if (document.querySelector('.cart-total') || document.querySelector('#cart-summary')) {\n context.page_type = 'cart';\n }\n\n // Checkout?\n if (document.querySelector('#card-element') || document.querySelector('input[name=\"card_number\"]')) {\n context.page_type = 'checkout';\n }\n\n // 3. Content Scraping (Keywords)\n const text = document.body.innerText.toLowerCase().slice(0, 2000); // Check first 2k chars\n if (text.includes('out of stock')) context.stock_status = 'out_of_stock';\n if (text.includes('limited time')) context.urgency = 'high';\n\n return context;\n }\n\n private setupFormListeners() {\n if (typeof document === 'undefined') return;\n\n // Debounce to avoid performance hit\n document.addEventListener('submit', (e) => {\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n // Look for email input\n const emailInput = form.querySelector('input[type=\"email\"]') as HTMLInputElement;\n if (emailInput && emailInput.value) {\n this.log('Auto-detected email form submission', emailInput.value);\n this.identify(emailInput.value);\n }\n }, true); // Capture phase to catch it before propagation stops\n }\n\n private setupHistoryListeners() {\n if (typeof window === 'undefined') return;\n\n const pushState = history.pushState;\n history.pushState = (...args) => {\n pushState.apply(history, args);\n this.pageView();\n };\n\n window.addEventListener('popstate', () => {\n this.pageView();\n });\n }\n\n // --- COOKIE UTILS ---\n\n private setCookie(name: string, value: string, days: number) {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = name + \"=\" + value + \";\" + expires + \";path=/;SameSite=Lax\";\n }\n\n private getCookie(name: string): string | null {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n }\n\n private log(...args: unknown[]) {\n if (this.config.debug) {\n console.log('[SendmailPixel]', ...args);\n }\n }\n\n private isDNTEnabled(): boolean {\n if (typeof navigator === 'undefined') return false;\n return navigator.doNotTrack === '1' ||\n (window as unknown as { doNotTrack?: string }).doNotTrack === '1';\n }\n\n private checkUrlForSubscriber(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const subscriberEmail = params.get('smp_email');\n const subscriberId = params.get('smp_sub');\n\n if (subscriberEmail) {\n try {\n const email = atob(subscriberEmail);\n if (this.isValidEmail(email)) {\n this.identify(email);\n }\n } catch {\n if (this.isValidEmail(subscriberEmail)) {\n this.identify(subscriberEmail);\n }\n }\n } else if (subscriberId) {\n this.track('email_link_clicked', { subscriber_id: subscriberId });\n }\n }\n\n private setupDataAttributeTracking(): void {\n if (typeof document === 'undefined') return;\n\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const tracked = target.closest('[data-smp-track]');\n\n if (tracked) {\n const eventName = tracked.getAttribute('data-smp-track');\n const properties: TrackProps = {};\n\n Array.from(tracked.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-smp-track-') && attr.name !== 'data-smp-track') {\n const propName = attr.name.replace('data-smp-track-', '').replace(/-/g, '_');\n properties[propName] = attr.value;\n }\n });\n\n if (eventName) {\n this.track(eventName, properties);\n }\n }\n });\n }\n\n private getStoredEmail(): string | null {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(IDENTIFIED_EMAIL_KEY);\n }\n\n private storeEmail(email: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(IDENTIFIED_EMAIL_KEY, email);\n }\n }\n\n private isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n }\n}\n\n/** Alias for SendmailPixel for SDK consistency */\nexport const Pixel = SendmailPixel;\n\n/**\n * Create pixel and attach global smp() function\n */\nexport function createGlobalPixel(config: PixelConfig): SendmailPixel {\n const pixel = new SendmailPixel(config);\n\n if (typeof window !== 'undefined') {\n const smpFunction = (method: string, ...args: unknown[]): unknown => {\n switch (method) {\n case 'track':\n pixel.track(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'identify':\n pixel.identify(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'page':\n pixel.pageView();\n return undefined;\n case 'optOut':\n pixel.optOut();\n return undefined;\n case 'optIn':\n pixel.optIn();\n return undefined;\n case 'isOptedOut':\n return pixel.isOptedOut();\n case 'reset':\n pixel.reset();\n return undefined;\n default:\n console.warn(`[SendmailPixel] Unknown method: ${method}`);\n return undefined;\n }\n };\n (window as unknown as { smp: typeof smpFunction }).smp = smpFunction;\n }\n\n pixel.init();\n return pixel;\n}\n","/**\n * React hook for SendMailOS Pixel tracking\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SendmailPixel, PixelConfig, TrackProps, IdentifyTraits } from '../pixel';\n\nexport interface UsePixelOptions extends Omit<PixelConfig, 'token'> {}\n\nexport interface UsePixelReturn {\n /** Track a custom event */\n track: (eventName: string, properties?: TrackProps) => void;\n /** Track a page view */\n page: () => void;\n /** Identify a user by email */\n identify: (email: string, traits?: IdentifyTraits) => void;\n /** Opt out of tracking */\n optOut: () => void;\n /** Opt back in to tracking */\n optIn: () => void;\n /** Check if opted out */\n isOptedOut: () => boolean;\n /** Reset identity (e.g., on logout) */\n reset: () => void;\n /** Get current visitor ID */\n getVisitorId: () => string | null;\n /** Pixel instance (for advanced usage) */\n pixel: SendmailPixel | null;\n}\n\n/**\n * React hook for pixel tracking\n *\n * @example\n * ```tsx\n * import { usePixel } from '@sendmailos/sdk/react';\n *\n * function MyComponent() {\n * const { track, identify } = usePixel('pk_live_...');\n *\n * const handleClick = () => {\n * track('button_clicked', { button_id: 'cta' });\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function usePixel(token: string, options?: UsePixelOptions): UsePixelReturn {\n const pixelRef = useRef<SendmailPixel | null>(null);\n\n // Initialize pixel once\n useEffect(() => {\n if (!pixelRef.current && typeof window !== 'undefined') {\n pixelRef.current = new SendmailPixel({\n token,\n ...options,\n });\n pixelRef.current.init();\n }\n }, [token, options]);\n\n const track = useCallback((eventName: string, properties?: TrackProps) => {\n pixelRef.current?.track(eventName, properties);\n }, []);\n\n const page = useCallback(() => {\n pixelRef.current?.pageView();\n }, []);\n\n const identify = useCallback((email: string, traits?: IdentifyTraits) => {\n pixelRef.current?.identify(email, traits);\n }, []);\n\n const optOut = useCallback(() => {\n pixelRef.current?.optOut();\n }, []);\n\n const optIn = useCallback(() => {\n pixelRef.current?.optIn();\n }, []);\n\n const isOptedOut = useCallback(() => {\n return pixelRef.current?.isOptedOut() ?? false;\n }, []);\n\n const reset = useCallback(() => {\n pixelRef.current?.reset();\n }, []);\n\n const getVisitorId = useCallback(() => {\n return pixelRef.current?.getVisitorId() ?? null;\n }, []);\n\n return {\n track,\n page,\n identify,\n optOut,\n optIn,\n isOptedOut,\n reset,\n getVisitorId,\n pixel: pixelRef.current,\n };\n}\n\n/**\n * Hook to track page views on route changes\n * Useful for Next.js App Router or React Router\n *\n * @example\n * ```tsx\n * import { usePageTracking } from '@sendmailos/sdk/react';\n * import { usePathname } from 'next/navigation';\n *\n * function Layout({ children }) {\n * const pathname = usePathname();\n * usePageTracking('pk_live_...', pathname);\n * return children;\n * }\n * ```\n */\nexport function usePageTracking(\n token: string,\n pathname: string,\n options?: UsePixelOptions\n): void {\n const { page } = usePixel(token, options);\n\n useEffect(() => {\n page();\n }, [pathname, page]);\n}\n\n/**\n * Hook to identify user when they log in\n *\n * @example\n * ```tsx\n * import { useIdentifyOnLogin } from '@sendmailos/sdk/react';\n *\n * function App() {\n * const { user } = useAuth();\n * useIdentifyOnLogin('pk_live_...', user?.email, {\n * first_name: user?.firstName,\n * plan: user?.plan,\n * });\n * return <Main />;\n * }\n * ```\n */\nexport function useIdentifyOnLogin(\n token: string,\n email: string | null | undefined,\n traits?: IdentifyTraits,\n options?: UsePixelOptions\n): void {\n const { identify, reset } = usePixel(token, options);\n\n useEffect(() => {\n if (email) {\n identify(email, traits);\n } else {\n // User logged out\n reset();\n }\n }, [email, traits, identify, reset]);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/use-subscribe.ts","../../src/react/subscribe-form.tsx","../../src/pixel.ts","../../src/react/use-pixel.ts"],"names":["data","error","useState","jsx","useCallback"],"mappings":";;;;AAOA,IAAM,iBAAA,GAAoB,cAA6C,IAAI,CAAA;AA0BpE,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,OAAA,GAAU,+BAAA;AAAA,EACV;AACF,CAAA,EAA4B;AAC1B,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,SAAA;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE;AAAA,KACpC,CAAA;AAAA,IACA,CAAC,WAAW,OAAO;AAAA,GACrB;AAEA,EAAA,uBACE,GAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OACzB,QAAA,EACH,CAAA;AAEJ;AAKO,SAAS,aAAA,GAAwC;AACtD,EAAA,MAAM,OAAA,GAAU,WAAW,iBAAiB,CAAA;AAE5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAA;AACT;ACXO,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAQ,GAAI,aAAA,EAAc;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,OAAO,MAAA,KAAsD;AAC3D,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,YAAA,CAAa,KAAK,CAAA;AAElB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,UAC1D,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,YAAY,MAAA,CAAO,SAAA;AAAA,YACnB,WAAW,MAAA,CAAO,QAAA;AAAA,YAClB,MAAM,MAAA,CAAO;AAAA,WACd;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAMA,KAAAA,GAAO,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACnD,UAAA,MAAM,IAAI,KAAA,CAAMA,KAAAA,CAAK,KAAA,IAAS,qBAAqB,CAAA;AAAA,QACrD;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,YAAA,CAAa,KAAK,CAAA;AAElB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,YAAA,EAAc,KAAK,UAAA,EAAY,EAAA;AAAA,UAC/B,SAAS,IAAA,CAAK;AAAA,SAChB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAMC,SAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,eAAe,CAAA;AACpE,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAASA,OAAM,OAAA,EAAQ;AAAA,MAClD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,SAAS;AAAA,GACrB;AAEA,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;ACnFO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,kBAAA;AAAA,EACd,UAAA,GAAa,WAAA;AAAA,EACb,WAAA,GAAc,gBAAA;AAAA,EACd,cAAA,GAAiB,yBAAA;AAAA,EACjB,cAAA,GAAiB,KAAA;AAAA,EACjB;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,OAAO,SAAA,EAAW,KAAA,KAAU,YAAA,EAAa;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAiB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU;AAAA,MAC7B,KAAA;AAAA,MACA,SAAA,EAAW,iBAAiB,SAAA,GAAY,MAAA;AAAA,MACxC,QAAA,EAAU,iBAAiB,QAAA,GAAW,MAAA;AAAA,MACtC;AAAA,KACD,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,SAAA,IAAY;AACZ,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAChB,WAAW,KAAA,EAAO;AAChB,MAAA,OAAA,GAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EACzB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,OAAE,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,MAAA,EAAQ,CAAA,EAAE,EAAI,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,sBAC3DA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAU,MAAA;AAAA,YACV,UAAA,EAAY,aAAA;AAAA,YACZ,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ;AAAA,WACV;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAsB,KAAA,EACjD,QAAA,EAAA;AAAA,IAAA,cAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,KAAA,EAAO,YAAA,EAAc,KAAA,EAAM,EAC7D,QAAA,EAAA;AAAA,sBAAAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,SAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC5C,WAAA,EAAY,YAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAChB;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC3C,WAAA,EAAY,WAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAChB;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBAGF,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,OAAM,EACxC,QAAA,EAAA;AAAA,sBAAAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA;AAAA,UACA,QAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,SAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,MAAA,EAAQ,gBAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAChB;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,aAAa,CAAC,KAAA;AAAA,UACxB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,UAAA;AAAA,YACT,eAAA,EAAiB,YAAY,SAAA,GAAY,SAAA;AAAA,YACzC,KAAA,EAAO,OAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ,YAAY,aAAA,GAAgB,SAAA;AAAA,YACpC,UAAA,EAAY;AAAA,WACd;AAAA,UAEC,sBAAY,WAAA,GAAc;AAAA;AAAA;AAC7B,KAAA,EACF,CAAA;AAAA,IAEC,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAM,EAC9D,gBAAM,OAAA,EACT;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;ACzIA,IAAM,WAAA,GAAc,aAAA;AACpB,IAAM,oBAAA,GAAuB,sBAAA;AAEtB,IAAM,gBAAN,MAAoB;AAAA,EAOvB,YAAY,MAAA,EAAqB;AAJjC,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAQ,QAAqB,EAAC;AAC9B,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAGrC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,QAAA,EAAU,wCAAA;AAAA,MACV,UAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,GAAG;AAAA,KACP;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,mBAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,cAAA,EAAe;AAAA,EAC/C;AAAA,EAEO,IAAA,GAAO;AACV,IAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,YAAW,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAC7C,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,cAAa,EAAG;AAC/C,MAAA,IAAA,CAAK,IAAI,0CAA0C,CAAA;AACnD,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAGnB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAG3B,IAAA,IAAA,CAAK,SAAA,EAAU;AAGf,IAAA,IAAA,CAAK,QAAA,EAAS;AAGd,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAGxB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAG3B,IAAA,IAAA,CAAK,0BAAA,EAA2B;AAEhC,IAAA,IAAA,CAAK,GAAA,CAAI,+BAAA,EAAiC,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKO,MAAA,GAAe;AAClB,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAa,MAAM,CAAA;AAAA,IAC5C;AACA,IAAA,IAAA,CAAK,IAAI,4BAA4B,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACjB,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,WAAW,WAAW,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,OAAO,WAAW,WAAA,EAAa;AACpD,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd;AACA,IAAA,IAAA,CAAK,IAAI,2BAA2B,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,UAAA,GAAsB;AACzB,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,KAAA;AAChD,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,KAAM,MAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,WAAW,oBAAoB,CAAA;AAAA,IAChD;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,UAAA,EAAW;AACrC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAa,IAAA,CAAK,aAAa,GAAG,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAI,gBAAgB,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKO,YAAA,GAAuB;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,GAAoC;AACvC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EAChB;AAAA,EAEO,KAAA,CAAM,SAAA,EAAmB,UAAA,GAAyB,EAAC,EAAG;AACzD,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS;AAAA,MACpB,UAAA,EAAY,SAAA;AAAA,MACZ;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEO,QAAA,CAAS,KAAA,EAAe,MAAA,GAAqB,EAAC,EAAG;AACpD,IAAA,IAAI,IAAA,CAAK,YAAW,EAAG;AAEvB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAErB,IAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,MACvB,KAAA;AAAA,MACA;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEO,QAAA,GAAW;AACd,IAAA,IAAA,CAAK,MAAM,WAAA,EAAa;AAAA,MACpB,IAAA,EAAM,OAAO,QAAA,CAAS,QAAA;AAAA,MACtB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,GAAA,EAAK,OAAO,QAAA,CAAS;AAAA,KACxB,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,mBAAA,GAA8B;AAClC,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,EAAA;AAE5C,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,UAAW,CAAA;AAC/C,IAAA,IAAI,CAAC,EAAA,EAAI;AACL,MAAA,EAAA,GAAK,OAAO,UAAA,EAAW;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAa,IAAI,GAAG,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,EAAA;AAAA,EACX;AAAA,EAEQ,SAAA,CAAU,MAA4B,OAAA,EAAc;AACxD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,IAAA,MAAM,YAAA,GAAe,KAAK,aAAA,EAAc;AAExC,IAAA,MAAM,IAAA,GAAO;AAAA,MACT,IAAA;AAAA,MACA,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA;AAAA,MACnB,cAAc,IAAA,CAAK,WAAA;AAAA,MACnB,GAAA,EAAK,OAAO,QAAA,CAAS,IAAA;AAAA,MACrB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,GAAG;AAAA,KACP;AAIA,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,QAAQ,SAAA,CAAU,QAAA;AAAA,MAClB,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,EAAO;AAAA,MACnE,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA;AAAA,MACxB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,GAAG;AAAA;AAAA,KACP;AAEA,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,IAAA,EAAM,OAAA,EAAQ;AAGrC,IAAA,IAAI,SAAA,CAAU,UAAA,IAAc,IAAA,KAAS,OAAA,EAAS;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAC/E,MAAA,SAAA,CAAU,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAW,IAAI,CAAA;AAAA,IACpD,CAAA,MAAO;AACH,MAAA,KAAA,CAAM,IAAA,CAAK,OAAO,QAAA,EAAW;AAAA,QACzB,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,QAC9B,SAAA,EAAW;AAAA,OACd,CAAA,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,QAAA,IAAI,KAAK,MAAA,CAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,iBAAiB,GAAG,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,CAAA,EAAK,IAAI,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,MAAa,SAAA,GAAY;AACrB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAA,CAAO,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AACzG,MAAA,IAAI,IAAI,EAAA,EAAI;AACR,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,MAChC;AAAA,IACJ,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAA,GAAqB;AACzB,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,EAAC;AAE7C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,WAAA,EAAY;AAClD,IAAA,IAAI,OAAA,GAAe;AAAA,MACf,SAAA,EAAW,SAAA;AAAA;AAAA,MACX,QAAQ;AAAC,KACb;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC3B,MAAA,IAAI,OAAA,GAAU,KAAA;AAEd,MAAA,IAAI;AACA,QAAA,IAAI,KAAK,UAAA,KAAe,OAAA,IAAW,IAAA,KAAS,IAAA,CAAK,aAAa,OAAA,GAAU,IAAA;AAAA,aAAA,IAC/D,IAAA,CAAK,eAAe,UAAA,IAAc,IAAA,CAAK,SAAS,IAAA,CAAK,WAAW,GAAG,OAAA,GAAU,IAAA;AAAA,aAAA,IAC7E,IAAA,CAAK,UAAA,KAAe,OAAA,IAAW,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,IAAA;AAAA,MAC/F,SAAS,CAAA,EAAG;AAAA,MAAE;AAEd,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,SAAA;AAGzB,QAAA,IAAI,KAAK,SAAA,EAAW;AAChB,UAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1D,YAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAkB,CAAA;AACpD,YAAA,IAAI,EAAA,EAAI;AAEJ,cAAA,MAAM,MAAO,EAAA,CAAwB,KAAA,IAAS,GAAG,WAAA,IAAe,EAAA,CAAG,aAAa,SAAS,CAAA;AACzF,cAAA,IAAI,GAAA,EAAK,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAI,IAAA,EAAK;AAAA,YACrC;AAAA,UACJ;AAAA,QACJ;AAGA,QAAA,OAAO,OAAA;AAAA,MACX;AAAA,IACJ;AAKA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,UAAW,SAAA,GAAY,MAAA;AAAA,SAAA,IAClD,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA,UAAW,SAAA,GAAY,UAAA;AAAA,SAAA,IAC9D,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA,UAAW,SAAA,GAAY,SAAA;AAAA,SAAA,IACxD,IAAA,CAAK,KAAA,CAAM,6BAA6B,CAAA,UAAW,SAAA,GAAY,UAAA;AAAA,SAAA,IAC/D,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA,UAAW,SAAA,GAAY,SAAA;AAAA,SAAA,IAC9D,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,UAAW,SAAA,GAAY,MAAA;AAAA,SAAA,IACpD,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,UAAW,SAAA,GAAY,MAAA;AAAA,SAAA,IACvD,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA,UAAW,SAAA,GAAY,SAAA;AAAA,SAAA,IACrD,IAAA,CAAK,KAAA,CAAM,oCAAoC,CAAA,UAAW,SAAA,GAAY,kBAAA;AAK/E,IAAA,MAAM,SAAS,QAAA,CAAS,aAAA,CAAc,0BAA0B,CAAA,EAAG,aAAa,SAAS,CAAA;AACzF,IAAA,IAAI,WAAW,SAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,SAAA,GAAY,SAAA;AAEpB,MAAA,MAAM,QAAQ,QAAA,CAAS,aAAA,CAAc,uCAAuC,CAAA,EAAG,aAAa,SAAS,CAAA;AACrG,MAAA,IAAI,KAAA,UAAe,aAAA,GAAgB,KAAA;AACnC,MAAA,MAAM,WAAW,QAAA,CAAS,aAAA,CAAc,yCAAyC,CAAA,EAAG,aAAa,SAAS,CAAA;AAC1G,MAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AAAA,IACrC;AAGA,IAAA,IAAI,SAAS,aAAA,CAAc,aAAa,KAAK,QAAA,CAAS,aAAA,CAAc,eAAe,CAAA,EAAG;AAClF,MAAA,OAAA,CAAQ,SAAA,GAAY,MAAA;AAAA,IACxB;AAGA,IAAA,IAAI,SAAS,aAAA,CAAc,eAAe,KAAK,QAAA,CAAS,aAAA,CAAc,2BAA2B,CAAA,EAAG;AAChG,MAAA,OAAA,CAAQ,SAAA,GAAY,UAAA;AAAA,IACxB;AAGA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,SAAA,CAAU,aAAY,CAAE,KAAA,CAAM,GAAG,GAAI,CAAA;AAChE,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,UAAW,YAAA,GAAe,cAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,UAAW,OAAA,GAAU,MAAA;AAErD,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,kBAAA,GAAqB;AACzB,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAGrC,IAAA,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,CAAC,CAAA,KAAM;AACvC,MAAA,MAAM,OAAO,CAAA,CAAE,MAAA;AACf,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,qBAAqB,CAAA;AAC3D,MAAA,IAAI,UAAA,IAAc,WAAW,KAAA,EAAO;AAChC,QAAA,IAAA,CAAK,GAAA,CAAI,qCAAA,EAAuC,UAAA,CAAW,KAAK,CAAA;AAChE,QAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,MAClC;AAAA,IACJ,GAAG,IAAI,CAAA;AAAA,EACX;AAAA,EAEQ,qBAAA,GAAwB;AAC5B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,IAAA,OAAA,CAAQ,SAAA,GAAY,IAAI,IAAA,KAAS;AAC7B,MAAA,SAAA,CAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAC7B,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAClB,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM;AACtC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAClB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,IAAA,EAAc;AACzD,IAAA,MAAM,CAAA,uBAAQ,IAAA,EAAK;AACnB,IAAA,CAAA,CAAE,OAAA,CAAQ,EAAE,OAAA,EAAQ,GAAK,OAAO,EAAA,GAAK,EAAA,GAAK,KAAK,GAAK,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,UAAA,GAAa,CAAA,CAAE,WAAA,EAAY;AAC3C,IAAA,QAAA,CAAS,MAAA,GAAS,IAAA,GAAO,GAAA,GAAM,KAAA,GAAQ,MAAM,OAAA,GAAU,sBAAA;AAAA,EAC3D;AAAA,EAEQ,UAAU,IAAA,EAA6B;AAC3C,IAAA,MAAM,SAAS,IAAA,GAAO,GAAA;AACtB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAChC,MAAA,IAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AACZ,MAAA,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,IAAK,GAAA,MAAS,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA;AACtD,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,IAAK,CAAA,EAAG,OAAO,CAAA,CAAE,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA;AAAA,IAC1E;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,OAAO,IAAA,EAAiB;AAC5B,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACnB,MAAA,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB,GAAG,IAAI,CAAA;AAAA,IAC1C;AAAA,EACJ;AAAA,EAEQ,YAAA,GAAwB;AAC5B,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAC7C,IAAA,OAAO,SAAA,CAAU,UAAA,KAAe,GAAA,IACxB,MAAA,CAA8C,UAAA,KAAe,GAAA;AAAA,EACzE;AAAA,EAEQ,qBAAA,GAA8B;AAClC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAEzC,IAAA,IAAI,eAAA,EAAiB;AACjB,MAAA,IAAI;AACA,QAAA,MAAM,KAAA,GAAQ,KAAK,eAAe,CAAA;AAClC,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AAC1B,UAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,QACvB;AAAA,MACJ,CAAA,CAAA,MAAQ;AACJ,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,EAAG;AACpC,UAAA,IAAA,CAAK,SAAS,eAAe,CAAA;AAAA,QACjC;AAAA,MACJ;AAAA,IACJ,WAAW,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,KAAA,CAAM,oBAAA,EAAsB,EAAE,aAAA,EAAe,cAAc,CAAA;AAAA,IACpE;AAAA,EACJ;AAAA,EAEQ,0BAAA,GAAmC;AACvC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACtC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA;AAEjD,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,gBAAgB,CAAA;AACvD,QAAA,MAAM,aAAyB,EAAC;AAEhC,QAAA,KAAA,CAAM,KAAK,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7C,UAAA,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,iBAAiB,CAAA,IAAK,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAC3E,YAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,OAAA,CAAQ,mBAAmB,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC3E,YAAA,UAAA,CAAW,QAAQ,IAAI,IAAA,CAAK,KAAA;AAAA,UAChC;AAAA,QACJ,CAAC,CAAA;AAED,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,IAAA,CAAK,KAAA,CAAM,WAAW,UAAU,CAAA;AAAA,QACpC;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,cAAA,GAAgC;AACpC,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,IAAA;AAChD,IAAA,OAAO,YAAA,CAAa,QAAQ,oBAAoB,CAAA;AAAA,EACpD;AAAA,EAEQ,WAAW,KAAA,EAAqB;AACpC,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACrC,MAAA,YAAA,CAAa,OAAA,CAAQ,sBAAsB,KAAK,CAAA;AAAA,IACpD;AAAA,EACJ;AAAA,EAEQ,aAAa,KAAA,EAAwB;AACzC,IAAA,OAAO,4BAAA,CAA6B,KAAK,KAAK,CAAA;AAAA,EAClD;AACJ,CAAA;;;AC5aO,SAAS,QAAA,CAAS,OAAe,OAAA,EAA2C;AACjF,EAAA,MAAM,QAAA,GAAW,OAA6B,IAAI,CAAA;AAGlD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,OAAO,WAAW,WAAA,EAAa;AACtD,MAAA,QAAA,CAAS,OAAA,GAAU,IAAI,aAAA,CAAc;AAAA,QACnC,KAAA;AAAA,QACA,GAAG;AAAA,OACJ,CAAA;AACD,MAAA,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,MAAM,KAAA,GAAQC,WAAAA,CAAY,CAAC,SAAA,EAAmB,UAAA,KAA4B;AACxE,IAAA,QAAA,CAAS,OAAA,EAAS,KAAA,CAAM,SAAA,EAAW,UAAU,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,QAAA,CAAS,SAAS,QAAA,EAAS;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,CAAC,KAAA,EAAe,MAAA,KAA4B;AACvE,IAAA,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,SAAS,MAAA,EAAO;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,OAAO,QAAA,CAAS,OAAA,EAAS,UAAA,EAAW,IAAK,KAAA;AAAA,EAC3C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AACrC,IAAA,OAAO,QAAA,CAAS,OAAA,EAAS,YAAA,EAAa,IAAK,IAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAO,QAAA,CAAS;AAAA,GAClB;AACF;AAkBO,SAAS,eAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,QAAA,CAAS,OAAO,OAAO,CAAA;AAExC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAA,EAAK;AAAA,EACP,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AACrB;AAmBO,SAAS,kBAAA,CACd,KAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,QAAA,CAAS,OAAO,OAAO,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IACxB,CAAA,MAAO;AAEL,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA;AACrC","file":"index.mjs","sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\n\ninterface SendMailOSContextValue {\n publicKey: string;\n baseUrl: string;\n}\n\nconst SendMailOSContext = createContext<SendMailOSContextValue | null>(null);\n\nexport interface SendMailOSProviderProps {\n /** Your public key (pk_live_... or pk_test_...) */\n publicKey: string;\n /** Custom API base URL (optional) */\n baseUrl?: string;\n children: React.ReactNode;\n}\n\n/**\n * Provider component for SendMailOS React integration\n * \n * @example\n * ```tsx\n * import { SendMailOSProvider } from '@sendmailos/sdk/react';\n * \n * function App() {\n * return (\n * <SendMailOSProvider publicKey=\"pk_live_...\">\n * <YourApp />\n * </SendMailOSProvider>\n * );\n * }\n * ```\n */\nexport function SendMailOSProvider({\n publicKey,\n baseUrl = 'https://sendmailos.com/api/v1',\n children,\n}: SendMailOSProviderProps) {\n if (!publicKey) {\n throw new Error('SendMailOSProvider requires a publicKey');\n }\n\n if (!publicKey.startsWith('pk_')) {\n console.warn(\n '[SendMailOS] Public keys should start with \"pk_\". ' +\n 'Never expose secret keys (sk_) in client-side code.'\n );\n }\n\n const value = useMemo(\n () => ({\n publicKey,\n baseUrl: baseUrl.replace(/\\/$/, ''),\n }),\n [publicKey, baseUrl]\n );\n\n return (\n <SendMailOSContext.Provider value={value}>\n {children}\n </SendMailOSContext.Provider>\n );\n}\n\n/**\n * Hook to access SendMailOS context\n */\nexport function useSendMailOS(): SendMailOSContextValue {\n const context = useContext(SendMailOSContext);\n \n if (!context) {\n throw new Error('useSendMailOS must be used within a SendMailOSProvider');\n }\n \n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useSendMailOS } from './provider';\n\ninterface SubscribeParams {\n email: string;\n firstName?: string;\n lastName?: string;\n tags?: string[];\n}\n\ninterface SubscribeResult {\n success: boolean;\n subscriberId?: string;\n message?: string;\n}\n\ninterface UseSubscribeReturn {\n /** Subscribe a new email address */\n subscribe: (params: SubscribeParams) => Promise<SubscribeResult>;\n /** Loading state */\n isLoading: boolean;\n /** Error message if subscription failed */\n error: Error | null;\n /** Success state */\n isSuccess: boolean;\n /** Reset the hook state */\n reset: () => void;\n}\n\n/**\n * Hook for subscribing users to your email list\n * \n * @example\n * ```tsx\n * function NewsletterForm() {\n * const { subscribe, isLoading, error, isSuccess } = useSubscribe();\n * const [email, setEmail] = useState('');\n * \n * const handleSubmit = async (e) => {\n * e.preventDefault();\n * await subscribe({ email, tags: ['newsletter'] });\n * };\n * \n * if (isSuccess) {\n * return <p>Thanks for subscribing!</p>;\n * }\n * \n * return (\n * <form onSubmit={handleSubmit}>\n * <input\n * type=\"email\"\n * value={email}\n * onChange={(e) => setEmail(e.target.value)}\n * placeholder=\"Enter your email\"\n * />\n * <button disabled={isLoading}>\n * {isLoading ? 'Subscribing...' : 'Subscribe'}\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\nexport function useSubscribe(): UseSubscribeReturn {\n const { publicKey, baseUrl } = useSendMailOS();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isSuccess, setIsSuccess] = useState(false);\n\n const reset = useCallback(() => {\n setIsLoading(false);\n setError(null);\n setIsSuccess(false);\n }, []);\n\n const subscribe = useCallback(\n async (params: SubscribeParams): Promise<SubscribeResult> => {\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n const response = await fetch(`${baseUrl}/public/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Public-Key': publicKey,\n },\n body: JSON.stringify({\n email: params.email,\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n }),\n });\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n throw new Error(data.error || 'Failed to subscribe');\n }\n\n const data = await response.json();\n setIsSuccess(true);\n setIsLoading(false);\n\n return {\n success: true,\n subscriberId: data.subscriber?.id,\n message: data.message,\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n setIsLoading(false);\n return { success: false, message: error.message };\n }\n },\n [baseUrl, publicKey]\n );\n\n return {\n subscribe,\n isLoading,\n error,\n isSuccess,\n reset,\n };\n}\n","import React, { useState, FormEvent } from 'react';\nimport { useSubscribe } from './use-subscribe';\n\nexport interface SubscribeFormProps {\n /** Tags to apply to new subscribers */\n tags?: string[];\n /** Callback when subscription succeeds */\n onSuccess?: () => void;\n /** Callback when subscription fails */\n onError?: (error: Error) => void;\n /** CSS class for the form container */\n className?: string;\n /** Placeholder text for email input */\n placeholder?: string;\n /** Text for submit button */\n buttonText?: string;\n /** Text shown while loading */\n loadingText?: string;\n /** Text shown on success */\n successMessage?: string;\n /** Whether to show first/last name fields */\n showNameFields?: boolean;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Pre-built newsletter subscription form\n * \n * @example\n * ```tsx\n * import { SubscribeForm } from '@sendmailos/sdk/react';\n * \n * function Newsletter() {\n * return (\n * <SubscribeForm\n * tags={['newsletter']}\n * onSuccess={() => console.log('Subscribed!')}\n * buttonText=\"Join Newsletter\"\n * placeholder=\"you@example.com\"\n * />\n * );\n * }\n * ```\n */\nexport function SubscribeForm({\n tags,\n onSuccess,\n onError,\n className,\n placeholder = 'Enter your email',\n buttonText = 'Subscribe',\n loadingText = 'Subscribing...',\n successMessage = 'Thanks for subscribing!',\n showNameFields = false,\n style,\n}: SubscribeFormProps) {\n const { subscribe, isLoading, error, isSuccess, reset } = useSubscribe();\n const [email, setEmail] = useState('');\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n \n const result = await subscribe({\n email,\n firstName: showNameFields ? firstName : undefined,\n lastName: showNameFields ? lastName : undefined,\n tags,\n });\n\n if (result.success) {\n onSuccess?.();\n setEmail('');\n setFirstName('');\n setLastName('');\n } else if (error) {\n onError?.(error);\n }\n };\n\n if (isSuccess) {\n return (\n <div className={className} style={style}>\n <p style={{ color: '#10b981', margin: 0 }}>{successMessage}</p>\n <button\n type=\"button\"\n onClick={reset}\n style={{\n marginTop: '8px',\n padding: '4px 8px',\n fontSize: '12px',\n background: 'transparent',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Subscribe another\n </button>\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className} style={style}>\n {showNameFields && (\n <div style={{ display: 'flex', gap: '8px', marginBottom: '8px' }}>\n <input\n type=\"text\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n placeholder=\"First name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <input\n type=\"text\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n placeholder=\"Last name\"\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n </div>\n )}\n \n <div style={{ display: 'flex', gap: '8px' }}>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={placeholder}\n required\n disabled={isLoading}\n style={{\n flex: 1,\n padding: '8px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n }}\n />\n <button\n type=\"submit\"\n disabled={isLoading || !email}\n style={{\n padding: '8px 16px',\n backgroundColor: isLoading ? '#9ca3af' : '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n }}\n >\n {isLoading ? loadingText : buttonText}\n </button>\n </div>\n \n {error && (\n <p style={{ color: '#ef4444', fontSize: '14px', marginTop: '8px' }}>\n {error.message}\n </p>\n )}\n </form>\n );\n}\n","export interface PixelConfig {\n /** Public API key (pk_live_... or pk_test_...) or legacy token */\n token: string;\n /** API endpoint for tracking events */\n endpoint?: string;\n /** Cookie name for anonymous ID storage */\n cookieName?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Respect Do Not Track browser setting (default: true) */\n respectDNT?: boolean;\n}\n\n/** Alias for PixelConfig for SDK consistency */\nexport type PixelOptions = PixelConfig;\n\nexport interface TrackProps {\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Alias for TrackProps */\nexport type TrackEventProperties = TrackProps;\n\n/** Traits for identify calls */\nexport interface IdentifyTraits {\n first_name?: string;\n last_name?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Dynamic rule for context detection */\ninterface PixelRule {\n match_type: 'exact' | 'contains' | 'regex';\n url_pattern: string;\n page_type: string;\n selectors?: Record<string, string>;\n}\n\nconst OPT_OUT_KEY = 'smp_opt_out';\nconst IDENTIFIED_EMAIL_KEY = 'smp_identified_email';\n\nexport class SendmailPixel {\n private config: PixelConfig;\n private anonymousId: string;\n private initialized: boolean = false;\n private rules: PixelRule[] = [];\n private identifiedEmail: string | null = null;\n\n constructor(config: PixelConfig) {\n this.config = {\n endpoint: 'https://sendmailos.com/api/pixel/track',\n cookieName: 'sm_anon_id',\n debug: false,\n respectDNT: true,\n ...config\n };\n this.anonymousId = this.getOrSetAnonymousId();\n this.identifiedEmail = this.getStoredEmail();\n }\n\n public init() {\n if (this.initialized) return;\n\n if (typeof window === 'undefined') {\n return; // Server-side safety\n }\n\n // Check for opt-out\n if (this.isOptedOut()) {\n this.log('Tracking disabled (user opted out)');\n return;\n }\n\n // Check for Do Not Track\n if (this.config.respectDNT && this.isDNTEnabled()) {\n this.log('Tracking disabled (Do Not Track enabled)');\n return;\n }\n\n this.initialized = true;\n\n // Check URL for subscriber ID from email clicks\n this.checkUrlForSubscriber();\n\n // 0. Load Dynamic Rules (Async)\n this.loadRules();\n\n // 1. Auto-track Page View\n this.pageView();\n\n // 2. Setup Form Auto-Detection\n this.setupFormListeners();\n\n // 3. Track History State Changes (SPA Support)\n this.setupHistoryListeners();\n\n // 4. Setup data attribute tracking\n this.setupDataAttributeTracking();\n\n this.log('Pixel initialized with Token:', this.config.token);\n }\n\n /**\n * Opt out of all tracking\n */\n public optOut(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(OPT_OUT_KEY, 'true');\n }\n this.log('User opted out of tracking');\n }\n\n /**\n * Opt back in to tracking\n */\n public optIn(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(OPT_OUT_KEY);\n }\n if (!this.initialized && typeof window !== 'undefined') {\n this.init();\n }\n this.log('User opted in to tracking');\n }\n\n /**\n * Check if user has opted out\n */\n public isOptedOut(): boolean {\n if (typeof localStorage === 'undefined') return false;\n return localStorage.getItem(OPT_OUT_KEY) === 'true';\n }\n\n /**\n * Reset identity (e.g., on logout)\n */\n public reset(): void {\n this.identifiedEmail = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(IDENTIFIED_EMAIL_KEY);\n }\n // Generate new anonymous ID\n this.anonymousId = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, this.anonymousId, 365);\n this.log('Identity reset');\n }\n\n /**\n * Get current visitor/anonymous ID\n */\n public getVisitorId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get identified email address\n */\n public getIdentifiedEmail(): string | null {\n return this.identifiedEmail;\n }\n\n public track(eventName: string, properties: TrackProps = {}) {\n this.sendEvent('track', {\n event_name: eventName,\n properties\n });\n }\n\n public identify(email: string, traits: TrackProps = {}) {\n if (this.isOptedOut()) return;\n\n this.identifiedEmail = email;\n this.storeEmail(email);\n\n this.sendEvent('identify', {\n email,\n traits\n });\n }\n\n public pageView() {\n this.track('page_view', {\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n url: window.location.href\n });\n }\n\n // --- INTERNAL HELPERS ---\n\n private getOrSetAnonymousId(): string {\n if (typeof document === 'undefined') return '';\n\n let id = this.getCookie(this.config.cookieName!);\n if (!id) {\n id = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, id, 365);\n }\n return id;\n }\n\n private sendEvent(type: 'track' | 'identify', payload: any) {\n if (typeof window === 'undefined') return;\n\n // Auto-Enrichment (Smart Context)\n const smartContext = this.detectContext();\n\n const body = {\n type,\n token: this.config.token, // Send Token\n anonymous_id: this.anonymousId,\n url: window.location.href,\n timestamp: new Date().toISOString(),\n ...payload\n };\n\n // Capture UTMs on first touch -> sent via context in API\n // For simplicity, we just send context\n const context = {\n userAgent: navigator.userAgent,\n locale: navigator.language,\n screen: { width: window.screen.width, height: window.screen.height },\n search: window.location.search,\n title: document.title,\n referrer: document.referrer,\n ...smartContext // Merge smart context\n };\n\n const finalBody = { ...body, context };\n\n // Use Beacon API if available (better for page unload)\n if (navigator.sendBeacon && type === 'track') {\n const blob = new Blob([JSON.stringify(finalBody)], { type: 'application/json' });\n navigator.sendBeacon(this.config.endpoint!, blob);\n } else {\n fetch(this.config.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(finalBody),\n keepalive: true\n }).catch(err => {\n if (this.config.debug) console.error('[Pixel Error]', err);\n });\n }\n\n this.log(`Event Sent [${type}]`, body);\n }\n\n // Call this after init to load rules\n public async loadRules() {\n if (typeof window === 'undefined') return;\n try {\n // Updated Endpoint Query Param\n const res = await fetch(`${this.config.endpoint?.replace('/track', '')}/rules?token=${this.config.token}`);\n if (res.ok) {\n const data = await res.json();\n this.rules = data.rules || [];\n }\n } catch (e) {\n // silent fail\n }\n }\n\n /**\n * Smart Auto-Detection of Page Type & Context\n * Uses Dynamic Rules + Static Heuristics\n */\n private detectContext(): any {\n if (typeof document === 'undefined') return {};\n\n const path = window.location.pathname.toLowerCase();\n let context: any = {\n page_type: 'general', // Default\n topics: []\n };\n\n // 0. CHECK DYNAMIC RULES (Database / AI Optimized)\n for (const rule of this.rules) {\n let matched = false;\n // URL Pattern Match\n try {\n if (rule.match_type === 'exact' && path === rule.url_pattern) matched = true;\n else if (rule.match_type === 'contains' && path.includes(rule.url_pattern)) matched = true;\n else if (rule.match_type === 'regex' && new RegExp(rule.url_pattern).test(path)) matched = true;\n } catch (e) { }\n\n if (matched) {\n context.page_type = rule.page_type;\n\n // Extract Data via Selectors\n if (rule.selectors) {\n for (const [key, selector] of Object.entries(rule.selectors)) {\n const el = document.querySelector(selector as string);\n if (el) {\n // Try value (input), then textContent, then content (meta)\n const val = (el as HTMLInputElement).value || el.textContent || el.getAttribute('content');\n if (val) context[key] = val.trim();\n }\n }\n }\n // Stop after first strong match? Or continue to merge? \n // Let's stop to allow override of default heuristics.\n return context;\n }\n }\n\n // --- FALLBACK TO STATIC HEURISTICS ---\n\n // 1. URL Heuristics\n if (path.match(/\\/(cart|basket|bag)/)) context.page_type = 'cart';\n else if (path.match(/\\/(checkout|payment|order)/)) context.page_type = 'checkout';\n else if (path.match(/\\/(product|item|p)\\//)) context.page_type = 'product';\n else if (path.match(/\\/(category|c|collection)\\//)) context.page_type = 'category';\n else if (path.match(/\\/(blog|article|post|news)/)) context.page_type = 'content';\n else if (path.match(/\\/(login|signin)/)) context.page_type = 'auth';\n else if (path.match(/\\/(signup|register)/)) context.page_type = 'auth';\n else if (path.match(/\\/(pricing|plans)/)) context.page_type = 'pricing';\n else if (path.match(/\\/(thank-you|confirmation|success)/)) context.page_type = 'purchase_success';\n\n // 2. DOM/Meta Heuristics (Stronger Signals)\n\n // Product? (Schema.org or OG Tags)\n const ogType = document.querySelector('meta[property=\"og:type\"]')?.getAttribute('content');\n if (ogType === 'product') {\n context.page_type = 'product';\n // Try to scrape price\n const price = document.querySelector('meta[property=\"product:price:amount\"]')?.getAttribute('content');\n if (price) context.product_price = price;\n const currency = document.querySelector('meta[property=\"product:price:currency\"]')?.getAttribute('content');\n if (currency) context.currency = currency;\n }\n\n // Cart?\n if (document.querySelector('.cart-total') || document.querySelector('#cart-summary')) {\n context.page_type = 'cart';\n }\n\n // Checkout?\n if (document.querySelector('#card-element') || document.querySelector('input[name=\"card_number\"]')) {\n context.page_type = 'checkout';\n }\n\n // 3. Content Scraping (Keywords)\n const text = document.body.innerText.toLowerCase().slice(0, 2000); // Check first 2k chars\n if (text.includes('out of stock')) context.stock_status = 'out_of_stock';\n if (text.includes('limited time')) context.urgency = 'high';\n\n return context;\n }\n\n private setupFormListeners() {\n if (typeof document === 'undefined') return;\n\n // Debounce to avoid performance hit\n document.addEventListener('submit', (e) => {\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n // Look for email input\n const emailInput = form.querySelector('input[type=\"email\"]') as HTMLInputElement;\n if (emailInput && emailInput.value) {\n this.log('Auto-detected email form submission', emailInput.value);\n this.identify(emailInput.value);\n }\n }, true); // Capture phase to catch it before propagation stops\n }\n\n private setupHistoryListeners() {\n if (typeof window === 'undefined') return;\n\n const pushState = history.pushState;\n history.pushState = (...args) => {\n pushState.apply(history, args);\n this.pageView();\n };\n\n window.addEventListener('popstate', () => {\n this.pageView();\n });\n }\n\n // --- COOKIE UTILS ---\n\n private setCookie(name: string, value: string, days: number) {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = name + \"=\" + value + \";\" + expires + \";path=/;SameSite=Lax\";\n }\n\n private getCookie(name: string): string | null {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n }\n\n private log(...args: unknown[]) {\n if (this.config.debug) {\n console.log('[SendmailPixel]', ...args);\n }\n }\n\n private isDNTEnabled(): boolean {\n if (typeof navigator === 'undefined') return false;\n return navigator.doNotTrack === '1' ||\n (window as unknown as { doNotTrack?: string }).doNotTrack === '1';\n }\n\n private checkUrlForSubscriber(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const subscriberEmail = params.get('smp_email');\n const subscriberId = params.get('smp_sub');\n\n if (subscriberEmail) {\n try {\n const email = atob(subscriberEmail);\n if (this.isValidEmail(email)) {\n this.identify(email);\n }\n } catch {\n if (this.isValidEmail(subscriberEmail)) {\n this.identify(subscriberEmail);\n }\n }\n } else if (subscriberId) {\n this.track('email_link_clicked', { subscriber_id: subscriberId });\n }\n }\n\n private setupDataAttributeTracking(): void {\n if (typeof document === 'undefined') return;\n\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const tracked = target.closest('[data-smp-track]');\n\n if (tracked) {\n const eventName = tracked.getAttribute('data-smp-track');\n const properties: TrackProps = {};\n\n Array.from(tracked.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-smp-track-') && attr.name !== 'data-smp-track') {\n const propName = attr.name.replace('data-smp-track-', '').replace(/-/g, '_');\n properties[propName] = attr.value;\n }\n });\n\n if (eventName) {\n this.track(eventName, properties);\n }\n }\n });\n }\n\n private getStoredEmail(): string | null {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(IDENTIFIED_EMAIL_KEY);\n }\n\n private storeEmail(email: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(IDENTIFIED_EMAIL_KEY, email);\n }\n }\n\n private isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n }\n}\n\n/** Alias for SendmailPixel for SDK consistency */\nexport const Pixel = SendmailPixel;\n\n/**\n * Create pixel and attach global smp() function\n */\nexport function createGlobalPixel(config: PixelConfig): SendmailPixel {\n const pixel = new SendmailPixel(config);\n\n if (typeof window !== 'undefined') {\n const smpFunction = (method: string, ...args: unknown[]): unknown => {\n switch (method) {\n case 'track':\n pixel.track(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'identify':\n pixel.identify(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'page':\n pixel.pageView();\n return undefined;\n case 'optOut':\n pixel.optOut();\n return undefined;\n case 'optIn':\n pixel.optIn();\n return undefined;\n case 'isOptedOut':\n return pixel.isOptedOut();\n case 'reset':\n pixel.reset();\n return undefined;\n default:\n console.warn(`[SendmailPixel] Unknown method: ${method}`);\n return undefined;\n }\n };\n (window as unknown as { smp: typeof smpFunction }).smp = smpFunction;\n }\n\n pixel.init();\n return pixel;\n}\n","/**\n * React hook for SendMailOS Pixel tracking\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SendmailPixel, PixelConfig, TrackProps, IdentifyTraits } from '../pixel';\n\nexport interface UsePixelOptions extends Omit<PixelConfig, 'token'> {}\n\nexport interface UsePixelReturn {\n /** Track a custom event */\n track: (eventName: string, properties?: TrackProps) => void;\n /** Track a page view */\n page: () => void;\n /** Identify a user by email */\n identify: (email: string, traits?: IdentifyTraits) => void;\n /** Opt out of tracking */\n optOut: () => void;\n /** Opt back in to tracking */\n optIn: () => void;\n /** Check if opted out */\n isOptedOut: () => boolean;\n /** Reset identity (e.g., on logout) */\n reset: () => void;\n /** Get current visitor ID */\n getVisitorId: () => string | null;\n /** Pixel instance (for advanced usage) */\n pixel: SendmailPixel | null;\n}\n\n/**\n * React hook for pixel tracking\n *\n * @example\n * ```tsx\n * import { usePixel } from '@sendmailos/sdk/react';\n *\n * function MyComponent() {\n * const { track, identify } = usePixel('pk_live_...');\n *\n * const handleClick = () => {\n * track('button_clicked', { button_id: 'cta' });\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * }\n * ```\n */\nexport function usePixel(token: string, options?: UsePixelOptions): UsePixelReturn {\n const pixelRef = useRef<SendmailPixel | null>(null);\n\n // Initialize pixel once\n useEffect(() => {\n if (!pixelRef.current && typeof window !== 'undefined') {\n pixelRef.current = new SendmailPixel({\n token,\n ...options,\n });\n pixelRef.current.init();\n }\n }, [token, options]);\n\n const track = useCallback((eventName: string, properties?: TrackProps) => {\n pixelRef.current?.track(eventName, properties);\n }, []);\n\n const page = useCallback(() => {\n pixelRef.current?.pageView();\n }, []);\n\n const identify = useCallback((email: string, traits?: IdentifyTraits) => {\n pixelRef.current?.identify(email, traits);\n }, []);\n\n const optOut = useCallback(() => {\n pixelRef.current?.optOut();\n }, []);\n\n const optIn = useCallback(() => {\n pixelRef.current?.optIn();\n }, []);\n\n const isOptedOut = useCallback(() => {\n return pixelRef.current?.isOptedOut() ?? false;\n }, []);\n\n const reset = useCallback(() => {\n pixelRef.current?.reset();\n }, []);\n\n const getVisitorId = useCallback(() => {\n return pixelRef.current?.getVisitorId() ?? null;\n }, []);\n\n return {\n track,\n page,\n identify,\n optOut,\n optIn,\n isOptedOut,\n reset,\n getVisitorId,\n pixel: pixelRef.current,\n };\n}\n\n/**\n * Hook to track page views on route changes\n * Useful for Next.js App Router or React Router\n *\n * @example\n * ```tsx\n * import { usePageTracking } from '@sendmailos/sdk/react';\n * import { usePathname } from 'next/navigation';\n *\n * function Layout({ children }) {\n * const pathname = usePathname();\n * usePageTracking('pk_live_...', pathname);\n * return children;\n * }\n * ```\n */\nexport function usePageTracking(\n token: string,\n pathname: string,\n options?: UsePixelOptions\n): void {\n const { page } = usePixel(token, options);\n\n useEffect(() => {\n page();\n }, [pathname, page]);\n}\n\n/**\n * Hook to identify user when they log in\n *\n * @example\n * ```tsx\n * import { useIdentifyOnLogin } from '@sendmailos/sdk/react';\n *\n * function App() {\n * const { user } = useAuth();\n * useIdentifyOnLogin('pk_live_...', user?.email, {\n * first_name: user?.firstName,\n * plan: user?.plan,\n * });\n * return <Main />;\n * }\n * ```\n */\nexport function useIdentifyOnLogin(\n token: string,\n email: string | null | undefined,\n traits?: IdentifyTraits,\n options?: UsePixelOptions\n): void {\n const { identify, reset } = usePixel(token, options);\n\n useEffect(() => {\n if (email) {\n identify(email, traits);\n } else {\n // User logged out\n reset();\n }\n }, [email, traits, identify, reset]);\n}\n"]}
|