@flonkid/kyc 1.4.2 → 1.5.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/browser/utils.ts","../src/browser/iframe-manager.ts","../src/browser/loader.ts","../src/browser/message-handler.ts","../src/browser/viewport.ts","../src/browser/index.ts","../src/browser/react.tsx"],"names":["useRef","useMemo","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["export const SDK_VERSION = '1.4.0';\r\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\r\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\r\n\r\nexport const WIDGET_EVENTS = {\r\n READY: 'KYC_WIDGET_READY',\r\n COMPLETE: 'KYC_COMPLETE',\r\n CANCEL: 'KYC_CANCEL',\r\n ERROR: 'KYC_ERROR',\r\n} as const;\r\n","export class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly statusCode?: number,\r\n ) {\r\n super(message);\r\n this.name = 'FlonkError';\r\n }\r\n}\r\n\r\nexport class FlonkAPIError extends FlonkError {\r\n constructor(\r\n message: string,\r\n statusCode: number,\r\n public readonly body?: unknown,\r\n ) {\r\n super(message, 'api_error', statusCode);\r\n this.name = 'FlonkAPIError';\r\n }\r\n}\r\n\r\nexport class FlonkAuthenticationError extends FlonkError {\r\n constructor(message = 'Invalid or missing secret key') {\r\n super(message, 'authentication_error', 401);\r\n this.name = 'FlonkAuthenticationError';\r\n }\r\n}\r\n\r\nexport class FlonkValidationError extends FlonkError {\r\n constructor(message: string) {\r\n super(message, 'validation_error', 400);\r\n this.name = 'FlonkValidationError';\r\n }\r\n}\r\n\r\nexport class FlonkWebhookSignatureError extends FlonkError {\r\n constructor(message = 'Invalid webhook signature') {\r\n super(message, 'webhook_signature_error');\r\n this.name = 'FlonkWebhookSignatureError';\r\n }\r\n}\r\n","// ── Types ──────────────────────────────────────────────\r\n\r\nexport interface DesignTokens {\r\n colors?: {\r\n primary?: { cannabis?: string };\r\n [key: string]: unknown;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface PublicSessionData {\r\n id: string;\r\n allowManualUpload?: boolean;\r\n clientMetadata?: Record<string, unknown>;\r\n qrCodeUrl?: string;\r\n testMode?: boolean;\r\n poaEnabled?: boolean;\r\n poaRequired?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n// ── DOM helpers ────────────────────────────────────────\r\n\r\nexport function getOrigin(url: string): string {\r\n try {\r\n return new URL(url).origin;\r\n } catch {\r\n return window.location.origin;\r\n }\r\n}\r\n\r\nexport function isDesktop(): boolean {\r\n return (\r\n window.innerWidth >= 1024 &&\r\n !('ontouchstart' in window || navigator.maxTouchPoints > 0)\r\n );\r\n}\r\n\r\nexport function setStyles(el: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\r\n Object.assign(el.style, styles);\r\n}\r\n\r\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n styles?: Partial<CSSStyleDeclaration>,\r\n attrs?: Record<string, string>,\r\n): HTMLElementTagNameMap[K] {\r\n const el = document.createElement(tag);\r\n if (styles) setStyles(el, styles);\r\n if (attrs) {\r\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\r\n }\r\n return el;\r\n}\r\n\r\nexport function debounce<T extends (...args: unknown[]) => void>(fn: T, ms: number): T {\r\n let timer: ReturnType<typeof setTimeout>;\r\n return ((...args: unknown[]) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => fn(...args), ms);\r\n }) as unknown as T;\r\n}\r\n\r\n// ── Color helper ───────────────────────────────────────\r\n\r\nexport function generateSecondaryColor(hex: string): string {\r\n try {\r\n const h = hex.replace('#', '');\r\n const r = parseInt(h.substring(0, 2), 16);\r\n const g = parseInt(h.substring(2, 4), 16);\r\n const b = parseInt(h.substring(4, 6), 16);\r\n const f = 0.6;\r\n const toHex = (n: number) => {\r\n const s = n.toString(16);\r\n return s.length === 1 ? '0' + s : s;\r\n };\r\n return (\r\n '#' +\r\n toHex(Math.round(r + (255 - r) * f)) +\r\n toHex(Math.round(g + (255 - g) * f)) +\r\n toHex(Math.round(b + (255 - b) * f))\r\n );\r\n } catch {\r\n return '#93c5fd';\r\n }\r\n}\r\n\r\n// ── API helpers ────────────────────────────────────────\r\n\r\nexport async function fetchWidgetToken(\r\n pk: string,\r\n apiBase: string,\r\n): Promise<{ token: string; mode: string; allowManualUpload: boolean }> {\r\n const res = await fetch(`${apiBase}/public/widget-token`, {\r\n headers: { 'x-kyc-pk': pk },\r\n credentials: 'include',\r\n });\r\n if (!res.ok) {\r\n let message = `Widget token request failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function fetchDesignTokens(\r\n apiBase: string,\r\n opts: { clientId?: string; pk?: string; sessionId?: string },\r\n): Promise<DesignTokens | null> {\r\n const params: string[] = [];\r\n if (opts.sessionId) params.push(`sessionId=${encodeURIComponent(opts.sessionId)}`);\r\n else if (opts.clientId) params.push(`clientId=${encodeURIComponent(opts.clientId)}`);\r\n\r\n const url = `${apiBase}/public/design-tokens${params.length ? '?' + params.join('&') : ''}`;\r\n try {\r\n const res = await fetch(url, {\r\n headers: opts.pk ? { 'x-kyc-pk': opts.pk } : {},\r\n credentials: 'omit',\r\n });\r\n return res.ok ? res.json() : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Validate serverUrl: absolute URLs must use HTTPS (except localhost for dev).\r\n */\r\nfunction validateServerUrl(url: string): void {\r\n // Relative paths are always OK ('/api/kyc/session')\r\n if (url.startsWith('/')) return;\r\n\r\n try {\r\n const parsed = new URL(url);\r\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\r\n if (parsed.protocol !== 'https:' && !isLocalhost) {\r\n throw new Error(\r\n `serverUrl must use HTTPS in production. Got: ${parsed.protocol}//. ` +\r\n `Use HTTPS ('https://api.myapp.com/...') or a relative path ('/api/...')`,\r\n );\r\n }\r\n } catch (e) {\r\n if ((e as Error).message.includes('serverUrl must use HTTPS')) throw e;\r\n throw new Error(`Invalid serverUrl: ${url}`);\r\n }\r\n}\r\n\r\nexport async function fetchSessionFromServer(\r\n serverUrl: string,\r\n clientMetadata?: Record<string, unknown>,\r\n): Promise<{ sessionId: string; embedToken: string }> {\r\n validateServerUrl(serverUrl);\r\n\r\n const res = await fetch(serverUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ clientMetadata }),\r\n });\r\n if (!res.ok) {\r\n let message = `Session request failed (${res.status})`;\r\n try {\r\n const body = await res.json();\r\n if (body.error) message = body.error;\r\n else if (body.message) message = body.message;\r\n } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function fetchPublicSession(\r\n apiBase: string,\r\n sessionId: string,\r\n embedToken: string,\r\n): Promise<PublicSessionData> {\r\n const res = await fetch(`${apiBase}/public/session/${sessionId}`, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${embedToken}`,\r\n },\r\n });\r\n if (!res.ok) {\r\n let message = `Failed to fetch session (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function exchangeSessionForToken(\r\n apiBase: string,\r\n sessionId: string,\r\n): Promise<{ embedToken: string; session: PublicSessionData }> {\r\n const res = await fetch(`${apiBase}/public/session/${sessionId}/token`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n if (!res.ok) {\r\n let message = `Token exchange failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n","import { createEl, isDesktop, setStyles } from './utils';\r\n\r\nexport function createIframe(src: string): HTMLIFrameElement {\r\n const d = isDesktop();\r\n const iframe = createEl(\r\n 'iframe',\r\n {\r\n border: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n zIndex: '9999',\r\n background: 'transparent',\r\n backgroundColor: 'transparent',\r\n opacity: '0',\r\n visibility: 'hidden',\r\n borderRadius: d ? '0' : '',\r\n boxShadow: d ? 'none' : '',\r\n colorScheme: 'normal',\r\n },\r\n {\r\n src,\r\n allow: 'camera;microphone;clipboard-read;clipboard-write',\r\n sandbox: 'allow-scripts allow-forms allow-same-origin allow-popups',\r\n 'aria-label': 'KYC Verification',\r\n allowtransparency: 'true',\r\n },\r\n );\r\n\r\n try {\r\n iframe.style.setProperty('background', 'transparent', 'important');\r\n iframe.style.setProperty('background-color', 'transparent', 'important');\r\n iframe.style.setProperty('color-scheme', 'normal', 'important');\r\n } catch { /* noop */ }\r\n\r\n return iframe;\r\n}\r\n\r\n/**\r\n * Ensure the iframe/loader z-index is above all existing elements.\r\n */\r\nexport function adjustZIndex(loader: HTMLElement, iframe: HTMLIFrameElement): void {\r\n if (!isDesktop()) return;\r\n const all = Array.from(document.querySelectorAll('*'));\r\n const maxZ = Math.max(\r\n ...all.map((el) => parseInt(getComputedStyle(el).zIndex) || 0).filter((z) => z < 999999),\r\n );\r\n if (maxZ > 9998) {\r\n loader.style.zIndex = String(maxZ + 1);\r\n iframe.style.zIndex = String(maxZ + 2);\r\n }\r\n}\r\n\r\n/**\r\n * Transition: loader fades out, iframe fades in.\r\n */\r\nexport function transitionLoaderToIframe(\r\n loader: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n onDone: () => void,\r\n): void {\r\n const d = isDesktop();\r\n const dur = d ? 300 : 500;\r\n\r\n setStyles(iframe, { opacity: '0', visibility: 'hidden' });\r\n const card = loader.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n loader.style.opacity = '0';\r\n\r\n setTimeout(() => {\r\n onDone();\r\n setStyles(iframe, {\r\n transition: d\r\n ? 'opacity 300ms cubic-bezier(0.4,0,0.2,1),visibility 0ms'\r\n : 'opacity 400ms ease-out,visibility 0ms',\r\n opacity: '1',\r\n visibility: 'visible',\r\n });\r\n }, dur);\r\n}\r\n","import { createEl, setStyles, isDesktop, debounce } from './utils';\r\n\r\nconst LOADER_I18N: Record<string, { title: string; subtitle: string; errorTitle: string; close: string }> = {\r\n en: { title: 'Initializing...', subtitle: 'Loading KYC widget', errorTitle: 'Something went wrong', close: 'Close' },\r\n de: { title: 'Initialisierung...', subtitle: 'KYC-Widget wird geladen', errorTitle: 'Ein Fehler ist aufgetreten', close: 'Schließen' },\r\n uk: { title: 'Ініціалізація...', subtitle: 'Завантаження KYC-віджета', errorTitle: 'Щось пішло не так', close: 'Закрити' },\r\n};\r\n\r\nconst KEYFRAMES = `\r\n@keyframes kycspin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}\r\n@keyframes kycdash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}\r\n@keyframes kycprogress{0%{transform:translateX(-100%)}50%{transform:translateX(0%)}100%{transform:translateX(250%)}}\r\n`.trim();\r\n\r\nlet styleInjected = false;\r\n\r\nexport class Loader {\r\n private overlay: HTMLElement | null = null;\r\n private cleanup: (() => void) | null = null;\r\n private origBodyStyles: { overflow: string; position: string } | null = null;\r\n\r\n show(primaryColor: string, lang?: string): HTMLElement {\r\n const color = primaryColor || '#15BA68';\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const d = isDesktop();\r\n\r\n // Inject keyframes once\r\n if (!styleInjected) {\r\n const style = document.createElement('style');\r\n style.textContent = KEYFRAMES;\r\n document.head.appendChild(style);\r\n styleInjected = true;\r\n }\r\n\r\n // Overlay\r\n const overlay = createEl('div', {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n background: d ? 'rgba(0,0,0,0.05)' : 'transparent',\r\n backdropFilter: d ? 'blur(2px)' : 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '9998',\r\n transition: 'opacity 600ms ease-out,transform 400ms ease-out',\r\n opacity: '1',\r\n overflow: 'hidden',\r\n margin: '0',\r\n padding: '0',\r\n });\r\n\r\n // Card\r\n const card = createEl('div', {\r\n width: d ? 'min(400px, 35vw)' : 'min(360px, 85vw)',\r\n backgroundColor: '#FFF',\r\n borderRadius: d ? '32px' : '24px',\r\n boxShadow: d\r\n ? '0 20px 64px rgba(17,17,17,0.12),0 4px 16px rgba(17,17,17,0.08)'\r\n : '0 8px 32px rgba(17,17,17,0.08)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: d ? '48px 36px' : '36px 24px',\r\n gap: d ? '24px' : '20px',\r\n transition: 'transform 400ms ease-out,opacity 400ms ease-out',\r\n });\r\n\r\n // Spinner SVG\r\n const wrap = createEl('div', {\r\n width: '48px',\r\n height: '48px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '48');\r\n svg.setAttribute('height', '48');\r\n svg.setAttribute('viewBox', '0 0 48 48');\r\n svg.style.animation = 'kycspin 1.2s cubic-bezier(0.4,0,0.6,1) infinite';\r\n\r\n const bg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none', stroke: color + '33',\r\n })) bg.setAttribute(k, v);\r\n\r\n const fg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none',\r\n stroke: color, 'stroke-linecap': 'round', 'stroke-dasharray': '62.8', 'stroke-dashoffset': '15.7',\r\n })) fg.setAttribute(k, v);\r\n setStyles(fg as unknown as HTMLElement, { transformOrigin: 'center', animation: 'kycdash 1.5s ease-in-out infinite' });\r\n\r\n svg.append(bg, fg);\r\n wrap.appendChild(svg);\r\n\r\n // Text\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n const textBox = createEl('div', { textAlign: 'center' });\r\n const title = createEl('h3', { fontFamily: font, fontWeight: '600', fontSize: '18px', lineHeight: '1.3', color: '#1F2937', margin: '0 0 4px 0' });\r\n title.textContent = strings.title;\r\n const subtitle = createEl('p', { fontFamily: font, fontWeight: '400', fontSize: '13px', lineHeight: '1.4', color: 'rgba(31,41,55,0.7)', margin: '0' });\r\n subtitle.textContent = strings.subtitle;\r\n textBox.append(title, subtitle);\r\n\r\n // Progress bar\r\n const track = createEl('div', { width: '100%', maxWidth: '240px', height: '3px', backgroundColor: color + '1A', borderRadius: '2px', overflow: 'hidden' });\r\n const bar = createEl('div', { width: '40%', height: '100%', backgroundColor: color, borderRadius: '2px', transform: 'translateX(-100%)', animation: 'kycprogress 2000ms ease-in-out infinite' });\r\n track.appendChild(bar);\r\n\r\n card.append(wrap, textBox, track);\r\n overlay.appendChild(card);\r\n\r\n // Lock body scroll\r\n this.origBodyStyles = { overflow: document.body.style.overflow, position: document.body.style.position };\r\n setStyles(document.body, { overflow: 'hidden', position: 'fixed', width: '100%', height: '100%' });\r\n document.body.appendChild(overlay);\r\n\r\n // Resize handler\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n const onResize = debounce(() => {\r\n const w = window.innerWidth;\r\n const h = window.innerHeight;\r\n if (Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1) {\r\n setStyles(overlay, { width: w + 'px', height: h + 'px' });\r\n prevW = w;\r\n prevH = h;\r\n }\r\n }, d ? 50 : 150);\r\n window.addEventListener('resize', onResize);\r\n\r\n this.overlay = overlay;\r\n this.cleanup = () => {\r\n window.removeEventListener('resize', onResize);\r\n if (this.origBodyStyles) {\r\n setStyles(document.body, { ...this.origBodyStyles, width: '', height: '' });\r\n }\r\n };\r\n\r\n return overlay;\r\n }\r\n\r\n get element(): HTMLElement | null {\r\n return this.overlay;\r\n }\r\n\r\n showError(message: string, lang?: string): void {\r\n if (!this.overlay) return;\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const card = this.overlay.querySelector('div') as HTMLElement | null;\r\n if (!card) return;\r\n\r\n // Replace card content with error state\r\n card.innerHTML = '';\r\n\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n\r\n // Error icon (X circle)\r\n const iconWrap = createEl('div', {\r\n width: '48px', height: '48px', borderRadius: '50%',\r\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\r\n display: 'flex', alignItems: 'center', justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '24'); svg.setAttribute('height', '24');\r\n svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('fill', 'none');\r\n svg.setAttribute('stroke', '#ef4444'); svg.setAttribute('stroke-width', '2');\r\n svg.setAttribute('stroke-linecap', 'round');\r\n const line1 = document.createElementNS(NS, 'line');\r\n line1.setAttribute('x1', '18'); line1.setAttribute('y1', '6');\r\n line1.setAttribute('x2', '6'); line1.setAttribute('y2', '18');\r\n const line2 = document.createElementNS(NS, 'line');\r\n line2.setAttribute('x1', '6'); line2.setAttribute('y1', '6');\r\n line2.setAttribute('x2', '18'); line2.setAttribute('y2', '18');\r\n svg.append(line1, line2);\r\n iconWrap.appendChild(svg);\r\n\r\n // Title\r\n const title = createEl('h3', {\r\n fontFamily: font, fontWeight: '600', fontSize: '18px',\r\n lineHeight: '1.3', color: '#1F2937', margin: '0', textAlign: 'center',\r\n });\r\n title.textContent = strings.errorTitle;\r\n\r\n // Message\r\n const msg = createEl('p', {\r\n fontFamily: font, fontWeight: '400', fontSize: '13px',\r\n lineHeight: '1.5', color: 'rgba(31,41,55,0.7)', margin: '0',\r\n textAlign: 'center', wordBreak: 'break-word', maxWidth: '300px',\r\n });\r\n msg.textContent = message;\r\n\r\n // Close button\r\n const btn = createEl('button', {\r\n fontFamily: font, fontWeight: '600', fontSize: '14px',\r\n padding: '10px 32px', borderRadius: '12px', border: 'none',\r\n backgroundColor: '#1F2937', color: '#fff', cursor: 'pointer',\r\n transition: 'opacity 150ms',\r\n });\r\n btn.textContent = strings.close;\r\n btn.onmouseenter = () => { btn.style.opacity = '0.85'; };\r\n btn.onmouseleave = () => { btn.style.opacity = '1'; };\r\n btn.onclick = () => this.destroy();\r\n\r\n card.append(iconWrap, title, msg, btn);\r\n }\r\n\r\n fadeOut(): void {\r\n if (!this.overlay) return;\r\n const d = isDesktop();\r\n const card = this.overlay.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n this.overlay.style.opacity = '0';\r\n }\r\n\r\n destroy(): void {\r\n this.cleanup?.();\r\n if (this.overlay?.parentNode) this.overlay.remove();\r\n this.overlay = null;\r\n this.cleanup = null;\r\n }\r\n}\r\n","import { WIDGET_EVENTS } from '../shared/constants';\r\nimport { getOrigin } from './utils';\r\n\r\nexport interface MessageCallbacks {\r\n onSuccess?: (result: Record<string, unknown>) => void;\r\n onError?: (error: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n}\r\n\r\nexport class MessageHandler {\r\n private listener: ((e: MessageEvent) => void) | null = null;\r\n private readyListener: ((e: MessageEvent) => void) | null = null;\r\n private completionHandled = false;\r\n\r\n constructor(\r\n private readonly iframeSrc: string,\r\n private readonly iframe: HTMLIFrameElement,\r\n private readonly callbacks: MessageCallbacks,\r\n ) {}\r\n\r\n /**\r\n * Start listening for postMessage events from the widget iframe.\r\n */\r\n listen(): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.listener = (e: MessageEvent) => {\r\n if (e.origin !== origin) return;\r\n if (e.source !== this.iframe.contentWindow) return;\r\n const data = e.data || {};\r\n const type = data.type as string;\r\n\r\n if (type === WIDGET_EVENTS.COMPLETE && this.callbacks.onSuccess) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onSuccess(data.result);\r\n setTimeout(() => this.iframe.remove(), 1000);\r\n } else if (type === WIDGET_EVENTS.CANCEL && this.callbacks.onCancel) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onCancel();\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.ERROR && this.callbacks.onError) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onError(data.error || 'Unknown error');\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.READY && this.callbacks.onReady) {\r\n this.callbacks.onReady();\r\n }\r\n };\r\n\r\n window.addEventListener('message', this.listener);\r\n }\r\n\r\n /**\r\n * Listen for the first READY event, then call the callback once.\r\n */\r\n onReadyOnce(callback: () => void): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.readyListener = (e: MessageEvent) => {\r\n if (e.origin !== origin || e.data?.type !== WIDGET_EVENTS.READY) return;\r\n window.removeEventListener('message', this.readyListener!);\r\n this.readyListener = null;\r\n callback();\r\n };\r\n\r\n window.addEventListener('message', this.readyListener);\r\n }\r\n\r\n destroy(): void {\r\n if (this.listener) {\r\n window.removeEventListener('message', this.listener);\r\n this.listener = null;\r\n }\r\n if (this.readyListener) {\r\n window.removeEventListener('message', this.readyListener);\r\n this.readyListener = null;\r\n }\r\n }\r\n}\r\n","import { setStyles, isDesktop, debounce } from './utils';\r\n\r\ninterface ViewportInfo {\r\n width: number;\r\n height: number;\r\n offsetTop: number;\r\n offsetLeft: number;\r\n}\r\n\r\nfunction getVV(): ViewportInfo {\r\n if (window.visualViewport) {\r\n return {\r\n width: window.visualViewport.width,\r\n height: window.visualViewport.height,\r\n offsetTop: window.visualViewport.offsetTop || 0,\r\n offsetLeft: window.visualViewport.offsetLeft || 0,\r\n };\r\n }\r\n return { width: window.innerWidth, height: window.innerHeight, offsetTop: 0, offsetLeft: 0 };\r\n}\r\n\r\nexport function ensureViewportMeta(): void {\r\n try {\r\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"viewport\"]');\r\n if (!meta) {\r\n const m = document.createElement('meta');\r\n m.setAttribute('name', 'viewport');\r\n m.setAttribute('content', 'width=device-width, initial-scale=1.0, viewport-fit=cover');\r\n document.head.appendChild(m);\r\n } else {\r\n const c = meta.getAttribute('content') || '';\r\n if (!c.includes('viewport-fit=cover')) {\r\n meta.setAttribute('content', c + ', viewport-fit=cover');\r\n }\r\n }\r\n } catch { /* noop */ }\r\n}\r\n\r\nexport function setupViewportSizing(\r\n overlay: HTMLElement | null,\r\n iframe: HTMLElement | null,\r\n): () => void {\r\n ensureViewportMeta();\r\n\r\n let baselineHeight = 0;\r\n let desktop = isDesktop();\r\n let rafId: number | null = null;\r\n\r\n const initBaseline = () => {\r\n const vv = getVV();\r\n baselineHeight = window.innerHeight || vv.height || document.documentElement.clientHeight || 0;\r\n desktop = isDesktop();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n const applySize = () => {\r\n try {\r\n const vv = getVV();\r\n const inner = window.innerHeight || vv.height;\r\n const kbThreshold = desktop ? 200 : 150;\r\n const isKeyboard = (inner - vv.height) > kbThreshold;\r\n const height = isKeyboard ? vv.height : (baselineHeight || inner);\r\n\r\n const dims = desktop\r\n ? { top: '0', left: '0', width: window.innerWidth + 'px', height: window.innerHeight + 'px' }\r\n : { top: vv.offsetTop + 'px', left: vv.offsetLeft + 'px', width: vv.width + 'px', height: height + 'px' };\r\n\r\n if (overlay) setStyles(overlay, dims);\r\n if (iframe) setStyles(iframe, dims);\r\n } catch { /* noop */ }\r\n };\r\n\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n let prevX = 0;\r\n let prevY = 0;\r\n\r\n const debouncedApply = debounce(() => {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n }, desktop ? 50 : 150);\r\n\r\n const handleResize = () => {\r\n const vv = getVV();\r\n const w = vv.width;\r\n const h = vv.height;\r\n const x = vv.offsetLeft;\r\n const y = vv.offsetTop;\r\n const changed = Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1\r\n || Math.abs(x - prevX) > 1 || Math.abs(y - prevY) > 1;\r\n if (!changed) return;\r\n\r\n if (Math.abs(h - prevH) > 1) initBaseline();\r\n prevW = w;\r\n prevH = h;\r\n prevX = x;\r\n prevY = y;\r\n\r\n if (desktop) {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n } else {\r\n debouncedApply();\r\n }\r\n };\r\n\r\n const handleOrientation = () => {\r\n initBaseline();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n initBaseline();\r\n applySize();\r\n\r\n window.addEventListener('resize', handleResize);\r\n window.addEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.addEventListener('resize', handleResize);\r\n window.visualViewport.addEventListener('scroll', handleResize);\r\n }\r\n\r\n return () => {\r\n try {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n window.removeEventListener('resize', handleResize);\r\n window.removeEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.removeEventListener('resize', handleResize);\r\n window.visualViewport.removeEventListener('scroll', handleResize);\r\n }\r\n } catch { /* noop */ }\r\n };\r\n}\r\n","import { SDK_VERSION, DEFAULT_WIDGET_URL, DEFAULT_API_BASE } from '../shared/constants';\r\nimport { FlonkValidationError } from '../shared/errors';\r\nimport type {\r\n FlonkKYCOptions,\r\n WidgetInitConfig,\r\n WidgetPreviewConfig,\r\n WidgetEmbedConfig,\r\n WidgetInstance,\r\n EmbedInstance,\r\n PreviewColors,\r\n VerificationResult,\r\n} from '../shared/types';\r\nimport {\r\n isDesktop,\r\n setStyles,\r\n getOrigin,\r\n generateSecondaryColor,\r\n fetchWidgetToken,\r\n fetchDesignTokens,\r\n fetchSessionFromServer,\r\n fetchPublicSession,\r\n exchangeSessionForToken,\r\n type DesignTokens,\r\n type PublicSessionData,\r\n} from './utils';\r\nimport { createIframe, adjustZIndex, transitionLoaderToIframe } from './iframe-manager';\r\nimport { Loader } from './loader';\r\nimport { MessageHandler } from './message-handler';\r\nimport { setupViewportSizing } from './viewport';\r\n\r\nexport class FlonkKYC {\r\n static readonly version = SDK_VERSION;\r\n\r\n private readonly widgetUrl: string;\r\n private readonly apiBase: string;\r\n\r\n constructor(options: FlonkKYCOptions = {}) {\r\n this.widgetUrl = (options.widgetUrl || DEFAULT_WIDGET_URL).replace(/\\/$/, '');\r\n this.apiBase = (options.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n }\r\n\r\n // ── Public API ───────────────────────────────────────\r\n\r\n /**\r\n * Open the KYC verification widget.\r\n *\r\n * Flows (pick one):\r\n * 1. `{ serverUrl }` — auto-create session via your backend (recommended)\r\n * 2. `{ sessionId, embedToken }` — server-to-server with pre-created session\r\n * 3. `{ publishableKey }` — client-side only\r\n */\r\n async init(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n if (!config) throw new FlonkValidationError('config is required');\r\n\r\n // Flow: serverUrl — SDK calls client's backend to auto-create session\r\n if (config.serverUrl) {\r\n return this.initWithServerUrl(config);\r\n }\r\n\r\n // Flow: sessionId + embedToken — direct server-to-server\r\n if (config.sessionId && config.embedToken) {\r\n return this.initWithEmbedToken(config);\r\n }\r\n\r\n // Flow: sessionId only — legacy (exchange for token)\r\n if (config.sessionId) {\r\n return this.initWithSession(config);\r\n }\r\n\r\n // Flow: publishableKey — client-side\r\n const pk = config.publishableKey;\r\n if (!pk || !/^pk_/.test(pk)) {\r\n throw new FlonkValidationError(\r\n 'Provide one of: serverUrl, sessionId + embedToken, or publishableKey (pk_*)',\r\n );\r\n }\r\n return this.initWithPublishableKey(config);\r\n }\r\n\r\n /**\r\n * Preview mode — no API calls, mock data.\r\n */\r\n preview(config: WidgetPreviewConfig = {}): WidgetInstance {\r\n const colors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n return this.openWidget({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(colors),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n lang: config.lang || 'de',\r\n overlayColor: config.overlayColor,\r\n }, {\r\n primaryColor: colors.primaryColor || '#3b82f6',\r\n lang: config.lang,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n });\r\n }\r\n\r\n /**\r\n * Embed inline preview in a container (for dashboards).\r\n */\r\n embed(config: WidgetEmbedConfig): EmbedInstance {\r\n if (!config?.container) throw new FlonkValidationError('container is required');\r\n\r\n const container =\r\n typeof config.container === 'string'\r\n ? document.querySelector<HTMLElement>(config.container)\r\n : config.container;\r\n if (!container) throw new FlonkValidationError('Container element not found');\r\n\r\n let colors: PreviewColors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n let device = config.device || 'mobile';\r\n let scale = config.scale ?? 1;\r\n const lang = config.lang || 'de';\r\n\r\n const buildSrc = (c: PreviewColors, d: string) => {\r\n const p = new URLSearchParams({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(c),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n device: d,\r\n lang,\r\n });\r\n return `${this.widgetUrl}/?${p.toString()}`;\r\n };\r\n\r\n const applyScale = () => {\r\n iframe.style.transform = scale !== 1 ? `scale(${scale})` : '';\r\n iframe.style.transformOrigin = scale !== 1 ? 'top left' : '';\r\n };\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.style.cssText = 'border:none;width:100%;height:100%;display:block';\r\n iframe.src = buildSrc(colors, device);\r\n iframe.title = 'KYC Widget Preview';\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms');\r\n applyScale();\r\n\r\n container.innerHTML = '';\r\n container.appendChild(iframe);\r\n\r\n return {\r\n iframe,\r\n setColors(newColors: Partial<PreviewColors>) {\r\n colors = { ...colors, ...newColors };\r\n if (newColors.primaryColor && !newColors.secondaryColor) {\r\n colors.secondaryColor = generateSecondaryColor(newColors.primaryColor);\r\n }\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n setDevice(d: 'mobile' | 'desktop') {\r\n device = d;\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n getColors: () => ({ ...colors }),\r\n destroy: () => iframe.remove(),\r\n };\r\n }\r\n\r\n // ── Private flows ────────────────────────────────────\r\n\r\n /**\r\n * Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.\r\n */\r\n private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const loader = new Loader();\r\n loader.show('#15BA68', config.lang);\r\n\r\n try {\r\n const { sessionId, embedToken } = await fetchSessionFromServer(\r\n config.serverUrl!,\r\n config.clientMetadata,\r\n );\r\n loader.destroy();\r\n return this.initWithEmbedToken({ ...config, sessionId, embedToken });\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to create session';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 2: sessionId + embedToken — fetch session data, open widget.\r\n */\r\n private async initWithEmbedToken(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const sessionData = await fetchPublicSession(\r\n this.apiBase,\r\n config.sessionId!,\r\n config.embedToken!,\r\n );\r\n\r\n const session = {\r\n id: sessionData.id,\r\n allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,\r\n clientMetadata: sessionData.clientMetadata || config.clientMetadata,\r\n qrCodeUrl: sessionData.qrCodeUrl,\r\n testMode: sessionData.testMode || false,\r\n poaEnabled: sessionData.poaEnabled || false,\r\n poaRequired: sessionData.poaRequired || false,\r\n };\r\n\r\n return this.buildWidget(config.embedToken!, session, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 3: sessionId only — exchange for embedToken, then init.\r\n */\r\n private async initWithSession(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const { embedToken, session } = await exchangeSessionForToken(\r\n this.apiBase,\r\n config.sessionId!,\r\n );\r\n return this.buildWidget(embedToken, session, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 4: publishableKey — fetch widget token, open widget.\r\n */\r\n private async initWithPublishableKey(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey!;\r\n const designTokens = await fetchDesignTokens(this.apiBase, { pk });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const data = await fetchWidgetToken(pk, this.apiBase);\r\n\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n publishableKey: pk,\r\n allowManualUpload: String(data.allowManualUpload !== false),\r\n };\r\n\r\n if (data.token) params.token = data.token;\r\n if (config.clientMetadata) {\r\n params.clientMetadata = JSON.stringify(config.clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor,\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n // ── Core widget builder ──────────────────────────────\r\n\r\n private buildWidget(\r\n token: string,\r\n session: PublicSessionData,\r\n config: WidgetInitConfig,\r\n loader: Loader,\r\n designTokens: DesignTokens | null,\r\n ): WidgetInstance {\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n sessionId: config.sessionId || session.id,\r\n token,\r\n allowManualUpload: String(session.allowManualUpload !== false),\r\n };\r\n\r\n if (session.testMode) params.testMode = 'true';\r\n if (session.poaEnabled) params.poaEnabled = 'true';\r\n if (session.poaRequired) params.poaRequired = 'true';\r\n if (designTokens?.colors) {\r\n params.designTokens = JSON.stringify(designTokens);\r\n }\r\n if (config.embedToken) params.embedToken = config.embedToken;\r\n if (session.qrCodeUrl) params.qrCodeUrl = session.qrCodeUrl;\r\n\r\n const clientMetadata = session.clientMetadata || config.clientMetadata;\r\n if (clientMetadata) {\r\n params.clientMetadata = JSON.stringify(clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor: designTokens?.colors?.primary?.cannabis || '#15BA68',\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n }\r\n\r\n /**\r\n * Core: create iframe, attach listeners, return WidgetInstance.\r\n */\r\n private openWidget(\r\n params: Record<string, string | undefined>,\r\n opts: {\r\n primaryColor: string;\r\n lang?: string;\r\n loader?: Loader;\r\n onSuccess?: (r: VerificationResult) => void;\r\n onError?: (e: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n mount?: HTMLElement;\r\n },\r\n ): WidgetInstance {\r\n // Build URL\r\n const filtered = Object.fromEntries(\r\n Object.entries(params).filter(([, v]) => v != null),\r\n ) as Record<string, string>;\r\n const search = new URLSearchParams(filtered);\r\n const src = `${this.widgetUrl}/?${search.toString()}`;\r\n\r\n // Create iframe\r\n const iframe = createIframe(src);\r\n const mountTarget = opts.mount || document.body;\r\n\r\n // Loader z-index\r\n const loader = opts.loader ?? (() => {\r\n const l = new Loader();\r\n l.show(opts.primaryColor, opts.lang);\r\n return l;\r\n })();\r\n\r\n if (loader.element) adjustZIndex(loader.element, iframe);\r\n mountTarget.appendChild(iframe);\r\n\r\n // Viewport sizing\r\n const cleanupViewport = setupViewportSizing(loader.element, iframe);\r\n\r\n // Shared cleanup — runs on both manual destroy() and auto-close from MessageHandler\r\n let cleaned = false;\r\n const cleanupAll = () => {\r\n if (cleaned) return;\r\n cleaned = true;\r\n try {\r\n handler.destroy();\r\n cleanupViewport();\r\n loader.destroy();\r\n if (iframe.parentNode) iframe.remove();\r\n } catch { /* noop */ }\r\n };\r\n\r\n // Wrap callbacks to run full cleanup after user callback fires\r\n const afterCleanup = (delayMs: number) => () => setTimeout(cleanupAll, delayMs);\r\n\r\n // Message handler\r\n const handler = new MessageHandler(src, iframe, {\r\n onSuccess: opts.onSuccess\r\n ? (r) => { opts.onSuccess?.(r); afterCleanup(1000)(); }\r\n : undefined,\r\n onError: opts.onError\r\n ? (e) => { opts.onError?.(e); afterCleanup(500)(); }\r\n : undefined,\r\n onCancel: opts.onCancel\r\n ? () => { opts.onCancel?.(); afterCleanup(500)(); }\r\n : undefined,\r\n onReady: opts.onReady,\r\n });\r\n handler.listen();\r\n\r\n // Ready transition: loader → iframe\r\n handler.onReadyOnce(() => {\r\n transitionLoaderToIframe(loader.element!, iframe, () => loader.destroy());\r\n });\r\n\r\n return {\r\n iframe,\r\n destroy: cleanupAll,\r\n };\r\n }\r\n}\r\n","import { useEffect, useRef, useMemo } from 'react';\nimport { FlonkKYC } from './index';\nimport type { WidgetInitConfig, WidgetInstance, FlonkKYCOptions, VerificationResult, WidgetLanguage } from '../shared/types';\n\nexport interface FlonkKYCProps extends FlonkKYCOptions {\n publishableKey?: string;\n serverUrl?: string;\n sessionId?: string;\n embedToken?: string;\n clientMetadata?: Record<string, unknown>;\n lang?: WidgetLanguage;\n overlayColor?: string;\n allowManualUpload?: boolean;\n onSuccess?: (result: VerificationResult) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onReady?: () => void;\n /** Auto-open on mount. Default: true */\n autoOpen?: boolean;\n}\n\nexport function FlonkKYCWidget({\n widgetUrl,\n apiBase,\n autoOpen = true,\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\n\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\n\n // Track mount generation to ignore stale inits from StrictMode\n const generationRef = useRef(0);\n\n useEffect(() => {\n if (!autoOpen) return;\n\n const thisGeneration = ++generationRef.current;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n mount: mountRef.current || undefined,\n onSuccess: (r) => callbacksRef.current.onSuccess?.(r),\n onError: (e) => callbacksRef.current.onError?.(e),\n onCancel: () => callbacksRef.current.onCancel?.(),\n onReady: () => callbacksRef.current.onReady?.(),\n };\n\n // Delay init to skip StrictMode's first mount-unmount cycle\n const timer = setTimeout(() => {\n if (generationRef.current !== thisGeneration) return;\n\n sdk.init(config)\n .then((instance) => {\n if (generationRef.current !== thisGeneration) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n })\n .catch((err) => {\n if (generationRef.current === thisGeneration) {\n callbacksRef.current.onError?.((err as Error).message);\n }\n });\n }, 0);\n\n return () => {\n clearTimeout(timer);\n widgetRef.current?.destroy();\n widgetRef.current = null;\n };\n }, [sdk, publishableKey, serverUrl, sessionId, autoOpen]);\n\n return <div ref={mountRef} />;\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/browser/utils.ts","../src/browser/iframe-manager.ts","../src/browser/loader.ts","../src/browser/message-handler.ts","../src/browser/viewport.ts","../src/browser/index.ts","../src/browser/react.tsx"],"names":["useRef","useMemo","useEffect","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["export const SDK_VERSION = '1.5.1';\r\nexport const DEFAULT_WIDGET_URL = 'https://widget.flonk.id';\r\nexport const DEFAULT_API_BASE = 'https://api.flonk.id/v1';\r\n\r\nexport const WIDGET_EVENTS = {\r\n READY: 'KYC_WIDGET_READY',\r\n COMPLETE: 'KYC_COMPLETE',\r\n CANCEL: 'KYC_CANCEL',\r\n ERROR: 'KYC_ERROR',\r\n} as const;\r\n","export class FlonkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly statusCode?: number,\r\n ) {\r\n super(message);\r\n this.name = 'FlonkError';\r\n }\r\n}\r\n\r\nexport class FlonkAPIError extends FlonkError {\r\n constructor(\r\n message: string,\r\n statusCode: number,\r\n public readonly body?: unknown,\r\n ) {\r\n super(message, 'api_error', statusCode);\r\n this.name = 'FlonkAPIError';\r\n }\r\n}\r\n\r\nexport class FlonkAuthenticationError extends FlonkError {\r\n constructor(message = 'Invalid or missing secret key') {\r\n super(message, 'authentication_error', 401);\r\n this.name = 'FlonkAuthenticationError';\r\n }\r\n}\r\n\r\nexport class FlonkValidationError extends FlonkError {\r\n constructor(message: string) {\r\n super(message, 'validation_error', 400);\r\n this.name = 'FlonkValidationError';\r\n }\r\n}\r\n\r\nexport class FlonkWebhookSignatureError extends FlonkError {\r\n constructor(message = 'Invalid webhook signature') {\r\n super(message, 'webhook_signature_error');\r\n this.name = 'FlonkWebhookSignatureError';\r\n }\r\n}\r\n","// ── Types ──────────────────────────────────────────────\r\n\r\nexport interface DesignTokens {\r\n colors?: {\r\n primary?: { cannabis?: string };\r\n [key: string]: unknown;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface PublicSessionData {\r\n id: string;\r\n allowManualUpload?: boolean;\r\n clientMetadata?: Record<string, unknown>;\r\n qrCodeUrl?: string;\r\n testMode?: boolean;\r\n poaEnabled?: boolean;\r\n poaRequired?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n// ── DOM helpers ────────────────────────────────────────\r\n\r\nexport function getOrigin(url: string): string {\r\n try {\r\n return new URL(url).origin;\r\n } catch {\r\n return window.location.origin;\r\n }\r\n}\r\n\r\nexport function isDesktop(): boolean {\r\n return (\r\n window.innerWidth >= 1024 &&\r\n !('ontouchstart' in window || navigator.maxTouchPoints > 0)\r\n );\r\n}\r\n\r\nexport function setStyles(el: HTMLElement, styles: Partial<CSSStyleDeclaration>): void {\r\n Object.assign(el.style, styles);\r\n}\r\n\r\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n styles?: Partial<CSSStyleDeclaration>,\r\n attrs?: Record<string, string>,\r\n): HTMLElementTagNameMap[K] {\r\n const el = document.createElement(tag);\r\n if (styles) setStyles(el, styles);\r\n if (attrs) {\r\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\r\n }\r\n return el;\r\n}\r\n\r\nexport function debounce<T extends (...args: unknown[]) => void>(fn: T, ms: number): T {\r\n let timer: ReturnType<typeof setTimeout>;\r\n return ((...args: unknown[]) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => fn(...args), ms);\r\n }) as unknown as T;\r\n}\r\n\r\n// ── Color helper ───────────────────────────────────────\r\n\r\nexport function generateSecondaryColor(hex: string): string {\r\n try {\r\n const h = hex.replace('#', '');\r\n const r = parseInt(h.substring(0, 2), 16);\r\n const g = parseInt(h.substring(2, 4), 16);\r\n const b = parseInt(h.substring(4, 6), 16);\r\n const f = 0.6;\r\n const toHex = (n: number) => {\r\n const s = n.toString(16);\r\n return s.length === 1 ? '0' + s : s;\r\n };\r\n return (\r\n '#' +\r\n toHex(Math.round(r + (255 - r) * f)) +\r\n toHex(Math.round(g + (255 - g) * f)) +\r\n toHex(Math.round(b + (255 - b) * f))\r\n );\r\n } catch {\r\n return '#93c5fd';\r\n }\r\n}\r\n\r\n// ── API helpers ────────────────────────────────────────\r\n\r\nexport async function fetchWidgetToken(\r\n pk: string,\r\n apiBase: string,\r\n): Promise<{ token: string; mode: string; allowManualUpload: boolean }> {\r\n const res = await fetch(`${apiBase}/public/widget-token`, {\r\n headers: { 'x-kyc-pk': pk },\r\n credentials: 'include',\r\n });\r\n if (!res.ok) {\r\n let message = `Widget token request failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function fetchDesignTokens(\r\n apiBase: string,\r\n opts: { clientId?: string; pk?: string; sessionId?: string },\r\n): Promise<DesignTokens | null> {\r\n const params: string[] = [];\r\n if (opts.sessionId) params.push(`sessionId=${encodeURIComponent(opts.sessionId)}`);\r\n else if (opts.clientId) params.push(`clientId=${encodeURIComponent(opts.clientId)}`);\r\n\r\n const url = `${apiBase}/public/design-tokens${params.length ? '?' + params.join('&') : ''}`;\r\n try {\r\n const res = await fetch(url, {\r\n headers: opts.pk ? { 'x-kyc-pk': opts.pk } : {},\r\n credentials: 'omit',\r\n });\r\n return res.ok ? res.json() : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Validate serverUrl: absolute URLs must use HTTPS (except localhost for dev).\r\n */\r\nfunction validateServerUrl(url: string): void {\r\n // Relative paths are always OK ('/api/kyc/session')\r\n if (url.startsWith('/')) return;\r\n\r\n try {\r\n const parsed = new URL(url);\r\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\r\n if (parsed.protocol !== 'https:' && !isLocalhost) {\r\n throw new Error(\r\n `serverUrl must use HTTPS in production. Got: ${parsed.protocol}//. ` +\r\n `Use HTTPS ('https://api.myapp.com/...') or a relative path ('/api/...')`,\r\n );\r\n }\r\n } catch (e) {\r\n if ((e as Error).message.includes('serverUrl must use HTTPS')) throw e;\r\n throw new Error(`Invalid serverUrl: ${url}`);\r\n }\r\n}\r\n\r\nexport async function fetchSessionFromServer(\r\n serverUrl: string,\r\n clientMetadata?: Record<string, unknown>,\r\n requestHeaders?: Record<string, string>,\r\n): Promise<{ sessionId: string; embedToken: string }> {\r\n validateServerUrl(serverUrl);\r\n\r\n const res = await fetch(serverUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json', ...requestHeaders },\r\n credentials: 'include',\r\n body: JSON.stringify({ clientMetadata }),\r\n });\r\n if (!res.ok) {\r\n let message = `Session request failed (${res.status})`;\r\n try {\r\n const body = await res.json();\r\n if (body.error) message = body.error;\r\n else if (body.message) message = body.message;\r\n } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function fetchPublicSession(\r\n apiBase: string,\r\n sessionId: string,\r\n embedToken: string,\r\n): Promise<PublicSessionData> {\r\n const res = await fetch(`${apiBase}/public/session/${sessionId}`, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${embedToken}`,\r\n },\r\n });\r\n if (!res.ok) {\r\n let message = `Failed to fetch session (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n\r\nexport async function exchangeSessionForToken(\r\n apiBase: string,\r\n sessionId: string,\r\n): Promise<{ embedToken: string; session: PublicSessionData }> {\r\n const res = await fetch(`${apiBase}/public/session/${sessionId}/token`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n if (!res.ok) {\r\n let message = `Token exchange failed (${res.status})`;\r\n try { const b = await res.json(); message = b.error || b.message || message; } catch {}\r\n throw new Error(message);\r\n }\r\n return res.json();\r\n}\r\n","import { createEl, isDesktop, setStyles } from './utils';\r\n\r\nexport function createIframe(src: string): HTMLIFrameElement {\r\n const d = isDesktop();\r\n const iframe = createEl(\r\n 'iframe',\r\n {\r\n border: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n zIndex: '9999',\r\n background: 'transparent',\r\n backgroundColor: 'transparent',\r\n opacity: '0',\r\n visibility: 'hidden',\r\n borderRadius: d ? '0' : '',\r\n boxShadow: d ? 'none' : '',\r\n colorScheme: 'normal',\r\n },\r\n {\r\n src,\r\n allow: 'camera;microphone;clipboard-read;clipboard-write',\r\n sandbox: 'allow-scripts allow-forms allow-same-origin allow-popups',\r\n 'aria-label': 'KYC Verification',\r\n allowtransparency: 'true',\r\n },\r\n );\r\n\r\n try {\r\n iframe.style.setProperty('background', 'transparent', 'important');\r\n iframe.style.setProperty('background-color', 'transparent', 'important');\r\n iframe.style.setProperty('color-scheme', 'normal', 'important');\r\n } catch { /* noop */ }\r\n\r\n return iframe;\r\n}\r\n\r\n/**\r\n * Ensure the iframe/loader z-index is above all existing elements.\r\n */\r\nexport function adjustZIndex(loader: HTMLElement, iframe: HTMLIFrameElement): void {\r\n if (!isDesktop()) return;\r\n const all = Array.from(document.querySelectorAll('*'));\r\n const maxZ = Math.max(\r\n ...all.map((el) => parseInt(getComputedStyle(el).zIndex) || 0).filter((z) => z < 999999),\r\n );\r\n if (maxZ > 9998) {\r\n loader.style.zIndex = String(maxZ + 1);\r\n iframe.style.zIndex = String(maxZ + 2);\r\n }\r\n}\r\n\r\n/**\r\n * Transition: loader fades out, iframe fades in.\r\n */\r\nexport function transitionLoaderToIframe(\r\n loader: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n onDone: () => void,\r\n): void {\r\n const d = isDesktop();\r\n const dur = d ? 300 : 500;\r\n\r\n setStyles(iframe, { opacity: '0', visibility: 'hidden' });\r\n const card = loader.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n loader.style.opacity = '0';\r\n\r\n setTimeout(() => {\r\n onDone();\r\n setStyles(iframe, {\r\n transition: d\r\n ? 'opacity 300ms cubic-bezier(0.4,0,0.2,1),visibility 0ms'\r\n : 'opacity 400ms ease-out,visibility 0ms',\r\n opacity: '1',\r\n visibility: 'visible',\r\n });\r\n }, dur);\r\n}\r\n","import { createEl, setStyles, isDesktop, debounce } from './utils';\r\n\r\nconst LOADER_I18N: Record<string, { title: string; subtitle: string; errorTitle: string; close: string }> = {\r\n en: { title: 'Initializing...', subtitle: 'Loading KYC widget', errorTitle: 'Something went wrong', close: 'Close' },\r\n de: { title: 'Initialisierung...', subtitle: 'KYC-Widget wird geladen', errorTitle: 'Ein Fehler ist aufgetreten', close: 'Schließen' },\r\n uk: { title: 'Ініціалізація...', subtitle: 'Завантаження KYC-віджета', errorTitle: 'Щось пішло не так', close: 'Закрити' },\r\n};\r\n\r\nconst KEYFRAMES = `\r\n@keyframes kycspin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}\r\n@keyframes kycdash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}\r\n@keyframes kycprogress{0%{transform:translateX(-100%)}50%{transform:translateX(0%)}100%{transform:translateX(250%)}}\r\n`.trim();\r\n\r\nlet styleInjected = false;\r\n\r\nexport class Loader {\r\n private overlay: HTMLElement | null = null;\r\n private cleanup: (() => void) | null = null;\r\n private origBodyStyles: { overflow: string; position: string } | null = null;\r\n\r\n show(primaryColor: string, lang?: string): HTMLElement {\r\n const color = primaryColor || '#15BA68';\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const d = isDesktop();\r\n\r\n // Inject keyframes once\r\n if (!styleInjected) {\r\n const style = document.createElement('style');\r\n style.textContent = KEYFRAMES;\r\n document.head.appendChild(style);\r\n styleInjected = true;\r\n }\r\n\r\n // Overlay\r\n const overlay = createEl('div', {\r\n position: 'fixed',\r\n top: '0',\r\n left: '0',\r\n right: '0',\r\n bottom: '0',\r\n width: window.innerWidth + 'px',\r\n height: window.innerHeight + 'px',\r\n background: d ? 'rgba(0,0,0,0.05)' : 'transparent',\r\n backdropFilter: d ? 'blur(2px)' : 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '9998',\r\n transition: 'opacity 600ms ease-out,transform 400ms ease-out',\r\n opacity: '1',\r\n overflow: 'hidden',\r\n margin: '0',\r\n padding: '0',\r\n });\r\n\r\n // Card\r\n const card = createEl('div', {\r\n width: d ? 'min(400px, 35vw)' : 'min(360px, 85vw)',\r\n backgroundColor: '#FFF',\r\n borderRadius: d ? '32px' : '24px',\r\n boxShadow: d\r\n ? '0 20px 64px rgba(17,17,17,0.12),0 4px 16px rgba(17,17,17,0.08)'\r\n : '0 8px 32px rgba(17,17,17,0.08)',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: d ? '48px 36px' : '36px 24px',\r\n gap: d ? '24px' : '20px',\r\n transition: 'transform 400ms ease-out,opacity 400ms ease-out',\r\n });\r\n\r\n // Spinner SVG\r\n const wrap = createEl('div', {\r\n width: '48px',\r\n height: '48px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '48');\r\n svg.setAttribute('height', '48');\r\n svg.setAttribute('viewBox', '0 0 48 48');\r\n svg.style.animation = 'kycspin 1.2s cubic-bezier(0.4,0,0.6,1) infinite';\r\n\r\n const bg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none', stroke: color + '33',\r\n })) bg.setAttribute(k, v);\r\n\r\n const fg = document.createElementNS(NS, 'circle');\r\n for (const [k, v] of Object.entries({\r\n cx: '24', cy: '24', r: '20', 'stroke-width': '3', fill: 'none',\r\n stroke: color, 'stroke-linecap': 'round', 'stroke-dasharray': '62.8', 'stroke-dashoffset': '15.7',\r\n })) fg.setAttribute(k, v);\r\n setStyles(fg as unknown as HTMLElement, { transformOrigin: 'center', animation: 'kycdash 1.5s ease-in-out infinite' });\r\n\r\n svg.append(bg, fg);\r\n wrap.appendChild(svg);\r\n\r\n // Text\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n const textBox = createEl('div', { textAlign: 'center' });\r\n const title = createEl('h3', { fontFamily: font, fontWeight: '600', fontSize: '18px', lineHeight: '1.3', color: '#1F2937', margin: '0 0 4px 0' });\r\n title.textContent = strings.title;\r\n const subtitle = createEl('p', { fontFamily: font, fontWeight: '400', fontSize: '13px', lineHeight: '1.4', color: 'rgba(31,41,55,0.7)', margin: '0' });\r\n subtitle.textContent = strings.subtitle;\r\n textBox.append(title, subtitle);\r\n\r\n // Progress bar\r\n const track = createEl('div', { width: '100%', maxWidth: '240px', height: '3px', backgroundColor: color + '1A', borderRadius: '2px', overflow: 'hidden' });\r\n const bar = createEl('div', { width: '40%', height: '100%', backgroundColor: color, borderRadius: '2px', transform: 'translateX(-100%)', animation: 'kycprogress 2000ms ease-in-out infinite' });\r\n track.appendChild(bar);\r\n\r\n card.append(wrap, textBox, track);\r\n overlay.appendChild(card);\r\n\r\n // Lock body scroll\r\n this.origBodyStyles = { overflow: document.body.style.overflow, position: document.body.style.position };\r\n setStyles(document.body, { overflow: 'hidden', position: 'fixed', width: '100%', height: '100%' });\r\n document.body.appendChild(overlay);\r\n\r\n // Resize handler\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n const onResize = debounce(() => {\r\n const w = window.innerWidth;\r\n const h = window.innerHeight;\r\n if (Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1) {\r\n setStyles(overlay, { width: w + 'px', height: h + 'px' });\r\n prevW = w;\r\n prevH = h;\r\n }\r\n }, d ? 50 : 150);\r\n window.addEventListener('resize', onResize);\r\n\r\n this.overlay = overlay;\r\n this.cleanup = () => {\r\n window.removeEventListener('resize', onResize);\r\n if (this.origBodyStyles) {\r\n setStyles(document.body, { ...this.origBodyStyles, width: '', height: '' });\r\n }\r\n };\r\n\r\n return overlay;\r\n }\r\n\r\n get element(): HTMLElement | null {\r\n return this.overlay;\r\n }\r\n\r\n showError(message: string, lang?: string): void {\r\n if (!this.overlay) return;\r\n const strings = LOADER_I18N[lang || ''] || LOADER_I18N.en;\r\n const card = this.overlay.querySelector('div') as HTMLElement | null;\r\n if (!card) return;\r\n\r\n // Replace card content with error state\r\n card.innerHTML = '';\r\n\r\n const font = 'Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif';\r\n\r\n // Error icon (X circle)\r\n const iconWrap = createEl('div', {\r\n width: '48px', height: '48px', borderRadius: '50%',\r\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\r\n display: 'flex', alignItems: 'center', justifyContent: 'center',\r\n });\r\n const NS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(NS, 'svg');\r\n svg.setAttribute('width', '24'); svg.setAttribute('height', '24');\r\n svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('fill', 'none');\r\n svg.setAttribute('stroke', '#ef4444'); svg.setAttribute('stroke-width', '2');\r\n svg.setAttribute('stroke-linecap', 'round');\r\n const line1 = document.createElementNS(NS, 'line');\r\n line1.setAttribute('x1', '18'); line1.setAttribute('y1', '6');\r\n line1.setAttribute('x2', '6'); line1.setAttribute('y2', '18');\r\n const line2 = document.createElementNS(NS, 'line');\r\n line2.setAttribute('x1', '6'); line2.setAttribute('y1', '6');\r\n line2.setAttribute('x2', '18'); line2.setAttribute('y2', '18');\r\n svg.append(line1, line2);\r\n iconWrap.appendChild(svg);\r\n\r\n // Title\r\n const title = createEl('h3', {\r\n fontFamily: font, fontWeight: '600', fontSize: '18px',\r\n lineHeight: '1.3', color: '#1F2937', margin: '0', textAlign: 'center',\r\n });\r\n title.textContent = strings.errorTitle;\r\n\r\n // Message\r\n const msg = createEl('p', {\r\n fontFamily: font, fontWeight: '400', fontSize: '13px',\r\n lineHeight: '1.5', color: 'rgba(31,41,55,0.7)', margin: '0',\r\n textAlign: 'center', wordBreak: 'break-word', maxWidth: '300px',\r\n });\r\n msg.textContent = message;\r\n\r\n // Close button\r\n const btn = createEl('button', {\r\n fontFamily: font, fontWeight: '600', fontSize: '14px',\r\n padding: '10px 32px', borderRadius: '12px', border: 'none',\r\n backgroundColor: '#1F2937', color: '#fff', cursor: 'pointer',\r\n transition: 'opacity 150ms',\r\n });\r\n btn.textContent = strings.close;\r\n btn.onmouseenter = () => { btn.style.opacity = '0.85'; };\r\n btn.onmouseleave = () => { btn.style.opacity = '1'; };\r\n btn.onclick = () => this.destroy();\r\n\r\n card.append(iconWrap, title, msg, btn);\r\n }\r\n\r\n fadeOut(): void {\r\n if (!this.overlay) return;\r\n const d = isDesktop();\r\n const card = this.overlay.querySelector('div');\r\n if (card) {\r\n setStyles(card as HTMLElement, {\r\n transform: d ? 'translateY(-10px) scale(0.98)' : 'translateY(-15px) scale(0.96)',\r\n opacity: '0',\r\n });\r\n }\r\n this.overlay.style.opacity = '0';\r\n }\r\n\r\n destroy(): void {\r\n this.cleanup?.();\r\n if (this.overlay?.parentNode) this.overlay.remove();\r\n this.overlay = null;\r\n this.cleanup = null;\r\n }\r\n}\r\n","import { WIDGET_EVENTS } from '../shared/constants';\r\nimport { getOrigin } from './utils';\r\n\r\nexport interface MessageCallbacks {\r\n onSuccess?: (result: Record<string, unknown>) => void;\r\n onError?: (error: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n}\r\n\r\nexport class MessageHandler {\r\n private listener: ((e: MessageEvent) => void) | null = null;\r\n private readyListener: ((e: MessageEvent) => void) | null = null;\r\n private completionHandled = false;\r\n\r\n constructor(\r\n private readonly iframeSrc: string,\r\n private readonly iframe: HTMLIFrameElement,\r\n private readonly callbacks: MessageCallbacks,\r\n ) {}\r\n\r\n /**\r\n * Start listening for postMessage events from the widget iframe.\r\n */\r\n listen(): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.listener = (e: MessageEvent) => {\r\n if (e.origin !== origin) return;\r\n if (e.source !== this.iframe.contentWindow) return;\r\n const data = e.data || {};\r\n const type = data.type as string;\r\n\r\n if (type === WIDGET_EVENTS.COMPLETE && this.callbacks.onSuccess) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onSuccess(data.result);\r\n setTimeout(() => this.iframe.remove(), 1000);\r\n } else if (type === WIDGET_EVENTS.CANCEL && this.callbacks.onCancel) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onCancel();\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.ERROR && this.callbacks.onError) {\r\n if (this.completionHandled) return;\r\n this.completionHandled = true;\r\n this.callbacks.onError(data.error || 'Unknown error');\r\n setTimeout(() => this.iframe.remove(), 500);\r\n } else if (type === WIDGET_EVENTS.READY && this.callbacks.onReady) {\r\n this.callbacks.onReady();\r\n }\r\n };\r\n\r\n window.addEventListener('message', this.listener);\r\n }\r\n\r\n /**\r\n * Listen for the first READY event, then call the callback once.\r\n */\r\n onReadyOnce(callback: () => void): void {\r\n const origin = getOrigin(this.iframeSrc);\r\n\r\n this.readyListener = (e: MessageEvent) => {\r\n if (e.origin !== origin || e.data?.type !== WIDGET_EVENTS.READY) return;\r\n window.removeEventListener('message', this.readyListener!);\r\n this.readyListener = null;\r\n callback();\r\n };\r\n\r\n window.addEventListener('message', this.readyListener);\r\n }\r\n\r\n destroy(): void {\r\n if (this.listener) {\r\n window.removeEventListener('message', this.listener);\r\n this.listener = null;\r\n }\r\n if (this.readyListener) {\r\n window.removeEventListener('message', this.readyListener);\r\n this.readyListener = null;\r\n }\r\n }\r\n}\r\n","import { setStyles, isDesktop, debounce } from './utils';\r\n\r\ninterface ViewportInfo {\r\n width: number;\r\n height: number;\r\n offsetTop: number;\r\n offsetLeft: number;\r\n}\r\n\r\nfunction getVV(): ViewportInfo {\r\n if (window.visualViewport) {\r\n return {\r\n width: window.visualViewport.width,\r\n height: window.visualViewport.height,\r\n offsetTop: window.visualViewport.offsetTop || 0,\r\n offsetLeft: window.visualViewport.offsetLeft || 0,\r\n };\r\n }\r\n return { width: window.innerWidth, height: window.innerHeight, offsetTop: 0, offsetLeft: 0 };\r\n}\r\n\r\nexport function ensureViewportMeta(): void {\r\n try {\r\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"viewport\"]');\r\n if (!meta) {\r\n const m = document.createElement('meta');\r\n m.setAttribute('name', 'viewport');\r\n m.setAttribute('content', 'width=device-width, initial-scale=1.0, viewport-fit=cover');\r\n document.head.appendChild(m);\r\n } else {\r\n const c = meta.getAttribute('content') || '';\r\n if (!c.includes('viewport-fit=cover')) {\r\n meta.setAttribute('content', c + ', viewport-fit=cover');\r\n }\r\n }\r\n } catch { /* noop */ }\r\n}\r\n\r\nexport function setupViewportSizing(\r\n overlay: HTMLElement | null,\r\n iframe: HTMLElement | null,\r\n): () => void {\r\n ensureViewportMeta();\r\n\r\n let baselineHeight = 0;\r\n let desktop = isDesktop();\r\n let rafId: number | null = null;\r\n\r\n const initBaseline = () => {\r\n const vv = getVV();\r\n baselineHeight = window.innerHeight || vv.height || document.documentElement.clientHeight || 0;\r\n desktop = isDesktop();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n const applySize = () => {\r\n try {\r\n const vv = getVV();\r\n const inner = window.innerHeight || vv.height;\r\n const kbThreshold = desktop ? 200 : 150;\r\n const isKeyboard = (inner - vv.height) > kbThreshold;\r\n const height = isKeyboard ? vv.height : (baselineHeight || inner);\r\n\r\n const dims = desktop\r\n ? { top: '0', left: '0', width: window.innerWidth + 'px', height: window.innerHeight + 'px' }\r\n : { top: vv.offsetTop + 'px', left: vv.offsetLeft + 'px', width: vv.width + 'px', height: height + 'px' };\r\n\r\n if (overlay) setStyles(overlay, dims);\r\n if (iframe) setStyles(iframe, dims);\r\n } catch { /* noop */ }\r\n };\r\n\r\n let prevW = window.innerWidth;\r\n let prevH = window.innerHeight;\r\n let prevX = 0;\r\n let prevY = 0;\r\n\r\n const debouncedApply = debounce(() => {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n }, desktop ? 50 : 150);\r\n\r\n const handleResize = () => {\r\n const vv = getVV();\r\n const w = vv.width;\r\n const h = vv.height;\r\n const x = vv.offsetLeft;\r\n const y = vv.offsetTop;\r\n const changed = Math.abs(w - prevW) > 1 || Math.abs(h - prevH) > 1\r\n || Math.abs(x - prevX) > 1 || Math.abs(y - prevY) > 1;\r\n if (!changed) return;\r\n\r\n if (Math.abs(h - prevH) > 1) initBaseline();\r\n prevW = w;\r\n prevH = h;\r\n prevX = x;\r\n prevY = y;\r\n\r\n if (desktop) {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n } else {\r\n debouncedApply();\r\n }\r\n };\r\n\r\n const handleOrientation = () => {\r\n initBaseline();\r\n if (rafId) cancelAnimationFrame(rafId);\r\n rafId = requestAnimationFrame(applySize);\r\n };\r\n\r\n initBaseline();\r\n applySize();\r\n\r\n window.addEventListener('resize', handleResize);\r\n window.addEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.addEventListener('resize', handleResize);\r\n window.visualViewport.addEventListener('scroll', handleResize);\r\n }\r\n\r\n return () => {\r\n try {\r\n if (rafId) cancelAnimationFrame(rafId);\r\n window.removeEventListener('resize', handleResize);\r\n window.removeEventListener('orientationchange', handleOrientation);\r\n if (window.visualViewport) {\r\n window.visualViewport.removeEventListener('resize', handleResize);\r\n window.visualViewport.removeEventListener('scroll', handleResize);\r\n }\r\n } catch { /* noop */ }\r\n };\r\n}\r\n","import { SDK_VERSION, DEFAULT_WIDGET_URL, DEFAULT_API_BASE } from '../shared/constants';\r\nimport { FlonkValidationError } from '../shared/errors';\r\nimport type {\r\n FlonkKYCOptions,\r\n WidgetInitConfig,\r\n WidgetPreviewConfig,\r\n WidgetEmbedConfig,\r\n WidgetInstance,\r\n EmbedInstance,\r\n PreviewColors,\r\n VerificationResult,\r\n} from '../shared/types';\r\nimport {\r\n isDesktop,\r\n setStyles,\r\n getOrigin,\r\n generateSecondaryColor,\r\n fetchWidgetToken,\r\n fetchDesignTokens,\r\n fetchSessionFromServer,\r\n fetchPublicSession,\r\n exchangeSessionForToken,\r\n type DesignTokens,\r\n type PublicSessionData,\r\n} from './utils';\r\nimport { createIframe, adjustZIndex, transitionLoaderToIframe } from './iframe-manager';\r\nimport { Loader } from './loader';\r\nimport { MessageHandler } from './message-handler';\r\nimport { setupViewportSizing } from './viewport';\r\n\r\nexport class FlonkKYC {\r\n static readonly version = SDK_VERSION;\r\n\r\n private readonly widgetUrl: string;\r\n private readonly apiBase: string;\r\n\r\n constructor(options: FlonkKYCOptions = {}) {\r\n this.widgetUrl = (options.widgetUrl || DEFAULT_WIDGET_URL).replace(/\\/$/, '');\r\n this.apiBase = (options.apiBase || DEFAULT_API_BASE).replace(/\\/$/, '');\r\n }\r\n\r\n // ── Public API ───────────────────────────────────────\r\n\r\n /**\r\n * Open the KYC verification widget.\r\n *\r\n * Flows (pick one):\r\n * 1. `{ serverUrl }` — auto-create session via your backend (recommended)\r\n * 2. `{ sessionId, embedToken }` — server-to-server with pre-created session\r\n * 3. `{ publishableKey }` — client-side only\r\n */\r\n async init(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n if (!config) throw new FlonkValidationError('config is required');\r\n\r\n // Flow: serverUrl — SDK calls client's backend to auto-create session\r\n if (config.serverUrl) {\r\n return this.initWithServerUrl(config);\r\n }\r\n\r\n // Flow: sessionId + embedToken — direct server-to-server\r\n if (config.sessionId && config.embedToken) {\r\n return this.initWithEmbedToken(config);\r\n }\r\n\r\n // Flow: sessionId only — legacy (exchange for token)\r\n if (config.sessionId) {\r\n return this.initWithSession(config);\r\n }\r\n\r\n // Flow: publishableKey — client-side\r\n const pk = config.publishableKey;\r\n if (!pk || !/^pk_/.test(pk)) {\r\n throw new FlonkValidationError(\r\n 'Provide one of: serverUrl, sessionId + embedToken, or publishableKey (pk_*)',\r\n );\r\n }\r\n return this.initWithPublishableKey(config);\r\n }\r\n\r\n /**\r\n * Preview mode — no API calls, mock data.\r\n */\r\n preview(config: WidgetPreviewConfig = {}): WidgetInstance {\r\n const colors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n return this.openWidget({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(colors),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n lang: config.lang || 'de',\r\n overlayColor: config.overlayColor,\r\n }, {\r\n primaryColor: colors.primaryColor || '#3b82f6',\r\n lang: config.lang,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n });\r\n }\r\n\r\n /**\r\n * Embed inline preview in a container (for dashboards).\r\n */\r\n embed(config: WidgetEmbedConfig): EmbedInstance {\r\n if (!config?.container) throw new FlonkValidationError('container is required');\r\n\r\n const container =\r\n typeof config.container === 'string'\r\n ? document.querySelector<HTMLElement>(config.container)\r\n : config.container;\r\n if (!container) throw new FlonkValidationError('Container element not found');\r\n\r\n let colors: PreviewColors = config.colors || { primaryColor: '#3b82f6', secondaryColor: '#93c5fd' };\r\n let device = config.device || 'mobile';\r\n let scale = config.scale ?? 1;\r\n const lang = config.lang || 'de';\r\n\r\n const buildSrc = (c: PreviewColors, d: string) => {\r\n const p = new URLSearchParams({\r\n mode: 'preview',\r\n isPreview: 'true',\r\n previewColors: JSON.stringify(c),\r\n allowManualUpload: 'true',\r\n documentType: config.documentType || 'id_card',\r\n device: d,\r\n lang,\r\n });\r\n return `${this.widgetUrl}/?${p.toString()}`;\r\n };\r\n\r\n const applyScale = () => {\r\n iframe.style.transform = scale !== 1 ? `scale(${scale})` : '';\r\n iframe.style.transformOrigin = scale !== 1 ? 'top left' : '';\r\n };\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.style.cssText = 'border:none;width:100%;height:100%;display:block';\r\n iframe.src = buildSrc(colors, device);\r\n iframe.title = 'KYC Widget Preview';\r\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms');\r\n applyScale();\r\n\r\n container.innerHTML = '';\r\n container.appendChild(iframe);\r\n\r\n return {\r\n iframe,\r\n setColors(newColors: Partial<PreviewColors>) {\r\n colors = { ...colors, ...newColors };\r\n if (newColors.primaryColor && !newColors.secondaryColor) {\r\n colors.secondaryColor = generateSecondaryColor(newColors.primaryColor);\r\n }\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n setDevice(d: 'mobile' | 'desktop') {\r\n device = d;\r\n iframe.src = buildSrc(colors, device);\r\n },\r\n getColors: () => ({ ...colors }),\r\n destroy: () => iframe.remove(),\r\n };\r\n }\r\n\r\n // ── Private flows ────────────────────────────────────\r\n\r\n /**\r\n * Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.\r\n */\r\n /**\r\n * POST to serverUrl to get sessionId + embedToken, then same path as embed token flow.\r\n * No loader here — avoids wrong brand color before design tokens exist; initWithEmbedToken\r\n * fetches tokens first, then shows loader with project primary color.\r\n */\r\n private async initWithServerUrl(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n try {\r\n const { sessionId, embedToken } = await fetchSessionFromServer(\r\n config.serverUrl!,\r\n config.clientMetadata,\r\n config.requestHeaders,\r\n );\r\n return this.initWithEmbedToken({ ...config, sessionId, embedToken });\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to create session';\r\n const loader = new Loader();\r\n loader.show('#15BA68', config.lang);\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 2: sessionId + embedToken — fetch session data, open widget.\r\n */\r\n private async initWithEmbedToken(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const sessionData = await fetchPublicSession(\r\n this.apiBase,\r\n config.sessionId!,\r\n config.embedToken!,\r\n );\r\n\r\n const session = {\r\n id: sessionData.id,\r\n allowManualUpload: sessionData.allowManualUpload ?? config.allowManualUpload ?? true,\r\n clientMetadata: sessionData.clientMetadata || config.clientMetadata,\r\n qrCodeUrl: sessionData.qrCodeUrl,\r\n testMode: sessionData.testMode || false,\r\n poaEnabled: sessionData.poaEnabled || false,\r\n poaRequired: sessionData.poaRequired || false,\r\n };\r\n\r\n return this.buildWidget(config.embedToken!, session, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 3: sessionId only — exchange for embedToken, then init.\r\n */\r\n private async initWithSession(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const designTokens = await fetchDesignTokens(this.apiBase, {\r\n sessionId: config.sessionId,\r\n });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const { embedToken, session } = await exchangeSessionForToken(\r\n this.apiBase,\r\n config.sessionId!,\r\n );\r\n return this.buildWidget(embedToken, session, config, loader, designTokens);\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Flow 4: publishableKey — fetch widget token, open widget.\r\n */\r\n private async initWithPublishableKey(config: WidgetInitConfig): Promise<WidgetInstance> {\r\n const pk = config.publishableKey!;\r\n const designTokens = await fetchDesignTokens(this.apiBase, { pk });\r\n const primaryColor = designTokens?.colors?.primary?.cannabis || '#15BA68';\r\n const loader = new Loader();\r\n loader.show(primaryColor, config.lang);\r\n\r\n try {\r\n const data = await fetchWidgetToken(pk, this.apiBase);\r\n\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n publishableKey: pk,\r\n allowManualUpload: String(data.allowManualUpload !== false),\r\n };\r\n\r\n if (data.token) params.token = data.token;\r\n if (config.clientMetadata) {\r\n params.clientMetadata = JSON.stringify(config.clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor,\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n } catch (err) {\r\n const msg = (err as Error).message || 'Failed to initialize verification';\r\n loader.showError(msg, config.lang);\r\n config.onError?.(msg);\r\n throw err;\r\n }\r\n }\r\n\r\n // ── Core widget builder ──────────────────────────────\r\n\r\n private buildWidget(\r\n token: string,\r\n session: PublicSessionData,\r\n config: WidgetInitConfig,\r\n loader: Loader,\r\n designTokens: DesignTokens | null,\r\n ): WidgetInstance {\r\n const params: Record<string, string> = {\r\n mode: 'embedded',\r\n sessionId: config.sessionId || session.id,\r\n token,\r\n allowManualUpload: String(session.allowManualUpload !== false),\r\n };\r\n\r\n if (session.testMode) params.testMode = 'true';\r\n if (session.poaEnabled) params.poaEnabled = 'true';\r\n if (session.poaRequired) params.poaRequired = 'true';\r\n if (designTokens?.colors) {\r\n params.designTokens = JSON.stringify(designTokens);\r\n }\r\n if (config.embedToken) params.embedToken = config.embedToken;\r\n if (session.qrCodeUrl) params.qrCodeUrl = session.qrCodeUrl;\r\n\r\n const clientMetadata = session.clientMetadata || config.clientMetadata;\r\n if (clientMetadata) {\r\n params.clientMetadata = JSON.stringify(clientMetadata);\r\n }\r\n if (config.lang) params.lang = config.lang;\r\n if (config.overlayColor) params.overlayColor = config.overlayColor;\r\n\r\n return this.openWidget(params, {\r\n primaryColor: designTokens?.colors?.primary?.cannabis || '#15BA68',\r\n lang: config.lang,\r\n loader,\r\n onSuccess: config.onSuccess,\r\n onError: config.onError,\r\n onCancel: config.onCancel,\r\n onReady: config.onReady,\r\n mount: config.mount,\r\n });\r\n }\r\n\r\n /**\r\n * Core: create iframe, attach listeners, return WidgetInstance.\r\n */\r\n private openWidget(\r\n params: Record<string, string | undefined>,\r\n opts: {\r\n primaryColor: string;\r\n lang?: string;\r\n loader?: Loader;\r\n onSuccess?: (r: VerificationResult) => void;\r\n onError?: (e: string) => void;\r\n onCancel?: () => void;\r\n onReady?: () => void;\r\n mount?: HTMLElement;\r\n },\r\n ): WidgetInstance {\r\n // Build URL\r\n const filtered = Object.fromEntries(\r\n Object.entries(params).filter(([, v]) => v != null),\r\n ) as Record<string, string>;\r\n const search = new URLSearchParams(filtered);\r\n const src = `${this.widgetUrl}/?${search.toString()}`;\r\n\r\n // Create iframe\r\n const iframe = createIframe(src);\r\n const mountTarget = opts.mount || document.body;\r\n\r\n // Loader z-index\r\n const loader = opts.loader ?? (() => {\r\n const l = new Loader();\r\n l.show(opts.primaryColor, opts.lang);\r\n return l;\r\n })();\r\n\r\n if (loader.element) adjustZIndex(loader.element, iframe);\r\n mountTarget.appendChild(iframe);\r\n\r\n // Viewport sizing\r\n const cleanupViewport = setupViewportSizing(loader.element, iframe);\r\n\r\n // Shared cleanup — runs on both manual destroy() and auto-close from MessageHandler\r\n let cleaned = false;\r\n const cleanupAll = () => {\r\n if (cleaned) return;\r\n cleaned = true;\r\n try {\r\n handler.destroy();\r\n cleanupViewport();\r\n loader.destroy();\r\n if (iframe.parentNode) iframe.remove();\r\n } catch { /* noop */ }\r\n };\r\n\r\n // Wrap callbacks to run full cleanup after user callback fires\r\n const afterCleanup = (delayMs: number) => () => setTimeout(cleanupAll, delayMs);\r\n\r\n // Message handler\r\n const handler = new MessageHandler(src, iframe, {\r\n onSuccess: opts.onSuccess\r\n ? (r) => { opts.onSuccess?.(r); afterCleanup(1000)(); }\r\n : undefined,\r\n onError: opts.onError\r\n ? (e) => { opts.onError?.(e); afterCleanup(500)(); }\r\n : undefined,\r\n onCancel: opts.onCancel\r\n ? () => { opts.onCancel?.(); afterCleanup(500)(); }\r\n : undefined,\r\n onReady: opts.onReady,\r\n });\r\n handler.listen();\r\n\r\n // Ready transition: loader → iframe\r\n handler.onReadyOnce(() => {\r\n transitionLoaderToIframe(loader.element!, iframe, () => loader.destroy());\r\n });\r\n\r\n return {\r\n iframe,\r\n destroy: cleanupAll,\r\n };\r\n }\r\n}\r\n","import { useEffect, useRef, useMemo } from 'react';\nimport { FlonkKYC } from './index';\nimport type { WidgetInitConfig, WidgetInstance, FlonkKYCOptions, VerificationResult, WidgetLanguage } from '../shared/types';\n\nexport interface FlonkKYCProps extends FlonkKYCOptions {\n publishableKey?: string;\n serverUrl?: string;\n sessionId?: string;\n embedToken?: string;\n clientMetadata?: Record<string, unknown>;\n lang?: WidgetLanguage;\n overlayColor?: string;\n allowManualUpload?: boolean;\n /**\n * Extra headers sent with the `serverUrl` POST request.\n * Use this to pass Authorization tokens (e.g. JWT) when your\n * backend requires authentication.\n *\n * @example { Authorization: 'Bearer <jwt>' }\n */\n requestHeaders?: Record<string, string>;\n onSuccess?: (result: VerificationResult) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onReady?: () => void;\n /** Auto-open on mount. Default: true */\n autoOpen?: boolean;\n}\n\nexport function FlonkKYCWidget({\n widgetUrl,\n apiBase,\n autoOpen = true,\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n requestHeaders,\n onSuccess,\n onError,\n onCancel,\n onReady,\n}: FlonkKYCProps) {\n const mountRef = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<WidgetInstance | null>(null);\n\n const callbacksRef = useRef({ onSuccess, onError, onCancel, onReady });\n callbacksRef.current = { onSuccess, onError, onCancel, onReady };\n\n const sdk = useMemo(() => new FlonkKYC({ widgetUrl, apiBase }), [widgetUrl, apiBase]);\n\n // Track mount generation to ignore stale inits from StrictMode\n const generationRef = useRef(0);\n\n useEffect(() => {\n if (!autoOpen) return;\n\n const thisGeneration = ++generationRef.current;\n\n const config: WidgetInitConfig = {\n publishableKey,\n serverUrl,\n sessionId,\n embedToken,\n clientMetadata,\n lang,\n overlayColor,\n allowManualUpload,\n requestHeaders,\n mount: mountRef.current || undefined,\n onSuccess: (r) => callbacksRef.current.onSuccess?.(r),\n onError: (e) => callbacksRef.current.onError?.(e),\n onCancel: () => callbacksRef.current.onCancel?.(),\n onReady: () => callbacksRef.current.onReady?.(),\n };\n\n // Delay init to skip StrictMode's first mount-unmount cycle\n const timer = setTimeout(() => {\n if (generationRef.current !== thisGeneration) return;\n\n sdk.init(config)\n .then((instance) => {\n if (generationRef.current !== thisGeneration) {\n instance.destroy();\n } else {\n widgetRef.current = instance;\n }\n })\n .catch((err) => {\n if (generationRef.current === thisGeneration) {\n callbacksRef.current.onError?.((err as Error).message);\n }\n });\n }, 0);\n\n return () => {\n clearTimeout(timer);\n widgetRef.current?.destroy();\n widgetRef.current = null;\n };\n }, [sdk, publishableKey, serverUrl, sessionId, autoOpen]);\n\n return <div ref={mountRef} />;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -16,6 +16,14 @@ interface WidgetInitConfig {
16
16
  overlayColor?: string;
17
17
  allowManualUpload?: boolean;
18
18
  mount?: HTMLElement;
19
+ /**
20
+ * Extra headers sent with the `serverUrl` POST request.
21
+ * Use this to pass Authorization tokens (e.g. JWT) when your
22
+ * backend requires authentication.
23
+ *
24
+ * @example { Authorization: 'Bearer <jwt>' }
25
+ */
26
+ requestHeaders?: Record<string, string>;
19
27
  onSuccess?: (result: VerificationResult) => void;
20
28
  onError?: (error: string) => void;
21
29
  onCancel?: () => void;
@@ -58,7 +66,7 @@ interface VerificationResult {
58
66
  }
59
67
 
60
68
  declare class FlonkKYC {
61
- static readonly version = "1.4.0";
69
+ static readonly version = "1.5.1";
62
70
  private readonly widgetUrl;
63
71
  private readonly apiBase;
64
72
  constructor(options?: FlonkKYCOptions);
@@ -82,6 +90,11 @@ declare class FlonkKYC {
82
90
  /**
83
91
  * Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.
84
92
  */
93
+ /**
94
+ * POST to serverUrl to get sessionId + embedToken, then same path as embed token flow.
95
+ * No loader here — avoids wrong brand color before design tokens exist; initWithEmbedToken
96
+ * fetches tokens first, then shows loader with project primary color.
97
+ */
85
98
  private initWithServerUrl;
86
99
  /**
87
100
  * Flow 2: sessionId + embedToken — fetch session data, open widget.
@@ -111,6 +124,14 @@ interface FlonkKYCProps extends FlonkKYCOptions {
111
124
  lang?: WidgetLanguage;
112
125
  overlayColor?: string;
113
126
  allowManualUpload?: boolean;
127
+ /**
128
+ * Extra headers sent with the `serverUrl` POST request.
129
+ * Use this to pass Authorization tokens (e.g. JWT) when your
130
+ * backend requires authentication.
131
+ *
132
+ * @example { Authorization: 'Bearer <jwt>' }
133
+ */
134
+ requestHeaders?: Record<string, string>;
114
135
  onSuccess?: (result: VerificationResult) => void;
115
136
  onError?: (error: string) => void;
116
137
  onCancel?: () => void;
@@ -118,7 +139,7 @@ interface FlonkKYCProps extends FlonkKYCOptions {
118
139
  /** Auto-open on mount. Default: true */
119
140
  autoOpen?: boolean;
120
141
  }
121
- declare function FlonkKYCWidget({ widgetUrl, apiBase, autoOpen, publishableKey, serverUrl, sessionId, embedToken, clientMetadata, lang, overlayColor, allowManualUpload, onSuccess, onError, onCancel, onReady, }: FlonkKYCProps): react_jsx_runtime.JSX.Element;
142
+ declare function FlonkKYCWidget({ widgetUrl, apiBase, autoOpen, publishableKey, serverUrl, sessionId, embedToken, clientMetadata, lang, overlayColor, allowManualUpload, requestHeaders, onSuccess, onError, onCancel, onReady, }: FlonkKYCProps): react_jsx_runtime.JSX.Element;
122
143
 
123
144
  declare class FlonkError extends Error {
124
145
  readonly code: string;
package/dist/index.d.ts CHANGED
@@ -16,6 +16,14 @@ interface WidgetInitConfig {
16
16
  overlayColor?: string;
17
17
  allowManualUpload?: boolean;
18
18
  mount?: HTMLElement;
19
+ /**
20
+ * Extra headers sent with the `serverUrl` POST request.
21
+ * Use this to pass Authorization tokens (e.g. JWT) when your
22
+ * backend requires authentication.
23
+ *
24
+ * @example { Authorization: 'Bearer <jwt>' }
25
+ */
26
+ requestHeaders?: Record<string, string>;
19
27
  onSuccess?: (result: VerificationResult) => void;
20
28
  onError?: (error: string) => void;
21
29
  onCancel?: () => void;
@@ -58,7 +66,7 @@ interface VerificationResult {
58
66
  }
59
67
 
60
68
  declare class FlonkKYC {
61
- static readonly version = "1.4.0";
69
+ static readonly version = "1.5.1";
62
70
  private readonly widgetUrl;
63
71
  private readonly apiBase;
64
72
  constructor(options?: FlonkKYCOptions);
@@ -82,6 +90,11 @@ declare class FlonkKYC {
82
90
  /**
83
91
  * Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.
84
92
  */
93
+ /**
94
+ * POST to serverUrl to get sessionId + embedToken, then same path as embed token flow.
95
+ * No loader here — avoids wrong brand color before design tokens exist; initWithEmbedToken
96
+ * fetches tokens first, then shows loader with project primary color.
97
+ */
85
98
  private initWithServerUrl;
86
99
  /**
87
100
  * Flow 2: sessionId + embedToken — fetch session data, open widget.
@@ -111,6 +124,14 @@ interface FlonkKYCProps extends FlonkKYCOptions {
111
124
  lang?: WidgetLanguage;
112
125
  overlayColor?: string;
113
126
  allowManualUpload?: boolean;
127
+ /**
128
+ * Extra headers sent with the `serverUrl` POST request.
129
+ * Use this to pass Authorization tokens (e.g. JWT) when your
130
+ * backend requires authentication.
131
+ *
132
+ * @example { Authorization: 'Bearer <jwt>' }
133
+ */
134
+ requestHeaders?: Record<string, string>;
114
135
  onSuccess?: (result: VerificationResult) => void;
115
136
  onError?: (error: string) => void;
116
137
  onCancel?: () => void;
@@ -118,7 +139,7 @@ interface FlonkKYCProps extends FlonkKYCOptions {
118
139
  /** Auto-open on mount. Default: true */
119
140
  autoOpen?: boolean;
120
141
  }
121
- declare function FlonkKYCWidget({ widgetUrl, apiBase, autoOpen, publishableKey, serverUrl, sessionId, embedToken, clientMetadata, lang, overlayColor, allowManualUpload, onSuccess, onError, onCancel, onReady, }: FlonkKYCProps): react_jsx_runtime.JSX.Element;
142
+ declare function FlonkKYCWidget({ widgetUrl, apiBase, autoOpen, publishableKey, serverUrl, sessionId, embedToken, clientMetadata, lang, overlayColor, allowManualUpload, requestHeaders, onSuccess, onError, onCancel, onReady, }: FlonkKYCProps): react_jsx_runtime.JSX.Element;
122
143
 
123
144
  declare class FlonkError extends Error {
124
145
  readonly code: string;
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { useRef, useMemo, useEffect } from 'react';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
 
4
4
  // src/shared/constants.ts
5
- var SDK_VERSION = "1.4.0";
5
+ var SDK_VERSION = "1.5.1";
6
6
  var DEFAULT_WIDGET_URL = "https://widget.flonk.id";
7
7
  var DEFAULT_API_BASE = "https://api.flonk.id/v1";
8
8
  var WIDGET_EVENTS = {
@@ -119,11 +119,12 @@ function validateServerUrl(url) {
119
119
  throw new Error(`Invalid serverUrl: ${url}`);
120
120
  }
121
121
  }
122
- async function fetchSessionFromServer(serverUrl, clientMetadata) {
122
+ async function fetchSessionFromServer(serverUrl, clientMetadata, requestHeaders) {
123
123
  validateServerUrl(serverUrl);
124
124
  const res = await fetch(serverUrl, {
125
125
  method: "POST",
126
- headers: { "Content-Type": "application/json" },
126
+ headers: { "Content-Type": "application/json", ...requestHeaders },
127
+ credentials: "include",
127
128
  body: JSON.stringify({ clientMetadata })
128
129
  });
129
130
  if (!res.ok) {
@@ -767,18 +768,23 @@ var FlonkKYC = class {
767
768
  /**
768
769
  * Flow 1: serverUrl — POST to client's backend, get sessionId + embedToken.
769
770
  */
771
+ /**
772
+ * POST to serverUrl to get sessionId + embedToken, then same path as embed token flow.
773
+ * No loader here — avoids wrong brand color before design tokens exist; initWithEmbedToken
774
+ * fetches tokens first, then shows loader with project primary color.
775
+ */
770
776
  async initWithServerUrl(config) {
771
- const loader = new Loader();
772
- loader.show("#15BA68", config.lang);
773
777
  try {
774
778
  const { sessionId, embedToken } = await fetchSessionFromServer(
775
779
  config.serverUrl,
776
- config.clientMetadata
780
+ config.clientMetadata,
781
+ config.requestHeaders
777
782
  );
778
- loader.destroy();
779
783
  return this.initWithEmbedToken({ ...config, sessionId, embedToken });
780
784
  } catch (err) {
781
785
  const msg = err.message || "Failed to create session";
786
+ const loader = new Loader();
787
+ loader.show("#15BA68", config.lang);
782
788
  loader.showError(msg, config.lang);
783
789
  config.onError?.(msg);
784
790
  throw err;
@@ -982,6 +988,7 @@ function FlonkKYCWidget({
982
988
  lang,
983
989
  overlayColor,
984
990
  allowManualUpload,
991
+ requestHeaders,
985
992
  onSuccess,
986
993
  onError,
987
994
  onCancel,
@@ -1005,6 +1012,7 @@ function FlonkKYCWidget({
1005
1012
  lang,
1006
1013
  overlayColor,
1007
1014
  allowManualUpload,
1015
+ requestHeaders,
1008
1016
  mount: mountRef.current || void 0,
1009
1017
  onSuccess: (r) => callbacksRef.current.onSuccess?.(r),
1010
1018
  onError: (e) => callbacksRef.current.onError?.(e),