@flonkid/kyc 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,45 +11,66 @@ Official SDK for [Flonk](https://flonk.id) identity verification.
11
11
  npm install @flonkid/kyc
12
12
  ```
13
13
 
14
- ## Browser Imperative
14
+ | Import | Use |
15
+ |--------|-----|
16
+ | `@flonkid/kyc` | Browser — widget + React component |
17
+ | `@flonkid/kyc/server` | Node.js — sessions API + webhook verification |
15
18
 
16
- ```typescript
17
- import { FlonkKYC } from '@flonkid/kyc';
19
+ ## React Component (recommended)
18
20
 
19
- const kyc = new FlonkKYC();
20
- const widget = await kyc.init({
21
- publishableKey: 'pk_live_...',
22
- onSuccess: (result) => console.log('Verified:', result),
23
- onError: (err) => console.error(err),
24
- });
21
+ ### Option A: SDK handles session creation
25
22
 
26
- // Later: widget.destroy()
23
+ ```tsx
24
+ import { FlonkKYCWidget } from '@flonkid/kyc';
25
+
26
+ <FlonkKYCWidget
27
+ serverUrl="/api/kyc/create-session"
28
+ clientMetadata={{ email: 'user@example.com', userId: 'user_123' }}
29
+ lang="de"
30
+ onSuccess={(result) => console.log('Verified:', result)}
31
+ onError={(error) => console.error(error)}
32
+ onCancel={() => console.log('Cancelled')}
33
+ />
34
+
35
+ // With authenticated backend
36
+ <FlonkKYCWidget
37
+ serverUrl="/api/kyc/create-session"
38
+ requestHeaders={{ Authorization: `Bearer ${token}` }}
39
+ ...
40
+ />
27
41
  ```
28
42
 
29
- ## Browser React Component
43
+ ### Option B: You control session creation
30
44
 
31
45
  ```tsx
32
46
  import { FlonkKYCWidget } from '@flonkid/kyc';
33
47
 
34
- function App() {
35
- return (
36
- <FlonkKYCWidget
37
- publishableKey="pk_live_..."
38
- onSuccess={(result) => console.log('Verified:', result)}
39
- onError={(err) => console.error(err)}
40
- />
41
- );
42
- }
48
+ // 1. Create session on your backend first
49
+ const { sessionId, embedToken } = await fetch('/api/kyc/create-session', {
50
+ method: 'POST',
51
+ body: JSON.stringify({ email: user.email }),
52
+ }).then(r => r.json());
53
+
54
+ // 2. Pass credentials to widget
55
+ <FlonkKYCWidget
56
+ sessionId={sessionId}
57
+ embedToken={embedToken}
58
+ lang="de"
59
+ onSuccess={(result) => console.log('Verified:', result)}
60
+ onError={(error) => console.error(error)}
61
+ onCancel={() => console.log('Cancelled')}
62
+ />
43
63
  ```
44
64
 
45
65
  ### Props
46
66
 
47
67
  | Prop | Type | Description |
48
68
  |------|------|-------------|
49
- | `publishableKey` | `string` | Client-side key (`pk_live_*` or `pk_sandbox_*`) |
50
- | `serverUrl` | `string` | Your backend endpoint for session creation |
51
- | `sessionId` | `string` | Pre-created session ID |
52
- | `embedToken` | `string` | JWT token from server-to-server flow |
69
+ | `serverUrl` | `string` | Your backend endpoint SDK auto-creates session |
70
+ | `sessionId` | `string` | Pre-created session ID (Option B) |
71
+ | `embedToken` | `string` | JWT token from your backend (Option B) |
72
+ | `requestHeaders` | `Record<string, string>` | Extra headers for serverUrl (e.g. JWT auth) |
73
+ | `clientMetadata` | `Record<string, unknown>` | Custom data passed to session |
53
74
  | `lang` | `'en' \| 'de' \| 'uk'` | Widget language |
54
75
  | `onSuccess` | `(result) => void` | Verification completed |
55
76
  | `onError` | `(error) => void` | Error occurred |
@@ -57,6 +78,26 @@ function App() {
57
78
  | `onReady` | `() => void` | Widget loaded |
58
79
  | `autoOpen` | `boolean` | Open on mount (default: `true`) |
59
80
 
81
+ ## Imperative API (non-React)
82
+
83
+ ```typescript
84
+ import { FlonkKYC } from '@flonkid/kyc';
85
+
86
+ const kyc = new FlonkKYC();
87
+
88
+ const widget = await kyc.init({
89
+ serverUrl: '/api/kyc/create-session',
90
+ clientMetadata: { email: 'user@example.com' },
91
+ lang: 'de',
92
+ onSuccess: (result) => console.log('Verified:', result),
93
+ onError: (error) => console.error(error),
94
+ onCancel: () => console.log('Cancelled'),
95
+ });
96
+
97
+ // Cleanup
98
+ widget.destroy();
99
+ ```
100
+
60
101
  ## Server — Node.js
61
102
 
62
103
  ```typescript
@@ -65,11 +106,14 @@ import { FlonkKYCServer } from '@flonkid/kyc/server';
65
106
  const flonk = new FlonkKYCServer({ secretKey: 'sk_live_...' });
66
107
 
67
108
  // Create session
68
- const session = await flonk.sessions.create({
69
- clientMetadata: { userId: 'user_123' },
109
+ const session = await flonk.createSession({
110
+ clientMetadata: { email: 'user@example.com', userId: 'user_123' },
111
+ expiryMinutes: 30,
112
+ language: 'de',
70
113
  });
114
+ // → { id, embedToken, status, expiresAt, widgetUrl, qrCodeUrl }
71
115
 
72
- // Verify webhook signature
116
+ // Verify webhook
73
117
  const event = flonk.webhooks.constructEvent(rawBody, signature, secret);
74
118
  ```
75
119
 
@@ -78,7 +122,7 @@ const event = flonk.webhooks.constructEvent(rawBody, signature, secret);
78
122
  | Event | Description |
79
123
  |-------|-------------|
80
124
  | `verification.completed` | AI verification finished |
81
- | `verification.status_changed` | Admin changed status |
125
+ | `verification.status_changed` | Admin changed status (approved/rejected) |
82
126
  | `verification.updated` | Admin edited verification data |
83
127
 
84
128
  ```typescript
@@ -86,13 +130,13 @@ const event = flonk.webhooks.constructEvent(rawBody, signature, secret);
86
130
 
87
131
  switch (event.type) {
88
132
  case 'verification.completed':
89
- // Automated decision
133
+ console.log('Extracted:', event.data.object.extracted_data);
90
134
  break;
91
135
  case 'verification.status_changed':
92
- // Admin approved/rejected
136
+ console.log('New status:', event.data.object.status);
93
137
  break;
94
138
  case 'verification.updated':
95
- // Admin edited extracted data
139
+ console.log('Updated by:', event.data.object.updated_by);
96
140
  break;
97
141
  }
98
142
  ```
@@ -100,9 +144,9 @@ switch (event.type) {
100
144
  ## Links
101
145
 
102
146
  - [Full Documentation](https://docs.flonk.id)
103
- - [Dashboard](https://dashboard.flonk.id)
147
+ - [Integration Guide](https://docs.flonk.id/docs/integration-frontend-backend)
104
148
  - [Webhook Guide](https://docs.flonk.id/docs/webhooks)
105
- - [API Reference](https://docs.flonk.id/docs/api-verification)
149
+ - [Dashboard](https://dashboard.flonk.id)
106
150
 
107
151
  ## License
108
152
 
package/dist/index.cjs CHANGED
@@ -121,11 +121,12 @@ function validateServerUrl(url) {
121
121
  throw new Error(`Invalid serverUrl: ${url}`);
122
122
  }
123
123
  }
124
- async function fetchSessionFromServer(serverUrl, clientMetadata) {
124
+ async function fetchSessionFromServer(serverUrl, clientMetadata, requestHeaders) {
125
125
  validateServerUrl(serverUrl);
126
126
  const res = await fetch(serverUrl, {
127
127
  method: "POST",
128
- headers: { "Content-Type": "application/json" },
128
+ headers: { "Content-Type": "application/json", ...requestHeaders },
129
+ credentials: "include",
129
130
  body: JSON.stringify({ clientMetadata })
130
131
  });
131
132
  if (!res.ok) {
@@ -775,7 +776,8 @@ var FlonkKYC = class {
775
776
  try {
776
777
  const { sessionId, embedToken } = await fetchSessionFromServer(
777
778
  config.serverUrl,
778
- config.clientMetadata
779
+ config.clientMetadata,
780
+ config.requestHeaders
779
781
  );
780
782
  loader.destroy();
781
783
  return this.initWithEmbedToken({ ...config, sessionId, embedToken });
@@ -984,6 +986,7 @@ function FlonkKYCWidget({
984
986
  lang,
985
987
  overlayColor,
986
988
  allowManualUpload,
989
+ requestHeaders,
987
990
  onSuccess,
988
991
  onError,
989
992
  onCancel,
@@ -1007,6 +1010,7 @@ function FlonkKYCWidget({
1007
1010
  lang,
1008
1011
  overlayColor,
1009
1012
  allowManualUpload,
1013
+ requestHeaders,
1010
1014
  mount: mountRef.current || void 0,
1011
1015
  onSuccess: (r) => callbacksRef.current.onSuccess?.(r),
1012
1016
  onError: (e) => callbacksRef.current.onError?.(e),
@@ -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.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 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 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 config.requestHeaders,\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 /**\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;
@@ -111,6 +119,14 @@ interface FlonkKYCProps extends FlonkKYCOptions {
111
119
  lang?: WidgetLanguage;
112
120
  overlayColor?: string;
113
121
  allowManualUpload?: boolean;
122
+ /**
123
+ * Extra headers sent with the `serverUrl` POST request.
124
+ * Use this to pass Authorization tokens (e.g. JWT) when your
125
+ * backend requires authentication.
126
+ *
127
+ * @example { Authorization: 'Bearer <jwt>' }
128
+ */
129
+ requestHeaders?: Record<string, string>;
114
130
  onSuccess?: (result: VerificationResult) => void;
115
131
  onError?: (error: string) => void;
116
132
  onCancel?: () => void;
@@ -118,7 +134,7 @@ interface FlonkKYCProps extends FlonkKYCOptions {
118
134
  /** Auto-open on mount. Default: true */
119
135
  autoOpen?: boolean;
120
136
  }
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;
137
+ 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
138
 
123
139
  declare class FlonkError extends Error {
124
140
  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;
@@ -111,6 +119,14 @@ interface FlonkKYCProps extends FlonkKYCOptions {
111
119
  lang?: WidgetLanguage;
112
120
  overlayColor?: string;
113
121
  allowManualUpload?: boolean;
122
+ /**
123
+ * Extra headers sent with the `serverUrl` POST request.
124
+ * Use this to pass Authorization tokens (e.g. JWT) when your
125
+ * backend requires authentication.
126
+ *
127
+ * @example { Authorization: 'Bearer <jwt>' }
128
+ */
129
+ requestHeaders?: Record<string, string>;
114
130
  onSuccess?: (result: VerificationResult) => void;
115
131
  onError?: (error: string) => void;
116
132
  onCancel?: () => void;
@@ -118,7 +134,7 @@ interface FlonkKYCProps extends FlonkKYCOptions {
118
134
  /** Auto-open on mount. Default: true */
119
135
  autoOpen?: boolean;
120
136
  }
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;
137
+ 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
138
 
123
139
  declare class FlonkError extends Error {
124
140
  readonly code: string;
package/dist/index.js CHANGED
@@ -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) {
@@ -773,7 +774,8 @@ var FlonkKYC = class {
773
774
  try {
774
775
  const { sessionId, embedToken } = await fetchSessionFromServer(
775
776
  config.serverUrl,
776
- config.clientMetadata
777
+ config.clientMetadata,
778
+ config.requestHeaders
777
779
  );
778
780
  loader.destroy();
779
781
  return this.initWithEmbedToken({ ...config, sessionId, embedToken });
@@ -982,6 +984,7 @@ function FlonkKYCWidget({
982
984
  lang,
983
985
  overlayColor,
984
986
  allowManualUpload,
987
+ requestHeaders,
985
988
  onSuccess,
986
989
  onError,
987
990
  onCancel,
@@ -1005,6 +1008,7 @@ function FlonkKYCWidget({
1005
1008
  lang,
1006
1009
  overlayColor,
1007
1010
  allowManualUpload,
1011
+ requestHeaders,
1008
1012
  mount: mountRef.current || void 0,
1009
1013
  onSuccess: (r) => callbacksRef.current.onSuccess?.(r),
1010
1014
  onError: (e) => callbacksRef.current.onError?.(e),
package/dist/index.js.map CHANGED
@@ -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":[],"mappings":"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","file":"index.js","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":[],"mappings":"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","file":"index.js","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 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 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 config.requestHeaders,\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 /**\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/types.d.ts CHANGED
@@ -15,6 +15,14 @@ interface WidgetInitConfig {
15
15
  overlayColor?: string;
16
16
  allowManualUpload?: boolean;
17
17
  mount?: HTMLElement;
18
+ /**
19
+ * Extra headers sent with the `serverUrl` POST request.
20
+ * Use this to pass Authorization tokens (e.g. JWT) when your
21
+ * backend requires authentication.
22
+ *
23
+ * @example { Authorization: 'Bearer <jwt>' }
24
+ */
25
+ requestHeaders?: Record<string, string>;
18
26
  onSuccess?: (result: VerificationResult) => void;
19
27
  onError?: (error: string) => void;
20
28
  onCancel?: () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flonkid/kyc",
3
- "version": "1.4.2",
3
+ "version": "1.5.0",
4
4
  "description": "Official Flonk KYC SDK — identity verification for any application",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Flonk.id — Dmytrii Popovych (dimon1936)",